1.设计需求
设计一个基于温度变化的展示系统。温度传感器检测温度变化,彩色LCD显示当前温度和设定阈值。LED根据温度高低展示不同颜色。按键用于设置温度阈值,摇杆调节LED显示的模式和控制参数。
2.设计思路
本设计温度检测使用硬禾学堂I/O扩展板包括的NST112温度传感器芯片,DSP将传感器芯片测得的温度结果读出,与预设的温度阈值进行比较。温度阈值的设定与修改使用摇杆和按键完成(I/O扩展板上的按键有一个短路,此处使用编码器开关的按键代替),使用LED和LCD的不同显示状态来表示比较结果。
3.完成的功能以及实物效果图
(1)实时显示环境温度
(2)实时与预设温度阈值比较,调整显示状态
当环境温度处于上下限温度阈值之间时,LED显示绿色,环境温度示数显示绿色;
当环境温度高于上线温度阈值时;LED熄灭(红色),环境温度示数显示红色;(若按照引脚对应表连接,LED显示红色,当时我在进行测试时线路接触不良才导致熄灭)
当环境温度低于下限温度阈值时;LED显示蓝色,环境温度示数显示蓝色;
(3)使用摇杆与按键进行交互,修改温度阈值的大小
摇杆左右移动选择待修改的阈值,按键控制加减;
(4)摇杆调节LED显示的模式
摇杆上下移动选择LED的显示模式,上移常亮,下移为呼吸灯模式。
4.硬件介绍
4.1NST112温度传感器
NST112使用I2C通信协议与TMS320F280049进行通信,只要向NST112发送正确的地址和读取指令就可以将当前测得的环境温度读出。在本设计的程序中,我使用了GPIO模拟IIC的驱动方式,易于移植和扩展。
4.2摇杆输出电路
从I/O扩展板提供的原理图可以看出,摇杆X轴可以改变三角波发生电路的振荡电阻的大小,从而改变输出PWM的周期,摇杆Y轴可以改变输出比较器的上限比较电压,从而改变输出PWM信号的占空比,因此只要使用TMS320F280049的ECAP外设将PWM信号的周期以及占空比求出,即可获知摇杆的状态。
4.3按键输出电路
由I/O扩展板按键输出电路原理图可知,当按键K1,K2,编码器按键按下时,会分别A_OUT改变为不同值,因此只要使用ADC将扩展板的输出模拟电压读出,即可获知按键被按下的情况。
4.4LaunchPad与I/O扩展板管脚连接表
5.软件流程图
6.主要代码片段及说明
6.1按键、摇杆控制
ADC_forceMultipleSOC(myADC0_BASE, ADC_FORCE_SOC0);
//
// Wait for ADCA to complete, then acknowledge flag
//
while(ADC_getInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1) == false)
{
}
ADC_result= ADC_readResult(ADCARESULT_BASE, ADC_SOC_NUMBER0);
ADC_clearInterruptStatus(myADC0_BASE, ADC_INT_NUMBER1);
if(2000<ADC_result&&ADC_result<2500)
{
key_1=0;
}
if(ADC_result<1000)
{
key_2=0;
}
//通过ECAP测出的PWM占空比D判断摇杆Y轴移动状态
if(D<85&&D>75)
{
mode=1;
}
if(D<35&&D>30)
{
mode=0;
}
if(mode==1) i=0;
if(mode==0)
{
i=i+n;
n=n+1;
if(n>=50) n=0;
if(i>=501) i=0;
}
//通过PWM周期T判断摇杆X轴移动状态
if(T>0x35000&&T<0x40000)
{
k=1;
}
if(T>0x60000)
{
k=0;
}
本段代码将ADC,ECAP的转换结果转化成按键、摇杆的状态,并通过中间变量key_1,key_2,k,i来将输入信号传出,间接完成对阈值温度和显示状态的控制。
6.2阈值温度调整
if(key_1==0)
{
if(k==0)
{
temp_set1++;
}
if(k==1)
{
temp_set2++;
}
key_1=1;
}
if(key_2==0)
{
if(k==0)
{
temp_set1--;
}
if(k==1)
{
temp_set2--;
}
key_2=1;
}
本段代码的功能是对温度阈值进行调整,其中k代表待调整的阈值电压,k=0代表调整上限阈值温度,k=1代表调整下限阈值温度。
6.3显示界面刷新
LCD_ShowString(2,12,"now temp:",BLUE,WHITE,16,0);
if(temperature<=temp_set1)
{
LCD_ShowFloatNum1(74,12,temperature,4,BLUE,WHITE,16);
EPWM_setCounterCompareValue(myEPWM0_BASE, EPWM_COUNTER_COMPARE_A, i);
EPWM_setCounterCompareValue(myEPWM0_BASE, EPWM_COUNTER_COMPARE_B, 500);
EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, 500);
}
if(temperature>=temp_set2)
{
LCD_ShowFloatNum1(74,12,temperature,4,RED,WHITE,16);
EPWM_setCounterCompareValue(myEPWM0_BASE, EPWM_COUNTER_COMPARE_A, 500);
EPWM_setCounterCompareValue(myEPWM0_BASE, EPWM_COUNTER_COMPARE_B, 500);
EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, i);
}
if(temperature<temp_set2 && temperature>temp_set1 )
{
LCD_ShowFloatNum1(74,12,temperature,4,GREEN,WHITE,16);
EPWM_setCounterCompareValue(myEPWM0_BASE, EPWM_COUNTER_COMPARE_A, 500);
EPWM_setCounterCompareValue(myEPWM0_BASE, EPWM_COUNTER_COMPARE_B, i);
EPWM_setCounterCompareValue(myEPWM1_BASE, EPWM_COUNTER_COMPARE_A, 500);
}
if(k==0)
{
LCD_ShowString(2,32,"temp_high:",BLUE,WHITE,16,0);
LCD_ShowString(2,52,"temp_low:",BLUE,YELLOW,16,0);
}
if(k==1)
{
LCD_ShowString(2,32,"temp_high:",BLUE,YELLOW,16,0);
LCD_ShowString(2,52,"temp_low:",BLUE,WHITE,16,0);
}
LCD_ShowFloatNum1(82,32,temp_set2,4,BLUE,WHITE,16);
LCD_ShowFloatNum1(74,52,temp_set1,4,BLUE,WHITE,16);
LCD_ShowString(2,72,"LED_mode:",BLUE,WHITE,16,0);
if(mode==1) LCD_ShowString(74,72,"Stable",BLUE,WHITE,16,0);
if(mode==0) LCD_ShowString(74,72,"Beat ",BLUE,WHITE,16,0);
本段代码主要完成刷新LCD屏幕以及LED显示状态的控制。
7.遇到的主要难题及解决方法
7.1默认cmd划分导致程序空间不足
在完成ST7735的驱动移植后,再对项目进行编译就会得到.text不足的报错,由于此前使用同系列TMS320F28335时遇见过类似内存不足的情况,第一时间想到原因是cmd划分的不合理导致分配给程序的内存过小。重新修改cmd进行内存划分后即可编译通过。
7.2NST112通信不成功
由于NST112的通信方式较为简单,一开始我尝试使用DSP内部的IIC外设进行驱动,经过很长时间的调试,发现仍然无法读到数据,只好使用GPIO模拟IIC的通信方式,在对网上的驱动程序进行移植后最终成功读到了温度数据。
8.未来的计划
本次寒假一起练虽说基本完成了设计需求,但是个人认为设计中对DSP各个外设的使用还是较为浅显,程序的结构和任务的调度都不够完美。因此我会继续对本项目进行更新迭代,此外,TMS320F280049是一款各个外设功能都十分强大,数据处理能力十分优秀的DSP,尤其是优势显著的PWM模块,对于电力电子功率变换器的控制具有得天独厚的优势,因此我也会在未来的学习和设计当中继续使用这款DSP,并在这一过程中加深对其应用的掌握。