1、恒温控制系统设计报告学 院:电子信息学院班 级:12 级电子信息工程指导老师:xxx姓 名:zzz学 号:1228436867 前言水温控制无论是在工业生产中,还是在日常生活中都起着非常重要的作用,过低的温度或过高的温度都会使水资源失去应有的作用,从而造成水资源的巨大浪费。为了保证生产过程正常安全地进行,提高产品的质量和数量,以及减轻工人的劳动强度、节约能源,要求对水温进监测、显示、控制,使之达到工艺标准,满足需要。由于电子行业的迅猛发展,计算机技术和传感器技术的不断改进,而且计算机和传感器的价格也日益降低,可靠性逐步提高,用信息技术来实现水温控制并提高控制的精确度不仅是可以达到的而且是容易实
2、现的。其发展必将带来新一轮的工业化的革命和社会发展的飞跃。在计算机没有发明之前,这些控制都是我们难以想象的。而当今,随着电子行业的迅猛发展,计算机技术和传感器技术的不断改进,而且计算机和传感器的价格也日益降低,可靠性逐步提高,用信息技术来实现水温控制并提高控制的精确度不仅是可以达到的而且是容易实现的。用高新技术来解决工业生产问题, 排除生活用水问题实施对水温的控制已成为我们电子行业的任务,以此来加强工业化建设,提高人民的生活水平。采用 PID 算法进行温度控制,它具有控制精度高,能够克服容量滞后的特点,特别适用于负荷变化大、容量滞后较大、控制品质要求又很高的控制系统。因此,我们在此基础上运用
3、PID 控制器方案制作温度控制器。目录前言目录摘要3第 1 章 设计方案论证.31.1 主控芯片的选择 21.2 温度控制模块 .31.3 温度采集模块 .41.4 温度显示模块 4第 2 章 系统设计.52.1 总体方案设计 52.2 硬件电路设计52.2.1 stc89c52 最小系统模块.52.2.2 温度控制模块.62.2.3 温度采集模块72.2.4 温度显示模块82.2.5 键盘输入模块.92.3 软件设计.102.3.1 程序流程图.102.3.2 PWM 输出程序设计112.3.3 PID 程序设计.112.3.4 DS18B20 温度采集程序设计.122.3.5 数码管显示程
4、序设计.132.3.6 独立按键扫描程序设计.15第 3 章 系统测试.173.1 测试数据记录 .173.2 数据分析与结论 18第 4 章 总结.18参考文献.19附录19附录 1 主要元器件明细表附录 2 仪器设备清单附录 3 程序设计摘要:本设计基于 STC89C52RC 单片机水温测量及控制系统的设计。系统硬件部分由单片机电路、温度采集电路、键盘电路、LED 显示电路、MOS 管控制电路等组成。本系统采用数字式温度传感器 DS18B20 作为温度传感器,简易实用,方便拓展。软件设计中由两个定时器产生一个 PWM 波,并通过 PID 控制 PWM 波的占空比从而控制 MOS 管的通断时
5、间以控制加热功率。本系统可实现水温的动态平衡,稳态温差 0.1 摄氏度。关键词: STC89C52 占空比 PID第 1 章 设计方案论证1.1 主控芯片的选择方案一:STC89C52RCSTC89C52RC 单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单 片机,指令代码完全兼容传统 8051 单片机,STC89C52 为 8 位通用微处理器,采用工业标准的 C51 内核。内部含有两个 16 位定时器模块,两个外部中断,8k字节 flash 闪速存储器,256 字节 RAM,支持位操作指令方案二:MSP430F149Msp430f149 是 TI 公司推出的超低功耗处理器,工作电压
6、3.6V1.8V ,正常工作模式 280A1MHz,2.2V,待机模式 1.6A,RAM 数据保存的掉电模式下 0.1A。五级节电模式。内部含有 2 个 16 位计数器, 16 个外部中断,60k 字节flash 闪速存储器,2k 字节 RAM。由于温度具有很强的滞后性,所以对处理器的速度要求不高;又因为单片机功耗与加热功耗相比非常小,所以我们选择操作简单,价格便宜的STC89C52RC 单片机作为主控芯片。1.2 温度控制模块方案一:采用可控硅来控制加热器有效功率。可控硅是一种半控器件,应用于交流电的功率控制有两种形式:控制导通的交流周期数达到控制功率的目的;控制导通角的控制交流功率。由交流
7、过零检测电路输出方波经适当延时控制双向可控硅的导通角,延时时间即移相偏移量由温度误差计算得到。可以实现对交流电单个周期有效值周期性控制,保证系统的动态性能指标。该方案电路稍复杂,需使用光耦合驱动芯片以及变压器等器件。但该方案可以实现功率的连续调节,因此反应速度快,控制精度高。方案二:采用继电器控制。使用继电器可以很容易地实现通过较高的电压和电流,在正常条件下,工作十分可靠。继电器无需外加光耦,自身即可实现电气隔离。这种电路无法精确实现电热丝功率控制,电热丝只能工作在最大功率或零功率,对控制精度将造成影响。但可以由多路加热丝组成功率控制,由单片机对温差的处理实现分级功率控制提高系统动态性能。方案
8、三:采用 MOS 管控制MOS 管(Field Effect Transistor 缩写(FET) )简称场效应管。由多数载流子参与导电,也称为单极型晶体管。它属于电压控制型半导体器件。具有输入电阻高(108109) 、噪声小、功耗低、动态范围大、易于集成、没有二次击穿现象、安全工作区域宽等优点,场效应管能在很小电流和很低电压的条件下工作,而且它的制造工艺可以很方便地把很多场效应管集成在一块硅片上,因此场效应管在大规模集成电路中得到了广泛的应用。可控硅电路过载能力小,尤其是短路时必须要由快速熔短器来保护,安全性能差;继电器无法精确实现电热丝功率控制;所以我们选择方案三 1.3 温度采集模块 方
9、案一:选用 Harris 公司生产的采用激光修正的精密集成温度传感器AD590。AD590 的岑温范围是-55+150,最大非线性误差为0.3,响应时间为 20us,重复性误差低至0.05,功耗低,仅为 2mW。方案二:采用热敏电阻。选用此类元件的优点价格便宜,但由于热敏电阻的非线性特性会带来较大的误差。方案三:使用带有 A/D(模数转换)单片集成的 DS18B20 传感器。DS18B20数字温度计是 DALLAS 公司生产的即单总线器件,无需其他外加电路,直接输出数字量。可直接与单片机通信,读取测温数据。具有线路简单,性能稳定体积小的特点。比较以上方案,结合设计精度要求最小区分度为 1,所以
10、选择方案三。1.4 温度显示模块方案一:采用 8 个 LED 八段数码管分别显示温度的十位、个位和小数位。数码管具有低能耗,低损耗,寿命长,耐老化,对外界环境要求低。但 LED 八度数码管引脚排列不规则,动态显示时要加驱动电路,硬件电路复杂。方案二:采用带有字库的 12864 液晶显示屏。12864 液晶显示屏(LCD)具有功耗低、轻薄短小无辐射危险,平面显示及影像稳定,不闪烁,可视面积大,画面效果好,抗干扰能力强。同时,12864 带有字库,编程容易,且具有多种功能:光标显示、画面移位、睡眠模式,增加可读性,降低功耗。由于要显示只有设定和测量的两个温度值,8 位数码管足够使用,所以我们选择方
11、案一。第 2 章 系统设计2.1 总体方案设计2.2 硬件电路设计 2.2.1 stc89c52 最小系统模块STC89C52RC 单片机是宏晶科技推出的新一代高速/低功耗/ 超强抗干扰的单片机,指令代码完全兼容传统 8051 单片机,12 时钟/机器周期和 6 时钟/ 机器周 期可以任意选择。主要特性如下: 1、兼容 MCS51 指令系统;2、8kB 可反复擦写(大于 1000 次)Flash ROM;3、32 个双向 I/O 口;4、256x8bit 内部 RAM;5、3 个 16 位可编程定时/计数器中断;6、时钟频率 0-24MHz;7、2 个串行中断,可编程 UART 串行通道;8、
12、2 个外部中断源,共 8 个中断源;9、2 个读写中断口线,3 级加密位;10、低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;11、有 PDIP、PQFP、TQFP 及 PLCC 等几种封装形式,以适应不同产品的需求。AT89C52 为 8 位通用微处理器,采用工业标准的 C51 内核。主要管脚有:XTAL1(19 脚)和 XTAL2(18 脚)为振荡器输入输出端口,外接 12MHz 晶振。RST/Vpd (9 脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40 脚)和 VSS(20 脚)为供电端口,分别接+5V 电源的正负端。P0 端口(第 39-32 脚):双向信号,多功能端口。
13、它是八位漏极开路的双向 I/O 端口;在拓展外部总线时,分时作为低八位总线和八位双向数据总线。P0 端口可驱动八个 LSTTL 负载。P0 口漏极开路,即高阻状态,适用于输入/输出,可独立输入/输出低电平和高阻状态,若需要输出高电平,则需使用外部上拉电阻。P1 端口(第 1-8 脚):双向信号,具有内部上拉电阻的 8 位准双向 I/O 端口,可驱动四个 LSTTL 负载。P2 端口(第 21-28 脚):双向信号,多功能端口,具有内部上拉电路的 8位准双向 I/O 端口;在拓展外部总线时,用作高八位地址总线,可驱动四个LSTTL 负载。P3 端口(第 10-17 脚):双向信号,多功能端口,具
14、有内部上拉电路的 8位准双向 I/O 端口,可驱动四个 LSTTL 负载;该端口的每一位都可以作为其他功能模块的输入/输出及控制引脚使用。图 2.2.1STC89C52RC 最小系统2.2.2 温度控制模块 此部分电路主要由 MOS 管控制。MOS 管源极接地;漏极接一个50W,10 欧姆的加热电阻接 15V 直流电;栅极接单片机 PWM 波输出端口。单片机通过输出 PWM 波的占空比控制 MOS 管的闭合时间来控制加热功率;控制部分电路图如图 2.2.2 所示:图 2.2.2 温度控制电路2.2.3 温度采集模块 温度采集模块选用高度集成芯片 DS18B20。DS18B20 为单总线结构,总
15、共有三个引脚 VCC、GND 和信号线。电路连接简单方便,只需格外接少量的电阻电容。硬件电路图如图 2.2.3 所示:图 2.2.3 DS18B20 硬件连接图2.2.4 温度显示模块 温度显示模块采用 8 个八位共阴极数码管,通过 8 位锁存器MC74HC573 完成段选和位选,节省 IO 口的使用。硬件连接电路图如图2.2.4 所示:图 2.2.4 数码管显示电路2.2.5 键盘输入模块按键输入模块选用四个独立按键,通过独立按键扫描方式输入设定值。硬件电路图如图 2.2.5 所示:图 2.2.5 独立按键硬件连接图 2.3 软件设计 2.3.1 程序流程图YesNo图 2.3.1 程序流程
16、图开始定时器 0、1 初始化测量水的温度PID 算法调节占空比VsetVtest+3全速加热2.3.2 PWM 输出程序设计 本模块通过 STC89C52RC 两个定时器协调工作输出一个频率为 50Hz,占空比可调的 PWM 波形,并通过 P2.0 口输出以控制 MOS 管。其中定时器 1 初始值恒定为 0xb800,精确定时 0.02ms。通过改变定时器 0 的初始值改变占空比的大小,程序每执行一个循环重新装载一次定时器 0 的初始值。程序如下:void init_time(void) TMOD |=0X01; TMOD |=0X10; TH1=0Xb8; TL1=0X00; ET0=1;
17、ET1=1; EA=1; PT1=0; PT0=0; TR1=1; /定时器 0 中断服务函数void time0(void)interrupt 1 /PWM_OUT=0;TR0=0;/定时器 1 中断服务函数 void time1()interrupt 3TH1=0Xb8;TL1=0X00;PWM_OUT=1;TH0=th0;TL0=tl0;TR0=1;2.3.3 PID 程序设计PID 是比例(P)、积分(I)、微分(D)控制算法,计算公式为dout=kp*e+ki*se+kd*de; 比例(P)、积分(I)、微分(D)控制算法各有作用:比例,反应系统的基本(当前)偏差 e(t),系数大,
18、可以加快调节,减小误差,但过大的比例使系统稳定性下降,甚至造成系统不稳定;积分,反应系统的累计偏差,使系统消除稳态误差,提高无差度,因为有误差,积分调节就进行,直至无误差; 微分,反映系统偏差信号的变化率 e(t)-e(t-1),具有预见性,能预见偏差变化的趋势,产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除,因此可以改善系统的动态性能。但是微分对噪声干扰有放大作用,加强微分对系统抗干扰不利。 积分和微分都不能单独起作用,必须与比例控制配合。PID 算法程序如下:void pid(void)float t0,zkb;uint t0_value;float e=0,de=0,do
19、ut=0;e=set_value-test_value;se=se+e;de=e-le;dout=kp*e+ki*se+kd*de;le=e;zkb=15+dout;if(zkb80)zkb=80;t0=184.31*zkb;t0=65535-t0;t0_value=(uint)t0;th0=(t0_value tl0=(t0_value 2.3.4 DS18B20 温度采集程序设计DS18B20 是单总线结构,最高精度 0.0625 摄氏度。要读取温度时首先通过单总线向 DS18B20 发送跳过 ROM 指令,然后发送温度转换命令,等待温度转换完成后向 DS18B20 发送读取温度命令,然后
20、就可以读取 DS18B20 的 12 位采样值。程序如下:/18b20 温度转换与读温度操作函数 void read_18b20()short wendu;short a;short b;uint wd;init_18b20();display_value();keyscan();write_bites(0xcc);write_bites(0x44);delay_750ms();init_18b20();display_value();keyscan();write_bites(0xcc);write_bites(0xbe);display_value();a=read_bites();b=r
21、ead_bites();wendu=b*256+a;test_value=wendu*0.0625;wd=wendu*0.625;value3=wd/100;value4=wd/10%10;value5=wd%10;display_value();2.3.5 数码管显示程序设计数码管显示程序采用 8 个共阴极数码管动态刷新模式进行,通过 8 位锁存器 MC74HC573 完成段选和位选,节省 IO 口的使用。程序如下:void display_value(void)P0=sz12;DU=1;DU=0;P0=0x7f;WE=1;WE=0;delay_ms(1);P0=szvalue5;DU=1;
22、DU=0;P0=0xbf;WE=1;WE=0;delay_ms(1);P0=szvalue4+0x80;DU=1; DU=0;P0=0xdf;WE=1;WE=0;delay_ms(1);P0=szvalue3;DU=1;DU=0;P0=0xef;WE=1;WE=0;delay_ms(1);P0=sz12;DU=1;DU=0;P0=0xf7;WE=1;WE=0;delay_ms(1);P0=szvalue2;DU=1;DU=0;P0=0xfb;WE=1;WE=0;delay_ms(1);P0= szvalue1+0x80;DU=1;DU=0;P0=0xfd;WE=1;WE=0;delay_ms(
23、1);P0=szvalue0;DU=1;DU=0;P0=0xfe;WE=1;WE=0;delay_ms(1);2.3.6 独立按键扫描程序设计独立按键扫描程序采用 4 个独立按键不间断扫描方式进行,当独立按键按下后,对应 IO 口会变成低电平,消抖后通过判断对应 IO 口是否为低电平来判断按键是否按下。四个按键中,key1 的功能为设定温度整数部分-1,key2 功能为设定温度整数部分+1, key3 的功能为设定温度小数部分-1,key4 功能为设定温度小数部分+1,程序设计如下:void keyscan(void)if(key4=0) display_value();if(key4=0)w
24、hile(!key4) /等待按键松开 display_value();if(value1=0)value1=9;value0-;elsevalue1-;set_value=value0*10+value1+value2*0.1;if(key3=0)display_value();if(key3=0)while(!key3)display_value();if(value1=9)value1=0;value0+;elsevalue1+;set_value=value0*10+value1+value2*0.1;if(key2=0) display_value();if(key2=0)while
25、(!key2)display_value();if(value2=0)value2=9;if(value1=0)value0-;value1=9;elsevalue1-;elsevalue2-;set_value=value0*10+value1+value2*0.1; if(key1=0) display_value();if(key1=0)while(!key1)display_value();if(value2=9)value2=0;if(value1=9)value0+;value1=0;elsevalue1+;elsevalue2+;set_value=value0*10+value
26、1+value2*0.1;第 3 章 系统测试3.1 测试数据记录初始温度 :38.5设定温度 :44.7加热电压 :15V加热电阻 :10 欧姆全速加热功率:19W实验所测数据表格如表 3.1 所示:时间 t/分钟 0 1 2 3 4 5 6 7 8 9 10测量温度/摄氏度 38.5 40.8 41.9 43 43.6 44.1 44.5 44.6 44.6 44.6 44.6时间 t/分钟 11 12 13 14 15 16 17 18 19 20 21测量温度/摄氏度 44.6 44.6 44.6 44.6 44.6 44.6 44.6 44.6 44.6 44.6 44.6表 3.1
27、 时间、温度记录表3.2 数据分析与结论 由实验所测数据表格绘制如图 3.2 所示温度测量曲线图:图 3.2 温度测量曲线图由温度测量曲线图可以看出系统从设定温度 38.5逐渐靠近设定温度44.7,并最终稳定在 44.6不变。当系统稳定在 44.6时,输出占空比为40.5%,加热功率为 9.6W。另实验时观察输出占空比发现占空比在缓慢增加,当占空比缓慢增加到一定程度,系统将稳定在 44.7。在程序中可适当的增加PID 中的积分参数 I 的大小以使温度更快的稳定在设定温度。由温度测量曲线图可以看出本水温控制系统稳态误差为 0.1,系统上升时间 7 分钟。因此该水温控制系统很好的完成了设计要求。第
28、 4 章 总结本系统稳态误差小,超调量小,整体性能良好。另外,系统还可以通过按键设置设定温度大小,设定温度和控制温度可精确到一位小数;通过数码管动态实时显示设定温度和当前测量温度,人机交互界面良好。但设计也有些不足的地方:系统要用开关电源供电;加热功率最大 20W,系统上升时间较长;系统所处环境改变或所烧水量发生改变后,系统响应曲线会发生变化,可能会出现超调现象,但在 PID 作用下最终会稳定在设定温度上。参考文献1胡寿松. 自动控制原理.北京:科学出版社,2014.122 陈蕾,等.单片机原理与接口技术.苏州:机械工业出版社,2012.8附录附录 1 主要元器件明细表STC89C52RC、1
29、0 欧姆,50W 功率电阻、IRF530、DS18B20附录 2 仪器设备清单(1)数字示波器(2)直流稳压电源附录 3 程序主函数#include#define uchar unsigned char#define uint unsigned int#define kp_value 20#define ki_value 0.3#define kd_value 5sbit ds=P22; sbit DU=P26;sbit WE=P27;sbit PWM_OUT=P20;/*独立按键位定义*/sbit key1=P37; /设定温度整数部分-1sbit key2=P36; /设定温度整数部分+1
30、sbit key3=P35; /设定温度小数部分-1sbit key4=P34; /设定温度小数部分+1uchar code sz17=0x3f , 0x06 , 0x5b ,0x4f , 0x66 , 0x6d ,0x7d ,0x07 , 0x7f , 0x6f ,0x77 , 0x7c , 0x39 , 0x5e , 0x79 , 0x71 , 0x00; /0-9uint th0=0xc3,tl0=0x50;uchar value6=4,5,0,0,0,0;float kp=kp_value,ki=ki_value,kd=kd_value;float le=0,se=0;void dis
31、play_value(void);void keyscan(void);void pid(void);void delay_ms(uint xms) /xms 等于几就延迟几毫秒uint i,j;for(i=xms;i0;i-)for(j=112;j0;j-);void delay_750ms(void) /xms 等于几就延迟几毫秒uint i;for(i=0;i=1;if(temp) /写 1ds=0;j+;ds=1;j=8; /延时 60-120uswhile(j-);elseds=0;j=8; /延时 60-120uswhile(j-);ds=1;j+;j+;/18b20 读 1 个字
32、节 uchar read_bites(void)uchar i,j,temp,date;for(i=0; i=1;date=date | temp;j=8; /延时 60-120uswhile(j-);return date;/ 18b20 初始化函数 void init_18b20(void)uint i;ds=0; i=103; /将总线拉低 480us960uswhile(i0)i-;ds=1; /然后拉高总线,若 DS18B20 做出反应会将在15us60us 后将总线拉低i=4; /15us60us 等待while(i0)i-;void init_time(void) TMOD |=
33、0X01; /T0 工作在 16 位计数模式 TMOD |=0X10; /T1 工作在 16 位计数模式 TH1=0Xb8;TL1=0X00; /计时器 1 初值:50Hz ET0=1; /开启 T0 中断 ET1=1; /开启 T1 中断 EA=1; /开启总中断 PT1=0; /T0 优先级高 PT0=0;TR1=1; /定时器 0 开始计时 void display_value(void)P0=sz12;DU=1;DU=0;P0=0x7f;WE=1;WE=0;delay_ms(1);P0=szvalue5;DU=1;DU=0;P0=0xbf;WE=1;WE=0;delay_ms(1);P
34、0=szvalue4+0x80;DU=1; DU=0;P0=0xdf;WE=1;WE=0;delay_ms(1);P0=szvalue3;DU=1;DU=0;P0=0xef;WE=1;WE=0;delay_ms(1);P0=sz12;DU=1;DU=0;P0=0xf7;WE=1;WE=0;delay_ms(1);P0=szvalue2;DU=1;DU=0;P0=0xfb;WE=1;WE=0;delay_ms(1);P0= szvalue1+0x80;DU=1;DU=0;P0=0xfd;WE=1;WE=0;delay_ms(1);P0=szvalue0;DU=1;DU=0;P0=0xfe;WE=
35、1;WE=0;delay_ms(1);/数据转换与显示函数 /18b20 温度转换与读温度操作函数 void read_18b20()short wendu;short a;short b;uint wd;init_18b20();display_value();keyscan();write_bites(0xcc);write_bites(0x44);delay_750ms();init_18b20();display_value();keyscan();write_bites(0xcc);write_bites(0xbe);display_value();a=read_bites();b=
36、read_bites();wendu=b*256+a;test_value=wendu*0.0625;wd=wendu*0.625;value3=wd/100;value4=wd/10%10;value5=wd%10;display_value();void keyscan(void)if(key4=0) /年月日时分秒星期选择 display_value();if(key4=0)while(!key4) /等待按键松开 display_value();if(value1=0)value1=9;value0-;elsevalue1-;set_value=value0*10+value1+val
37、ue2*0.1;if(key3=0) /模式加 display_value();if(key3=0)while(!key3)display_value();if(value1=9)value1=0;value0+;elsevalue1+;set_value=value0*10+value1+value2*0.1;if(key2=0) /模式减 display_value();if(key2=0)while(!key2)display_value();if(value2=0)value2=9;if(value1=0)value0-;value1=9;elsevalue1-;elsevalue2-
38、;set_value=value0*10+value1+value2*0.1; if(key1=0) /加display_value();if(key1=0)while(!key1)display_value();if(value2=9)value2=0;if(value1=9)value0+;value1=0;elsevalue1+;elsevalue2+;set_value=value0*10+value1+value2*0.1;void pid(void)float t0,zkb;uint t0_value;float e=0,de=0,dout=0;e=set_value-test_v
39、alue;se=se+e;de=e-le;dout=kp*e+ki*se+kd*de;le=e;display_value();keyscan();zkb=15+dout;if(zkb80)zkb=80;t0=184.31*zkb;t0=65535-t0;t0_value=(uint)t0;th0=(t0_value tl0=(t0_value void main()uchar pid_state=0;init_time() ;while(1)read_18b20();display_value();keyscan();if(test_value(set_value-3)th0=0xc3;tl0=0x50;if(pid_state=1)kp=kp_value,ki=ki_value,kd=kd_value;le=0,se=0;pid_state=0;else pid_state=1;pid();/定时器 0 中断服务函数 void time0(void)interrupt 1 /PWM_OUT=0;TR0=0;/定时器 1 中断服务函数 void time1()interrupt 3TH1=0Xb8;TL1=0X00;PWM_OUT=1;TH0=th0;TL0=tl0;TR0=1;