基于MATLAB的simulink仿真模型 液晶屏显示模型-基于dsp28035的液晶显示,具备一定的学习性,包括显示汉字,显示数字,显示字母等 模型是利用ADC采样液晶显示 如果你还在为模型搭建的液晶显示烦恼,这种显示过程值得你学习 图一为实验效果图片 图二为模型图 图三为液晶部分原理图 还有讲解视频附送 MATLAB版本2020b的
液晶屏显示在嵌入式开发里是个既基础又磨人的活儿,尤其是当你要在DSP28035这种资源有限的芯片上玩花样。今天咱们直接上硬货,用Simulink给这块小液晶做个"外科手术",看看怎么让它在ADC采样的同时稳定显示汉字、数字、字母三件套。
先看模型结构(对应图二),整个系统的核心是ADC采样触发显示刷新。这里有个骚操作——用ADC中断服务例程直接驱动液晶时序。在Simulink里配置ADC模块时注意两个关键参数:采样率要设到芯片支持的最高15MHz,触发模式选EPWMxSOCA(这个配置直接关联到后续的显示同步)。
//DSP2803x_Adc.c片段 AdcRegs.ADCTRL1.bit.ACQ_PS = 0xF; //采样窗口拉到最长 AdcRegs.ADCTRL3.bit.ADCCLKPS = 3; //时钟分频比 AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; //级联模式这段配置代码里藏着玄机:把采样窗口时间拉到最长,确保在ADC转换期间液晶控制器有足够时间准备显示数据。ADCCLKPS分频系数3对应实际采样时钟3.75MHz,这个数值要和液晶的写周期匹配。
汉字显示最麻烦的是字库处理。咱们用16x16点阵,每个汉字占32字节。在Simulink里搞了个自定义存储块,直接把GB2312字库烧进FLASH。这里有个取巧的办法——用Matlab脚本自动生成字库数组:
% 字库生成脚本片段 font_matrix = zeros(32,length(gb2312_codes)); for k = 1:length(gb2312_codes) im = imread(['HZK16\',gb2312_codes{k},'.bmp']); font_matrix(:,k) = reshape(im',32,1); end生成的二维数组第一维是32字节的字模数据,第二维对应GB2312编码位置。在模型里调用这个数组时,记得把DSP的char类型设为16bit(Project->Properties->C/C++ Build->Settings->Runtime Model Options)。
数字和字母显示相对简单,但要注意同步问题。模型里用了双缓冲机制:当ADC在采样通道1时,液晶正在更新通道0的显示缓存。对应的SPI配置必须把时钟相位(CLKPHA)设成1,这样数据在时钟第二个边沿捕获:
//SPI初始化关键配置 SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; //下降沿发送 SpiaRegs.SPICCR.bit.SPISWRESET = 0; //先复位 SpiaRegs.SPICTL.bit.CLK_PHASE = 1; //相位控制 SpiaRegs.SPIBRR = 0x002F; //波特率设置实测中发现,当SPI时钟超过5MHz时会出现显示残影,这个问题通过插入软延迟解决了——在每次发送完8bit数据后插入3个NOP指令,别看这招土,比调时钟分频管用多了。
基于MATLAB的simulink仿真模型 液晶屏显示模型-基于dsp28035的液晶显示,具备一定的学习性,包括显示汉字,显示数字,显示字母等 模型是利用ADC采样液晶显示 如果你还在为模型搭建的液晶显示烦恼,这种显示过程值得你学习 图一为实验效果图片 图二为模型图 图三为液晶部分原理图 还有讲解视频附送 MATLAB版本2020b的
模型里最妙的要数ADC采样值与显示联动了。设置了一个映射关系:当ADC采样值超过2V时,自动切换显示内容类型。这个逻辑在Stateflow里用状态机实现,比用普通逻辑模块节省了40%的代码量。
调试时如果遇到花屏,重点检查三点:1. 液晶复位时序是否满足15ms低电平;2. 字库数组的存储地址是否4字节对齐;3. SPI的CS信号有没有被其他外设干扰。图三的原理图里特别注意了CS线上拉电阻的阻值,10KΩ刚刚好能抑制DSP引脚的漏电流干扰。
最后说个坑:MATLAB2020b的Embedded Coder在生成DSP28035代码时,默认会把float转成32bit处理,但咱们芯片的硬件FPU是32位的。记得在配置参数里把float map到32bit类型,否则显示刷新率会从设计的60帧直接掉到20帧不到。
完整工程里还塞了个彩蛋:长按开发板的按键3秒,会激活屏幕自检模式,这时候ADC采样值直接映射成屏幕渐变色显示(虽然这液晶是单色的,但用抖动算法模拟出了灰度效果)。代码在VideoProcessing.slx里,用到了误差扩散算法,这个下次单独唠。