电热恒温水壶设计报告

  • 格式:doc
  • 大小:165.00 KB
  • 文档页数:20

1

2009年格州电子杯电子设计竞赛作品设计报告

广西职业技术学院

题 目 电热恒温水壶

学生姓名 农承际、黄明隆、麦锦钊

专 业 应用电子技术

指导老师 李显圣、韦忠善

二00九年七月二十号

电热恒温水壶设计报告

前言 2 电热恒温水壶是一种自动控制温度电热器。随着社会的进步,人们对生活中用电器的性能有了更高的要求。而以往的电热恒温水壶保温的效果不是很理想,温度偏差太大。为了使电热器的加热后,保温效果更好。因此我们采用本电路的设计。本电路采用STC89C58微控芯片,通过软件实时检测采用PID调节法控制加热和保温,并通过数码管来显示保温的温度值。本电路由STC89C58最小系统、18B20温度采集、键盘系统、数码管显示、电热器组成。温度采集器通过实时监控温度的变化。

一、 系统组成原理

本电路硬件采用STC89C58微控制芯片为核心。结合外围电路单片机的最小系统、温度采集电路、数码显示电路、键盘电路等组成一个完整的控制系统。

电热恒温水壶控制总框图

二、 方案的设计与论证

本电路要求加热到80度后进入保温。因此,需要解决的问题是对温度进行实时采集和控制加热时间。

温度采集方案

方案一:采用热敏电阻。热敏电阻是一种随温度变化阻值随之变化的器件。当温度变化时热敏电阻的阻值,电阻两端产生的电压也随之变化。通过比较器设置的电压进行比较 ,对电压的变化来判断温度的变化。从而可以控制加热的时间。采用热敏电阻时,比较电路需要很精确的设计,且对电路要求跟高。

1、 方案二:采用温度芯片18B20进行温度采集。该温度芯片不

需要接外围电路,可以直接接至单片机,通过单片机直接读取 单

机 温度采集

键 盘 显 示

电热器控制 3 温度值。这样可以省掉部分电路的设计,同时电路也变得更简

洁,控制更好。

综合上述的方案,我们采用方案二。 方案二电路比较简单合理。

显示方案:

1、 方案一:采用LED显示。LED点阵可以显示多种字符以及图形,可用软件进行调制,有很强的兼容性以及可操作性。但是对于本系统来说其成本比较高。

2、 方案二:采用数码管显示。数码管体积小,又便于单片机控制。本系统需要显示1到9,硬件只需通过控制单片机来直接控制数码管的显示。采用数码管节约I/O口,同时减少成本。

综合上述的方案,我们采用方案二。

键盘设置方案:

1、 采用矩阵式键盘。此类键盘采用行列扫描方式取得按键的键号,在系统软件中,可以先把按键的键号取出,再给按键分配相应的功能,然后再根据设定好的功能进行相应的控制,其优点在于当按键较多时可减少占用单片机的I/O口数目,如果键盘的行数等于列数,则有:按键数 = 行数(或列数)的平方。

2、 采用独立式按键。一个按键单独占用一根I/O口线,此类键盘采用端口直接扫描方式,当有按键被按下时,I/O口的电平就相应被拉底。独立式按键的缺点是当按键较多时占用单片机的I/O口数目很多,如果系统庞大,还需要考虑扩展I/O口,增加成本。优点为电路设计简单,且编程相对简单。本系统只有四个按键功能,所以可以采用独立式按键,这样可以减少电路的复杂性,同时编程也比较简单。

综合上述的方案,我们采用方案二。

输出控制方案:

1、 方案一:采用普通继电器控制电热器加热。通过单片机输出的PWM脉冲来控制继电器的接通和断开。普通继电器性能不是很优越,反映慢。

2、 方案二:采用固态继电器控制电热器加热。通过单片机输出的

PWM脉冲来控制继电器的接通和断开。固态继电器交流端采用无触点接通和断开,性能优越反映快。

综合上述的方案,我们采用方案二。(固态继电器外接方式)

三、 硬件设计 4 通过上述方案的论证,我们最终得出本电路的组成方案。以下是本电路的各个部分的电路组成。

1、按键部分

采用独立式键盘,如下图。

按键名 功能

S2 设定保温温度值,加1度

S3 设定保温温度值,加10度

S4 设定保温温度值,减1度

S5 设定保温温度值,减10度

2、按键功能模块

3、 温度采集电路

温度采集电路的核心采用18B20,18B20采集的温度直接送至单片机进行处理。

5 4、 显示电路

显示部分采用数码管显示方式。数码管用四位一体的共阳数码管。段选直接有单片机控制,位选通过单片机P2口接上9015进行驱动数码管。

四、 软件设计部分

由于温度滞后性,我们主要采用PID控制算法来减,实测温度跟目标温度的误差。

PID控制,即取偏差的比例、积分、微分的组合控制。PID控制是连续系统应用最广、技术最成熟的控制方式之一,特别是在过程控制中,由于控制对象的模型未知或难以建立, 6 用基于现代控制理论的控制方法既不实用又不能达到预期效果,人们常常采用PID调节器。而且随着控制论的发展,在提出的层出不穷的各种算法中,有许多都以PID控制为基础算法。由于PID控制器的结构简单、性能稳定、参数易于调整,对温度控制效果很好。因此我们采用了PID控制算法。

常用的PID算法有位置式算法和增量式算法。位置式PID算法每次输出与整个过去状态有关,计算式中要用到过去误差的累加值,容易产生较大的累积计算误差。而增量式PID只需计算增量,计算误差或精度不足时对控制量的计算影响较小。

因此,我们决定在本系统中采用增量式PID算法。

公式为:Yk0 =Yk1+Δyk

=Yk1+P+I+D

=Yk1+Kp * (En0 - En1)+ Ki * En0+ Kd * (En0 -2 *

En1+En2)

上式中:Final_Tem——设定值;Yk0——第k次实际采样值;Yk1——第(k-1)次实际采样值;En2:第(k-2)次温差值;En1:第(k-1)次温差值;En0:第k次温差值; En0 = Final_Tem

- Yk0 ; Kp——比例系数;Ki——积分系数;Kd——微分系数。

PID位置算法中,“饱和”主要由积分项引起,称为“积分饱要克服“积分饱和”,就要限制积分作用,使积分积累不能过大。为为克服“积分饱和”,则采用积分分离法,其控制算式为:

{ > ξ PD运算

|En0 | =|Final_Tem - Yk0|{

{ < 或 = ξ PID运算

PID各参数Kp、Ki和Kd 值将只能通过结合硬件实际在线整定,以得到适合该系统的各项参数值。

主程序流程图

7

PID算法流程框图如图 初始化各参数值

检测温度(18B20)

PID运算

改变PWM波形

调用LED程序显示当前温度

检测键盘输入 8 置PID各参数值

En1= En2=0

En0= Final_Tem - Yk0

P= Kp * (En0 – En1)

D= Kd * (En0-2 * En1+En2)

ΔYk =P+I +D

Yk0= Yk1+ΔYk

Yk1= Yk0

En2= En1, En1= En0

返回 I= Ki * En0 I= 0 Y N

温度控制算法流程 |En0|>ε?

积分分离 9 主程序部分

#include

#include

#include "disp.h"

#include "DELAY.H"

#include "DS18B20.H"

#include "PID.H"

#define uchar unsigned char

#define uint unsigned int

sbit Pwm_Out=P1^5; //输出端口

sbit Add_Tem_1 = P3^0; //加高设定温度,每按一次加 1℃

sbit Add_Tem_10 = P3^1; //加高设定温度,每按一次加 10℃

sbit Sub_Tem_1 = P3^2; //加高设定温度,每按一次减 1℃

sbit Sub_Tem_10 = P3^3; //加高设定温度,每按一次减 10℃

uint HL=50;//占空比显示单元,初始化为中间值

uint DS=100;//定时中断计数器

void timer0() interrupt 1 //T0定时中断子函数

{

TH0=60; //重置定时初值 ,(65536-50000)/256

TL0=176; //定时4毫秒,(65536-50000)%256

if( HL==DS )//占空比计数器等于定时中断计数器否

Pwm_Out=1; //开通输出

DS--;

if (DS==0)//定时中断计数器为0否

{ Pwm_Out=0;//关断输出

DS=100; //重置初始值 ,跟默认初装值相同 10 }

}

///////////////////////////////////////////////////////////////////////

void Break_Ini()//中断初始化程序

{

TMOD=0x01; //T0方式1计时

TH0=(65536-50000)/256;//定时4毫秒

TL0=(65536-50000)%256;

EA=1; //总中断开

ET0=1;//定时器0开

TR0=1;//启动定时器

}

void main()

{

uchar i;

uint T0_Data,T1_Data,te,Final_Tem=8000;

T1_Data=50;

Pwm_Out=1;

PID_Ini();

Break_Ini();

while(1)

{

if(i==0)

{

te=Read_Temperature();

T0_Data = PID_increment(te,Final_Tem);

T1_Data = PID_Action(T0_Data);

if(T1_Data<=0)

{

EA=0;

Pwm_Out=0;