嵌入式系统设计性水温控制系统实验报告.docx

上传人:b****1 文档编号:2527706 上传时间:2023-05-03 格式:DOCX 页数:45 大小:118.41KB
下载 相关 举报
嵌入式系统设计性水温控制系统实验报告.docx_第1页
第1页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第2页
第2页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第3页
第3页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第4页
第4页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第5页
第5页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第6页
第6页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第7页
第7页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第8页
第8页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第9页
第9页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第10页
第10页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第11页
第11页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第12页
第12页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第13页
第13页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第14页
第14页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第15页
第15页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第16页
第16页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第17页
第17页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第18页
第18页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第19页
第19页 / 共45页
嵌入式系统设计性水温控制系统实验报告.docx_第20页
第20页 / 共45页
亲,该文档总共45页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

嵌入式系统设计性水温控制系统实验报告.docx

《嵌入式系统设计性水温控制系统实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式系统设计性水温控制系统实验报告.docx(45页珍藏版)》请在冰点文库上搜索。

嵌入式系统设计性水温控制系统实验报告.docx

嵌入式系统设计性水温控制系统实验报告

嵌入式系统设计性实验报告

水温控制系统

院别:

控制工程学院

专业:

自动化专业

学号:

5090529

姓名:

张键

指导老师:

孙文义

2012年6月8日

 

嵌入式系统设计性实验报告

作者:

张键班级:

50905学号:

5090529

摘要:

在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。

人们都要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。

采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大的提高产品的质量和数量。

该实验设计基于飞思卡尔MC9S12DG128开发板平台,根据实验任务要求,完成了基于单片机的水温自动控制系统的设计该实验设计基于飞思卡尔MC9S12DG128开发板平台,根据实验任务要求,完成了水温自动控制系统的设计。

关键字:

水温控制单片机MC9S12DG128

一、系统设计的功能

画出系统功能框图,说明每个功能模块的作用。

1、键盘采用4*4扫描键盘用于设定温度值

2、数码管采用动态扫描方式

3、采用PWM工程DA转换器控制电热丝加热

4、串口每秒钟向计算机发送一次温度值

5、用小灯模拟加热强度,将DA输出平均分为8段,处于第一段时最低位

灯亮处于第二段时,最低位两个小灯亮,处于第8段时所有小灯都亮。

6、采用内部10位AD转换方式测量温度值,用电位器模拟温度变化

水温控制系统框图:

二、系统总体功能分析

本系统是一个简单的单回路控制系统,为了实现温度的测量及自动控制,根据任务要求及要求,系统由单片机系统,前向通道,后向通道,及人机通话四个模块构成。

总体框图如图2所示。

三、各功能模块作用分析

(1)单片机系统是控制系统的核心,MC9S12DG128可以提供系统所需的IO口及内置的功能模块。

A/D转换模块是将外部采集到的模拟量转换为数字量,不需要加另外的AD转换芯片,在本设计实验中采用内部10位AD转换方式测量温度值。

PWM模块通过软件编程可以输出任意占空比的波形,在本设计实验中可以通过输出电压波形控制电阻丝的通断,从而模拟水的加热程度,达到控制水温的目的。

SCI模块使单片机与PC机连接,将采样温度值上传到PC机,从而可以通过PC机实时地看到温度的变化,还可以从PC机下载程序,人机交互方便。

(2)前向通路:

用电位器模拟温度变化,然后进行温度值采样,主要包括热电阻的传感器,信号放大电路组成。

pt100是铂热电阻,它的阻值跟温度的变化成正比。

PT100的阻值与温度变化关系为:

当PT100温度为0℃时它的阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。

它的工业原理:

当PT100在0摄氏度的时候他的阻值为100欧姆,它的阻值会随着温度上升而成匀速增长的。

(3)数据显示:

采用了四位共阴极数码管进行显示设定温度值及测量温度值。

(4)键盘采用4*4扫描键盘用于设定温度值

(5)继电器、电阻丝电路:

通过PWM输出电压波形控制SSR固态继电器的通断,从而控制电阻丝的加热程度。

(6)交流固态继电器(缩写SSR)是一种全部由固态电子元件组成的新型无触点通断电子开关,为四端有源器件。

其中两个端子为输入控制端,另外两端为输出受控端,中间采用光电隔离,作为输入输出之间电气隔离(浮空)。

在输入端加上直流或脉冲信号,输出端就能从关断状态转变成导通状态(无信号时呈阻断状态),从而控制较大负载。

整个器件无可动部件及触点,可实现相当于常用的机械式电磁继电器一样的功能。

四、硬件设计原理及内容

画出实验电路原理图,说明每个硬件模块的工作原理与作用

1.矩阵键盘用以控制设置系统的温度值。

2.数码管用以显示检测到的温度实际值(用电位器AD模拟温度变化)

3.原理图的其它电路为最小系统基本组成部分。

3、系统软件设计流程

1.程序框架结构

一个整体的系统软件设计是由各个在系统里起着不同作用的模块整合在一起,从而实现系统的所要实现的功能。

此系统包括主控制程序,A/D采样数据处理程序,PID算法程序,LED显示及按键处理程序。

结构框架如下图:

2.系统软件主程序流程图

通过调用程序即可实现所需使用的功能,主程序流程图如下图:

显示

设置温度b

温度采样a

初始化(AD初始化,数码管,SCI,LED,PWM,定时器等)

 

 

SCI发送

PWM产生占空比

PID运算

 

3.A/D采样数据处理

当采样到温度数据时,为了防止在采样过程中外界干扰而造成采样数据的不准确,必须调用温度均值处理程序,然后确定温度系数使采样转换得到的电压信号转换成温度值,并进行十进制转换,用于显示和PID计算。

其中均值处理是一个比较重要的环节,是A/D转换前必不可少的工具,流程图如下图所示:

4.键盘及LED显示

5.继电器控制

继电器是和单片机HCS12的PWM口相连的,它的开断完全取决于PID计算的结果。

当输出小于零说明设定值小于实际输出值,这是就要关闭电炉,同时关闭定时器的计时。

如果输出值大于设定值2摄氏度时就可以开电炉对水开始加热。

如果设定值与实际输出值差值在2摄氏度以内时,我们就调用中断程序定时加热。

下图控制程序的中断服务程序,用来对继电器定时加热。

它利用中断定时器10ms确定加热时间,当加热时间未到时,继续时间累积,若加热时间到时,就调用关定时器子程序,停止计时。

    

6.数据采样中断

下图是数据采样中断服程序的流程图,此中断程序采用的是2Hz中断,定时0.5秒采样一次。

     

     

 

四、调试过程及数据

在开始做这个设计的时候,先是把系统的每一部分都分成不同模块,每一个模块先单独作为一个工程建立,每一个模块调试成功之后才将各部分组合在一起,最终调试成为一个系统的。

系统的模块分为:

SCI串行口输入输出模块、LED数码管显示模块、KB键盘输入模块,AD转换输入模块,PWM模块。

模块的调试过程:

1.SCI串行口调试使用方法:

先将SCI的初始化,让接受程序,发送程序编译通过,然后在SCI的调试主程序中通过输入字符,并让其在电脑自带的超级终端上显示,如果超级终端成功显示我们在键盘上输入的字符,则说明SCI串行口模块可以调用,如果显示不成功则需要继续对程序进行修改和编译。

在串行口这里我遇到的问题是:

键盘输入的字符不在超级终端显示。

解决办法:

实验板的晶振16M,但是单片机MC9S12DG128中未启用锁相环,故单片机的内部总线实际上只有16M/2.所以在串行口波特率要求9600时,需要在程序的串口初始化中将SCI0BDL=0X80改为SCI0BDL=0X34。

2.LED数码管调试使用方法:

分析数码管的共阴或者共阳,让后将LED编程初始化,然后编译数码管的段选函数,位选函数。

在数码管的测试主函数中编程保证数码管能够显示我们输入的静态数字。

比如我们在主函数中,让数码管显示“0123”,4位数码能够正常显示0123,则说明数码管模块中的函数可以被调用,否则需要继续对程序进行修改和编译。

在数码管这里我遇到的问题是:

数码管不显示。

原因及解决办法:

刚开始的时候没有看到实验板的数码管的原理图和数据手册,自己按照课本上的管脚图,进行了实验板上的连线。

后来在老师的指导下,发现本次实验用的数码管管脚和课本不一致,在修改管脚连线后,数码管才正常显示数字。

3.KB键盘输入模块

在理解了4*4矩阵键盘的编程原理后,自己结合课本成功编译通过键盘程序。

并联合之前做的数码管模块和串行口通讯模块,达到了让矩阵键盘按键,数码管显示数字,同时通过超级终端在电脑上显示矩阵键盘按键的数字。

在键盘这里我遇到的问题是:

键盘输入的数字,在数码管上显示一位数字,但是在超级终端上显示一连串一摸一样的字符。

原因及解决办法:

键盘的扫描速度比串行口的通讯速度快,以至于在串行口检测数据的时候,键盘已经扫描多次,所以重复发送。

后来在程序中增加了一个延时程序,让扫描键盘之后等待一段时间,此时间比串口扫描时间略长,再扫描,最终达到按一下矩阵键盘,数码管显示数字,超级终端只出现一个数字的结果。

  4.AD转换输入模块

在编译通过AD转换程序后,联系数码管显示模块,用一个可变电阻(电位器)的检测采样,用单片机的AD转换通道AN06输入采样信号,将其转化为0~100可变数字,用以模拟温度0~100度的变化,并在数码管上显示。

在AD转换这里我遇到的问题是:

数码管显示的数字没有小数点.

原因及解决办法:

为了显示小数点,自己通过在数码管的程序中单独加入了一个数组DATA2,这个数组中的每一位数字“0123456789”中的编码都带有小数点,在显示程序调用时,让数码管的从右至左第二位数码管单独调用此数组。

而其他的几个数码管在调用显示数字时依然用DATA1I即这个数组中的每一位数字“0123456789”中的编码没有小数点。

五、实验结果与心得

结果:

达到了老师要求的键盘输入数码管及时显示,用电位器模拟温度变化时数码管及时显示0到100的变化,并且数码管的最后一位为小数部分。

但是遗憾的是,自己的自动控制算法没有很好的编译,未能通过程序,所以无法达到系统自动控制温度逐渐靠近通过4*4矩阵键盘设置的数值。

心得:

在这次设计性实验中,起初对硬件结构不是很清楚,走了一些弯路,随着对测试版的逐步了解,编写程序就变得得心应手了。

但是在其中仍然有不少的问题,只能在实验中一步一步的解决,最后基本完成了设计指导书中的大部分要求。

这次实验,对MC9S12DG128芯片的管脚和寄存器有了一定的了解,对程序的调制又有了不少的心的,同时对于PID的调试和编写有了更进一步的认识。

通过本次的设计性实验,自己对《嵌入式系统》课程更加了解,同时自己也在为这次设计的前期准备中学会了AltimDesigner的使用,现在自己能够独立完成一些简单电路的原理图绘制,并为该原理图设计PCB板图。

实验中,由于自身C语言基础不好,所以程序方面比较困难,而且经验不足,在老师和同学的帮助下,程序问题基本得到解决。

这次实验中用vb写了一个温度监控软件,在调试PID发挥了较大的作用,如果没有这个程序的话,实验室无法完成的。

这次设计性实验,我运用到了自己在课堂上学到的多科的理论知识,而且动手能力及程序调试方面都得到了提高。

同时我也体会到了理论知识与实践操作之间的差距,自己在某些知识方面还是有很大的欠缺,自己编程的能力有待提高,不能仅仅只停留在看懂程序,要慢慢学会自己编程,是自己的编程能力得到提高。

六、参考资料

电子设计自动化.马淑华高原P218ProtelDXP使用操作流程

计算机控制技术.顾德英张健马淑华P60A/D转换器接口设计

嵌入式系统——使用HCS12微控制器的设计与应用.王宜怀P119串行通信子函数

嵌入式系统——使用HCS12微控制器的设计与应用.王宜怀P134键盘处理函数

电力电子技术.金海明郑安平P119PWM整流电路基本原理

嵌入式系统——使用HCS12微控制器的设计与应用.王宜怀P141LED函数

嵌入式系统——使用HCS12微控制器的设计与应用.王宜怀P132键盘抖动处理

附件:

***********led.h********

#ifndefLED_H

#defineLED_H

#defineLEDdataPORTA

#defineLEDdata_DDDRA

#defineLEDcsPTT

#defineLEDcs_DDDRT

voidLEDInit(void);

voidLEDShow(INT8U*Buf);

voidLEDShow1(INT8Ui,INT8Uc);

#endif

**********pwm.h*********

#ifndefPWM_H

#definePWM_H

voidPwm_Init(void);

#endif

***********sci.h**********

#ifndefSCI_H

#defineSCI_H

#defineReSendStatusRSCI0SR1

#defineReTestBit5

#defineSendTestBit7

#defineReSendDataRSCI0DRL

voidSCIInit(void);

voidSCISend1(INT8Uo);

voidSCISendN(INT8Un,INT8Uch[]);

voidUsart_Send_Word(chardata);

voidUsart_Printf(char*data);

voidUsart_Init(void);

INT8USCIRe1(INT8U*p);

INT8USCIReN(INT8Un,INT8Uch[]);

voidSendToSCI(void);

#endif

*********timer.h********

#ifndefTIMER_H

#defineTIMER_H

voidECT_Init(void);

voidinterruptInt_TimerOverFlow(void);

#endif

*************ad***********

#ifndefAD_H

#defineAD_H

#defineSCFBit7

 

voidAD_Init(void);

voidADCInit(void);

INT16UADCvalue(INT8Uchannel);

INT16UADCmid(INT8Uchannel);

INT16UADCave(INT8Uchannel);

voidSample(void);

#endif

**********can.h***********

#ifndefCAN_H

#defineCAN_H

#defineCANE7

#defineINITRQ0

#defineINITACK0

#defineCLKSRC6

#defineLOOPB5

#defineLISTEN4

#defineDataFrm1

#defineRemoteFrm2

#defineRXF0

#defineTXE00

#defineTXE11

#defineTXE22

#defineTXS00

#defineTXS11

#defineTXS22

#defineTXF00

#defineTXF11

#defineTXF22

#defineIDE3

#defineRTR4

#defineERTR0

#defineCAN0BTR0V0X04

#defineCAN0BTR1V0X25

#defineCAN0IDACV0X00

#defineCAN0IDAR0V0X00

#defineCAN0IDAR1V0Xff

#defineCAN0IDMR0V0X00

#defineCAN0IDMR1V0X1F

#defineCAN0TIERV0X00

#defineCAN0TXFGCAN0TXIDR0

#defineCAN0RXFGCAN0RXIDR0

voidCANInit(void);

INT8UCANSND1DFRM(INT16UID,INT8U*DataBUF,INT8ULEN);

INT8UGetSNDBUF(void);

INT8UCANRCV1FRM(INT8U*CANRCVBUF);

#endif

***********isr.h*********

#ifndefISR_H

#defineISR_H

#defineEnableSCIReIntSCI0CR2|=0x20

#defineDisableSCIReIntSCI0CR2&=0xdf

voidISR_Receive(void);

#endif

*************key.h***********

#ifndefKEY_H

#defineKEY_H

#defineKB_PPTP//键盘接在P口上

#defineKB_DDDRP//数据方向寄存器

#defineKB_PEPERP//上拉下拉电阻允许寄存器

#defineKB_PSPPSP//极性选择寄存器

#defineKB_IEPIEP//中断允许寄存器

#defineKB_IFPIFP//中断标志寄存器

voidKB_Init(void);

INT8UKB_Scan1(void);

INT8UKB_Def(INT8UKB_valve);

INT8UKB_ScanN(INT8UKB_count);

voidKey_Del(void);

#endif

************type.h***********

#ifndefTYPE_H

#defineTYPE_H

#defineINT8Uunsignedchar

#defineINT16Uunsignedint

#endif

*********include.h************

#ifndefINCLUDES

#defineINCLUDES_H

#include"type.h"

#include"led.h"

#include"sci.h"

#include"timer.h"

#include"ad.h"

#include"can.h"

#include"isr.h"

#include"key.h"

#endif

/***********main.c*************/

#include/*commondefinesandmacros*/

#include/*derivativeinformation*/

#include"includes.h"

#pragmaLINK_INFODERIVATIVE"mc9s12dg128b"

INT16UTemperature_Set;

INT16UPID_P_Set=7;

INT16UPID_I_Set=5;

INT16UPID_D_Set=80;

INT8ULEDbuf[4]={'0','0','0','0'};

//数码管显示数组

INT8UFlag_Send,Flag_ADC,Set_Flag=0;

INT16UNUM;

INT8URCVData[16];//接收数据帧

voidmain(void){

/*putyourowncodehere*/

bytei,j,ge,shi,bai,point;

constINT8UData[]="Hello!

!

!

oooo";//数据内容

constINT8UDataLenth=6;//数据长度

INT16UID;//标示符

INT16UWaitTime=0;//循环延时

//发送标志=0,没有空闲发送缓冲区,发送不成功;=1,发送成功

INT8USNDFlag;

//接收标志=0xff,未收到帧;=1,收到数据帧;=2,收到远程帧

INT8URCVFlag;

DDRB=0XFF;

PORTB=0Xff;

ECT_Init();

LEDInit();

Usart_Init();

NUM=0;

Flag_ADC=0x00;

Flag_Send=0;

ADCInit();

AD_Init();

//SCIInit();

KB_Init();

CANInit();

Temperature_Set=50;

Pwm_Init();

EnableSCIReInt;

EnableInterrupts;

while

(1){

Key_Del();

Sample();

}

for(;;){}/*waitforever*/

/*pleasemakesurethatyouneverleavethisfunction*/

}

***********led.c**********

#include

#include

#include"type.h"

#include"led.h"

/*0123456789灭*/

constINT8UDtable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

/*3210*/

constINT8UCStable[4]={0xf7,0xfb,0xfd,0xfe};

voidLEDInit(void)

{

LEDdata_D=0xff;

LEDcs_D|=0x0f;

}

voidLEDShow1(INT8Ui,INT8Uc)

{

LEDcs=CStable[i];

if(i==2)

{

LEDdata=(~Dtable[c])&0x7f;

}

else

{

LEDdata=~Dtable[c];

}

}

voidLEDShow(INT8U*Buf)

{

INT8Ui,c;

for(i=0;i<=3;i++)

{

c=Buf[i]-'0';

LEDShow1(3-i,c);

}

}

***********detapage.c**********

#include

#include

#include"type.h"

#include"led.h"

/*0123456789灭*/

constINT8UDtable[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};

/*3210*/

constINT8UCStable[4]={0xf7,0xfb,0xfd,0xfe};

voidLEDInit(void)

{

LEDdata_D=0xff;

LEDcs_D|=0x0f;

}

voidLEDShow1(INT8Ui,INT8Uc)

{

LEDcs=CStable[i];

if(i==2)

{

LEDdata=(~Dtable[c])&0x7f;

}

else

{

LEDdata=~Dtable[c];

}

}

voidLEDShow(INT8U*B

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 建筑土木

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2