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

下载本文档

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

文档简介

嵌入式系统设计性实验报告 水温控制系统系 别: 控制工程学院 专 业: 自动化 学 号: 姓 名: 指导老师: 孙文义 2012年6月6日水温控制系统一、任务 设计并制作一个水温自动控制系统,控制对象为1升净水,容器为搪瓷器皿。水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变。二、要求(1)温度设定范围为 4090,最小区分度为1,标定温度1。(2)环境温度降低时(例如用电风扇降温)温度控制的静态误差1。(3)用十进制数码管显示水的实际温度保留一位小数。(4)采用适当的控制方法(如数字pid),当设定温度突变(由 40提高到60)时,减小系统的调节时间和超调量。(5)温度控制的静态误差0.2。(6)从串口输出水温随时间变化的数值。实验要求:1、写出设计报告(要求见附件) 2、键盘采用4*4扫描键盘用于设定温度值 3、数码管采用动态扫描方式 4、采用pwm工程da转换器控制电热丝加热 5、串口每秒钟向计算机发送一次温度值 6、用小灯模拟加热强度,将da输出平均分为8段,处于第一段时最低位灯亮 处于第二段时,最低位两个小灯亮,处于第8段时所有小灯都亮。 7、采用内部10位ad转换方式测量温度值,用电位器模拟温度变化 嵌入式系统设计性实验报告摘要:该实验设计基于飞思卡尔mc9s12dg128开发板平台,用电位器模拟水温,采用单片机内部10位ad转化器,以及pwm模块对温度进行控制,该水温控制系统是一个典型的检测、控制系统,他要求系统完成模拟量输入完成、信号处理运算、输出显示的全部过程。本设计实现了水温的智能控制和人机交互接口以及串行通信。关键字: 水温控制 、飞思卡尔mc9s12dg128单片机 、pid控制、pwm控制输出前言: 具体实验任务描述1. 最小系统电路包括电源电路、pll电路、复位电路、晶振电路bdm调试接口、串行通信电路等,是单片机能工作的前提。2. 键盘采用4*4扫描键盘用于设定温度值,按a键进入设定模式,按b键进行确定。0-9十个数字用于输入设定的数字。3. 数码管采用动态扫描方式,显示设定的温度值和实时的温度值。数码管驱动采用三极管放大电流,为八个二极管提供电流4. 采用pwm工程da转换器控制电热丝加热,pwm输出不同的高低电平,控制电热丝的通断5. 采用sci模块每秒钟向计算机发送一次温度值6. 用小灯模拟加热强度,将da输出平均分为8段,处于第一段时最低位灯亮处于第二段最低位两个小灯亮,处于第8段时所有小灯都亮。7. 用电位器模拟温度变化,采用内部10位ad转换方式测量温度值。正文一、系统设计的功能画出系统功能框图,说明每个功能模块的作用。单片机dg128驱动数码管键盘固态继电器电阻丝串行通信pc机小灯模拟加热程度信号调理热电阻最小系统电路图1.水温控制系统功能框图二、硬件设计原理及内容画出实验电路原理图,说明每个硬件模块的工作原理与作用。原理图模块电路及各部分功能:1电源电路hcs12 mcu的芯片内部使用3v电压,i/o端口和外部供电电压为5v,电源电路中的c3和c4构成滤波电路,可以改善系统的电磁兼容性,降低电源波动对系统的影响,增强电路工作稳定性。led0为电源指示灯。2pll电路pll电路兼有频率放大和信号提纯的功能,系统可以以较低的外部时钟信号获得较高的工作频率,以降低因高速开关时钟过造成的高频噪声。3晶振电路晶振电路为mcu提供工作时钟频率,器件所有的时钟信号都来自extal引脚输入的时钟4接口电路和复位电路bdm调试方式为开发人员提供了底层的调试手段,开发人员可通过它初次向目标板下载程序,同时也可通过调试器对目标板的flash存储器进行写入、擦除等操作。用户也可通过它进行应用程序的下载和在线更新,在线动态调试和编程,读取cpu各个寄存器的内容,mcu内部资源的配置与修复,程序的加密处理等操作。mcu在响应各种外部或侦测到得内部系统故障时可进行系统复位,复位时,将寄存器和控制位设置成已知的其实默认值。复位的用途是错误恢复,即当mcu检测到内部故障时,它尝试回到一个已知的、明确的状态而从故障中恢复。5串行通信接口sci串行通信实现mcu与pc之间进行通信,接收时,把外部数据的单线输入的数据变成一个字节的并行数据送入mcu内部,发送时,把需要发送的一个字节的并行数据转换为单线输出。6键盘输入电路矩阵键盘用以控制设置系统的温度值。p端口的低四位0-3设置为输出,高四位4-7设置为输入,(即ddrp=0xof)。通过ptp的低四位逐行输出低电平,同时读取ptp的高四位,将低四位的输出状态与读取的高四位的状态相“与”,然后查询保存在ram中的表就能判断被按下键的位置。7数码管显示电路.数码管用以显示检测到的温度实际值(试验中用电位器ad模拟温度变化)。在设定状态时显示设定值。片选端接t端口低四位,数据端接a端口。采用三极管放大电路,驱动数码管。203、 系统软件设计流程画出系统软件流程图开始初始化(键盘、a/d转换、led、pwm、sci、定时器)检测启动键是否按下采样显示控制计算输出pwm检测设定按键处理图三 程序流程图4、 调试过程及数据 在开始做这个设计的时候,先是把系统的每一部分都分成不同模块,每一个模块先单独作为一个工程建立,每一个模块调试成功之后才将各部分组合在一起,最终调试成为一个系统的。系统的模块分为:sci串行口输入输出模块、led数码管显示模块、kb键盘输入模块,ad转换输入模块,pwm模块。模块的调试过程:1.sci串行口调试使用方法: 编程:1.将sci的初始化,设置波特率、接收发送数据的格式,接收发送的方式。2.编写发送函数和接收函数,接收以中断方式实现,故还要编写中断接收函数。调试: 编译通过后,在串口调试助手里输入字符,如果成功显示我们在键盘上输入的字符,则说明sci串行口模块可以调用,如果显示不成功则需要继续对程序进行修改和编译。在串行口这里我遇到的问题是: a、键盘输入的字符不在串口助手显示。 解决办法:不能显示的原因是自己对串口发送和接收的程序没能充分理解,不知道函数间数值是如何传递的,经过对发送程序和接收语句的一条条分析,得以理解,修改主程序,编译通过。另外实验板的晶振16m,但是单片机 mc9s12dg128中未启用锁相环,故单片机的内部总线实际上只有16m/2.所以在串行口波特率要求9600时,需要在程序的串口初始化中将sci0bdl=0x80改为sci0bdl=0x34。2. led数码管调试使用方法: 编程:首先将led编程初始化,然后编译共阳数码管的段选数表,位选数表。最后编写led显示一个数和led显示4个数的函数。接线:1-12接口分别对应接e、 d、 h 、c、 g、 cs0、 b、 cs1、 cs2 、f a、 cs3。调试:在数码管的测试主函数中编程保证数码管能够显示我们输入的静态数字。比如我们在主函数中,让数码管显示“0123”,4位数码能够正常显示0123,则说明数码管模块中的函数可以被调用,否则需要继续对程序进行修改和编译。在数码管这里我遇到的问题是: a、数码管不显示。 原因是实验板上的数码管是共阳的,而教材上的程序是针对共阴数码的。重新编写显示码表dtable10,问题得以解决。后来发现只要在dtable前加取反符号即dtable就可以了,省去了很多麻烦。 b、数码管正常显示数字但四个数码管都显示小数点。 原因及解决办法:自己的段选数表编错了,在显示4个数的函数中直接把段选数表赋给a端口。修改段选数表,在显示4个数的函数中判断是否为第三个数码管,若是才点亮小数点,若不是,只显示数。3. kb键盘输入模块编程:首先键盘初始化,再要找到按键的位置,其次要通过多次扫描去除抖动,还要将键值转换为设定值,并能读取定义值,最后编写一个设定函数。接线:p端口的高四位接键盘列四个接口,低四位接行四个接口调试:在键盘测试主函数中编程保证输入的数字能在数码管显示,按a键进入设定模式,按b键确定。如果能实现那么说明键盘编写的函数能被主函数调用。在键盘这里我遇到的问题是:a、在键盘输入数字,在数码管显示的却是乱码原因及解决办法:问题在扫描的键值keynum是字符型数据,直接调用ledshow(1,keynum),所以会显示乱码,解决办法是keynum转换为数字即keynum0,在调用ledshow1(1,keynum),显示正常。b、键盘输入的数字,在数码管上显示一位数字,但是在超级终端上显示一连串一摸一样的字符。原因及解决办法:键盘的扫描速度比串行口的通讯速度快,以至于在串行口检测数据的时候,键盘已经扫描多次,所以重复发送。后来在程序中增加了一个延时程序,让扫描键盘之后等待一段时间,此时间比串口扫描时间略长,再扫描,最终达到按一下矩阵键盘,数码管显示数字,超级终端只出现一个数字的结果。4. ad转换输入模块编程:首先将ad转换器初始化,编写一个通道的函数、ad中断函数,中值滤波、均值滤波函数。 调试: 在编译通过ad转换程序后,联系数码管显示模块,用一个可变电阻(电位器)的检测采样,用单片机的ad转换通道an06输入采样信号,将其转化为0100可变数字,用以模拟温度0100度的变化,并在数码管上显示。 在ad转换这里我遇到的问题是:a、 数码管显示的数字没有小数点 原因及解决办法:为了显示小数点,自己通过在数码管的程序中单独加入了一个数组data2,这个数组中的每一位数字“0123456789”中的编码都带有小数点,在显示程序调用时,让数码管的从右至左第二位数码管单独调用此数组。而其他的几个数码管在调用显示数字时依然用data1i即这个数组中的每一位数字“0123456789”中的编码没有小数点。5控制输出模块编程:编写一个pid控制函数、控制pwm输出函数,标度转换函数、将结果分解显示函数b口模拟加热强度函数在控制输出这里我遇到的问题是a、 温度设定超过76.5摄氏度时,只能加热到76.5摄氏度此问题未能解决5、 实验结果与心得实验的最终结果:1.实现了用4*4扫描键盘设定温度值,按a键进入设定模式,可以自右向左设定温度值,按b键进行设定。实现了串口每秒钟向计算机发送一次温度值。2.实现了采用pwm工程da转换器控制电热丝加热,3.实现了用小灯模拟加热强度,将da输出平均分为8段,处于第一段时最低位灯亮处于第二段时,最低位两个小灯亮,处于第8段时所有小灯都亮的要求。4.实现了数码管实时显示温度值。5.实现了采用内部10位ad转换方式测量温度值,用电位器模拟温度变化实验心得:到此为止,本学期嵌入式系统的实验基本就结束了。水温控制实验做完我觉得收获了很多。我了解了嵌入式系统开发过程,编写了对我来说到目前为止最复杂的程序。在此之前,我们并没有了解过类似的知识,也并没有过类似的实验经验。谈一下我们的主要收获。在实验编程的过程中,我们遇到了很多的问题。从刚开始完全不知从何入手,到用code warrior编写简单函数,发现了很多问题,我c语言学的不扎实,编写程序经常丢三落四,没有条理。但是经过多次修改编译成功了。后来开始编写复杂函数,在编译的过程中,开始没有思路,pid函数完全不知如何编写,后来经过上网查询和参考老师给的程序,学会了pid控制的编程。6、 参考资料 学出实验过程中用到的参考资料,要求写出参考资料的来源,页码和参考内容嵌入式系统使用hcs12微控制器的设计与应用.王宜怀 p119 串行口处理相关函数嵌入式系统使用hcs12微控制器的设计与应用.王宜怀 p134 键盘处理相关函数嵌入式系统使用hcs12微控制器的设计与应用.王宜怀 p140 led数码管相关函数嵌入式系统使用hcs12微控制器的设计与应用.王宜怀 p202 a/d转换相关函数基于hcs12的嵌入式系统设计第七章脉宽调制模块及其应用实例7、 附录一、最小系统pcb板最小系统3d板二、原理图三、源程序#include /* common defines and macros */#include /*derivative-specific definitions */#define bus_clock 8000000 /总线频率#define baud 9600#define resendstatusr sci0sr1#define retestbit 5#define sendtestbit 7#define resenddatar sci0drl#define kb_p ptp /键盘接在h口上#define kb_d ddrp /相应的方向寄存器#define kb_pe perp /相应的上啦下拉电阻允许寄存器#define kb_ps ppsp /相应的极性选择寄存器#define kb_ie piep /相应的中断允许寄存器#define kb_if pifp /相应的中断标志寄存器#define enablescireint sci0cr2 |=0x20 /开放sci0接受中断#define disablescireint sci0cr2 &=0xdf /禁止sci0接受中断#define scfbit 7 /转换完成标志位#define atdctl2 atd0ctl2#define atdctl3 atd0ctl3#define atdctl4 atd0ctl4#define atdctl5 atd0ctl5#define atdstat0 atd0stat0#define atddr0 atd0dr0#define kp 100#define ki 1#define kd 100unsigned char ledbuf4= 0,0,0,0; /数码管显示数组unsigned char flag_send,flag_adc;unsigned int ad_wdata ;unsigned int temperature_set;/*/* 延迟 */*/ void delay(unsigned int k) unsigned int u; for(u=0;uk;u+); /*/* 初始化sci */*/void sciiint(void) sci0bd = bus_clock/16/baud; /设置sci0波特率为9600 sci0cr1 = 0x00; /设置sci0为正常模式,八位数据位,无奇偶校验 sci0cr2 = 0x2c; /允许接收和发送数据,允许接收中断功能 /*/* 串口发送函数一个字节 */*/void scisend1(unsigned char a) while(1) /若sci0sr1第七位为一,条件成立,此时发送数据寄存器空 if(resendstatusr & (1 sendtestbit) != 0) resenddatar = a; break; /*/* 串口接收函数一个字节 */*/unsigned char scire1(unsigned char *p) unsigned int k; unsigned char i; for (k = 0; k 0xfbbb; k +) /若sci0sr1第五位为一,条件成立,此时接收数据寄存器数据可用 if(resendstatusr & (1 = 0xfbbb) i = 0xff; *p = 0x01;/返回出错标志 return i; /*/* 串口发送n字节函数 */*/void scisendn(unsigned char n,unsigned char ch) unsigned char i; for(i = 0; i n; i +) scisend1(chi); /*/* 串行接收n字节 */*/ unsigned char sciren(unsigned char n,unsigned char ch) unsigned char m; unsigned char fp; m = 0; while (m n) chm = scire1(&fp); if( fp = 1) return 1; m+; return 0; /*/* 中断接收函数 */*/void interrupt isr_receive(void) unsigned char i; unsigned char serialbuff1; i = sciren(1,serialbuff); scisendn(1,serialbuff);/*/* 数码管显示表 片选表 */*/const unsigned char dtable11 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00;const unsigned char cstable4 = 0xf7,0xfb,0xfd,0xfe;/*/* led初始化 */*/void ledinit(void) ddra=0xff;/定义a口为输出 ddrt=0x0f;/t口低四位为输出/*/* led显示一个数 */*/ void ledshow1(unsigned char i,unsigned char c) ptt = cstablei; if(i = 2) porta = (dtablec)&0x7f;/若为第二个数码管点亮小数点 else porta = dtablec; /*/* 显示4个十进制数 */*/void ledshow(unsigned char *buf)unsigned char i,c;unsigned int j;for(i=0;i=3;i+) c=bufi-0; ledshow1(3-i,c); for(j=0;j=100;j+); /*/* 键盘定义表 */*/const unsigned char 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;/*/* 键盘初始化 */*/ void kb_init(void) kb_p = 0x00;/复位kb_p kb_d = 0x0f;/定义7-4为输入3-0为输出 kb_pe = 0xf0;/ 定义kb_p.7-4允许上拉或下拉 kb_ps = 0x00;/定义kb_p.7-4上拉电阻,并且由下降沿产生中断 kb_ie = 0x00;/定义kb_p.7-4输入引脚禁止中断 kb_if = 0xff;/清除键盘中断标志位(写1清除)/*/* 扫描读取键值函数 */* 功能:扫描一次4乘4键盘 */* 返回扫描到的键值 */*/unsigned char kb_scan1(void) unsigned char line ,i ,temp; /line 低四位值决定扫描的行 高四位的值始终为f line = 0xfe;/使第一根行线为零(低电平) for(i = 1; i = 4; i+)/最多将扫描4根行线 / 以上三行将当前扫描的一行输出低电平 temp = kb_p; temp |= 0x0f;/高四位保持不变,低4为置1 kb_p = temp & line;/结果高四位是tmp的高四位,低4位是line的低4位 asm(nop); asm(nop); asm(nop); temp = kb_p;/读取键盘口寄存器 高四位与输入引脚电平有关 低四位便是line的低四位 /通过观察4根列线中是否出现低电平来判断当前行有无按键 temp &= 0xf0;/高四位保留 低四位清零 仅保留列线的值 if(temp!=0xf0) delay(100); if(temp != 0xf0) temp = kb_p;/读取扫描到的键值 break;/退出循环不再扫描 else / 当前行无按键准备扫描下一行 line = (line 1) | 0x01; if(i = 5)/无按键返回0xff temp = 0xff; return (temp);/*/* 多次扫描键盘函数 */* 功能:多次扫描键盘消除抖动 */* kb_count扫描键盘的次数 */*/ unsigned char kb_scann(unsigned char kb_count) unsigned char i,kb_value_last,kb_value_now; if(0 = kb_count | 1 = kb_count) return kb_scan1(); /先扫描一次得到的键值,便于下面的比较 kb_value_now = kb_value_last = kb_scan1(); for(i = 0; i = 0) & (keynum = 9) ledbuf3 = ledbuf2; ledbuf2 = ledbuf1; ledbuf1 = ledbuf0; ledbuf0 = keynum; /*/* ad转换初始化 */*/ void ad_init(void) atd0test1 = 0b00000000; /禁止特殊通道 atd0ctl2 = 0b11000010; /快速清除模式,完成中断允许 atd0ctl3 = 0b00001000; /队列长度为1 atd0ctl4 = 0b01000011; /atdclock=1m atd0ctl5 = 0b10100110; /右对齐,无符号数、连续转换、单通道采样、通道6/*/* 一个通道ad转换 */*/unsigned int adcvalue(unsigned char channel) unsigned int temp; /暂存a/d转换的结果/atdctl5.djm = 0,结果寄存器数据采用左调整,1为右调整/atdctl5.scan = 1,连续转换序列 0只执行一次/atdctl5.ccca = channel,启动通道转换 000111 对应an0an7atdctl5 = (0x20 | channel);/取a/d转换结果while (1) if (atdstat0&(1 6); /对数据调整,使低十位有效 break;return temp;/返回ad转换结果/*/* ad中断函数 */*/ _interrupt 22 int_ad0(void) ad_wdata = atd0dr0; /从寄存器读取结果 /*/* ect初始化 */*/void ect_init(void) tscr2_pr = 0; /预分频系数为1,总线时钟1 tscr2_toi = 1; /定时器溢出中断允许 tscr1_ten = 1; /允许定时器正常运行/*/* 时钟溢出中断 */*/ void interrupt int_timeroverflow(void) static unsigned int i,j,k; tflg2_tof = 1; /主定时器溢出标志,写1清除 if(+i)3) /四个数码管循环显示 i = 0; ledshow1(3 - i,ledbufi-0);/一次串口发送间隔时间 if( j+ 500) j = 0; flag_send = 0xff; if( k+ 10) /一次ad转换间隔时间 k = 0; flag_adc = 0xff; /*/* 每秒发送一次 */* */void sendtosci(void) unsigned char temp4,i; if( flag_send=0xff) /若第四位为0 发送空字符 if(ledbuf3=9+1) temp3= ; /若第三位为0 发送空字符 else temp3= ledbuf3; if(ledbuf2=9+1) temp2= ; else temp2= ledbuf2; temp1 = ledbuf1; temp0 = ledbuf0; scisend1(temp3); scisend1(temp2); scisend1(temp1); scisend1(.);

温馨提示

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

评论

0/150

提交评论