当前位置:文档之家› 单回路温度控制系统的设计和调试

单回路温度控制系统的设计和调试

学生实习(实训)总结报告

院(系):专业班级:_ _

学生姓名:___ ____学号:_ __

实习(实训)地点:__ ____ ___ ________ _

报告题目:___ 单回路温度控制系统的设计和调试_ ____

报告日期:年月日

指导教师评语: _______________________________________

_____________________________________________________

_____________________________________________________

_____________________________________________________

______________________________________________

成绩(五级记分制):______ _______

指导教师(签字):_____________________

目录

1 实习内容及其要求 (1)

2 AC6611多功能过程通道卡 (1)

2.1 功能特点与技术指标 (1)

2.2 应用方法和步骤 (3)

3 方案设计 (3)

3.1 加热器的过程特性 (3)

3.2 加热器温度控制系统的实现方案 (3)

3.4 控制程序的方案设计和模块划分 (4)

4 数据采集与输出程序设计 (5)

4.1 AC6611数据采集与温度换算程序 (5)

4.2 数字滤波算法及程序设计 (5)

4.3控制量与D/A代码换算及输出程序 (5)

5 控制算法程序设计 (7)

5.1 温度设定曲线的程序实现 (7)

5.2 不完全微分PID算法 (7)

5.3 PID算法程序设计 (8)

6 控制程序的调试 (8)

6.1 主要调试内容 (8)

6.2 调试方法 (8)

6.3 调试步骤和结果 (9)

7 PID参数的整定 (9)

7.1 整定方法 (9)

7.2 整定结果及分析 (9)

8 技术小结 (10)

参考文献 (10)

附录:控制程序清单 (11)

单回路温度控制系统的设计和调试

1 实习内容及其要求

实习目的:通过实训,让学生了解计算机控制系统的基本组成,提出计算机控制系统的设计思路,初步学会计算机控制系统软硬件设计及调试的方法,具备技术实现能力;基本上能够处理实践过程中出现的问题并提出解决办法,进一步提高学生的计算机应用水平。

实习内容:通过温度的设定值和反馈值,计算其偏差,并使用基本PID、或不完全微分PID或微分先行PID或死区PID或积分分离PID或积分限幅PID 控制算法输出控制信号,整定PID参数,使被控的温度达到设定值。具体实训内容包括AC6611过程卡的接线和测试、数据采集程序设计、PID算法程序设计、控制输出程序设计、PID参数整定、实训报告。

要求:完成一个基本PID或不完全微分PID或微分先行PID或死区PID或积分分离PID或积分限幅PID单回路温度控制系统的设计和调试过程。

2 AC6611多功能过程通道卡

AC6611是一款廉价通用A/D、D/A板,AD工作在查询方式,采用PCI总线支持即插即用、无需地址跳线。AC6611具有16路单端模拟输入、32路开关量(16路输入及16路输出)、一路12位D/A。AC6611采用大规模可编程门阵列设计,提高可靠性。

2.1 功能特点与技术指标

2.1.1模拟量:

(1) 模拟量输入(A/D)

A/D转换器: 120KHZ ,12位A/D,ADS7816,A/D内置采样保持器。

工作方式:软件查询。

16路单端输入,输入阻抗:1MΩ

最大输入耐压电压:< +12V / -5.5V,瞬时输入耐压:-25V - +30V

连接器:DB25孔式输入连接器。

A/D最大通过率: 70KHZ,输入通道建立时间<8us。

双极性输入范围: 5V,单极性输入范围:5V、10V。输入范围跳线器选择,

对应输入

幅度及精度如下表1所示:

(2)模拟量输出(D/A)

1路12位DA,分辨率12位,精度:0.2%,

电压输出,最大输出电流:5毫安。

输出零点误差小于±10毫伏。

输出范围:10伏、±10伏,跳线器选择。

输出建立时间小于:50微秒。

输出插座:DB25(孔)连接器。表1 2.1.2开关量输入/输出:

16路开关量输入(2个8位),16路开关量输出(2个8位)

TTL电平(兼容3伏逻辑)

开关量输出复位后为输出为低电平“0”。

输出高电压 > 2.5V,低电压 < 0.5V,最大输出电流:8mA

输入电流:<0.1mA 输入高电压门限:〉2V,低电压:〈 0.8V。

输入耐压:高电平最大耐压:8伏,低电平:-0.4伏。

连接器:40脚扁平电缆插座。

2.1.3其他:

符合PCI V2.1标准,供电:+5伏、+12伏、-12伏。

AC6611占用64个I/O选通空间(自动分配)。

工作温度:0-70℃,尺寸:12(W)X 9(H) (厘米)

2.2 应用方法和步骤

(1)安装AC6611的驱动程序,安装完成后需要运用AC6611(静态)测试程序对AC6611办卡的功能进行测试,以检查AC6611卡是否完好和正确。

(2)设置好AC6611的模拟输入范围及DA量程跳线器,关掉PC机电源,将AC6611插入主机的任何一个PCI插槽中并将外部的输入、输出线连好。按照手册连接好我们要的输入输出量范围,然后接入端子板,就可以连接对象的进行采集和控制。

(3)编写程序,可以实现模拟量的输入输出以及开关量的输入输出。

3 方案设计

要进行方案设计,必须要知道控制对象的各项指标,以及控制过程中的各个工具的特性。

3.1 加热器的过程特性

过程特性:指被控过程输入量发生变化时,过程输出量的变化规律。加热器的过程特性是带滞后的一介对象。也就是它不能发生突变,温度不能再很短的时间升高一个比较大的值,也不能达到瞬间降温

3.2 加热器温度控制系统的实现方案

硬件连接好并测试硬件与电脑能正常的通信后,通过可视化程序设计。利用AC6611板卡采集数据,通过总线送入PC,经过程序算法,得出控制量通过AC6611板卡送达加热器,从而达到控制的目的。

3.3 AC6611和加热器接线图设计

实验室用的加热器是通过温度传感器,转换成了标准的工业标准(4MA—20MA)。参照AC6611板卡手册,最大输入耐压电压:< +12V / -5.5V,瞬时输入耐压:-25V - +30V,DB25孔式输入连接器。输入:双极性输入范围: 5V,

单极性输入幅度:5伏、10伏。为此我们选择0—10V 为益。所以AC6611和加热器接线图要满足要求,可以做一个I/V 变换在变送器的输出端串一个500欧的电阻,板卡采集的范围就在2—10V ,这样在程序中做一个转换就能实现温度0度—100度的显示。所以接线图(1)如下所示。

图(1)AC6611与加热器的接线图

3.4 控制程序的方案设计和模块划分

控制程序可以分为A/D 、PID 、D/A 、以及人机交互部分。四大部分A/D 进行数据采集。

基本PID 算法得出控制量,D/A 输出加热器能接受的控制信号。人机交互则是可以设置一个合理的温度,人能直接看到控制的结果。

TI+

VI-

TI-

CH P23

4 数据采集与输出程序设计

4.1 AC6611数据采集与温度换算程序

AC6611数据采集第一个步骤调用动态链接库,然后加入头文件(一些函数的申明)。硬件连接好就直接调用AC6611_AD( )函数,就可以把板卡寄存器中的数据读入电脑内存中,提供给程序计算。

温度换算程序的设计要考虑到我们采集的数据是2—10V,而实际的温度则是0—100度,如果要达到可视化的目的,必须做一个转换算法:

AC6611_AD(hDevice,0,&adc); //AD采样

float adt=100.0*(adc-819.0)/(4095.0-819.0); //标度变换成温度,4~20mA对应0~100度Edit3->Text=FloatToStrF(adt,0,4,4);

4.2 数字滤波算法及程序设计

一般微机应用系统的模拟输入信号中,均含有种种噪声和干扰,它们来自被测信号源本身、传感器、外界干扰等。为了进行准确测量和控制,必须消除被测信号中的噪声和干扰。这是我们往往采取数字滤波的方法来实现。数字滤波算法有算术平均值法、中位值滤波法、限幅滤波法、惯性滤波法。在此次实验中由于大的随机干扰或采样器的不稳定,使得采样数据偏离实际值太远,为此采用上、下限限幅滤波法,其程序的设计如下:

DUk=q0*Ek+q1*Ek1+q2*Ek2;

Uk=DUk+Uk1;

if( Uk>100.0) Uk=100.0;

if(Uk<0) Uk=0;

Uk1=Uk;

Edit8->Text=FloatToStrF(Uk,0,4,4);

4.3控制量与D/A代码换算及输出程序

4.3.1控制量:

从图(2)中可以看到,通过当前值的采集读入内存,然后与设定值进行比较,然后利用基本PID算法,我们得出控制量。然而控制量不能直接输出控制加

热器,要把它转为2—10V的控制量。

图(2)加热器温度控制图4.3.2D/A代码换算及输出程序:

void __fastcall TForm1::Timer1Timer(TObject *Sender) {

unsigned long adc;

AC6611_AD(hDevice,0,&adc);

float adt=100.0*(adc-819.0)/(4095.0-819.0);

Edit3->Text=FloatToStrF(adt,0,4,4);

q0=100/P*(1+Ts/I+D/Ts) ;

q1=-100/P*(1+2*D/Ts);

q2=100/P*D/Ts;

DUk=q0*Ek+q1*Ek1+q2*Ek2;

Uk=DUk+Uk1;

if( Uk>100.0) Uk=100.0;

if(Uk<0) Uk=0;

Uk1=Uk;

Edit8->Text=FloatToStrF(Uk,0,4,4);

Ek2=Ek1;

Ek1=Ek;

Ek=sv-adt;

unsigned long dac;

dac=(unsigned long)(2048.0*Uk/100.0);

AC6611_DA(hDevice,dac);

····

···

}

5 控制算法程序设计 5.1 温度设定曲线的程序实现

曲线要实现显示首先导入画布,然后按一定的周期在画布上画出那一时刻的图像。

for(int i=0;i<479;i++) {

PVtrend[i]=PVtrend[i+1]; PVtrend[479]=300*adt/100;

SVtrend[i]=SVtrend[i+1]; SVtrend[479]=300*sv/100;

MVtrend[i]=MVtrend[i+1]; MVtrend[479]=300*Uk/100; }

Image1->Picture->LoadFromFile("123.bmp");

Image1-> Canvas->Pen->Width = 1; //实际温度趋势图 Image1-> Canvas->Pen->Color = clRed; Image1->Canvas->MoveTo(0,300);

for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-PVtrend[i]);

Image1-> Canvas->Pen->Width = 1; //设定温度趋势图 Image1-> Canvas->Pen->Color = clGreen; Image1->Canvas->MoveTo(0,300);

for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-SVtrend[i]);

Image1-> Canvas->Pen->Width = 1; //控制趋势图 Image1-> Canvas->Pen->Color = clBlue; Image1->Canvas->MoveTo(0,300);

for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-MVtrend[i]);

5.2 不完全微分PID 算法

不完全微分是在基本PID 算法的控制算式如下:

k

'T

(k)(k)e(i)(e(k)e(k 1))D

P T u K e ??=+

+--∑

5.3 PID 算法程序设计

Ek=SP-PV;

DeltaUk=a*DeltaUk1+(1-a)*(q0*Ek+q1*Ek1+q2*Ek2); Uk=Uk1+DeltaUk;

if(Uk>100.0) Uk=100.0; if(Uk<0) Uk=0;

DeltaUk1=DeltaUk; Uk1=Uk; Ek2=Ek1; Ek1=Ek;

6 控制程序的调试 6.1 主要调试内容

(1)通道数据的采集以及输出控制; (2)曲线的显示走向;

(3)人机交互数据输入输出部分。

6.2 调试方法

对于程序的调试方法,从自己的实践经验中总结出,要以模块为单位,作出一个模块就测试一个模块,就像修一栋高楼,只要从基础就认真而且十分牢固做好每一步,当高楼的框架完工以后,剩下的就只是装修而已。

T T T )1(T T T )(f f f

++

-+=k u k u )()1()1()(''k u k u k u αα-+-=T

T T f f +=

α

6.3 调试步骤和结果

通道数据的采集以及输出控制的调试,在程序中加入代码:

hDLL=LoadLibrary("ac6611.dll");

if(hDLL!=NULL)Label30->Caption = "AC6611.dll load ok!";

hDevice=AC6611_CreateDevice(0, &ErrorOf6611); //创建驱动,选择第0块卡

if(hDevice != -1){ Label31->Caption = "AC6611 Card Is Exist!"; }

else{ Label31->Caption = "AC6611 Card Is not Exist!"; }

便可以检测通道是否和计算机成功连接。

曲线的显示走向

曲线的现实只要理解原理后,可以实现自己想法,最主要的就是自己的算法,输入算法后,观察是否是自己要的结果,如果然后修正算法。

炉温的实时监测和控制,这部分主要是通过设定参数进行反复的参数调整以及图形观测分析,从而找出最佳的PID控制参数。

7 PID参数的整定

7.1 整定方法

在整定过程中,感到经验凑试法在实践中最为实用。在整定参数时,必须认真观察系统响应情况,根据系统的响应情况决定调整那些参数。

7.2 整定结果及分析

观察系统响应效果,可以通过查看控制回路细目画面中的实时趋势曲线,衰减曲线最好是4:1,即前一个峰值与后一个峰值的比值为4:1。

根据整定方法整定得出一组比较好的参数,PID中:16< P < 20;5 < TI < 10; 0.5

从曲线图中也可以看出加热器也是一个带惯性的一介对象。

8 技术小结

我在此次实训中认识到这次实习更加的综合一些,要用到以前学过的CB编辑器、C语言、《计算机控制技术》和《自动控制原理》综合知识。灵活运用上面的只是,得到在实习中的经验,从而可以使我们的综合应用能力得到了提高。

在实验和以后的工作中,认识到外部硬件(板卡)与PC的底层硬件连接,windows操作系统对这两部分的硬件通过硬件商提供的硬件驱动和动态链接库实现数据交换,实际是windows与板卡的寄存器实现数据交换。

当然在实习中约到了很多困难,比如pv的值调整很慢,达到稳定后仍然有波动,这里可能是PID参数的问题,也有的是正常原因,因为温度很难控制在一个特定的温度不变,仍有些波动是正常的。

最后完成了这次实训,学到了很多东西,感到很有它的价值所在。

参考文献

【1】陆卫忠 . C++Builder程序设计教程.2版 . 北京 . 科学出版社,2009. 【2】于海生 .计算机控制技术 . 北京 . 机械工业出版社,2007.

【3】 (荷) Andrew S. Tanenbaum . 现代操作系统 . 北京: 机械工业出版社, 2009

【4】叶蓓华.数字控制技术[M].北京:清华大学出版社,2002.

附录:控制程序清单

#include

#pragma hdrstop

#include "adc.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

float P=20,I=10,D=10;

float Uk=0.0,DUk=0.0,Uk1=0.0,Ek=0.0,Ek1=0.0,Ek2=0.0;

float q0,q1,q2;

float Ts=3.0;

float sv=20;

int SVtrend[480];

int PVtrend[480];

int MVtrend[480];

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

Edit4->Text=FloatToStr(sv);

Edit5->Text=FloatToStr(P);

Edit6->Text=FloatToStr(I);

Edit7->Text=FloatToStr(D);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

unsigned long adc;

AC6611_AD(hDevice,0,&adc); //AD采样

float adt=100.0*(adc-819.0)/(4095.0-819.0); //标度变换成温度,4~20mA对应0~100度

Edit3->Text=FloatToStrF(adt,0,4,4);

q0=100/P*(1+Ts/I+D/Ts) ;

q1=-100/P*(1+2*D/Ts);

q2=100/P*D/Ts;

DUk=q0*Ek+q1*Ek1+q2*Ek2;

Uk=DUk+Uk1;

if( Uk>100.0) Uk=100.0;

if(Uk<0) Uk=0;

Uk1=Uk;

Edit8->Text=FloatToStrF(Uk,0,4,4);

Ek2=Ek1;

Ek1=Ek;

Ek=sv-adt;

unsigned long dac;

dac=(unsigned long)(2048.0*Uk/100.0);

AC6611_DA(hDevice,dac);

for(int i=0;i<479;i++)

{

PVtrend[i]=PVtrend[i+1];

PVtrend[479]=300*adt/100;

SVtrend[i]=SVtrend[i+1];

SVtrend[479]=300*sv/100;

MVtrend[i]=MVtrend[i+1];

MVtrend[479]=300*Uk/100;

}

Image1->Picture->LoadFromFile("123.bmp"); Image1-> Canvas->Pen->Color = clBlack; Image1-> Canvas->Pen->Width = 1;

Image1->Canvas->MoveTo(0,60);

Image1->Canvas->LineTo(480,60);

Image1->Canvas->MoveTo(0,120);

Image1->Canvas->LineTo(480,120);

Image1->Canvas->MoveTo(0,180);

Image1->Canvas->LineTo(480,180);

Image1->Canvas->MoveTo(0,240);

Image1->Canvas->LineTo(480,240);

Image1->Canvas->MoveTo(0,300);

Image1->Canvas->LineTo(480,300);

Image1->Canvas->MoveTo(80,0);

Image1->Canvas->LineTo(80,300);

Image1->Canvas->MoveTo(160,0);

Image1->Canvas->LineTo(160,300);

Image1->Canvas->MoveTo(240,0);

Image1->Canvas->LineTo(240,300);

Image1->Canvas->MoveTo(320,0);

Image1->Canvas->LineTo(320,300);

Image1->Canvas->MoveTo(400,0);

Image1->Canvas->LineTo(400,300);

Image1->Canvas->MoveTo(480,0);

Image1->Canvas->LineTo(480,300);

Image1-> Canvas->Pen->Width = 1; //实际温度趋势图

Image1-> Canvas->Pen->Color = clRed;

Image1->Canvas->MoveTo(0,300);

for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-PVtrend[i]);

Image1-> Canvas->Pen->Width = 1; //设定温度趋势图

Image1-> Canvas->Pen->Color = clGreen;

Image1->Canvas->MoveTo(0,300);

for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-SVtrend[i]);

Image1-> Canvas->Pen->Width = 1; //控制趋势图

Image1-> Canvas->Pen->Color = clBlue;

Image1->Canvas->MoveTo(0,300);

for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-MVtrend[i]);

}

//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)

{

sv=StrToFloat(Edit4->Text);

P=StrToFloat(Edit5->Text);

I=StrToFloat(Edit6->Text);

D=StrToFloat(Edit7->Text);

}

//--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender)

{

hDLL=LoadLibrary("ac6611.dll");

if(hDLL!=NULL)Label1->Caption = "";

(FARPROC

&)AC6611_CreateDevice=GetProcAddress(hDLL,"AC6611_CreateDevice"); //创建驱动句柄(FARPROC

&)AC6611_CloseDevice=GetProcAddress(hDLL,"AC6611_CloseDevice"); //关闭驱动句柄(FARPROC &)AC6611_DI=GetProcAddress(hDLL,"AC6611_DI"); //数字量输入,port=0-1两个通道,8位数据由DiData返回

(FARPROC &)AC6611_DO=GetProcAddress(hDLL,"AC6611_DO"); //数字量输出,port=0-1两个通道,8位数据由DoData输出

(FARPROC &)AC6611_DiBit=GetProcAddress(hDLL,"AC6611_DiBit"); //数字量输入,port=0-1两个通道,指定位输入

(FARPROC &)AC6611_DoBit=GetProcAddress(hDLL,"AC6611_DoBit"); //数字量输出,port=0-1两个通道,指定位输出

(FARPROC &)AC6611_DA=GetProcAddress(hDLL,"AC6611_DA"); //DA输出,0-4095

(FARPROC

&)AC6611_VoltageToDA=GetProcAddress(hDLL,"AC6611_V oltageToDA");

(FARPROC &)AC6611_AD=GetProcAddress(hDLL,"AC6611_AD"); //通用AD采样

(FARPROC

&)AC6611_AD_CHN=GetProcAddress(hDLL,"AC6611_AD_CHN"); //设置AD通道0-15 (FARPROC &)AC6611_ADS=GetProcAddress(hDLL,"AC6611_ADS"); //直接AD采样,为单通道AD采样设计

(FARPROC

&)AC6611_ADToV oltage=GetProcAddress(hDLL,"AC6611_ADToVoltage");

hDevice=AC6611_CreateDevice(0, &ErrorOf6611); //创建驱动,选择第0块卡

if(hDevice != -1){

Label2->Caption = "";

}else{

Label2->Caption = "";

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Close();

}

相关主题
文本预览
相关文档 最新文档