计算机控制系统实验报告

更新时间:2024-03-03 20:36:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

温度控制系统

一、题目要求

请设计一套以单片机为控制装置的温度控制系统,可以是电热炉温度控制,水温控制等,要求有合理的方案设计,总体结构图,算法选择和验证分析。可以以软件实现。推荐制造实物验证系统,并给出较好的精度和稳定性。

二、应用背景与理论基础

2.1 应用背景

温度是生活及生产中最基本的物理量,它表征的是物体的冷热程度。自然界中任何物理、化学过程都紧密的与温度相联系。在人类的生活环境中,温度扮演着极其重要的角色。在很多生产过程中,温度的测量和控制都直接和安全生产、提高生产效率、保证产品质量、节约能源等重大技术经济指标相联系。因此,温度的测量与控制在国民经济各个领域中均受到了相当程度的重视。

近年来,温度的检测在理论上发展比较成熟,但在实际测量和控制中,如何保证快速实时地对温度进行采样,确保数据的正确传输,并能对所测温度场进行较精确的控制,仍然是目前需要解决的问题。温度控制技术按照控制目标的不同可分为两类:动态温度跟踪与恒值温度控制。动态温度跟踪实现的控制目标是使被控对象的温度值按预先设定好的曲线进行变化。在工业生产中很多场合需要实现这一控制目标,如在发酵过程控制,化工生产中的化学反应温度控制,冶金工厂中燃烧炉中的温度控制等;恒值温度控制的目的是使被控对象的温度恒定在某一给定数值上,且要求其波动幅度(即稳态误差)不能超过某允许值。本文所讨论的基于单片机的温度控制系统就是要实现对水温的恒值温度控制,故以下仅对恒值温度控制进行讨论。从工业控制器的发展过程来看,温度控制技术大致可分以下几种: 2.1.1 定值开关控温法

所谓定值开关控温法,就是通过硬件电路或软件计算判别当前温度值与设定目标温度值之间的关系,进而对系统加热装置(或冷却装置)进行通断控制。若当前温度值比设定温度值高,则关断加热器,或者开动制冷装置;若当前温度值比设定温度值低,则开启加热器并同时关断制冷器。这种开关控温方法比较简单,在没有计算机参与的情况下,用很简单的模拟电路就能够实现。但由于这种控制方式是当系统温度上升至设定点时关断电源,当系统温度

下降至设定点时开通电源,因而无法克服温度变化过程的滞后性,致使被控对象温度波动较大,控制精度低,完全不适用于高精度的温度控制。 2.1.2 PID线性控温法

这种控温方法是基于经典控制理论中的PID调节器控制原理,PID控制是最早发展起来的控制策略之一,由于其算法简单、鲁棒性好、可靠性高等优点被广泛应用工业过程控制中,尤其适用于可建立精确数学模型的确定性控制系统。由于PID调节器模型中考虑了系统的误差、误差变化及误差积累三个因素,因此,其控制性能大大地优越于定值开关控温。其具体控制电路可以采用模拟电路或计算机软件方法来实现PID调节功能。前者称为模拟PID控制器,后者称为数字PID控制器。其中数字PID控制器的参数可以在现场实现在线整定,因此具有较大的灵活性,可以得到较好的控制效果。采用这种方法实现的温度控制器,其控制品质的好坏主要取决于三个PID参数(比例值、积分值、微分值)。只要PID参数选取的正确,对于一个确定的受控系统来说,其控制精度是比较令人满意的。但是,它的不足也恰恰在于此,当对象特性一旦发生改变,三个控制参数也必须相应地跟着改变,否则其控制品质就难以得到保证。

2.1.3 智能温度控制法

为了克服PID线性控温法的弱点,人们相继提出了一系列自动调整PID参数的方法,如PID参数的自学习,自整定等等。并通过将智能控制与PID控制相结合,从而实现温度的智能控制。智能控温法以神经网络和模糊数学为理论基础,并适当加以专家系统来实现智能化。其中应用较多的有模糊控制、神经网络控制以及专家系统等。尤其是模糊控温法在实际工程技术中得到了极为广泛的应用。目前已出现一种高精度模糊控制器,可以很好的模拟人的操作经验来改善控制性能,从理论上讲,可以完全消除稳态误差。

2.2 理论基础

PID控制策略是最早发展起来的控制策略之一,现使用的PID控制器产生并发展于1915-1940年期间。尽管自1940年以来,许多先进的控制方法不断的推出,但由于PID控制具有结构简单、鲁棒性好、可靠性高、参数易于整定,P、I、D控制规律各自成独立环节,可根据工业过程进行组合,而且其应用时期较长,控制工程师们已经积累大量的PID控制器参数的调节经验。因此,PID控制器在工业控制中仍然得到广泛的应用,许多工业控制器仍然采用PID控制器。

在现代计算机控制系统中,PID控制算法将由计算机软件实现。由于计算机软件的灵活性,利用就算几实现PID控制具有许多优点,可以将PID算法修改得更为合理,

1

得到许多考虑了实际要求的该井算法;同时对于参数的在线调整和修改更为方便,朝着更加灵活和智能化的方向发展。此外,计算机还能实现数据处理、显示、报警和打印功能,便于管理和造作。所以,用计算机实现数字PID算法获得了广泛的应用。 2.2.1 数字PID基本算法

数字PID算法主要包括位置式PID算法和增量式PID算法。除此之外,还有一些改进算法,包括抗积分饱和算法、微分改进算法等等。本次实验用到的算法在算法选择中会详细介绍,在此不再赘述。

2.2.2 PID调节参数的整定

一个PID控制必须选择几个主要参数,如KP,TI,TD以及采样周期T等。由于数字PID控制中,采样周期比被控对象的时间常数要小得多,所以是准PID控制,一般仍沿用连续PID控制的参数整定方法。 1. 试凑法确定PID参数

(1)首先只整定比例部分。比例系数KP由小变大,观察相应的系统响应,直到得到反应快,超调小的响应曲线。系统若无静差或静差已小到允许范围内,并且响应效果良好,那么只须用比例调节器即可。

(2)若稳态误差不能满足设计要求,则需加入积分控制。整定时先置积分时间TI为一较大值,并将经第1步整定得到的KP减小些,然后减小TI,并使系统在保持良好动态响应的情况下,消除稳态误差。这种调整可根据响应曲线的状态,反复改变KP及TI,以期得到满意的控制过程。

(3)若使用PI调节器消除了稳态误差,但动态过程仍不能满意,则可加入微分环节。在第2步整定的基础上,逐步增大TD,同时相应地改变KP和TI,逐步试凑以获得满意的调节效果。

2. 扩充临界比例度法

这种方法是对连续系统临界比例度法的扩充。适用于具有自平衡能力的被控对象,不需要准确知道对象的特性。具体步骤如下:

(1)选择一个足够短的采样周期T,通常可选择采样周期为被控对象纯滞后时间的1/10。

2

(2)用选定的T使系统工作。这时,去掉数字控制器的积分作用和微分作用,只保留比例作用。然后逐渐减小比例度?(?1/KP),直到系统发生持续等幅振荡。记下此时的临界比例度?k及系统的临界振荡周期Tk (即振荡波形的两个波峰之间的时间) 。  (3)选择控制度。

控制度????0?0[e(t)2dt]DDC[e(t)dt]模拟2

实际应用时并不需要计算两个误差平方积分,控制度仅表示控制效果这一物理概念。工程经验给出了整定参数和控制度的关系,通常认为控制度为1.05是,数字控制与模拟控制效果相当;控制度为2时,数字控制效果比模拟控制差得多。 (4)根据选定的控制度,查表2-1 ,求得KP、TI、TD的值。

(5)按计算所得参数投入在线运行,观察效果,如果性能不满意,可根据经验和对P、I、D各控制项作用的理解,进一步调节参数,直到满意为止。

表2-1 扩充临界比例度法整定参数

控制度 1.05 控制规律 PI PID 1.20 PI PID 1.50 PI PID 2.0 PI PID

T/Tk 0.03 0.014 0.05 0.043 0.14 0.09 0.22 0.16 Kp/Kk 0.53 0.63 0.49 0.47 0.42 0.34 0.36 0.27 TI/Tk 0.88 0.49 0.91 0.47 0.99 0.43 1.05 0.40 TD/Tk — 0.14 — 0.16 — 0.20 — 0.22 三、题目分析

题目要求是以单片机为控制装置的温度控制系统,考虑到成本、时间与安全等诸多因素,我选择做水温加热控制。该系统的任务包括软件仿真和硬件实现量大部分组成。软件部分主要用到的软件有Matlab、Simulink、Protues以及Keil。Matlab和Simulink主要做PID

3

算法仿真,Protues做的是电路仿真,Keil做的是单片机的编程。硬件部分主要包括单片机、继电器、温度传感器等部分。

水温控制系统的基本原理为:将设定温度与实际水温进行比较,它们的差值经PID计算后得到控制量,控制执行机构的输出功率,从而控制给水加热的能量大小,并且实时检测水温。其原理图如图3-1所示。

G(s) Y(z) 加热装置 水温 r(k) PID PWM ZOH 继电器 u(t) 温度传感器

图3-1 水温控制系统原理图

为了对该系统进行仿真,我们需要水温加热的传递函数。 设水温为T,环境温度(干扰)为T0,供热量

(3-1) Q1?I2R,Q2?KrA(T?T0) 式中:Kr为散热系数,A为散热面积。能量平衡式: Q1?Q2?GCPdT (3-2) dt式中:G为水的质量,CP为水的比热。将Q2带入(3-2)整理得:

GCPdT1?T?Q1?T0 (3-3)

KrAdtKrAGCP1为对象的供热时间常数,K?则得对象Q1?T为对象的供热比例系数,KrAKrA设Tc?特征的微分方程为 TcdT ?T?K (3-4)

dt对(3-4)作拉式变换,推出被测温度与供热之间的传递函数为 W(s)?K (3-5)

1?Tcs4

由上式不难看出,水温加热为一阶惯性环节。在实际实验过程中,发现用加热棒加热,会因加热不均,而产生迟滞,故而,最终的传递函数应为:

Ke??s W(s)? (3-6)

1?Tcs故水温加热环节为一阶惯性迟滞环节。

由上面的推导过程不难看出,对于水量的不同、环境的不同,所取得K、Tc和?也会不同,因此很难依靠经验确定参数。我们先做好了部分硬件,意图通过实验来完成数学模型的建立。

先利用相关离散化公式将式(3-6)离散化,采样时间T=1s,可以得到该系统的数字化时域形式:

y(k?1)?y(k)?1 [Ku(k??)?y(k)] (3-7)

Tc其中u(k??)为输入功率,y(k)为输出温度。

通过实验,不难得出延迟时间??5,其余数据如下表:

参数 组别 y(k) 43.6 y(k?1) 43.8 44.8 44.3 44.8 u(k?5) 28.5 25.5 42 54 K Tc 72 1 44.7 44.4 44.6 2 2 1.2 60 故K?1.6,Tc?66。所以得到传递函数为:

1.6e?5s W(s)? (3-7)

1?66s所以得到系统结构图为:

5

r(t) PID ZOH 1.6e?5s 1?66s

图3-2 水温控制系统原理图

四、算法选择

4.1 PID算法

4.1.1模拟PID控制算法离散化(PID位置式算法)

模拟PID控制器的基本算式为:

u(t)?Kp(e(t)?1TI?e(t)dt?TDde(t)) (2-1) dtD(s)?U(s)1?Kp(1??TDs) (2-2) E(s)TIs对式(2-1)离散化,可得

T u(k)?Kp{e(k)?TI?e(j)?j?0kkTD[e(k)?e(k?1)]} T?Kpe(k)?KI?e(j)?KD[e(k)?e(k?1)]} (2-3)

j?0通常,计算机输出的控制指令u(k)是直接控制执行机构(如控制流量的阀门),u(k)的值与执行机构输出的位置(如阀门的开度)相对应,随意将式(2-3)称为PID位置算法。按位置算法构成的计算机控制系统如图3-1所示。工业应用时,采用PID位置算法是不够方便和有欠缺的。由于要累计误差,占用内存较多,并且安全性较差。由于计算机输出的u(k)直接对应的是执行机构的实际位置,如果一旦计算机出现故障,u(k)的大幅度变化会引起执行机构位置的突变,在某些场合下,就可能造成重大生产是够。考虑到这种情况,在工业应用中,还采用一种增量式算法。

6

图2-1 PID位置式计算机控制系统

4.1.2 PID增量式算法

PID增量式算法是位置算法的一种改进。由式(1-3)可以得到(k-1)次的PID输出表达式:

u(k?1)?KPe(k?1)?KI由式(1-3)和(1-4)可得

?u(k)?KP[e(k)?e(k?1)]?KIe(k)?KD[e(k)?2e(k?1)?e(k?2)] (1-5) 该式为增量式PID算法。该算法优点:

(1)较为安全。因为一旦计算机出现故障,输出控制指令为零时,执行机构的位置(如阀门的开度)仍可保持前一步的位置,不会给被控对象带来较大的扰动。 (2)计算时不需进行累加,仅需最近几次误差的采样值。

增量式算法带来的主要问题是执行机构的实际位置也就是控制指令全量的累加需要用计算机外的其他的硬件(如步进电机)实现。,如图2-2。因此,如果系统的执行机构具有这个功能,采用增量算法是很方便的。

?e(j)?Kj?0k?1D[e(k?1)?e(k?2)] (1-4)

图2-2 PID增量式计算机控制系统

4.2 Smith预估控制

在工程过程控制中,许多被控对象具有纯滞后的性质。Smith提出了一种纯滞后补偿模型,其原理为,与PID控制器并接一个补偿环节,该补偿环节称为Smith预估器。带有纯迟滞

Gc(s)G0(s)e??sY(s)?的单回路控制系统的闭环传递函数为:?(s)?。其特征方程为R(s)1?Gc(s)G0(s)e??s1?Gc(s)G0se??s?0。可见,特征方程中出现了纯延迟环节,是系统稳定性降低。如果?足

够大,系统讲不稳定,这就是大延迟过程难于控制的本质。针对这种问题,Smith提出采用人造模型的方法,构造如图2-3所示的控制系统:

7

图2-3 Smith预估控制系统

五、仿真

5.1 位置式PID仿真

5.1.1 MATLAB仿真程序。

ts=1;%采样时间

sys=tf([1.6],[66,1],'inputdelay',5);%传递函数 dsys=c2d(sys,ts,'z');%离散化 [num,den]=tfdata(dsys,'v');

u_1=0;u_2=0;u_3=0;u_4=0;u_5=0;u_6=0; y_1=0;y_2=0;y_3=0;%设定初值 x=[0,0,0]'; error_1=0; for k=1:1:350 time(k)=k*ts;

yout(k)=-den(2)*y_1+num(2)*u_6; %延时抽样为5s rin(k)=45;

Kp=5.95;Ki=0.1;Kd=0.28;%PID参数设定

u(k)=Kp*x(1)+Kd*x(2)+Ki*x(3);%位置式PID控制信号 error(k)=rin(k)-yout(k);%误差

u_6=u_5;u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k); y_3=y_2;y_2=y_1;y_1=yout(k); x(1)=error(k);%参数P

x(2)=(error(k)-error_1)/ts;%参数D x(3)=x(3)+error(k)*ts;%参数I error_1=error(k); end figure(1);

plot(time,rin,'k',time,yout,'b')%画图

5.1.2 PID参数计算

8

首先用扩充临界比例度法来选定参数。按照上面介绍的步骤,增大KP使系统发生等

幅振荡。当KP?10.34时,系统发生等幅振荡,如下图所示:

图5-1 系统等幅震荡

由上图可以得知:Kk?10.34,Tk?25。经计算,该系统的控制度为1.20。故KP?5,

KI?0.1,KD?0.25。以此为基础,结合试凑法确定PID参数,进行Matlab仿真。

5.1.3 仿真结果

首先令KP?5,KI?0.1,KD?0.25,仿真结果如下

9

图5-11 水温控制系统PID 仿真曲线图(Kp=3,Ki=0.05,Kd=0.25)

5.2.3 Simulink仿真

增量式PID的Simulink仿真图如图5-12所示:

图5-12 位置式PID仿真图

MATLAB Function中的函数如下:

function [u]=pidsimf(u1,u2)

persistent pidmat errori error_1 error_2 u_1 if u1==0 errori=0 error_1=0 error_2=0 u_1=0 end ts=1; kp=3; ki=0.000012; kd=5;

error=u2;

errord=(error-error_1);

errori=error-2*error_1+error_2;

du=kp*errord+kd*errori+ki*error; u=u_1+du; u_1=u;

15

error_2=error_1; error_1=error;

令KP?3,KI?0.000012,KD?0时,系统稳定,且无超调,控制效果好。如图5-13所示。

图5-13 温度控制系统Simulink仿真图(Kp=3,Ki=0.000012,Kd=0)

5.3 Smith预估控制系统

5.3.1 Smith预估控制系统Matlab程序

Ts=1; kp=1.6; Tp=66; tol=5;

sys=tf([kp],[Tp,1],'inputdelay',tol); dsys=c2d(sys,Ts,'zoh'); [num,den]=tfdata(dsys,'v'); kp1=kp; Tp1=Tp; tol1=tol;

sys1=tf([kp1],[Tp1,1],'inputdelay',tol1); dsys1=c2d(sys1,Ts,'zoh'); [num1,den1]=tfdata(dsys1,'v');

u_0=0;u_1=0.0;u_2=0.0;u_3=0.0;u_4=0.0;u_5=0.0; e1_1=0; e2=0.0; e2_1=0.0;

16

ei=0;

xm_1=0.0; ym_1=0.0; y_1=0.0;

for k=1:1:350 time(k)=k*Ts;

rin(k)=45.0; %输入信号

xm(k)=-den1(2)*xm_1+num1(2)*u_1;

ym(k)=-den1(2)*ym_1+num1(2)*u_5; %加入延迟 yout(k)=-den(2)*y_1+num(2)*u_5; P=15; I=0.3;

e2(k)=rin(k)-xm(k); ei=ei+Ts*e2(k); u(k)=P*e2(k)+I*ei; e2_1=e2(k);

xm_1=xm(k); ym_1=ym(k);

u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u_0;u_0=u(k); y_1=yout(k); end

plot(time,rin,'b',time,yout,'r'); xlabel('time(s)');ylabel('rin,yout');

5.3.2 Matlab仿真结果

17

图5-14 温控制系统Smith仿真曲线图(Kp=15,Ki=0.3,Kd=0)

如果不加入Smith,在同等PID参数的情况下,系统完全发散,如下图:

图5-15 加Smith的水温控制系统仿真曲线图(Kp=15,Ki=0.3,Kd=0)

由上图不难看出,Smith对系统的调节作用非常明显。

5.3.2 Smith预估控制系统Simulink仿真

Simulink仿真图图5-16所示:

18

图5-16 Smith预估Simulink仿真

当KP?15,KI?0.3,KD?0,加入Smith的相应和为加入的响应如图5-17和5-18所示:

图5-17 Smith预估的Simulink仿真结果

19

图5-17 未加入Smith预估的Simulink仿真

对比图5-16和图5-17,加入Smith预估控制的系统要比为加入Smith预估控制的系统稳定的多。

5.4 实际实验算法选择

从上面的仿真可以看出,系统无论是用位置式PID、增量式PID亦或是加入Smith预估的PID,系统都可以稳定。但是,增量式算法的控制指令全量的累加需要用计算机外的其他的硬件,会增加实验成本,因此不选用。而Smith系统的稳定性虽然高于位置式,但是其存在控制函数较为复杂,对存储空间要求高的缺点,因此我决定选择最为简单、也最为实用的位置式PID算法来进行硬件的控制。

六、方案、结构设计

6.1 方案设计

选择单片机为控制核心,利用温度传感器,加热棒等构建温度控制系统。控制算法采用位置式PID。

6.2 结构设计

6.2.1 硬件结构设计

按照题目要求,我们用单片机作为控制器,通过编程实现其对温控控制系统的控制。我们令温度传感器传回的温度与单片机内部的温度的设定至之差,通过PID相关算法运算,转换成PWM波最为控制信号输出,控制继电器的开关使执行机构(加热棒)为被控对象(水杯内的水)加热,改变水的温度。从而形成闭环控制系统。与此同时,还可以通过单片机实现对LCD液晶屏的控制,实现温度的实时显示和温度曲线的绘制。此外,我们还可以利用单片机使数据的返回电脑,从而实现利用电脑做出温度变化曲线以及数据的分析。硬件结构示意图如6-1所示。

20

单片机 (STC12LE5A60S2) P2.0~P2.4 PC LCD液晶屏 PWM P1.2 P2.6 温度传感器 继电器 加热棒 (DS18B20) 水杯

图6-1 硬件结构示意图

6.2.2 软件结构设计

我们利用软件编程实现对于单片机的控制。主程序主要包括是数据定义以及一些子程序的调用。其中,子程序主要包括测温子程序、显示子程序、PID控制子程序、中断子程序等等,其详细功能在图6-2中,在此不再赘述。

主程序 测温子程序 显示子程序 PID控制子程序 中断子程序 实时温度测量; 采样时间50ms LCD温度显示; 刷新时间50ms LCD打点记录温度曲线;打点时间 2.5s 增量式PID控制 PWM波输出; 周期5s 数据返回电脑; 采样时间1s

图6-2 软件结构示意图

七、硬件选型

7.1 单片机型号:STC12LE5A60S2

STC12C5A60S2/AD/PWM 系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,

21

是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S一次,即25万次/秒),针对电机控制,强干扰场合。其主要特点如下:

1) 增强型 8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051; 2) 工作电压:STC12LE5A60S2 系列工作电压: 3.6V-2.2V;

3) ISP(在系统可编程)/ IAP(在应用可编程),无需专用编程器,无需专用仿真器可通

过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;

4) 共4个16位定时器:两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定

时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可再实现2个16位定时器;

5) PWM(2路)/ PCA(可编程计数器阵列,2路);

6) A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次);

7) 通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件

实现多串口。

由上面介绍可知,该类型的单片机与普通C51相比,既有速度快、功耗低等优点,且片内集成PWM及A/D转换电路,功能强大,且程序下载较普通单片机更为简单,因此选用该型号的单片机。

7.2 温度传感器

常用的温度传感器有PT1000、AD590以及DS18B20。考虑到前两种传感器均需A/D转换电路才可完成测温,因此选用电路更为简单、不需外接A/D就可测温的DS18B20温度传感器。

本次试验选用DS18B20传感器,DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种数字化单总线器件,属于新一代适配微处理器的改进型智能温度传感器。使用DS1SB20可使系统结构更趋简单,可靠性更高。其测量温度范围为-55℃~+125℃,在-10℃~85℃范围内,精度为土0.5℃。现场温度直接以“一线总线”的数字方式传输,用符号扩展的16位数字量方式串行输出,大大提高了系统的抗干扰性。因此,数字化单总线器件DS18B20适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。它在测温精度、转换时间、传输距离、分辨率等方面较DS18B20都有了很大的改进,给用户带来了更方便和更令人满意的效果。DS18B20的性能特点如下:

1) 采用DALLAS公司独特的单线接口方式:DS18B20与微处理器连仅需要一条口线即可实现

微处理器与DSI8B20的双向通讯;

22

2) 在使用中不需要任何外围元件。可用数据线供电,供电电压范围+3.0V~5.5V; 3) 可用数据线供电,供电电压范围+3.0V~5.5V;

4) 测温范围:-55℃~125℃。固有测温分辨率为0.5℃。当在-10℃~+85℃范围内,可确保测

量误差不超过0.5℃,在-55℃~+125℃范围内,测量误差也不超过2℃; 5) 通过编程可实现9~12位的数字读数方式; 6) 用户可自设定非易失性的报警上下限值;

7) 支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现多点测温; 8) 负压特性,即具有电源反接保护电路。当电源电压的极性反接时,能保护DS18B20不会

因发热而烧毁。但此时芯片无法正常工作;

9) DS18B20的转换速率比较高,进行9位的温度转换仅需93.75ms; 10) 适配各种单片机或系统;

7.3 加热装置

考虑到给水加热的应用环境及成本等因素,选用220V/150W加热棒为温度控制系统加热。

7.4 显示装置

为了能够实时显示温度,还需要显示装置。目前常用的显示装置有两种——LED和LCD,考虑到LED电路较为复杂,且无法直接绘出温度曲线,故选用铭正同创12864显示模块。其主要特点如下: 1) 128 ×64 点阵;

2) 串行SPI接口方式(仅写入);

3) 自带12×12点和16×16点汉字库(包含一级和二级汉字库); 4) 自带6×10、8×16点ASCII码西文字库(96个字符);

5) 自带基本绘图GUI功能(绘点、直线、矩形、矩形框、实心圆形、圆形框);6.自带整

型数显示功能,直接输入整型数显示,而无需作变换;

6) 带有背光控制指令,只需一条指令便可控制背光亮度等级(0~127)。 7) 模块本身是3.3V供电

7.5 控制环节

本实验采用PWM波控制加热棒的加热。PWM波为高低电平,而加热棒则需要220V交流供电,因此中间需要一个利用小电压控制大电压的控制环节。目前常用的有继电器和光耦元件。光耦元件隔离效应好,无声音,但是成本也较高。而继电器控制简单,电路简单,同时成本很低,基本可以完成PID的控制需要,因此在本实验中选用继电器进行控制。

23

八、硬件电路及软件设计

8.1 硬件电路

8.1.1 测温电路

图8-1 测温电路

DS18B20外围电路较为简单,只需在数据线和电源之间连接一个电阻。数据线接单片机P2.6口。 8.1.2 继电器电路

图8-2 继电器电路

继电器电路与P1.2口相连,P1.2口输出PWM波,经三极管8550放大电流后,与继电器线圈端相连,与此同时,在线圈端,并上一个发光二极管,当电路正在加热时,二极管发光,这样更加易于监测电路。当P1.2为高点平时,三极管不能导通,继电器处于常闭端。当P1。2为低电平时,三极管导通,对电流放大,继电器由常闭端吸合至常开端。 8.1.3 加热电路

24

现,8550在同等价格的三级管里放大倍数已经不小了。因此,我考虑在只在继电器这一边利用5V供电。我先将继电器相关电路与单片机断开,利用5V电源给继电器供电,继电器成功打开了。此时,我检查了一下与单片机相连的三极管基极的电流,大约为0.3mA左右。随后,我又查阅了一下单片机的手册,单片机I/O口可以承受的电流为20mA左右,因此这种方案在理论上是可行的。实验的结果也证实了我这一想法。

9.2 软件调试

在软件的编程上,我还是遇到了一些困难。主要是由于我以前没有用过Keil,平时接

触单片机也不太多,好在Keil的界面很友好,又有C语言的基础,虽然是费了一番功夫,但最终还是完成了程序的编写。在程序调试方面,我遇到的最大的问题就是采样时间的控制,例如多少秒进行一次温度采集,多少秒在LCD上画一个点,多少秒向电脑返回一回数据,经过多次的实验,根据每一种功能不同的需要,我确定了不同的周期。在上面的介绍中已经有所提及,在此不再赘述。

9.3 系统调试与实验结果

根据上面的仿真结果,PID三个参数分别取KP?6,KP?0.1,KD?0.28,但是

单片机的运算空间有限,为节省空间,我们只取PID参数和温度的整数部分进行计算,因此令KP?6,KP?0,KD?0。PID控制程序如下: void init_pid() {

spid.Proportion = 6; // 设定PID参数 spid.Integral = 0; spid.Derivative =0;

spid.SetPoint = set; // 设定温度温度 }

unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) {

signed int dError,Error;

Error = pp->SetPoint - NextPoint; // 偏差 pp->SumError += Error; // 积分

dError = pp->LastError - pp->PrevError; // 当前微分 pp->PrevError = pp->LastError; pp->LastError = Error;

return (pp->Proportion * Error+ pp->Integral * pp->SumError + pp->Derivative * dError); }

void duty_cycle(unsigned int t) // 占空比 {

30

unsigned char s;

t=t/10; //实际温度 s=set; if(s>t) {

if((s-t)>2) low_time=100; else {

rout = PIDCalc ( &spid,t ); // PID控制量返回值 if(low_time<=100)

low_time=(unsigned char)(rout/6); else

low_time=100; } } else {

low_time=0; } }

通过串口返回数据,利用Matlab画图。Matlab程序如下: a=[];

for i=1:322

time(i)=(i-1)*1;

b(i)=a(i*2-1)+a(2*i)/100; c(i)=45; end

plot(time,b,'b',time,c,'r') 其中,数组a中存放的是串口返回的数据值。 控制实测结果如9-1所示:

31

图9-1 水温控制系统PID 控制温度变化曲线图(Kp=6,Ki=0,Kd=0)

由上图不难看出,当温度大约44℃时系统的加热速度明显减慢,斜率急剧变小,虽然系统最终稳定,且没有稳态误差,但其调节时间也因此而变长。为改善此系统,我增大了比例环节,令KP?8,KP?0,KD?0。实验结果如下:

图9-2 水温控制系统PID 控制温度变化曲线图(Kp=8,Ki=0,Kd=0)

32

由上图可以看出,水温控制系统基本上已经满足控制要求,水温稳定在45℃左右,无超调,无稳态误差,控制效果很好,调节时间在128s左右。

为了能够进一步了解系统,可以继续增大KP,令KP?10,KP?0,KD?0。实验结果如下:

图9-3 水温控制系统PID 控制温度变化曲线图(Kp=8,Ki=0,Kd=0)

由上图可以看出,该系统存在较大超调,虽然趋势上是可以稳定的,但是调节时间会很长,对于该水温控制系统,并不是很适合。

虽然图9-2获得了较好的实验效果,但是其PID所用参数和温度误差的类型为整形,这使得算法的精度并不高,且温度在某一度内所得的误差是一样的,因此控制量较为粗糙。为了能在不增大内存占用的基础上,进一步提高系统精度,我采用了将相关参数先乘以10,再计算完后再除以10的办法来解决。令KP?6,KP?0.1,KD?0.3。修改后的程序如下

(斜体的为修改过的地方):

void init_pid() {

spid.Proportion = 60; // 60是将P*10得到的,实际Kp =6,以下如是 spid.Integral = 1; //Ki=0.1 spid.Derivative =3; //Kd=0.3 33

spid.SetPoint = set; }

unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) {

signed int dError,Error;

Error = pp->SetPoint*10 - NextPoint; // 偏差 pp->SumError += Error; // 积分 dError = Error-pp->LastError; // 当前微分 pp->PrevError = pp->LastError; pp->LastError = Error;

return (pp->Proportion * Error+ pp->Integral * pp->SumError + pp->Derivative * dError);

}

void duty_cycle(unsigned int t) // 占空比 {

unsigned int s; s=set*10; if(s>t) {

if((s-t)>20)

low_time=100;

else {

rout = PIDCalc ( &spid,t );

if(low_time<=100)

low_time=(unsigned char)(rout/(100*0.7)); else

low_time=100;

}

34

} else {

low_time=0; } }

实验结果如下:

图9-3 水温控制系统PID 控制温度变化曲线图(Kp=6,Ki=0.1,Kd=0.3)

不难看出,实际系统与仿真结果得到了很好的统一,在KP?6,KP?0.1,KD?0.3时,系统能够较快达到稳定,无超调,无稳态误差,调节时间也较短,控制效果很好。

参考文献

[1] 高金源.计算机控制系统[M].北京:清华大学出版社,2007.

[2] 刘金琨.先进PID控制及其Matlab仿真(第二版)[M].北京:电子工业出版社,2002.

[3] 赵春锋, 孙兴朋, 王东兴. 基于MATLAB /Simu1ink下加热炉传递函数的PID仿真试验 [J].节能, 2009,4:20-22.

[4] 张越,张炎,赵延军. 基于单片机和模糊控制的水温自动控制系统[J]. 仪表技术与传感器, 2001,7:71-72.

[5]PID温度控制[D].辽宁:渤海大学,2010

35

附1:整体电路图:

附2:实物图

附3:程序清单(忽略头文件): 主程序:

#include \

void duty_cycle(unsigned int t); void DelayXus(); void DS18B20_Reset(); void DS18B20_WriteByte(); void xint0(); void xtimer0();

unsigned char lowtime,hightime,counter=0; extern unsigned char low_time; unsigned int cycle=0; unsigned int j,flag;

unsigned int a,flag,shu1,shu2,shu3; unsigned long temp;

unsigned int count,y,time=0;

//定义小数计算部分

36

sbit DQ = P2^5; //DS18B20的数据口位P3.3 sbit PWM=P1^2;

typedef unsigned char BYTE;

BYTE TPH; //存放温度值的高字节 BYTE TPL; //存放温度值的低字节 BYTE TPH1; //存放温度值的高字节 BYTE TPL1; //存放温度值的低字节

void DelayXus(int n) {

while (n--) {

_nop_();

_nop_(); } }

/************复位DS18B20,并检测设备是否存在************/ void DS18B20_Reset() {

CY = 1; while (CY) {

DQ = 0; //送出低电平复位信号 DelayXus(480); //延时至少480us DelayXus(480);

DQ = 1; //释放数据线 DelayXus(60); //等待60us CY = DQ; //检测存在脉冲 DelayXus(240); //等待设备释放数据线 DelayXus(180); } }

/**************从DS18B20读1字节数据******************/ BYTE DS18B20_ReadByte() {

BYTE i; BYTE dat = 0;

for (i=0; i<8; i++) //8位计数器 {

dat >>= 1;

37

DQ = 0; //开始时间片 DelayXus(1); //延时等待 DQ = 1; //准备接收 DelayXus(1); //接收延时 if (DQ) dat |=0x80; //读取数据

DelayXus(60); //等待时间片结束 }

return dat; }

/**************向DS18B20写1字节数据***************/ void DS18B20_WriteByte(BYTE dat) {

char i;

for (i=0; i<8; i++) //8位计数器 {

DQ = 0; //开始时间片 DelayXus(1); //延时等待 dat >>= 1; //送出数据 DQ = CY;

DelayXus(60); //等待时间片结束 DQ = 1; //恢复数据线 DelayXus(1); //恢复延时 } }

/****************中断初始化*****************/ void init() {

cycle=0;

IE=0X0A;//开总中断,开T0、T1中断

TMOD=0x21;//T1为定时器工作于方式2 T0为定时工作于方式1 TH0=0x3c;//定时器赋高8初值 , 12M晶振 TL0=0xb0;//定时器赋低8初值 , 12M晶振,50ms TH1=0xfd; TL1=0xfd; TR1=1;

TR0=1;//开定时器1 REN=1; SM0=0; SM1=1; EA=1; ES=1;

38

}

/************主函数*************/ main() {

unsigned int x,c; unsigned char num=0;

x=0; c=100; ClrScreen();

//设置背光的亮度等级为0

FontSet(1,1); SetBackLight(40);

while(1)

{ if(cycle>9) {

float f_j; TR0=0; EA=0; //温度测量

DS18B20_WriteByte(0xCC); //跳过ROM命令 while (!DQ); //等待转换完成 DS18B20_Reset(); //设备复位 DS18B20_WriteByte(0xCC); //跳过ROM命令

init_pid(); init();

//调用定时器,计数器初始化

DS18B20_Reset(); //设备复位 DS18B20_WriteByte(0x44); //开始转换命令

DS18B20_WriteByte(0xBE); //读暂存存储器命令 TPL = DS18B20_ReadByte(); //读温度低字节 TPH = DS18B20_ReadByte(); //读温度高字节

j=TPH; j<<=8; j=j|TPL; f_j=j*0.0625; TPH1=j=f_j*10+0.5;

TPL1=count=(TPL&0x0f)*625/1000; EA=1; shu1=j/100; shu2=(j)0/10; shu3=count; PutChar(0,0,((j)/100)+48);

39

//温度显示

}

PutChar(8,0,((j)0/10+48)); PutChar(16,0,46);

PutChar(24,0,(count)+48); PutPixel(37,1); PutPixel(38,0); PutPixel(38,2); PutPixel(39,1); PutChar(40,0,67);

cycle=0;

TH0=0x3c; //定时器赋高8初值 , 12M晶振 TL0=0xb0; //定时器赋低8初值 , 12M晶振 TR0=1; num++;

PutChar(64,0,((low_time)/100)+48); PutChar(72,0,((low_time)0/10+48)); PutChar(80,0,((low_time)+48)); if(num>=5&&num<128)

{

//开定时器1

duty_cycle(j/10*10+count);

if(x<128)

num=0; y=84-j/10;

PutPixel(x,y); x++; }

{

else

ClrScreen(); }

x=0; }

}

void xtimer0() interrupt 1 //PWM {

unsigned int wendu,i; wendu=shu1*16+shu2;

i=low_time/10*16+low_time; if(time>20) {

ES=0; SBUF=wendu;

40

}

}

while(!TI); for(j=0;j<500;j++); TI=0;

SBUF=shu3*16;

while(!TI); for(j=0;j<500;j++); TI=0; ES=1; time=0;

if(++counter<=(low_time)) PWM=0; else if(counter<=100) PWM=1; else

TH0=0x3c;//定时器赋高8初值 , 12M晶振 TL0=0xb0;//定时器赋低8初值 , 12M晶振 cycle++; time++;

counter=0;

void ints() interrupt 4 { }

PID程序:

unsigned char set=45; //温度初始值 unsigned int rout; // PID响应 unsigned char low_time=50; //占空比调节参数

#include \

struct PID {

unsigned int SetPoint; // 设定目标 unsigned int Proportion; // 比例 unsigned int Integral; // 积分 unsigned int Derivative; // 微分 signed int LastError; // Error_1 signed int PrevError; // Error_2 signed int SumError; // 误差和

41

TI=0; RI=0; a=SBUF; flag=1;

};

struct PID spid;

/****************pid初始化*********************/ void init_pid() { }

/***************************PID算法**************************/ unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) { }

/***************************PID算法**************************/ /*unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) {

signed int ddError,dError,Error; Error = pp->SetPoint*10-NextPoint;

dError = Error-pp->LastError; // 当前微分 ddError= Error-2*pp->LastError+pp->PrevError; signed int dError,Error;

Error = pp->SetPoint*10 - NextPoint; // 偏差 pp->SumError += Error; // 积分 dError = Error-pp->LastError; // 当前微分 pp->PrevError = pp->LastError; pp->LastError = Error;

return (pp->Proportion * Error+ pp->Integral * pp->SumError + pp->Derivative * dError);

spid.Proportion = 60; //设定PID参数 spid.Integral = 1; spid.Derivative =3;

spid.SetPoint = set; // 设定温度点

pp->PrevError = pp->LastError; pp->LastError = Error; } */

/********************PID控制占空比*************************/ void duty_cycle(unsigned int t) // 占空比 {

unsigned int s; // //

t=t/10; s=set; if(s>t) {

if((s-t)>20)

42

return (pp->Proportion*dError+pp->Integral*Error+pp->Derivative*ddError);

s=set*10;

else { //

low_time=100;

rout = PIDCalc ( &spid,t ); // Perform PID Interation

if(rout<=100&&low_time<=100) if(low_time<=100)

//low_time=(unsigned char)(rout/6); low_time=(unsigned char)(rout/70);

else

low_time=100;

} }

else {

low_time=0; } }

43

本文来源:https://www.bwwdw.com/article/vkta.html

Top