收藏 分销(赏)

水温控制新版系统.docx

上传人:快乐****生活 文档编号:2955404 上传时间:2024-06-12 格式:DOCX 页数:35 大小:82.85KB 下载积分:12 金币
下载 相关 举报
水温控制新版系统.docx_第1页
第1页 / 共35页
水温控制新版系统.docx_第2页
第2页 / 共35页


点击查看更多>>
资源描述
设计汇报 1.设计原理 水温控制系统以STC89C52单片机作为控制关键,采取开关控制和PID控制算法相结合,经过控制单位时间内加热时间所占百分比(即控制波形占空比)来控制水加热速度,实现对1L水全量程(10℃――70℃)内升温、降温功效自动控制。依据设计要求系统可划分为控制模块、温度测量模块、水温调整模块、键盘输入模块、显示电路模块等。系统原理图图所表示 STC89C52首先写命令给DS18B20开始转换数据,将转换后温度数据送入89C52进行处理,处理后在液晶屏上实时显示。并将实际测量温度值和键盘设定值进行比较,依据比较结果进行温度调整,当温差比较大时采取开关量调整,既全速加热和制冷,当温差小时采取PID算法进行调整,最终达成温度稳定控制。其中,加热采取内置(水中)电加热器实现,热量直接和水传输,加热效果好,控温方便;降温采取半导体制冷片实现。其体积小,安装简单,易于控制,价格廉价,可短时间内反复开启,但其制冷速率不高,所以设计中配套散热风扇以达成快速降温目标。 2.温度控制算法 实际温度控制系统,常采取开关控制或数字PID控制方法。开关控制特点是能够使系统以最快素向平衡点靠近,但在实际应用却很轻易造成系统在平衡点周围震荡,精度不高;而数字PID控制含有稳态误差小特点,实用性广泛特点,但误差较大时,系统轻易出现积分饱和,从而份致系统出现很大超调量,甚至出现失控现象。所以,本设计将开关控制,放积分饱和、防参数突变积分饱和等方法溶入PID控制算法组成复式数字PID控制方法,集多种控制策略优点,既改善了常规控制动态过程又保持了常规控制稳态特征。 2.1控制算法确实定 温度控制过程为:当水温温差大时,采取开关控制方法快速减小温差,以缩短调整时间;当温差小于某一值后采取PID控制方法,以使系统快速稳定并保持系统无静态误差。在这种控制方法中, PID控制在较小温差时开始进入,这么可有效避免数字积分器饱和。PID参数和被控制对象关系亲密,要正确得到被控对象模型比较困难,为此,采取离线模糊整定方法来确定PID参数,即给出一组PID参数初值,测得对应数据,按使这个量减小方向调整PID参数,用整定后参数控制该系统,并依据输出调整时间、超调量及稳态误差,调整PID参数,如此反复,求得一组使系统性能最优PID参数。复合PID控制系统方框图图所表示。 2.2PID控制算法 依据设计要求,系统对1L净水进行加热或降温处理,依据水对象特征,会出现惯性温度误差问题,原因以下: 温度控制器采取发烧丝对水进行加热。发烧丝通电加热时,内部温度很高。当容器内水温升高至设定温度时,温度控制器发出信号停止加热。但这时发烧丝温度会高于设定温度,发烧丝还将继续对对水进行加热,造成水温度还会继续上升几度,然后才开始下降。当水温下降到设定温度下限时,温度控制器又发出加热信号,开始加热,但发烧丝要把温度传输到被加热器件需要一定时间,造成水温会继续下降几度。所以,为了对水温实现正确控制,使温度测量误差在±0.5 ℃内,必需采取PID模糊控制算法,经过Pvar、Ivar、Dvar(百分比、积分、微分)三方面结合形成一个模糊控制来处理惯性温度误差问题。 利用数值迫近方法,在采样时刻t=iT(T为采样周期,i为正整数)时,PID调整规律可经过下式近似计算。 则增量式PID算法输出量为: 式中,ei、ei-1、ei-2分别为第n次、n-1次和n-2次偏差值,Kp、Ti、Td分别为百分比系数、积分系数和微分系数,T为采样周期。 单片机每隔固定时间 T将现场温度和用户设定目标温度差值带入增量式PID算法公式,由公式输出量决定PWM方波占空比,后续加热电路依据此PWM方波占空比决定加热功率。现场温度和目标温度偏差大则占空比大,加热电路加热功率增大,使温度实测值和设定值偏差快速降低;反之,二者偏差小则占空比减小,加热电路加热功率降低,直至目标值和实测值相等,达成自动控制目标。 2.3PID参数确实定 PID参数选择是设计成败关键,它决定了温度控制正确度。因为温度系统是一个含有较大滞后性系统,所以本系统采样周期定为10秒,加热周期定为1秒钟,依据部分文件提供经验值,初步确定Kp=2,Ti=2,Td=0.5,依据公式Ki= Kp*T/ TI ;Kd = Kp * TD /T;计算得出Ki=1,Kd=1;然后,由按键对系统设定一个温度值,在线应用工程整定法中经验法对P,I,D各参数进行调整,经验法是一个凑试法,它经过模拟或闭环运行,观察调整过程响应曲线,假如曲线不够理想,则按某种程序将参数反复凑试,直到调整质量满意为止。凑试程序通常是先百分比后积分,最终加入微分。凑试法整定PID参数步骤是: 1)首优异行P整定。将参数Kp由小而大慢慢改变,直至得到反应快,超调小响应曲线。若无静差或静差在许可范围内且响应曲线满意,整定结束,不然继续下步。 2)进行PI整定。略小于Kp值,将Ti由大而小缓慢改变,在保持系统动态性能良好前提下,消除静差或是静差许可范围内。反复改变Kp,Ti值以求得很好效果,若效果满意,则整定结束,不然继续下去。 3)进行PID整定。略改变Kp,Ti值,使Td由小而大缓慢改变,以求得很好响应曲线和较小静差。逐步反复试凑,直至取得满意效果为止。 对于一定系统,合理参数组并不唯一,依据部分文件实践经验,在具体实施PID参数整定时,以下多个结论比较实用: 1)百分比系数Kp是PID调整中最关键一个参数,Kp增大,系统稳定性增加,但调整灵敏度减弱,通常曲线振荡频繁时,要增大Kp,而曲线飘浮绕大弯时,要减小Kp. 2)积分时间常数Ti关键起消除静差作用,减小Ti,消除静差快,但稳定性减小,通常曲线偏离恢复慢时,减小Ti,而曲线波动周期长时,再增大Ki。 3)微分时间常数Td是加速过程有力调整,在加速过渡过程,应增加Td,Td不宜过小,也不宜太大,Td通常选Ti四分之一为最好。 依据以上调整步骤及调整方法及经验,经过反复试验做后得到最终P,I,D参数为Kp=30,Ki=5,Kd=0. 3.硬件电路设计 水温控制系统硬件电路关键包含:主控电路、温度采集电路、温控电路和显示电路等,下面依次对各部分进行设计。 3.1主控电路 主控电路采取STC89C52单片机作为系统控制器,结合数字PID算法完成对温度测量信号接收、处理,控制加热器和制冷片,使水温控制达成设计要求。主控电路包含STC89C52最小系统和键盘电路两部分,STC89C52最小系统在上一章中已介绍,这里不再赘述。本设计键盘采取RF-X1开发板上6个独立按键中4个,各按键经上拉电阻分别接到单片机P3.2、P3.3、P3.4、P3.5口上,起到确定、选择、上调和下调作用,每按上调或下调键一次,设定温度值加1或减1。电路图图所表示。 3.2温度采集电路 本系统采取DS18B20单总线可编程温度传感器来实现温度采集和转换,温度以9~12位数字量读出,能够直接和单片机进行连接,无需外部器件和电源,大大简化了电路复杂度。DS18B20应用广泛,测温范围为-55~+125oC,温度数字量转换快,性能能够满足题目标设计要求。DS18B20测温电路图所表示。 3.3温度控制电路 温度控制电路采取加热器和制冷片对1L水实现加热和降温,具体电路图12-5所表示。当实测温度高于设定温度时,单片机P0.2脚输出低电平,光耦管导通输出高电平,进入LM393管脚比较整形,滤除高次谐波,输出高电平,进入Q3和Q4组成推挽电路,Q3导通Q4截止,输出低电平,晶闸管导通,驱动制冷片降温。当实测温度低于设定温度时,P0.3脚输出低电平,驱动加热器对水温进行加热,工作原理和降温驱动相同。 3.4显示电路 显示电路采取LCD12864液晶模块显示系统设定温度和实测温度。LCD12864液晶共有20个引脚,管脚名称及功效如表12-1所表示。本系统选择单片机P1口作为数据输出端和LCD12864数据端(DB0~DB7)相连,进行水温数据传输;P20接串并行模式方法位RS;P21接并行读写方法位R/W;P22接并行使能端口E;P23接并/串行接口选择位PSB;P24接复位端口RST。具体电路图图所表示。 4.软件设计 系统软件设计应用C语言,采取模块化对单片机进行编程实现各项功效。关键包含:PID控制程序、按键子程序、温度采集子程序、温度比较子程序和液晶显示程序。 4.1主程序设计 系统上电初始化后,首优异行按键扫描,若有按键按下,则读取按键值,更新设定温度。将实测温度和设定温度进行比较,若实测温度和设定温度差值大于2ºC,则对水进行全速加热或降温;若实测温度和设定温度差值小于2ºC,则调用PID子程序,对水温进行微调,达成设计要求。系统主程序步骤图图所表示. 附录: PID控制程序 PID控制就是按设定值和测量值之间偏差百分比、偏差积累和偏差改变趋势进行控制。它依据采样时刻偏差值计算输出控制量增量,调整控制信号导通时间来控制加热电路和冷却电路工作。当采样周期相当短时,能够用求和替换积分,用差商替换微分。 PID控制子程序以下: /******************************PID算法**********************************/ unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint ) { unsigned 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); // 微分项 } /************************************************************************/ 按键子程序 本系统采取四个按键,完成温度设定。当选择键K1每按下一次,K1num加1,依据K1num值选择对温度值百位(预留)、十位、个位进行数值调整。每按一次按键K2,对应位数值加1,每按一次按键K1,对应位数值减1,并将设定温度值写到液晶显示器对应位置。 按键子程序以下: /*************************按键子程序***********************************/ void sheding() { if(k1==0) { delay1(10); if(k1==0) //按键K1按下 while(!k1);//按键K1抬起 write_com(0x0f);write_com(0x94); k1num++; switch(k1num) { case 1: write_com(0x0f);write_com(0x94);//液晶显示位置,十位 break; case 2: write_com(0x95);//液晶显示位置,个位 break; case 3: write_com(0x96);//液晶显示位置,小数位 break; case 4: k1num=0;write_com(0x0c);//清零 break; } } if(k1num!=0)//返回 { //温度值加处理: if(k2==0) //按键K2按下 { delay1(10); if(k2==0) { while(!k2); switch(k1num) { case 1: shi++;if(shi==10)shi=0;a=shi;//十位加1,到10清零 write_com(0x94);write_date(table[shi]);write_com(0x94); break; case 2: ge++;if(ge==10)ge=0;b=ge;//个位加1,到10清零 write_com(0x95);;write_date(table[ge]);write_com(0x95); break; case 3: xs++;if(xs==10)xs=0;c=xs;//小数位加1,到10清零 write_com(0x96);write_date('.');write_date(table[xs]);write_com(0x96);//在液晶对应位置画点 break; } } } //温度值减处理: if(k3==0) { delay1(10); if(k3==0) { while(!k3); switch(k1num) { case 1: shi--;if(shi==-1)shi=9;a=shi; write_com(0x94);write_date(table[shi]);write_com(0x94); break; case 2: ge--;if(ge==-1)ge=9;b=ge; write_com(0x95); write_date(table[ge]);write_com(0x95); break; case 3: xs--;if(xs==-1)xs=9;c=xs; write_com(0x96);write_date('.');write_date(table[xs]);write_com(0x96); break; } } } } } /***************************************************************************/ DS18B20温度采集子程序 系统采取DS18B20对1L水温度进行采集。首先依据DS18B20工作时序对其进行初始化,并对DS18B20内部寄存器读写操作进行定义。系统工作时,单片机读取DS18B20内部寄存器二进制数值,将其转化为十进制真实温度值。 DS18B20温度采集子程序以下: /******************* DS18B20温度采集子程序************************/ void init_DS18B20()//初始化 { uchar x=0; DS18B20 = 1; //DQ复位 delay(8); //稍做延时 DS18B20 = 0; //单片机将DQ拉低 delay(80); //正确延时 大于 480us DS18B20 = 1; //拉高总线 delay(14); x=DS18B20; //稍做延时后 假如x=0则初始化成功 x=1则初始化失败 delay(20); } uchar read_onechar()//读一个字节 { uchar i=0; uchar date = 0; for (i=8;i>0;i--) { DS18B20 = 0; date>>=1; //寄存器右移 DS18B20 = 1; if(DS18B20) date|=0x80; delay(4); } return(date); } void write_onechar(uchar date)//写一个字节 { uchar i=0; for (i=8; i>0; i--) { DS18B20 = 0; DS18B20 = date&0x01; delay(5); DS18B20 = 1; date>>=1; } } uint read_temp()//读取温度 { uchar a=0; uchar b=0; uint t=0; float tt=0; init_DS18B20(); write_onechar(0xcc); // 跳过读序号列号操作 write_onechar(0x44); // 开启温度转换 init_DS18B20(); write_onechar(0xcc); //跳过读序号列号操作 write_onechar(0xbe); //读取温度寄存器 a=read_onechar(); //连续读两个字节数据 //读低8位 b=read_onechar(); //读高8位 t=b; t<<=8; t=t|a; //两字节合成一个整型变量。 tt=t*0.0625; //得到真实十进制温度值,因为DS18B20能够正确到0.0625度,所以读回数据最低位代表是0.0625度 //temper12=tt*10; t= tt*10+0.5; //放大10倍,这么做目标将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。 return(t); } void manage_DS18B20() { uint num; num=read_temp(); shi=num/100; delay(5); ge=num%100/10; delay(5); xs=num%10; delay(5); temper=shi*10+ge+0.1*xs;} /**************************************************************************/ 温度比较子程序 系统将DS18B20采集到实际测量温度值和键盘设定值进行比较,依据比较结果对水温进行调整。若设置温度大于实际温度,而且温差在2度以上,则驱动加热器对水温进行全速加热;当温差在0.8到2度之间时,则停止加热,开始降温;当温差小于0.8度时,则启用PID计算,控制温差逐步趋近设定值,最终达成稳态。若设置温度小于实际温度,系统驱动制冷片开始全速降温。当实际温度下降到低于设定温度时,则立即开启PID计算,控制温差逐步趋近设定值,最终达成稳态。 /************************温度比较处理子程序****************************/ void compare_temper() { unsigned char i; if(set_temper>temper) //是否设置温度大于实际温度 { if(set_temper-temper>2) //设置温度比实际温度是否是大于2度 { high_time=100; //假如是,则全速加热 low_time=0; } else //假如是在0.8到2度范围,则开始降温 { if(set_temper-temper>0.8) { high_time=0; low_time=100; } else //假如温差小于0.8度,运行PID计算 { for(i=0;i<10;i++) { s=read_temp(); rin = s; // Read Input rout = PIDCalc ( &spid,rin ); // Perform PID Interation } if (high_time<=100) { high_time=(unsigned char)(rout/1000); } else { high_time=100; low_time= (100-high_time); } } } } else if(set_temper<=temper) //是否设置温度小于实际温度 { if(set_temper-temper<0) { high_time=0; low_time=100; //全速降温 } else //实际温度大于设定温度,立即开启PID计算 { for(i=0;i<10;i++) { s=read_temp(); rin = s; // Read Input rout = PIDCalc ( &spid,rin ); // Perform PID Interation } if (high_time<100) { high_time=(unsigned char)(rout/10000); } else { high_time=0; low_time= (100-high_time); } } } } /*************************************************************************/ 液晶显示程序 液晶显示器用于显示水温实际温度和设定温度。首先对LCD12864进行初始化,并读取控制器目前状态,判定是否准备好(空闲)。然后向液晶模块写入指令代码,进行显示准备,将要水温以十六进制代码形式送入液晶显示缓冲区,最终利用读显示数据指令控制液晶模块在对应位置显示水温数据。 液晶显示程序以下: /***************************LCD12864初始化*******************************/ void init_lcd() { //lcd_psb=1; write_com(0x34);//扩充指令集 delay1(2); write_com(0x30);//基础指令集 delay1(2); write_com(0x02);//显示归位 delay1(2); write_com(0x01);//清屏显示 delay1(2); write_com(0x0c);//显示状态开关 delay1(2); write_com(0x06);//显示光标移动设置 delay1(2); } /**********************************写数据*********************************/ void write_date(uchar date) { read_busy(); lcd_rs=1; delay(5); lcd_rw=0; delay(5); lcd_date=date; lcd_en=0; delay(5); lcd_en=1; delay(5); lcd_en=0; delay(5); } /***********************************写指令*******************************/ void write_com(uchar com) { read_busy(); lcd_rs=0; delay(5); lcd_rw=0; delay(5); lcd_date=com; lcd_en=0; delay(5); lcd_en=1; delay(5); lcd_en=0; delay(5); } /****************************判定忙闲状态*******************************/ uchar read_busy() { lcd_date=0xff; lcd_rs=0; delay(5); lcd_rw=1; delay(5); lcd_en=1; delay(5); while(lcd_date&busy); lcd_en=0; delay(5); return(lcd_date); } /***********************清除液晶GDRAM中随机数据*********************/ void clear_GDRAM() { uchar i,j,k; write_com(0x34); //打开扩展指令集 i = 0x80; for(j = 0;j < 32;j++) { write_com(i++); write_com(0x80); for(k = 0;k < 16;k++) { write_date(0x00); } } i = 0x80; for(j = 0;j < 32;j++) { write_com(i++); write_com(0x88); for(k = 0;k < 16;k++) { write_date(0x00); } } write_com(0x30); //回到基础指令集 } /******************在指定位置显示一串字符(X--列;Y--行)*******************/ void display_listchar(uchar X, uchar Y, uchar code *date) { uchar ListLength,X2; ListLength = 0; X2=X; if(Y<1) Y=1; if(Y>4) Y=4; X &= 0x0F; //限制X不能大于16,Y在1-4之内 switch(Y) { case 1:X2|=0X80;break; //依据行数来选择对应地址 case 2:X2|=0X90;break; case 3:X2|=0X88;break; case 4:X2|=0X98;break; } write_com(X2); //发送地址码 while (date[ListLength]>=0x20) //若抵达字串尾则退出 { if (X <= 0x0F) //X坐标应小于0xF { write_date(date[ListLength]); ListLength++; X++; delay1(2); } } } /***************************************************************************/
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服