MC9S12DG128水温控制系统设计.doc_第1页
MC9S12DG128水温控制系统设计.doc_第2页
MC9S12DG128水温控制系统设计.doc_第3页
MC9S12DG128水温控制系统设计.doc_第4页
MC9S12DG128水温控制系统设计.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式系统设计性实验报告 水温控制系统院 别: 专 业: 学 号: 姓 名: 指导老师: 2012年6月7日 嵌入式系统设计性实验报告 作者:XXX 班级:509XX 学号:摘要:该实验设计基于飞思卡尔MC9S12DG128开发板平台,根据实验任务要求,完成了水温控制系统的设计。关键字: 水温控制 单片机MC9S12DG128前言:本系统完成水温的PID调节,通过键盘设定所需加热的温度值、PID算法的三个参数值,通过给定温度值与此时温度值的偏差设置不同的PWM占空比,从而改变输出电压平均值,给电阻丝加热。其中温度值通过4个数码管显示、电压输出强度通过LED灯显示。并能每隔一定的时间将采集的温度值通过串口送给PC机显示。一、系统设计的功能画出系统功能框图,说明每个功能模块的作用。1、键盘采用4*4扫描键盘用于设定温度值、PID参数值 2、数码管采用动态扫描方式 3、采用PWM控制SSR控制电热丝加热 4、串口每秒钟向计算机发送一次温度值 5、用小灯模拟加热强度,将DA输出平均分为8段,处于第一段时最低位 灯亮处于第二段时,最低位两个小灯亮,处于第8段时所有小灯都亮。 6、采用内部10位AD转换方式测量温度值,用PWM平均电压值模拟温度变化 DG128复位电路电源PWMAD数码管驱动热电阻调理电路SSR电阻丝晶振图1.水温控制系统框图二、硬件设计原理及内容画出实验电路原理图,说明每个硬件模块的工作原理与作用 图2.控制系统电路原理图(此为矢量图,可以放大到看清各个器件参数)其中原理图包括最小系统、数码管显示模块、4*4键盘模块、LED灯模块、PWM电压模块、SCI模块。原理图模块电路功能:1.矩阵键盘用以控制设置系统的温度值及PID所需的三个参数。2.数码管用以显示检测到的温度实际值。3.LED灯模块是用来模拟显示不同的加热等级。4.PWM电压模块,是用来将PWM输出波形平均化并加以放大。5.SCI串口连接计算机,每秒向计算机发送一个温度采样值。键盘模块 下图为键盘原理图图3 键盘原理图此键盘为4*4的16键盘,其中0-9为数字键,A-F为功能键,其中A用来设定温度值,C用来设定P参数,D用来设定I参数,E用来设定D参数。试验中采用扫描法获取键值,通过多次扫描来消除抖动产生的影响。LED模块图4 LED原理图8个led灯接在单片机PORTB口,它用来模拟加热强度,将DA输出平均分为8段,处于第一段时最低位灯亮处于第二段时,最低位两个小灯亮,处于第8段时所有小灯都亮。其中向PTB端口对应位写低电平,对应的位的LED就点亮。SCI通信模块:图5 SCI通信模块其中MAX232为电平转换芯片。只起到电平转换的作用,它将TTL电平和RS-232电平相互转换。单片机发送过程时候,它将单片机发送的TTL电平转换为RS-232电平,通过串口连接到PC机。单片机接受过程时候,串口过来的数据经过它转换为TTL电平,并送到单片机内部。数码管显示模块: 图6 数码管显示模块由于每段灯亮需要大概10mA电流,当数码管每个段都点亮时候需要大概80mA电流,单片机单个引脚无法驱动如此大的电流,则通过加入三极管放大,用单片机控制三极管的导通,从而点亮数码管。实际电路加热模块及采集模块: 1、通过PWM的占空比来控制过零SSR的导通时间。其中T包含多个正弦波周期,为PWM周期,然后通过控制PWM的占空比来控制对应的导通正弦波数,即控制最后的加热持续时间。 图7 过零固态继电器交流交流过零型固态继电器,因有其电压过零时开启,负载电流过零时关断的特性。它的最大接通、关断时间是半个电源周期,在负载上可得到一个完整的正弦波形。也相应的减少了对负载的冲击。而在相应的控制回路中产生的射频干扰也大大减少。 2、另一种可以通过将PWM的波形利用电容给平均化,变成比较平直的电压,通过这个电压来控制电阻丝的加热强度。 此系统设计就是利用此来实现的。通过热电阻桥式电路,将温度信号的转换为电压信号,再经过信号调理电路输出0-5v的电压信号。其中Pt100,测温范围为-200-850摄氏度 图8 温度检测及信号调理电路试验中,此处通过PWM的不同占空比波形,经过电容平均电压,再经放大。图9 PWM模块然后将输出的不同电压值送给DG128的AD0通道中。3、 系统软件设计流程1、主程序流程图开始初始化启动采样显示控制计算输出设定处理YN 图9 主程序流程图2、系统控制框图 主程序中初始化后,通过键盘设定参数,然后系统根据这些参数执行,达到预期的闭环控制。从而使最终的温度值保持在设定值附近。其中需要设定的参数有温度以及PID的三个参数。 图10 水温控制系统控制框图3、部分模块函数的原理其中数码管、AD转换、定时发送采用中断方式。利用定时器设定一段时间,通过静态变量值计数,每来一次中断循环亮一个数码管,由于采用中断方式,与系统同时运行,不会导致数码管亮度不均。通过计数时间到一定时间,给采样函数标记位写数,通过标记位执行相应的程序。同样利用定时的时间到达标记相应的发送标记变量,从而执行相应的SCI发送命令。4、 调试过程及数据 在开始做这个设计的时候,先是把系统的每一部分都分成不同模块,每一个模块先单独作为一个工程建立,每一个模块调试成功之后才将各部分组合在一起,最终调试成为一个系统的。系统的模块分为:SCI串行口输入输出模块、LED数码管显示模块、KB键盘输入模块,AD转换输入模块,PWM模块。 模块的调试过程: 1.SCI串行口调试使用方法: 先将SCI的初始化,让接受程序,发送程序编译通过,然后在SCI的调试主程序中通过输入字符,并让其在电脑自带的超级终端上显示,如果超级终端成功显示我们在键盘上输入的字符,则说明SCI串行口模块可以调用,如果显示不成功则需要继续对程序进行修改和编译。 在串行口这里我遇到的问题及解决办法:a. 开始设置超级终端不正确,一直选择的是硬件,改为无以后正确b. 设置正确后仍不能发送字符,最后发现时没有连接串口c. SCI控制字写的不对,开了中断,对发送过程产生影响2. LED数码管调试使用方法: 分析数码管的共阴或者共阳,让后将LED编程初始化,然后编译数码管的段选函数,位选函数。在数码管的测试主函数中编程保证数码管能够显示我们输入的静态数字。比如我们在主函数中,让数码管显示“0123”,4位数码能够正常显示0123,则说明数码管模块中的函数可以被调用,否则需要继续对程序进行修改和编译。 在数码管这里我遇到的问题是: a、数码管不显示。 原因及解决办法:编写程序时候一直以为是共阴数码管,后来在同学的指导下才知道是共阳数码管。后来在老师的指导下,发现本次实验用的数码管管脚和课本不一致,在修改管脚连线后,数码管才正常显示数字。 b.数码管亮度不均匀。 原因及解决办法:数码管亮度不均是因为在主程序的执行过程中,数码管循环点亮中间插入了其他程序,导致每个灯延时时间不同。3. KB键盘输入模块 在理解了4*4矩阵键盘的编程原理后,自己结合课本成功编译通过键盘程序。并联合之前做的数码管模块和串行口通讯模块,达到了让矩阵键盘按键,数码管显示数字,同时通过超级终端在电脑上显示矩阵键盘按键的数字。 在键盘这里我遇到的问题是: a、开始写的是翻转键盘法,调试程序的时候,通过单步运行发现,每次按键获取的键值与理论的相差很远,要么是高四位全是1即检测不到按键按下,或者是获得的键码有多个0,理论是高四位一个0,第四位一个0。而且只有三个键能用。 原因及解决办法:换了个键盘发现就能获得相应键值。 b、键盘输入PID参数值时候,用C、D、E分别完成P、I、D三个参数的输入,但是实际输入时候总是乱码,并且没法保存所设置的参数值,而且将exmple中的键值功能换为C、D时候,竟然也没法用。解决办法:通过将A、B键改为C、D时候发现没法设置,并换其他键盘时候也不能用,最后发现只有最后一行没法用。将功能键用数字键替代时候就能完成设置。通过对整体函数的查询,发现是PWM3通道和Y4公用一个引脚,将PWM初始化关掉,测试结果正确。 4.AD转换输入模块 在编译通过AD转换程序后,联系数码管显示模块,用一个可变电阻(电位器)的检测采样,用单片机的AD转换通道AN06输入采样信号,将其转化为0100可变数字,用以模拟温度0100度的变化,并在数码管上显示。5、 实验结果与心得实验的最终结果:达到了老师要求的键盘输入数码管及时显示,用PWM输出电压平均值大小模拟温度变化,数码管及时显示0到100的变化,并且数码管的最后一位为小数部分。通过键盘A设定给定温度,C设置P参数,D设置I参数,E设置D参数,B完成整体的确定功能。通过设定合适的PID参数后,用超级终端监控实时温度变化值和预期温度满足闭环系统的控制。并用LED灯模拟不同的加温强度。实验不足:在PID算法上参照了example中的算法,PID只能设置整数值,并没有加入浮点运算。实验心得:通过本次的设计性实验,对嵌入式整个开发过程有所了解,同时也了解到编程调试程序的艰辛。在系统设计之前自己完成了老师所给的最小系统原理图、串口发送的编写。虽然程序逻辑没有错误但是在时间运行中还是出了很多错误,和自己理想差的很远,再一次明白了只有实践才能检验理论的正确性。在整个过程中要学会有全局思维,将系统功能模块化,并将每个模块单独调试,为以后从事系统开发打下了一定的基础。在单独调试模块时候,单独的功能都能实现,但是整体化后就出现了众多问题,例如开始用的反转法键盘最后也没有加进整体程序中,而是用的课本上的循环扫描键盘方式。 并且对自己的编程习惯有了一定的提升,要有良好的编程习惯,方便其他人读取。进一步熟悉了模块化编程。整个功能的模块化就为我们团队合作打了一定基础,此次实验中将和同学商量较多,在共同商讨与试验中解决了不少问题,并对水温系统不断的进行了完善。这次实验,自己也深刻的感受到了自己在嵌入式系统设计和编程上的不足,对MC9S12DG128芯片的管脚和寄存器没有足够的了解,对单片机的各个功能仅限于皮毛,而且试验中很大部分都是参照别人的。总之,在有限的时间内收获颇丰。6、 参考资料 学出实验过程中用到的参考资料,要求写出参考资料的来源,页码和参考内容如嵌入式系统使用HCS12微控制器的设计与应用.王宜怀 P119 串行口处理函数嵌入式系统使用HCS12微控制器的设计与应用.王宜怀 P134 键盘处理函数嵌入式系统使用HCS12微控制器的设计与应用.王宜怀 P140 LED数码管函数嵌入式系统使用HCS12微控制器的设计与应用.王宜怀 P202 A/D转换函数7、 附录实验程序要求:程序要求写出注释程序按照如图顺序给出18#include /* common defines and macros */#include /* derivative information */#pragma LINK_INFO DERIVATIVE mc9s12dg128b#define INT8U unsigned char#define INT16U unsigned int /dingyiINT8U Flag_ADC; /adINT16U AD_wData ;INT16U Temperature_Set,P_Set,I_Set,D_Set; /温度设定值INT8U Flag_Send,Flag_ADC; /标志位INT16U NUM;INT8U LEDbuf4 = 0,0,0,0;/数码管显示数组const INT8U Dtable11 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00; /ledconst INT8U CStable4 = 0xf7,0xfb,0xfd,0xfe;const INT8U KB_Table33 = 0xee,1,0xde,2,0xbe,3,0x7e,4, 0xed,5,0xdd,6,0xbd,7,0x7d,8, 0xeb,9,0xdb,0,0xbb,A,0x7b,B, 0xe7,C,0xd7,D,0xb7,E,0x77,F, 0x00;#define KB_P PTP /jianpan#define KB_D DDRP#define KB_PE PERP#define KB_PS PPSP#define KB_IE PIEP#define KB_IF PIFP#define SCFBit 7#define kp 100#define ki 1#define kd 100#define EnableSCIReInt SCI0CR2 |= 0x20 #define DisableSCIReInt SCI0CR2 &= 0xdf#define LEDdata PORTA#define LEDdata_D DDRA#define LEDcs PTT#define LEDcs_D DDRT#define ReSendStatusR SCI0SR1 /sci状态寄存器#define ReTestBit 5 /接收缓冲区满标志位#define SendTestBit 7 /发送缓冲区满标志位#define ReSendDataR SCI0DRL /数据寄存器 /*串口初始化函数入口参数:无出口参数:无调用函数:无功 能:开SCI0,关SCI1,关串口中断,对串口初始化,默认为允许SCI,正常码输出调试时间:2012-6-6作 者:孙文义*/void SCIInit(void) INT8U t; SCI0BD = 0x0034; SCI0CR1 = 0x00; t = SCI0DRL; t = SCI0DRH; SCI0CR2 = 0x0c; /*发送一个字节函数入口参数:无出口参数:无调用函数:无功 能:串行发送一个字节调试时间:2012-6-6作 者:孙文义*/void SCISend1(INT8U o) while(1) if(ReSendStatusR & (1 SendTestBit) != 0) ReSendDataR = o; break; /*串口初始化函数入口参数:待发送的字节数,存放待发送数据的地址出口参数:无调用函数:SCISend1功 能:发送多个字节调试时间:2012-6-6作 者:孙文义*/void SCISendN(INT8U n,INT8U ch) INT8U i; for(i = 0; i n; i +) SCISend1(chi); /*接收一个字节函数入口参数:存放地址出口参数:接收到的数据(若接受失败。返回0xff)调用函数:无功 能:接收一个字节数据调试时间:2012-6-6作 者:孙文义*/INT8U SCIRe1(INT8U *p) INT16U k; INT8U i; for (k = 0; k 0xfbbb; k +) if(ReSendStatusR & (1 = 0xfbbb) i = 0xff; *p = 0x01; return i; /*串口接受多个字节函数入口参数:字节数及存放地址出口参数:无调用函数:SCIRe1(&fp)功 能:接收多个字节调试时间:2012-6-6作 者:孙文义*/INT8U SCIReN(INT8U n,INT8U ch) INT8U m; INT8U fp; m = 0; while (m n) chm = SCIRe1(&fp); if( fp = 1) return 1; m+; return 0; /*串口发送PC函数入口参数:无出口参数:无调用函数:SCISend1( )功 能:发送温度值调试时间:2012-6-6作 者:孙文义*/void SendToSCI(void) INT8U temp4,i; if( Flag_Send=0xff) if(LEDbuf3=9+1) temp3= ; else temp3= LEDbuf3; if(LEDbuf2=9+1) temp2= ; else temp2= LEDbuf2; temp1 = LEDbuf1; temp0 = LEDbuf0; SCISend1(temp3); SCISend1(temp2); SCISend1(temp1); SCISend1(.); SCISend1(temp0); Flag_Send = 0; /*数码管初始化函数入口参数:无出口参数:无调用函数:无功 能:设置相应端口为输出调试时间:2012-6-6作 者:孙文义*/void LEDInit(void) / LEDdata_D = 0xff; LEDcs_D |= 0x0f; void LEDShow1(INT8U i,INT8U c) LEDcs = CStablei; if(i = 2) LEDdata = (Dtablec)&0x7f; else LEDdata = Dtablec; /*单个数码管显示函数入口参数:显示数据及第几个出口参数:无调用函数:LEDShow1(INT8U i,INT8U c)功 能:显示第几个数码管调试时间:2012-6-6作 者:孙文义*/void LEDShow(INT8U *Buf,INT8U i) INT8U c ; / INT16U j; for(i = 0;i = 3;i+) c = Bufi-0; LEDShow1(3 - i,c); /for (j = 0;j 0) if(Pk25500) tmp = 255; else tmp = (byte)(Pk/100); return tmp; else tmp = 0; return tmp; /*采样控制函数入口参数:无出口参数:无调用函数:PID(result)功 能:将要传送的数据转换到数组中,并控制PWM的占空比调试时间:2012-6-6作 者:孙文义*/void Sample(void) byte ge,shi,bai,point; dword result; if(Flag_ADC = 0xff) result=(dword)(AD_wData)*1000/1023 ; bai = (byte)(result/1000+0); shi = (byte)(result%1000)/100+0); ge = (byte)(result%100)/10+0); point =(byte)(result%10+0); if(bai = 0) LEDbuf3 = 9+1; if(shi = 0) LEDbuf2 = 9+1; else LEDbuf2 = shi; else LEDbuf3 = bai; LEDbuf2 = shi; LEDbuf1 = ge; LEDbuf0 = point; PWMDTY0 = 255 - PID(result); PORTB = (0xff PWMDTY0/32); Flag_ADC = 0x00; /*中断接收函数入口参数:无出口参数:无调用函数:SCIReN(1,SerialBuff)功 能:中断接收调试时间:2012-6-6作 者:孙文义*/ void interrupt ISR_Receive(void) /zhongduan INT8U i; INT8U SerialBuff1; / DisableInterrupts; i = SCIReN(1,SerialBuff); / if(i = 0) SCISendN(1,SerialBuff); / / EnableInterrupts;/*键盘初始化函数入口参数:无出口参数:无调用函数:无功 能:初始化键盘的引脚调试时间:2012-6-6作 者:孙文义*/ void KB_Init(void) /jianpan KB_P = 0x00; /复位KB_P KB_D = 0x0f; /定义 KB_PE = 0xf0; KB_PS = 0x00; KB_IE = 0x00; KB_IF = 0xff; /*扫描读取键值函数入口参数:无出口参数:键值调用函数:无功 能:扫描一次4*4键盘上的按键,读取键值调试时间:2012-6-6作 者:孙文义*/INT8U KB_Scan1(void) INT8U line ,i ,temp; line = 0xfe;for(i = 1; i = 4; i+) temp = KB_P; temp |= 0x0f; KB_P = temp & line; asm(NOP); asm(NOP); asm(NOP); temp = KB_P; temp &= 0xf0; if(temp != 0xf0) temp = KB_P; break; else line = (line 1) | 0x01; if(i = 5) temp = 0xff; return (temp);/*键值转为定义值函数入口参数:KB_valve出口参数:KeyPress调用函数:无功 能:键值转为定义值调试时间:2012-6-6作 者:孙文义*/INT8U KB_Def(INT8U KB_valve) INT8U KeyPress; INT8U i,j; i =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论