DSP课设 温度采集.docx
《DSP课设 温度采集.docx》由会员分享,可在线阅读,更多相关《DSP课设 温度采集.docx(23页珍藏版)》请在冰豆网上搜索。
DSP课设温度采集
信电学院
课程设计说明书
(2009/2010学年第二学期)
课程名称:
DSP控制器及其应用
题目:
温度采集与显示
专业班级:
学生姓名:
学号:
\
指导教师:
设计周数:
2周
设计成绩:
2010年6月23日
目录
1课程设计目的…………………………………………………………………………………1
2课程设计正文…………………………………………………………………………………1
2.1设计任务…………………………………………………………………………………1
2.2设计思路…………………………………………………………………………………1
2.3硬件设计……………………………………………………………………………………1
2.3.1方案设计……………………………………………………………………………1
2.3.2元器件选择……………………………………………………………………………2
2.3.3单元电路设计…………………………………………………………………………2
2.4软件设计…………………………………………………………………………………4
2.4.1软件系统分析…………………………………………………………………………4
2.4.2软件设计模块…………………………………………………………………………5
2.5运行描述…………………………………………………………………………………17
2.6系统调试…………………………………………………………………………………17
3课程设计总结………………………………………………………………………………18
4参考文献……………………………………………………………………………………18
1课程设计目的
(1)熟悉并掌握硬件设计方面的温度采集技术
(2)熟悉并掌握软件设计方面的A/D转换技术
(3)熟悉并掌握软件设计方面的DSP液晶显示功能
2课程设计正文
2.1设计任务
(1)熟悉MC1403芯片的应用
(2)设计由MC1403和热门电阻组成的温度采集电路
(3)将温度采集电路中热敏电阻的阻值变化转变为输入端的变化,根据电压—温度转换公式,检测温度变化
(4)完成程序流程图的设计
(5)完成软件设计方面的A/D转换和LCD显示程序
(6)软硬件联合调试
(7)最终结果在液晶显示屏上显示相应的文字及温度
2.2设计思路
首先设计由MC1403和热敏电阻组成的温度采集电路,利用热敏电阻输出电压值与温度间的函数关系,检测温度的变化;然后将采集到的温度送入TMS320F2812中的A/D转换模块,将电压转换为数字信号;最后通过编写LCD显示函数来控制相应的温度及文字的变化。
2.3硬件设计
2.3.1方案设计
最小系统设计:
TMS320F2812芯片包含33个电源引脚,时钟模块,分别有电源复位,复位引脚/RS,软件复位,非法地址,看门狗定时器溢出,欠电压复位这6种信号使DSP控制器复位。
在设计中采用了由PCRESET引脚PCRESET电源复位的方式。
为了可靠复位,高电平的有效时间至少保持6个时钟周期。
DSP平最小系统指的是由F2812芯片组成的电源模块,复位电路和晶振电路组成的无外围设备的系统。
最小系统如图1:
图1DSP最小系统图
2.3.2元器件选择
(1)MC1403芯片(图2)
图2
MC1403是低压基准芯片,为模数转换模块提供基准电压。
因为MC1403的输出时固定的,所以只需要用到Vin,Vout,GND三个引脚。
(2)热敏电阻
适当阻值的热敏电阻感应一定范围内的温度变化,提供相对精确的值。
2.3.3单元电路设计
(1)温度采集电路
由MC1403和热敏电阻组成温度采集电路。
MC1403的Vin端接入一个5V左右的模拟电压值,并在此端(1脚)接入电容滤除其它频率分量;在Vout端(2脚)输出一个稳定的电压值,接P2口的23引脚;GND端(3脚)直接接地,接P2口的33引脚。
原理图如图3:
图3温度采集电路原理图
(2)A/D模数转换模块
当模/数转换完成后,读取结果寄存器前,最好先读取模/数转换控制寄存器ADCTRL2的ADCFIFO1或ADCFIFO2,以确定当前结果寄存器的状态,保证读取的结果是正确的。
并且12位的转换结果放在结果寄存器的高12位上,该12位数据与外部模拟输入电压的关系为:
12位数字结果=4095*(输入电压/基准电压)
(3)LCD液晶显示模块
DSP需要对读写周期较慢的液晶显示模块进行访问,这样就存在DSP与慢速设备之间的输入/输出时序匹配问题。
直接访问方式是将DSP的读写信号线与慢速设备口控制板引出的读写信号线直接相连,时序由DSP内部读写逻辑控制。
由于慢速外设的读写周期相对DSP较慢,要使两者的时序匹配,还必须进行一些时序方面的控制处理,一种处理方法是软件编程等待状态发生器,将外部总线周期扩展到数个机器周期。
由于受硬件条件的限制,这种扩展通常也是有限的。
另一种处理方法是利用DSP的READY(外部设备准备就绪)引脚,通过硬件扩展实现外部状态自动等待,从而使DSP与慢速设备之间的时序匹配。
虽然可以将总线周期扩展到任意个机器周期,但是需要进行硬件扩展,增加了系统设计的复杂度。
间接访问是用DSP的数字I/O间接控制慢速设备通过软件控制DSP的I/O口来实现与慢速设备的时序匹配。
此种方式无需硬件扩展即可实现与任意时序慢速设备之间的时序匹配。
本设计采用间接访问方式来实现DSP与LCD之间的时序匹配,即在程序中加入大量延时语句。
由于DSP为3.3V设备,而液晶显示模块属于+5V设备,所以在连接控制线、数据线时需要加电平隔离和转换设备。
2.4软件设计
2.4.1软件系统分析
(1)系统设计原理
首先要初始化A/D转换模块,然后等待中断,当产生中断后对采集到的模拟信号进行处理,为了确保转换精度应多次取值求平均,将其转换结果放在结果寄存器的高12位上,最后将处理后的温度值送到LCD上显示。
系统设计原理框图如图4:
TMS320F2812
图4系统设计原理框图
(2)软件系统流程图
2.4.2软件模块设计
(1)等待ADC中断程序
#defineADC_usDELAY8000L
#defineADC_usDELAY220L
interruptvoidadc_isr(void);
Uint16LoopCount;
Uint16ConversionCount;
Uint16Voltage1[1024];
Uint16Voltage2[1024];
floattemp;
Uint16i,j;
voidInitAdc(void);
interruptvoidadc_isr(void)
{
Voltage1[ConversionCount]=AdcRegs.ADCRESULT0>>4;
Voltage2[ConversionCount]=AdcRegs.ADCRESULT1>>4;
//If40conversionshavebeenlogged,startover
if(ConversionCount==200)
{
ConversionCount=0;
}
elseConversionCount++;
if(ConversionCount==0)
{temp=0;
for(i=0;i<200;i++)
temp=temp+Voltage1[i];
temp=temp/200.0;
temp=temp*3.0/4095.0;
}
//ReinitializefornextADCsequence
AdcRegs.ADCTRL2.bit.RST_SEQ1=1;//ResetSEQ1
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;//ClearINTSEQ1bit
PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;//AcknowledgeinterrupttoPIE
return;
}
voidInitAdc(void)
{
externvoidDSP28x_usDelay(Uint32Count);
AdcRegs.ADCTRL3.bit.ADCBGRFDN=0x3;//Powerupbandgap/referencecircuitry
DELAY_US(ADC_usDELAY);//DelaybeforepoweringuprestofADC
AdcRegs.ADCTRL3.bit.ADCPWDN=1;//PoweruprestofADC
DELAY_US(ADC_usDELAY2);//DelayafterpoweringupADC
}
(2)延时子程序
voidDelay(unsignedintnDelay)
{
intii,jj,kk=0;
for(ii=0;ii{
for(jj=0;jj<1024;jj++)
{
kk++;
}
}
}
(3)打开显示子程序
voidTurnOnLCD()
{
*(int*)0x108001=LCDCMDTURNON;
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(2048);
*(int*)0x108001=LCDCMDSTARTLINE;
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
}
(4)清屏程序
voidLCDCLS()
{
inti,j;
*(int*)0x108001=LCDCMDSTARTLINE;
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
for(i=0;i<8;i++)
{
*(int*)0x108001=LCDCMDPAGE+i;
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
*(int*)0x108001=LCDCMDVERADDRESS;
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
for(j=0;j<64;j++)
{
*(int*)0x108003=0;
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
}
*(int*)0x108001=LCDCMDPAGE+i;
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
*(int*)0x108001=LCDCMDVERADDRESS;
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
for(j=0;j<64;j++)
{
*(int*)0x108004=0;
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
}
}
}
(5)显示模块
//汉字模块
voidLCDWrite(unsignedintx,unsignedinty,unsignedintLR,unsignedintn)
{
unsignedcharlcdkey[5][32]=
{
{0x10,0x21,0x86,0x70,0x00,0x7E,0x4A,0x4A,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00,0x00,
0x02,0xFE,0x01,0x40,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x41,0x41,0x7F,0x40,0x00},//温
{0x00,0x00,0xFC,0x04,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x24,0x24,0x04,0x00,
0x80,0x60,0x1F,0x80,0x80,0x42,0x46,0x2A,0x12,0x12,0x2A,0x26,0x42,0xC0,0x40,0x00},//度
{0x00,0x00,0x00,0x3E,0x2A,0xEA,0x2A,0x2A,0x2A,0xEA,0x2A,0x3E,0X00,0X00,0X00,0X00,
0x20,0x21,0x22,0x2C,0x20,0x3F,0x20,0x20,0x20,0x3F,0x28,0x24,0x23,0x20,0x20,0x00},//显
{0x00,0x20,0x20,0x22,0x22,0x22,0x22,0xE2,0x22,0x22,0x22,0x22,0x22,0x20,0x20,0x00,
0x10,0x08,0x04,0x03,0x00,0x40,0x80,0x7F,0x00,0x00,0x01,0x02,0x0C,0x18,0x00,0x00},//示
{0x00,0x02,0x05,0xE2,0x18,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,
0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x18,0x00,0x00},//℃
};
if(LR==0)
{
intj;
intk=n;
*(int*)0x108001=LCDCMDPAGE+x;
Delay
(1);
*(int*)0x108002=0;
Delay
(1);
*(int*)0x108001=LCDCMDVERADDRESS+y;
Delay
(1);
*(int*)0x108002=0;
Delay
(1);
for(j=0;j<16;j++)
{
*(int*)0x108003=lcdkey[k][j];
Delay(10);
*(int*)0x108002=0;
Delay(10);
}
x++;
*(int*)0x108001=LCDCMDPAGE+x;
Delay
(1);
*(int*)0x108002=0;
Delay
(1);
*(int*)0x108001=LCDCMDVERADDRESS+y;
Delay
(1);
*(int*)0x108002=0;
Delay
(1);
for(j=16;j<32;j++)
{
*(int*)0x108003=lcdkey[k][j];
Delay(100);
*(int*)0x108002=0;
Delay(100);
}
}
else
{
intj;
intk=n;
*(int*)0x108001=LCDCMDPAGE+x;
Delay
(1);
*(int*)0x108002=0;
Delay
(1);
*(int*)0x108001=LCDCMDVERADDRESS+y;
Delay
(1);
*(int*)0x108002=0;
Delay
(1);
for(j=0;j<16;j++)
{
*(int*)0x108004=lcdkey[k][j];
Delay(100);
*(int*)0x108002=0;
Delay(100);
}
x++;
*(int*)0x108001=LCDCMDPAGE+x;
Delay
(1);
*(int*)0x108002=0;
Delay
(1);
*(int*)0x108001=LCDCMDVERADDRESS+y;
Delay
(1);
*(int*)0x108002=0;
Delay
(1);
for(j=16;j<32;j++)
{
*(int*)0x108004=lcdkey[k][j];
Delay(100);
*(int*)0x108002=0;
Delay(100);
}
}
}
//数字模块
unsignedcharledkey[12][8]=//半角
{
{0x00,0x00,0x7C,0x82,0x82,0x82,0x7C,0x00},//0
{0x00,0x00,0x00,0x84,0xFE,0x80,0x00,0x00},//1
{0x00,0x00,0x84,0xC2,0xA2,0x92,0x8C,0x00},//2
{0x00,0x00,0x44,0x92,0x92,0x92,0x6C,0x00},//3
{0x00,0x00,0x30,0x28,0x24,0xFE,0x20,0x00},//4
{0x00,0x00,0x4E,0x92,0x92,0x92,0x62,0x00},//5
{0x00,0x00,0x7C,0x92,0x92,0x92,0x64,0x00},//6
{0x00,0x00,0x02,0xC2,0x32,0x0A,0x06,0x00},//7
{0x00,0x00,0x6C,0x92,0x92,0x92,0x6C,0x00},//8
{0x00,0x00,0x4C,0x92,0x92,0x92,0x7C,0x00},//9
{0x00,0x00,0x00,0x66,0x66,0x00,0x00,0x00},//:
{0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00},//.
};
voidWriteNb(unsignedintx,unsignedinty,unsignedchar*No,unsignedf,unsignedintLR)
{
inti;
y*=8;
*(int*)0x108001=LCDCMDPAGE+x;//设置操作页=1
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
*(int*)0x108001=LCDCMDVERADDRESS+y;//起始列=8
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
if(LR==1)
for(i=0;i<8;i++)
{
if(f==1)
*(int*)0x108004=~No[i];
else
*(int*)0x108004=No[i];
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
}
else
for(i=0;i<8;i++)
{
if(f==1)
*(int*)0x108003=~No[i];
else
*(int*)0x108003=No[i];
Delay(LCDDELAY);
*(int*)0x108002=0;
Delay(LCDDELAY);
}
}
(6)温度计算子程序
voidWendu(floatc)
{
temp1=35.91-246.7*c;
ZhengshuT=(int)temp1;
XiaoshuT=(int)((temp1-ZhengshuT)*100);
Zhongjian1=ZhengshuT/10;
Zhongjian2=ZhengshuT%10;
ZhengshuT=(Zhongjian1<<4)|Zhongjian2;
Zhongjian1=XiaoshuT/10;
Zhongjian2=XiaoshuT%10;
XiaoshuT=(Zhongjian1<<4)|Zhongjian2;
}
(7)主函数
#include"DSP281x_Device.h"//DSP281xHeaderfileIncludeFile
#include"DSP281x_Examples.h"//DSP281xExamplesIncludeFile
#include"lcd.h"
#include"ad.h"
Uint16ZhengshuT,XiaoshuT,Zhongjian1,Zhongjian2;
floattemp1=0;
unsignedcharlcdkey[5][32];
voiddelay_loop(void);
voiderror(void);
voidWendu(floatc);
voidLCDWrite(unsignedintx,unsignedinty,unsignedintLR,unsignedintn);
voidmain(void)
{
InitSysCtrl();
EALLOW;
GpioMuxRegs.GPFMUX.all=0x0000;//I/O:
0特殊功能:
1
GpioMuxRegs.GPFDIR.all=0x000f;//output
//PortFMUX-x000000000001111
EDIS;
DINT;
InitPieCtrl();
IER=0x0000;//CPU中断允许寄存器
IFR=0x0000;//CPU中断标志寄存器
InitPieVectTable();
EALLOW;
SysCtrlRegs.HISPCP.all=0x3;//HSPCLK=SYSCLKOUT/6给AD转换时钟提供一个6分频
EDIS;
EALLOW;//ThisisneededtowritetoEALLOWprotectedregister
PieVectTable.ADCINT=&adc_isr;
EDIS;//ThisisneededtodisablewritetoEALLOWprotectedregisters
InitAdc();//Forthisexample,inittheADC
PieCtrlRegs.PIEIE