资源描述
计算机控制系统设计汇报
设计名称: 恒温箱温度计算机控制系统设计
姓 名:
学 号:
班 级:
学 院: 信息工程学院
任课老师:
基于单片机恒温箱控制系统设计
摘要: 本设计是基于AT89S52单片机恒温箱控制系统,系统分为硬件和软件两部分,其中硬件包含:电源、温度传感器、显示、控制、晶闸管驱动和报警设计;软件包含:键盘管理程序设计、显示程序设计、PID控制程序设计和温度报警程序设计。编写程序结合硬件进行调试,能够实现设置和调整初始温度值,进行液晶显示,当加热到设定值后立即报警。本设计从实际应用出发选择了体积小、精度相对高数字式温度传感元件DS18B20作为温度采集器,单片机AT89S52为主控芯片,液晶作为显示输出,实现了对温度实时测量和恒定控制。
关键词:单片机、温度传感器、恒温、声光报警、PID。
引言: 温度控制是工业生产过程中常常碰到过程控制,尤其是在冶金、化工、建材、食品、机械、石油等工业中,含有举足重轻作用,其温度控制效果直接影响着产品质量,所以设计一个较为理想温度控制系统是很有价值。对于不一样场所、不一样工艺、所需温度高低范围不一样、精度不一样,则采取测温元件、测温方法和对温度控制方法也将不一样;产品工艺不一样、控制温度精度不一样、时效不一样,则对数据采集精度和采取控制算法也不一样。所以,对温度测控方法多个多样。伴随电子技术和微型计算机快速发展,微机测量和控制技术也得到了快速发展和广泛应用。利用微机对温度进行测控技术,也便随之而生,并得到日益发展和完善,越来越显示出其优越性。然而现有温度传感元件大多为模拟器件(热电耦)体积大、应用复杂、而且不轻易实现数字化等缺点,阻碍了应用领域扩展。本设计从实际应用出发选择了体积小、精度相对高数字式温度传感元件DS18B20作为温度采集器,单片机AT89S52作为主控芯片,数码管作为显示输出,实现了对温度实时测量和恒定控制。
一、 本课题设计要求
以下图所表示,恒温箱采取木箱或纸箱(外形尺寸小于30cm×30cm×30cm),内置白炽灯泡(功率小于100W)用于加热。
30cm
30cm
木箱或纸箱
白炽灯泡≤100W
自制恒温箱要求
(1)温度采集传感器采取热电阻或热电偶,或一体化数字温度传感器DS18B20。
(2)控制灯泡亮度或发烧量,采取可控硅平滑控制。
(3)采取单片机作为控制器。
(4)采取LCD液晶显示器作为显示器,同时显示给定温度和实际温度。
(5)采取自制按键键盘作为温度给定值输入。
(6)恒温箱实际温度达成给定值时(误差要求±1℃)需声光提醒,声音延时5秒后停止。
(7)恒温箱最高温度≤50℃。
二、总体方案设计
系统整体框图以下图:
图1 系统结构框图
1.电源模块
首先是电源模块,利用变压器把220V交流电转为正负12V交流电,再用二极管桥式整流电路,整流出直流电。以后用大电容平波,小电容滤波,以后在用7805稳压芯片稳出5V直流电,供给各个部分。其次是单片机外围电路,其中包含有单片机最小系统、LCD显示、按键、晶闸管控制电路和温度采集电路。
2.温度传感器
方案一:使用热敏电阻作为传感器,用热敏电阻和一个对应阻值电阻相串联分压,利用热敏电阻阻值随温度改变而改变特征,采集这两个电阻改变分压值,并进行A/D转换,此设计方案需要A/D转换电路,增加了硬件成本而且热敏电阻感温特征曲线并不是严格性,会产生较大测量误差。
方案二:采取温度传感器铂电阻 Pt1000。铂热电阻物理化学性能在高温和氧化性介质中很稳定,它能用作工业测温元件,且此元件线性很好。在 0—100 摄氏度时,最大非线性偏差小于 0.5 摄氏度。铂热电阻和温度关系是,Rt = R0(1+At+Bt) ;其中 Rt 是温度为 t 摄氏度时电阻;R0 是温度为 0 摄氏度时电阻;t 为任意温度值,A,B 为温度系数。
方案三:采取模拟温度传感器AD590K,AD590K含有较高精度和反复性(反复性优于0.1℃),其良好非线性能够确保优于±0.1℃测量精度。但其测量值需要经过运算放大、模数转换再传给单片机,硬件电路较复杂,调试也会相对困难,所以本系统不宜采取此法。
方案四:采取数字式温度传感器DS18B20,这类传感器为数字式传感器,而且仅需要一条数据线进行数据传输,易于和单片机连接,能够去除A/D模块,降低了硬件成本,简化系统电路。另外,数字式温度传感器还含有测量精度高,测量范围广等优点。
综合以上四种方案,本设计采取第四种方案,利用数字温度计DS18B20作为温度传感器。
3.显示部分
方案一:温度显示能够用数码管,但数码管只能显示简单数字,它有电路复杂,占用资源较多,显示信息少等缺点。
方案二:1602液晶也叫1602字符型液晶,它是一个专门用来显示字母、数字、符号等点阵型液晶模块。显示字母和数字比较方便,控制简单,成本较低。我们设计系统需要显示更多信息,所以考虑显示功效愈加好液晶显示,要求能显示更多数据,增强显示信息可读性,看起来更方便。
综合以上两种方案,本设计采取方案二,用1602液晶显示器来显示数据。
4.输出控制
方案一:采取继电器,易于控制,且实施比较简单,但强电和弱电不能很好隔离,抗干扰能力极差,开关频率不能太高,灯泡会一直闪烁。
方案二:采取固态继电器,易于控制,电路简单,但需要PWM波来进行控制,一般51单片机无PWM口,故不采取此法。
方案三:采取晶闸管,控制信号和输出信号能够很好隔离,增强了系统安全性和抗干扰能力。
综合以上三种方案,本设计采取晶闸管控制负载工作。
三、硬件电路设计及工作原理
1.系统功效及工作步骤介绍
依据恒温箱控制器功效要求,并结合对51系列单片机资源分析,即单片机软件编程自由度大,可用编程实现多种控制算法和逻辑控制。所以采取AT89C52作为电路系统控制关键。恒温箱控制器总体布局图1所表示。按键将设置好温度值传给单片机,经过温度显示模块显示出来。初始温度设置好后,单片机开启输出控制模块,使电热器开始加热,同时将从数字温度传感器DS18B20测量到温度值实时显示出来,当加热到设定温度值时,单片机控制声光报警模块,发出声光报警,当超出设置温度关闭加热器。当自然冷却到设定温度以下时,单片机再次开启加热器,如此循环反复,以达成恒温控制目标。系统结构框图图1所表示,系统基础硬件电路图图2所表示。
图2 基础硬件电路图
2. 系统硬件设计
(1)DS18B20测温电路
DS18B20数字温度计是Dallas企业生产1-Wire器件,即单总线器件。和传统热敏电阻有所不一样,DS18B20可直接将被测温度转化成串行数字信号,以供单片机处理,含有连线简单、微型化、低功耗、高性能、抗干扰能力强、精度高等特点。所以用它来组成一个测温系统,含有电路简单,在一根通信线上能够挂很多这么数字温度计,十分方便。现在已被众多行业进行广泛利用(锅炉、温控表粮库、冷库、工业现场温度监控、仪器仪表温度监控、农业大棚温度监控等)。
经过编程,DS18B20能够实现9~12位温度读数。信息经过单线接口送入DS18B20或从DS18B20送出,所以从微处理器到DS18B20仅需连接一条信号线和地线。读、写和实施温度变换所需电源能够由数据线本身提供,而不需要外部电源。
每片DS18B20在出厂时全部设有唯一产品序列号,所以多个DS18B20能够挂接于同一条单线总线上,这许可在很多不一样地方放置温度传感器,尤其适合于组成多点温度测控系统
因为DS18B20采取是1-Wire总线协议方法,即在一根数据线实现数据双向传输,而对AT89S52单片机来说,硬件上并不支持单总线协议,所以,我们必需采取软件方法来模拟单总线协议时序来完成对DS18B20芯片访问。1-Wire总线支持一主多从式结构,硬件上需外接上拉电阻。当一方完成数据通信需要释放总线时,只需将总线置高点平即可;若需要取得总线进行通信时则要监视总线是否空闲,若空闲,则置低电平取得总线控制权。
图3 DS18B20测温电路
(2)输出控制电路
加热电路中采取MOC3023目标是实现强电和弱电隔离,其在电路中工作原理是单片机依据传感器和设定开关输入控制指令,控制电器电源通断。BTA16是小型塑封双向晶闸管,当电源控制电路输出管脚送出开关控制指令为高电平,MOC3023截止,BTA16截止,电器被关闭;当电源控制电路送出开关控制指令为低电平,MOC3023导通,BTA16导通,电器被打开。R4是BTA16保护电路。
图4 光耦控制输出
(3)显示电路
1602液晶也叫1602字符型液晶 它是一个专门用来显示字母、数字、符号等点阵型液晶模块 它有若干个5X7或5X11等点阵字符位组成,每个点阵字符位全部能够显示一个字符。显示电路采取LCD1602液晶显示,图(7)所表示,图中只画出了其对应接口,3脚用于调整LCD1602背光,4、5、6为LCD1602控制口,用于控制其写入或是读出指令,7至14脚为LCD1602数据口,将数传送到LCD1602中。
图5 LCD1602显示电路
LCD1602特征:
+5V电压,对比度可调;
内含复位电路;
提供多种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多个功效;
有80字节显示数据存放器DDRAM;
内建有160个5X7点阵字型字符发生器CGROM,8个可由用户自定义5X7字符发生器CGRAM;
基础操作时序:
读状态:输入:RS=L,RW=H,E=H;输出:DB0~DB7=状态字 ;
写指令:输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码 ;输出:无。
读数据:输入:RS=H,RW=H,E=H;输出:DB0~DB7=数据 ;
写数据:输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据 ;输出:无。
LCD1602多种指令不再一一说明。
(4)温度越线报警电路
报警电路图8所表示,该电路采取一个小功率三极管Q1驱动蜂鸣器BELL,当单片机接收到超额温度信号或危险信号时,输出脚BELL输出高点平,Q1导通,致使蜂鸣器BELL得电工作,发出报警声。同时,电路中发光二极管指示出电路工作状态。
图6 报警电路
(5)过零检测
TLP521-2是一个内部集成两个光耦芯片,关键用于过零检测,当电源正弦交流电过零时,在三极管集电极会产生一个下降沿和一个上升沿,这么单片机外部中止口能够识别到,最终用于控制晶闸管导通角。
图7过零检测电路
四、系统应用软件设计
软件描述
本程序关键功效就是控制晶闸管导通角,来控制白炽灯亮度,最终达成控制温度目标。设置有两个按键,一个按键能够增加期望温度,另一个能够降低期望温度,步进最小是0.1摄氏度。有一个LCD显示器,能够显示目前温度和期望,当实际温度达成期望温度时,蜂鸣器和LED灯报警5s后停止。
利用控制策略是PID算法,PID算法精华之处就是利用偏差进行控制。P代表是百分比,这个参数可是使调整愈加快速,I是积分,这个参数能够消除稳态误差,D是微分,能够超前控制。
依据以上对操作和工作过程分析,程序应分为两个阶段:一是通电或复位后到给定温度;二是检测并显示系统实时温度,并依据检测结果控制电热器,这时系统不接收键盘输入。所以,程序能够分为以下多个功效模块:温度设定和开启;显示;温度检测;温度控制和报警。
(1)键盘管理模块
当通电以后,系统进入键盘管理状态,单片机只接收设定温度和开启。当检测到有键闭合时先去除抖动,这里采取软件延时方法,延时一段时间后,再确定是否有键闭合,然后将设定好值送入预置温度数据区,并调用温度正当检测报警程序,当设定温度超出最大值时就会报警,最终当开启键闭合时开启加热。
键盘设定:用于温度设定。共两个按键。
KEY1(P3.6): 设置温度“+”。
KEY2(P3.7): 设置温度“-”。
(2)显示模块
显示子程序功效是将缓冲区二进制数据先转换成3个BCD码,再将其分别存入百位、十位、个位3个显示缓冲区,送往串行口,利用单片机P0口进行扫描,让数据动态在1602上显示出来,可显示设置温度和测量温度。
(3)控制模块
温度控制子程序步骤图7所表示,将目前温度和设定好温度比较,当目前温度小于设定温度时,开启电热器;当目前温度大于设定温度时,关闭电热器;当二者相等时,电热器保持这一状态。
图8控制模块程序步骤
(4)温度报警模块
依据设计要求,当检测到目前温度值高于设定温度值时报警,报警同时关闭电热器。为了预防误报,设置了报警许可标志,只有在许可报警情况下,温度值高于设定温度值时才报警。
(5)主程序和中止服务程序步骤
主程序采取中止嵌套方法设计,各功效模块可直接调用。主程序完成系统初始化,温度预置及其正当性检测,预置温度显示及定时器0设置。定时器0中止服务子程序是温度控制体系主体,用于温度检测、控制和报警(包含开启温度转换、读入采样数据、数字滤波、越限温度报警和越限处理、输出控制脉冲等)。
图9 主程序步骤图 图10 中止服务程序步骤图
五、系统调试和仿真
硬件调试时,可先检验印制板及焊接质量是否符合要求,有没有虚焊点及线路间有没有短路、断路。然后用万用表检测,检验无误后,可通电检验 LCD 液晶显示器亮度情况,通常情况下取背光电压为 4~5.5V 即可得到满意效果,再依次检验各部分结构安装是否牢靠。
软件调试是在proteus编译器下进行,源程序编译及仿真调试应分段或以子程序为单位逐一进行,最终结合硬件实时调试。
子程序调试包含:
1).LCD1602显示程序;
2).延时函数子程序;
3).DS18B20读出温度子程序、温度转换命令子程序、计算温度子程序、显示数据刷新子程序。
六、设计心得
这次课程设计是对过去所学知识一次回顾和巩固,也是一次尤其实践能力。经过该次课程设计,不仅培养了我们实践动手能力,而且也学到了很多东西。因为以前学习知识,全部是基于理论,就算是试验课,器材也是学校已经弄好了,我们做试验基础就是连接线路,也根本了解不深入。不过,这次课程设计,不仅要我们自己买器材,更要我们设计电路、画出电路图、画出PCB、最终焊接成一块板子,然后调试板子,板子调试差不多了就要开始设计程序了。恒温箱顾名思义就是要让温度基础恒定在一个我们期望值,所以在设计程序时,就要想一个算法来控制单片机,使之能够恒定温度。当然对于这种控制,最好算法莫过于PID算法,因为此法简单而有效,工业上也有很多应用,假如需要更正确控制,能够在PID基础增加部分算法,比如模糊控制、鲁棒控制等。
看到完成课程设计时,我知道还有部分不足,很多地方需要更深入改善,不过我仍然很快乐,因为我尽心尽力将它全部全部完成了,我尽到自己最大努力。即使还是有很多不懂之处,不过在同学帮助下也弄懂了不少。
参考文件
(1) 郭天祥,新概念51单片机c语言教程,电子工业出版社,
(2) 陈跃东,DS18B20集成温度传感器原理和应用[J],安徽教育出版社,,5-23
(3) 李广弟,《单片机基础》[M],北京航空航天大学出版社,1994,1-56
(4) 谭浩强,C程序设计(第二版)[M],清华大学出版社,
(5) 付家才,单片机控制工程实践技术[M],化学工业出版社,
附录一 源程序代码
#include<includes.h>
//=============================================//
//============液晶初始化及显示模块=============//
//=============================================//
sbit RS=P2^5; //数据/命令选择端
sbit RW=P2^6; //读/写选择端
sbit E=P2^7; //使能端
uchar table[10]={'0','1','2','3','4','5','6','7','8','9'};
//-----------delay延时函数
void delay1602(int z)
{ int i,j;
for(j=z;j>=0;j--)
for(i=11;i>=0;i--);
}
uchar gfReverse_Bits(uchar Data)
{
Data=(Data<<4)|(Data>>4);
Data=((Data<<2)&0xcc)|((Data>>2)&0x33);
Data=((Data<<1)&0xaa)|((Data>>1)&0x55);
return Data;
}
//-----------写com为命令
void write_com(uchar com)
{
com=gfReverse_Bits(com);
E=0;
RS=0;
RW=0;
P0=com;
E=1;
delay1602(20);
E=0;
RS=1;
}
//-----------写dat为数据
void write_dat ( uchar dat )
{
dat=gfReverse_Bits(dat);
E=0;
RS=1;
RW=0;
P0=dat;
E=1;
delay1602(20);
E=0;
RS=0;
}
//-----------初始化液晶屏
void init_1602()
{ write_com(0x38);
delay1602(50);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
//-----------液晶显示函数
//-----------address为显示地址:
//0x80--第一行,0x80+0x40--第二行
//-----------mean[]为意义字符串
//-----------value为显示值
//-----------unit[]单位字符串
void dispaly(uchar address,uchar mean[],float value,uchar unit[])
{
uchar *pt;
int Val;
write_com(address);
for(pt=mean;*pt!='\0';pt++)
{
write_dat(*pt);
}
Val = (int)(value*10);
write_dat(table[Val/100]);
write_dat(table[Val%100/10]);
write_dat('.');
write_dat(table[Val%10]);
for(pt=unit;*pt!='\0';pt++)
{
write_dat(*pt);
}
}
void bdispaly(uchar ad,uchar sta[])
{
uchar *pp;
write_com(ad);
for(pp=sta;*pp!='\0';pp++)
{
write_dat(*pp);
}
}
#include<includes.h>
//=============================================//
//=============DS18b20模块初始化===============//
//=============================================//
sbit DQ = P2^1;
//-----------delayDs18b20延时函数
void delayDs18b20(uint i)//延时函数
{
while(i--);
}
//----------18b20初始化函数
void Init_DS18B20(void)
{
DQ = 1; //DQ复位
delayDs18b20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delayDs18b20(80); //正确延时 大于 480us
DQ = 1; //拉高总线
delayDs18b20(20);
}
//----------读一个字节
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delayDs18b20(5);
}
return(dat);
}
//----------写一个字节
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delayDs18b20(5);
DQ = 1;
dat>>=1;
}
delayDs18b20(5);
}
//----------读取温度
float ReadTemperature(void)
{
uchar TH=0;
uchar TL=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号操作
WriteOneChar(0x44); // 开启温度转换
delayDs18b20(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
TL=ReadOneChar();
TH=ReadOneChar();
return((TH*256+TL)*0.0625);
}
#include<includes.h>
//=============================================//
//================键盘延时函数=================//
//=============================================//
void DelayKeyms(int z)
{ int i,j;
for(j=z;j>=0;j--)
for(i=110;i>=0;i--);
}
//=============================================//
//================键盘扫描函数=================//
//=============================================//
sbit SET=P1^0;
sbit UP=P1^1;
sbit DOWN=P1^2;
sbit OUT=P1^3;
uchar count=1;
uchar OutFlag=1;
float TempSet=27.0;
float temp;
/*uchar KeyScan(void)
{
if(Key1==0)
{
DelayKeyms(10);
if(Key1==0)
{
while(!Key1);
return 1;}
}
if(Key2==0)
{
DelayKeyms(10);
if(Key2==0)
{
while(!Key2);
return 2;}
}
if(Key3==0)
{
DelayKeyms(10);
if(Key3==0)
{
while(!Key3);
return 3;}
}
return 0;
} */
void SetKey() //模式选择
{
if(SET==0)
{
DelayKeyms(10);
if(SET==0)
{
count++;
if(count>2)
count=1;
}
while(SET==0);
}
}
void UpKey() //按键加
{
if(UP==0)
{
DelayKeyms(10);
if(UP==0)
{
switch(count)
{
case 1:temp=TempSet;
temp=temp+1;
if(temp>50.0) temp=20.0;
TempSet=temp;
break;
case 2:temp=TempSet;
temp=temp+0.1;
if(temp>50.0) temp=20.0;
TempSet=temp;
break;
default:break;
}
}
while(UP==0);
}
}
void DownKey() //按键减
{
if(DOWN==0)
{
DelayKeyms(10);
if(DOWN==0)
{
switch(count)
{
case 1:temp=TempSet;
temp=temp-1;
if(temp<20.0) temp=50.0;
TempSet=temp;
break;
case 2:temp=TempSet;
temp=temp-0.1;
if(temp<20.0) temp=50.0;
TempSet=temp;
break;
default:break;
}
}
while(DOWN==0);
}
}
void OutKey() //弹出
{
if(OUT==0)
{
DelayKeyms(10);
if(OUT==0)
{
OutFlag++;
if(OutFlag>1)
OutFlag=0;
}
while(OUT==0);
}
}
void keyDone() //按键功效实施
{
bdispaly(0x80,"please set Tempset:");
dispaly(0x80+0x40,"Temp_Set:",TempSet,"'C");
SetKey();
switch(count)
{
case 1:
UpKey();
DownKey();
dispaly(0x80+0x40,"Temp_Set:",TempSet,"'C");
break;
case 2:
UpKey();
DownKey();
dispaly(0x80+0x40,"Temp_Set:",TempSet,"'C");
break;
default:break;
}
OutKey();
}
#include<includes.h>
sbit Controlpin=P2^0;
sbit Light=P2^3;
sbit Beep=P2^2;
//=============================================//
//===================延时函数====================//
//=============================================//
void Delayms(int z)
{ int i,j;
for(j=z;j>=0;j--)
for(i=110;i>=0;i--);
}
//=============================================//
//===================主函数====================//
//=============================================//
uchar beepflag=0;
uchar Be_LiFlag=0;
extern float TempSet;
float TempReal=0;
uchar ExpectTime=0;
void main()
{
//初始化定义
//uchar k;
float TempNew = 0;
//float TempOld1 = 0;
//float TempOld2 = 0;
init_1602();
XInterruptInit();
TimerInit();
Beep =1;
Controlpin=1;
EA=0;
while(1)
{
//键盘数据处理
//蜂鸣器报警
OutKey();
while(OutFlag==0)
{
keyDone();
Light=1;
beepflag=0;
}
if(TempSet==TempReal&&!beepflag)
{
Be_LiFlag++;
}
if(Be_LiFlag==6)
{
Be_LiFlag=0;
Beep =0;
Light=0;
Delayms(500);
Beep =1;
Light=1;
Delayms(500);
Beep =0;
Light=0;
Delayms(500);
Beep =1;
Light=1;
beepflag=1;
}
//液晶显示数据
//读取温度
TempNew = ReadTemperature();
TempReal=TempNew;
//ExpectTime = PidControl(15,0.0,TempSet,TempReal);
if(TempNew>TempSet)
{
// EA=0;
Controlpin=1;
P2 |=0x10;
}
else if(TempSet>TempNew)
{
// EA=0;
Controlpin=0;
P2 &=0xef;
}
dispaly(0x80,"Temp_Now:",TempNew ,"'C ");
dispaly(0x80+0x40,"Temp_Set:",TempSet,"'C ");
}
}
//=============================================//
//==================中止处理===================//
//=============================================//
void OutIn() interrupt 0
{
TR0 = 1;
}
void Timer0() interrupt 1
{
static char time=0;
TH0 = (65535-200)/256;
TL0 = (65535-200)%256;
time++;
if(time==ExpectTime)
{
Controlpin = 0;
_nop_();
_nop_();
_nop_();
_nop_();
Controlpin = 1;
time = 0;
TR0 = 0;
}
}
#include<includes.h>
void TimerInit(void)
{
TMOD=0x01;
TH0=(65535-200)/256;
TL0=(65535-200)%256;
EA=1;
PT0=1;
ET0=1;
}
void XInterruptInit(void)
{
IT0=1; //负跳变延触发
EX0=1; //外部中止0
PX0=0;
EA=1; //开总中止
}
#include<includes.h>
float ErrorNew;
float ErrorSum;
uchar PidControl(float Kp,float Ki,float tset,float tfeedback)
{
int Result=0;
ErrorNew = tset-tfeedback;
ErrorSum=ErrorNew;
if((tfeedback-tset)>=0&&(tfeedback-tset)<0.3) Result=25;
else if((tset-tfeedback)>0.6
展开阅读全文