1、 2.5 运行描述17 2.6 系统调试17 3 课程设计总结18 4 参考文献181 课程设计目的 (1) 熟悉并掌握硬件设计方面的温度采集技术 (2) 熟悉并掌握软件设计方面的A/D转换技术 (3) 熟悉并掌握软件设计方面的DSP液晶显示功能2 课程设计正文2.1 设计任务 (1)熟悉MC1403芯片的应用 (2)设计由MC1403和热门电阻组成的温度采集电路 (3)将温度采集电路中热敏电阻的阻值变化转变为输入端的变化,根据电压温度转换公式,检测温度变化 (4)完成程序流程图的设计 (5)完成软件设计方面的A/D转换和LCD显示程序 (6)软硬件联合调试 (7)最终结果在液晶显示屏上显示相
2、应的文字及温度 2.2 设计思路 首先设计由MC1403和热敏电阻组成的温度采集电路,利用热敏电阻输出电压值与温度间的函数关系,检测温度的变化;然后将采集到的温度送入TMS320F2812中的A/D转换模块,将电压转换为数字信号;最后通过编写LCD显示函数来控制相应的温度及文字的变化。2.3 硬件设计 2.3.1 方案设计最小系统设计:TMS320F2812芯片包含33个电源引脚,时钟模块,分别有电源复位,复位引脚/RS,软件复位,非法地址,看门狗定时器溢出,欠电压复位这6种信号使DSP控制器复位。在设计中采用了由PCRESET引脚PCRESET电源复位的方式。为了可靠复位,高电平的有效时间至
3、少保持6个时钟周期。DSP平最小系统指的是由F2812芯片组成的电源模块,复位电路和晶振电路组成的无外围设备的系统。最小系统如图1: 图1 DSP最小系统图2.3.2 元器件选择 (1)MC1403芯片(图2) 图2MC1403是低压基准芯片,为模数转换模块提供基准电压。因为MC1403的输出时固定的,所以只需要用到Vin,Vout,GND三个引脚。(2)热敏电阻适当阻值的热敏电阻感应一定范围内的温度变化,提供相对精确的值。2.3.3 单元电路设计 (1)温度采集电路 由MC1403和热敏电阻组成温度采集电路。MC1403的Vin端接入一个5V左右的模拟电压值,并在此端(1脚)接入电容滤除其它
4、频率分量;在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与慢速设备之间
5、的输入/输出时序匹配问题。直接访问方式是将DSP的读写信号线与慢速设备口控制板引出的读写信号线直接相连,时序由DSP内部读写逻辑控制。由于慢速外设的读写周期相对DSP较慢,要使两者的时序匹配,还必须进行一些时序方面的控制处理,一种处理方法是软件编程等待状态发生器,将外部总线周期扩展到数个机器周期。由于受硬件条件的限制,这种扩展通常也是有限的。另一种处理方法是利用DSP的READY(外部设备准备就绪)引脚,通过硬件扩展实现外部状态自动等待,从而使DSP与慢速设备之间的时序匹配。虽然可以将总线周期扩展到任意个机器周期,但是需要进行硬件扩展,增加了系统设计的复杂度。间接访问是用DSP的数字I/O间接
6、控制慢速设备通过软件控制DSP的I/O口来实现与慢速设备的时序匹配。此种方式无需硬件扩展即可实现与任意时序慢速设备之间的时序匹配。本设计采用间接访问方式来实现DSP与LCD之间的时序匹配,即在程序中加入大量延时语句。由于DSP为3.3V设备,而液晶显示模块属于+5V设备,所以在连接控制线、数据线时需要加电平隔离和转换设备。2.4 软件设计2.4.1 软件系统分析(1)系统设计原理 首先要初始化A/D转换模块,然后等待中断,当产生中断后对采集到的模拟信号进行处理,为了确保转换精度应多次取值求平均,将其转换结果放在结果寄存器的高12位上,最后将处理后的温度值送到LCD上显示。系统设计原理框图如图4
7、:TMS320F2812 图4 系统设计原理框图 (2)软件系统流程图2.4.2 软件模块设计(1)等待ADC中断程序#define ADC_usDELAY 8000L#define ADC_usDELAY2 20Linterrupt void adc_isr(void);Uint16 LoopCount;Uint16 ConversionCount;Uint16 Voltage11024;Uint16 Voltage21024;float temp;Uint16 i,j;void InitAdc(void);interrupt void adc_isr(void) Voltage1Conve
8、rsionCount = AdcRegs.ADCRESULT0 4; Voltage2ConversionCount = AdcRegs.ADCRESULT1 / If 40 conversions have been logged, start over if(ConversionCount = 200) ConversionCount = 0; else ConversionCount+; if(ConversionCount=0) temp=0; for(i=0;i200;i+) temp=temp+Voltage1i; temp=temp/200.0; temp=temp*3.0/40
9、95.0; / Reinitialize for next ADC sequence AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; / Reset SEQ1 AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; / Clear INT SEQ1 bit PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; / Acknowledge interrupt to PIE return;void InitAdc(void) extern void DSP28x_usDelay(Uint32 Count); AdcRegs.ADCTRL
10、3.bit.ADCBGRFDN = 0x3; / Power up bandgap/reference circuitry DELAY_US(ADC_usDELAY); / Delay before powering up rest of ADC AdcRegs.ADCTRL3.bit.ADCPWDN = 1; / Power up rest of ADC DELAY_US(ADC_usDELAY2); / Delay after powering up ADC (2)延时子程序void Delay(unsigned int nDelay) int ii,jj,kk=0; for ( ii=0
11、;iinDelay;ii+ ) for ( jj=0;jj1024;jj+ ) kk+; (3)打开显示子程序void TurnOnLCD() *(int *)0x108001=LCDCMDTURNON; Delay(LCDDELAY); *(int *)0x108002=0; Delay(2048); *(int *)0x108001=LCDCMDSTARTLINE;(4)清屏程序void LCDCLS() int i,j; for ( i=0;8;i+ ) *(int *)0x108001=LCDCMDPAGE+i; Delay(LCDDELAY); *(int *)0x108002=0;
12、 *(int *)0x108001=LCDCMDVERADDRESS; for ( j=0;j64;j+ ) *(int *)0x108003=0; Delay(LCDDELAY); *(int *)0x108002=0; *(int *)0x108001=LCDCMDPAGE+i; *(int *)0x108004=0;(5)显示模块/汉字模块void LCDWrite(unsigned int x,unsigned int y,unsigned int LR,unsigned int n) unsigned char lcdkey532= 0x10,0x21,0x86,0x70,0x00,
13、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,/度0
14、x00,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
15、,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) int j; int k=n; *(int *)0x108001=LCDCMDPAGE+x; Delay(1); *(int *)0x108001=LCDCMDVERADDRESS+y; for(j=0;16;
16、j+) *(int *)0x108003=lcdkeykj; Delay(10);x+; for(j=16;32; Delay(100);else *(int *)0x108004=lcdkeykj; x+;/数字模块unsigned char ledkey128= /半角 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,
17、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,0x
18、66,0x00,0x00,0x00, /:0x00,0x60,0x60,0x00,0x00,0x00,0x00,0x00, /. ;void WriteNb(unsigned int x,unsigned int y,unsigned char *No,unsigned f,unsigned int LR) int i; y*=8; *(int *)0x108001=LCDCMDPAGE+x; / 设置操作页=1 *(int *)0x108001=LCDCMDVERADDRESS+y; / 起始列=8 if(LR=1) for(i=0; if(f=1) *(int*)0x108004=Noi;
19、 else *(int*)0x108004=Noi; *(int*)0x108002=0; else *(int*)0x108003=Noi; *(int*)0x108003=Noi; (6)温度计算子程序void Wendu(float c) temp1=35.91-246.7*c; ZhengshuT=(int)temp1; XiaoshuT=(int)(temp1-ZhengshuT)*100); Zhongjian1=ZhengshuT/10; Zhongjian2=ZhengshuT%10; ZhengshuT=(Zhongjian14)|Zhongjian2; Zhongjian1
20、=XiaoshuT/10; Zhongjian2=XiaoshuT%10; XiaoshuT=(Zhongjian1(7)主函数#include DSP281x_Device.h / DSP281x Headerfile Include FileDSP281x_Examples.h / DSP281x Examples Include Filelcd.had.hUint16 ZhengshuT,XiaoshuT,Zhongjian1,Zhongjian2;float temp1=0;unsigned char lcdkey532;void delay_loop(void);void error
21、(void);void Wendu(float c);void LCDWrite(unsigned int x,unsigned int y,unsigned int LR,unsigned int n);void main(void) InitSysCtrl(); EALLOW; GpioMuxRegs.GPFMUX.all=0x0000; /I/O:0 特殊功能:1 GpioMuxRegs.GPFDIR.all=0x000f; / output / Port F MUX - x000 0000 0000 1111 EDIS; DINT; InitPieCtrl(); IER = 0x000
22、0; /CPU中断允许寄存器 IFR = 0x0000;/CPU中断标志寄存器 InitPieVectTable(); SysCtrlRegs.HISPCP.all = 0x3; / HSPCLK = SYSCLKOUT/6 给AD转换时钟提供一个6分频 / This is needed to write to EALLOW protected register PieVectTable.ADCINT = &adc_isr; / This is needed to disable write to EALLOW protected registers InitAdc(); / For this example, init the ADC PieCtrlRegs.PIEIE
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2