PID温控程序

合集下载

温控pid自整定算法

温控pid自整定算法

温控pid自整定算法温控PID自整定算法PID(比例-积分-微分)控制算法被广泛应用于温度控制系统中。

它能够根据实际的温度变化情况,自动调整控制器的参数,以实现温度的精确控制。

PID自整定算法是一种用于自动计算PID参数的方法,它可以根据系统的动态响应特性,快速准确地确定PID参数的值。

PID控制器由比例控制、积分控制和微分控制三个部分组成。

比例控制根据偏差值与设定值之间的差距来调整输出;积分控制则根据偏差值的累积来调整输出;微分控制则根据偏差值的变化率来调整输出。

PID自整定算法的目标是通过自动计算PID参数的值,使得控制系统能够以最佳的控制性能工作。

在PID自整定算法中,需要进行的操作包括:设定一个适当的目标温度;根据目标温度和实际温度的差距,计算出比例系数;根据温度变化的速度,计算出微分系数;根据温度变化的累积,计算出积分系数。

通过这些计算,可以得到合适的PID参数值,从而实现温度的控制。

在实际应用中,PID自整定算法可以通过以下步骤来实现。

首先,将控制系统设定为自整定模式,并将目标温度设定为所需的温度。

然后,系统会根据自整定算法自动计算出合适的PID参数值。

接下来,系统会根据这些参数值进行温度控制,并不断调整参数值以适应系统的变化。

最后,系统会根据实际的温度变化情况,对PID参数进行进一步优化,以达到更好的控制效果。

需要注意的是,PID自整定算法是一种自适应算法,它可以根据系统的动态响应特性,自动调整参数值。

然而,在实际应用中,由于系统的非线性和时变性等因素的存在,PID参数的自整定可能会受到一定的限制。

因此,为了获得更好的控制效果,可能需要进行一些额外的参数调整或者采用其他更为复杂的控制算法。

温控PID自整定算法是一种应用广泛的温度控制方法。

通过自动计算PID参数的值,可以实现对温度的精确控制。

然而,在实际应用中,需要考虑系统的动态响应特性和非线性时变性等因素,以获得更好的控制效果。

因此,对于不同的温度控制系统,可能需要采用不同的PID参数调整方法或者其他更为复杂的控制算法。

温控PID程序

温控PID程序

#include <aduc7026.h>#include <stdio.h>#include <math.h>#include <absacc.h>#define uint unsigned int#define uchar unsigned charvoid senddata(short);void ADCpoweron(int);char hex2ascii(char);#define so_h() GP2DAT=GP2DAT|0x40400000 //sbit so=P2^6;#define so_l() GP2DAT=GP2DAT&0xFFBF0000void sys_clk_init(unsigned char clk){PLLKEY1=0xAA;PLLCON=0x01; //PLL配置PLLKEY2=0x55;POWKEY1=0x01;POWCON=0x00; //CPU时钟配置为POWKEY2=0xF4;}void TIMER1_init(void){T1LD=0x1000; // Timer 1 Load Value ,约0.4秒 TxLD * 预分频值=0X27D832 * 16// 时间间隔= --------------- = --- ----------- = 1// 源时钟 41.78MT1CON = 0xC4;IRQEN=0x08;}void senddata(short to_send){while(!(0x020==(COMSTA0 & 0x020))){}COMTX = 0x0A; // output LFwhile(!(0x020==(COMSTA0 & 0x020))){}COMTX = 0x0D; // output CRwhile(!(0x020==(COMSTA0 & 0x020))){}COMTX = hex2ascii ((to_send >> 8) & 0x0F);while(!(0x020==(COMSTA0 & 0x020))){}COMTX = hex2ascii ((to_send >> 4) & 0x0F);while(!(0x020==(COMSTA0 & 0x020))){}COMTX = hex2ascii (to_send & 0x0F);}char hex2ascii(char toconv){if (toconv<0x0A){toconv += 0x30;}else{toconv += 0x37;}return (toconv);}uint t=0;uint PWM_T;void PWM(void){while(T1VAL!=0){}T1CON=0x00;t++;if(t==100){t=0;so_l();}if(PWM_T==t){so_h();}T1LD=0x1000;T1CON=0xC4;}void delay_50us(uint t){uchar j;for(;t>0;t--)for(j=19;j>0;j--);}unsigned int average;uint Value0;int a[8];void ADCpoweron(int time){ADCCON = 0x20; // power-on the ADCwhile (time >=0) // wait for ADC to be fully powered ontime--;}void getValue0(void) //ADC0{ADCCP=0x00;REFCON=0x01; //打开内部2.5V参考电压ADCCON=0x1773; //0000 0110 1010 0011=0x06A3(0x06E3) while(ADCSTA==0);Value0=(ADCDAT>>16);}void pwminit(void){GP2CON=0x00110000; //2.4 2.5为输出端口 2.5HPWMCON=0x01;PWMDAT0=0xFFFF;PWMDAT1=0x00;PWMDAT2=0xFF;PWMCFG=0x00;PWMCH0=0x8000 ;}unsigned int result;unsigned int SetPoint;unsigned int Proportion;unsigned int result;unsigned int PIDCalc(){unsigned int dError,Error;unsigned int NextPoint;unsigned int SumError,LastError,PrevError; unsigned int Integral,Derivative;NextPoint=average;Error = NextPoint-SetPoint ; // 偏差SumError += Error; // 积分dError = LastError - PrevError; // 当前微分 PrevError = LastError;LastError = Error;result=(Proportion * Error)/0x148; // 比例项 /*+ Integral *SumError // 积分项+ Derivative * dError; // 微分项 */}int main(){ sys_clk_init(0);ADCpoweron(20000);pwminit();TIMER1_init();SetPoint=0x0666;Proportion=40;GP1CON = 0x011;// Start setting up UARTCOMCON0 = 0x80; // Setting DLABCOMDIV0 = 0x88; //COMDIV1 = 0x00;COMCON0 = 0x07; // Clearing DLAB//while(1){ unsigned int i;unsigned int sum=0;unsigned int max = 0;unsigned int min = 0;for(i=0;i<8;i++){getValue0();a[i]=Value0;}for(i=0;i <8;i++){if(a[i]> a[max]){max = i;}if(a[i] <a[max]){min = i; }}for(i = 0;i <8;i++){ if(i!= max && i != min)sum+=a[i];}PWM() ;average=sum/8;while (!ADCSTA){} // wait for end of conversionsenddata (ADCDAT >> 16);PIDCalc();if(Value0>0x07AE)// 1.2V 0.2-148h 0.1-A3{PWM_T=20; //0.21V}else if(Value0>0x070A&&Value0<0x07AE)// 1.1V 0.2-148h0.1-A3{PWM_T=50; //1.65V}else if(Value0<0x070A)//{PWM_T=result;}}delay_50us(10000);}/***************main函数****************/void Undef_Handler(void) {;}void SWI_Handler(void) {;}void PAbt_Handler(void) {;}void DAbt_Handler(void) {;}void IRQ_Handler(void) __irq {;}void FIQ_Handler(void) __irq {;}。

模糊PID控制温控系统设计C语言程序代码

模糊PID控制温控系统设计C语言程序代码

模糊PID控制温控系统设计C语言程序代码介绍本文介绍了使用模糊PID控制方法来设计温控系统的C语言程序代码。

本温控系统使用传感器读取室内温度,然后根据读取的数值对应调整冷风机的风速和加热器的加热时间,从而控制室内温度达到一个设定值。

系统设计本温控系统采用模糊PID控制方法,具体实现流程如下:1.根据设定温度和当前室内温度计算出误差值2.使用模糊控制方法将误差值转化为温度调节量3.根据模糊控制输出的温度调节量计算出PID控制器的输出4.根据PID控制器的输出调节冷风机的风速和加热器的加热时间系统设计中需要使用的传感器,冷风机和加热器的具体型号及参数需要根据实际情况进行选择。

此处不做详细说明。

程序代码实现以下代码实现了上述系统设计,包括模糊控制和PID控制。

// 温控系统C语言程序代码#include<stdio.h>#include<stdlib.h>// 模糊控制double GetTemperatureByFuzzy(double error){double delta = 0.5; // 设定的温度调节步长double result = 0;if (error <= -5){result = 1;}else if (error > -5 && error < 0){result = (error + 5) / 5.0;}else if (error >= 0 && error < 5){result = (5 - error) / 5.0;}else{result = 0;}return result * delta;}// PID控制double GetTemperatureByPID(double error, double lastError, double integ ral){double Kp = 0.5; // 比例系数double Ki = 0.01; // 积分系数double Kd = 0.1; // 微分系数double deltaT = 0.1; // 采样时间double derivate = (error - lastError) / deltaT;double result = Kp * error + Ki * integral + Kd * derivate;return result;}// 主函数int main(){double setTemp = 25; // 设定温度double curTemp = 24; // 当前温度,需要从传感器读取double lastError = 0; // 上一次的误差值double integral = 0; // 积分项while (1){double error = setTemp - curTemp; // 计算当前误差值double fuzzyTemp = GetTemperatureByFuzzy(error); // 模糊控制integral += error; // 更新积分项double pidTemp = GetTemperatureByPID(error, lastError, integra l); // PID控制lastError = error; // 更新上一次误差值// 根据pidTemp和fuzzyTemp调节冷风机的风速和加热器的加热时间,省略// 读取传感器更新当前温度,省略// curTemp = GetCurTemp();// 采样时间,省略// sleep(1);}}本文介绍了使用模糊PID控制方法来设计温控系统的C语言程序代码。

温控器PID调节方法

温控器PID调节方法

温控器PID调节方法比例(proportion)调节:是按比例反应系统的偏差,比例(P值)越小引发同样调节的所需的偏差越小,(即同样偏差引起的调节越大,即P值与调节作用成反比)可以加快调节,减少误差,但可使系统的稳定性下降,甚至不稳定。

比例越大,所需偏差越大,系统反应越迟钝。

积分(integral)调节:是使系统消除稳态误差,提高无差度。

只要有误差,积分调节就进行,直至无差,积分调节停止。

积分作用的强弱与积分时间常数(完成一次积分所需的时间)I值成反比。

积分时间短,调节作用强。

积分时间长,动态响应慢。

积分作用常与另两种调节规律结合,组成PI调节器或PID调节器。

微分(differential)调节:微分反映系统偏差信号的变化率。

能预见偏差变化的趋势,产生超前的控制作用,,减少超调,减少调节时间。

微分作用对噪声干扰有放大作用,因此D值太大,对系统抗干扰不利。

微分调节作用的大小与微分时间成正比。

微分作用需要与另外两种调节相结合,组成PD或PID控制器。

PID参数整定顺口溜参数整定斩乱麻,P I D 值顺序查调节作用反反正,小步试验找最佳曲线振荡很频繁,比例度盘要放大曲线漂浮绕大湾,比例度盘往小扳曲线偏离回复慢,积分时间往下降曲线波动摆得快,积分时间再加长,曲线振荡频率快,先把微分降下来动差大来波动慢。

微分时间应加长理想曲线两个波,前高后低4比1一看二调多分析,调节质量不会低。

比例:,加热电流与偏差(即实际值和设定值之差)成比例。

P的大小,在数量上是调节器闭环放大倍数的倒数。

P = 偏差电压∕调节器输出电压比例带越小(P越小),开始时调节电压上升越快,但易过冲。

当温差变小,实际比例越接近P,电压越小。

例如:设定温控于60度,在实际温度为20和40度时,加热的功率就不一样。

积分:如果长时间达不到设定值,积分器起作用,进行修正。

加热电流与偏差的累积(积分)成比例。

因此,只要有偏差存在,尽管偏差极微小,但经过长时间的累积,就会有足够的输出去控制炉丝加热电流,去消除偏差,减少小静态误差。

PID温度控制

PID温度控制

/***********************************************************************PID温度控制程序程序说明:系统上电后显示“--温度”表示需要先设定温度才开始进行温度检测温度设定完毕后程序才开始进行PID温控***********************************************************************/#include <reg52.h>#include <absacc.h>#include"DS18B20.H"#include"PID.H"#define uchar unsigned char#define uint unsigned intunsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xBF};/*个位0~9的数码管段码*/unsigned char code sao[]={0x7f,0xbf,0xdf,0xef};//扫描码uchar set=30,keyflag=1 ; //set初始化为30°keyflag为进入温度设定的标志位//4个按键使用说明sbit key_out=P1^0 ; //用于温度设定后的退出sbit key_up=P1^1 ; //设定温度加sbit key_down=P1^2 ; //设定温度减sbit key_in=P1^3 ; //在程序的运行中如需要重新设定温度按下此键才能进入设置模式并且此时是停在温度控制的,按下key_out键后才表示设定完毕void Show_key();/***********************************************************/void delays(unsigned char k){unsigned char i,j ;for(i=0;i<k;i++)for(j=0;j<50;j++);}/*********************************************************//数码管显示函数P0口作为数据口P2口的低四位作为扫描口变量x表示扫描d表示是否要加小数点为1是为0不加y表示传递的数值*********************************************************/LCD_disp_char(uchar x,bit d,uchar y){P2=0XFF ;P0=0xFF ;if(d==0)P0=tab[y];elseP0=tab[y]&0x7f ; //与上0x7f表示是否要加小数点P2=sao[x]; //打开扫描端号}/*********************************************************按键扫描*********************************************************/void keyscan(void){if(key_in==0) //按键进入函数{delays(10); //延时消抖(以下同)if(key_in==0){while(key_in==0){Show_key(); //如果一直按着键不放就一直显示在当前状态(以下同) }keyflag=1 ; //按键标志位}}/***********************/if(key_out==0) //按键退出{delays(10);if(key_out==0){while(key_out==0){Show_key();}keyflag=0 ;set_temper=set ;}}/*************************/if(key_up==0) //设定温度的加{delays(10);if(key_up==0){while(key_up==0){Show_key();}if(keyflag==1){set++;if(set>90) //如果大于90°就不在加set=90 ;}}}/*************************/if(key_down==0) //温度设定的减{delays(10);if(key_down==0){while(key_down==0){Show_key();}if(keyflag==1){set--;if(set<30) //温度减到30°时不在往下减set=30 ;}}}}/********************************************************************* 按键按下时的显示函数***********************************************************************/void Show_key(){output=1 ;LCD_disp_char(3,0,10); //显示-delays(3);LCD_disp_char(2,0,10); //显示- (表示温度设定)delays(3);LCD_disp_char(1,0,set/10); //显示温度十位delays(3);LCD_disp_char(0,0,set%10); //显示温度个位delays(3);}/*****************************************************************/ void main(){unsigned int tmp ;//声明温度中间变量unsigned char counter=0 ;PIDBEGIN(); //PID参数的初始化output=1 ; //关闭继电器输出while(1){keyscan();if(keyflag){Show_key(); //显示温度设定}else{if(counter--==0){tmp=ReadTemperature();//每隔一段时间读取温度值counter=20 ;}LCD_disp_char(3,0,tmp/1000); //显示温度十位delays(3);LCD_disp_char(2,1,tmp/100%10); //显示温度个位//显示小数点delays(3);LCD_disp_char(1,0,tmp/10%10); //显示温度小数后一位delays(3);LCD_disp_char(0,0,tmp%10);//显示温度小数后二位delays(3);P2=0XFF ;P0=0xff ;compare_temper(); //比较温度}}}/****************************************************************************** ****************************************************************///PID算法温控C语言2008-08-17 18:58#ifndef _PID_H__#define _PID_H__#include<intrins.h>#include<math.h>#include<string.h>struct PID{unsigned int SetPoint ;// 设定目标Desired Valueunsigned int Proportion ;// 比例常数Proportional Constunsigned int Integral ;// 积分常数Integral Constunsigned int Derivative ;// 微分常数Derivative Constunsigned int LastError ;// Error[-1]unsigned int PrevError ;// Error[-2]unsigned int SumError ;// Sums of Errors};struct PID spid ;// PID Control Structureunsigned int rout ;// PID Response (Output)unsigned int rin ;// PID Feedback (Input)sbit output=P1^4;unsigned char high_time,low_time,count=0 ;//占空比调节参数unsigned char set_temper ;void PIDInit(struct PID*pp){memset(pp,0,sizeof(struct PID)); //PID参数初始化全部设置为0}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);// 微分项}/***********************************************************温度比较处理子程序***********************************************************/void compare_temper(){unsigned char i ;//EA=0;if(set_temper>temper){if(set_temper-temper>1){high_time=100 ; //大于1°不进行PID运算low_time=0 ;}else{ //在1°范围内进行PID运算for(i=0;i<10;i++){//get_temper();rin=s;// Read Inputrout=PIDCalc(&spid,rin); //执行PID运算// Perform PID Interation}if(high_time<=100) //限制最大值high_time=(unsigned char)(rout/800);elsehigh_time=100;low_time=(100-high_time);}}/****************************************/else if(set_temper<=temper) //当实际温度大于设置温度时{if(temper-set_temper>0)//如果实际温度大于设定温度{high_time=0 ;low_time=100 ;}else{for(i=0;i<10;i++){//get_temper();rin=s ;// Read Inputrout=PIDCalc(&spid,rin);// Perform PID Interation}if(high_time<100) //此变量是无符号字符型high_time=(unsigned char)(rout/10000);elsehigh_time=0 ;//限制不输出负值low_time=(100-high_time);//EA=1;}}}/***************************************************** T0中断服务子程序,用于控制电平的翻转,40us*100=4ms周期******************************************************/ void serve_T0()interrupt 1 using 1{if(++count<=(high_time))output=0 ;else if(count<=100){output=1 ;}elsecount=0 ;TH0=0x2f ;TL0=0xe0 ;}void PIDBEGIN(){TMOD=0x01 ;TH0=0x2f ;TL0=0x40 ;EA=1 ;ET0=1 ;TR0=1 ;high_time=50 ;low_time=50 ;PIDInit(&spid);// Initialize Structurespid.Proportion=10 ;// Set PID Coefficientsspid.Integral=8 ;spid.Derivative=6 ;spid.SetPoint=100 ;// Set PID Setpoint}#endif。

PID温度控制的PLC程序设计(梯形图语言)教学文案

PID温度控制的PLC程序设计(梯形图语言)教学文案

P I D温度控制的P L C 程序设计(梯形图语言)PID温度控制的PLC程序设计(梯形图语言)PID温度控制的PLC程序设计温度控制是许多机器的重要的构成部分。

它的功能是将温度控制在所需要的温度范围内,然后进行工件的加工与处理。

PID控制系统是得到广泛应用的控制方法之一。

在本文中,将详细讲叙本套系统。

l 系统组成本套系统采用Omron的PLC与其温控单元以及Pro-face的触摸屏所组成。

系统包括CQM1H-51、扩展单元TC-101、GP577R以及探温器、加热/制冷单元。

l 触摸屏画面部分(见图1-a)1-a如图所见,数据监控栏内所显示的002代表现在的温度,而102表示输出的温度。

如按下开始设置就可设置参数。

需要设置的参数有六个,分别是比例带、积分时间、微分时间、滞后值、控制周期、偏移量。

它们在PLC的地址与一些开关的地址如下所列。

比例带 : DM51积分时间 : DM52微分时间 : DM53滞后值 : DM54控制周期 : DM55偏移量 : DM56数据刷新 : 22905l PLC程序部分002:PID的输入字102:PID的输出字[NETWORK]Name="Action Check" //常规检查[STATEMENTLIST]LD 253.13 //常ONOUT TR0CMP 002 #FFFF //确定温控单元是否完成初始化字串1AND NOT 255.06 //等于OUT 041.15 //初始化完成LD TR0AND 041.15OUT TR1AND NOT 040.10 //不在参数设置状态MOV DM0050 102 //将设置温度DM50传送给PID输出字 LD TR1MOV 002 DM0057 //将002传送到DM57[NETWORK]Name="Setting Start"//设置开始[STATEMENTLIST]LD 253.13OUT TR0AND 229.05 //触摸屏上的开始设置开关DIFU 080.05 //设置微分LD TR0AND 041.15AND 080.05SET 040.01 //开始设置标志位1SET 040.10 //开始设置标志位2[NETWORK]Name="Poportion"//比例带设置[STATEMENTLIST]LD 040.01OUT TR0AND NOT 042.01MOV #C110 102 //读输出边与输入边的比例带CMP 002 #C110 //比较输入字是否变成C110AND 255.06 //等于SET 042.01 //设置比例带标志LD TR0AND 042.01MOV DM0051 102 //将比例带的设定值写入输出字 CMP 002 DM0051 //是否写入AND 255.06 字串4RSET 040.01 //复位标志1RSET 042.01 //复位比例带标志SET 040.02 //向下继续设置标志[NETWORK]Name="Integral"//积分时间设置[STATEMENTLIST]LD 040.02OUT TR0AND NOT 042.02MOV #C220 102 //读输出边与输入边的积分CMP 002 #C220 //比较输入字是否变成C220AND 255.06SET 042.02 //设置积分标志LD TR0AND 042.02MOV DM0052 102 //将积分的设定值写入输出字 CMP 002 DM0052 //是否写入AND 255.06RSET 040.02RSET 042.02SET 040.03 //向下继续设置标志[NETWORK]Name="differential"//微分时间设置[STATEMENTLIST]LD 040.03OUT TR0AND NOT 042.03MOV #C330 102 //读输出边与输入边的微分CMP 002 #C330 //比较输入字是否变成C330AND 255.06SET 042.03 //设置微分标志LD TR0AND 042.03MOV DM0053 102 /将微分的设定值写入输出字CMP 002 DM0053 //是否写入字串3AND 255.06RSET 040.03RSET 042.03SET 040.04 //向下继续设置标志[NETWORK]Name="Hysteresis"//滞后值设置[STATEMENTLIST]LD 040.04OUT TR0AND NOT 042.04MOV #C440 102 //读输出边与输入边的滞后值CMP 002 #C440 //比较输入字是否变成C440AND 255.06SET 042.04 设置滞后值标志LD TR0AND 042.04MOV DM0054 102 /将滞后值的设定值写入输出字 CMP 002 DM0054 //是否写入AND 255.06RSET 040.04RSET 042.04SET 040.05 //向下继续设置标志[NETWORK]Name="Period"//控制周期设置[STATEMENTLIST]LD 040.05OUT TR0AND NOT 042.05MOV #C550 102 //读输出边与输入边的控制周期CMP 002 #C550 //比较输入字是否变成C550AND 255.06SET 042.05 //设置控制周期标志LD TR0AND 042.05MOV DM0055 102 将控制周期的设定值写入输出字CMP 002 DM0055 是否写入AND 255.06RSET 040.05RSET 042.05SET 040.06 //向下继续设置标志[NETWORK]Name="Shift"//偏移量设置[STATEMENTLIST]LD 040.06OUT TR0AND NOT 042.06MOV #C660 102 //读输出边与输入边的偏移量CMP 002 #C660 //比较输入字是否变成C660AND 255.06SET 042.06 //设置偏移量标志LD TR0AND 042.06MOV DM0056 102 //将偏移量的设定值写入输出字 CMP 002 DM0056 //是否写入AND 255.06RSET 040.06RSET 042.06SET 040.00[NETWORK]Name="Return"//返回[STATEMENTLIST]LD 040.00OUT TR0AND NOT 042.00MOV #C070 102 //读输入边的处理值CMP 002 #C070 比较输入字变成C070AND 255.06SET 042.00 //返回标志LD TR0AND 042.00MOV DM0050 102 将设定温度值写入输出字RSET 040.00RSET 042.00RSET 040.10以上是本套系统的全部内容,经过反复试验,此系统可以维持温度在1°C 之间变化。

pid算法温度控制c语言程序

pid算法温度控制c语言程序

pid算法温度控制c语言程序PID算法是一种常用的温度控制算法,广泛应用于各种温度控制系统中。

在C语言中,我们可以通过编写程序来实现PID算法的温度控制功能。

我们需要了解PID算法的基本原理。

PID算法是通过对系统的反馈信号进行不断调整,使得系统的输出达到期望值。

PID算法由三个部分组成:比例控制、积分控制和微分控制。

比例控制根据反馈信号与期望值的差异来调整输出;积分控制根据反馈信号与期望值的累积差异来调整输出;微分控制根据反馈信号的变化率来调整输出。

在C语言中,我们可以使用变量来表示系统的输入、输出和期望值。

以下是一个简单的示例代码:```c#include <stdio.h>// 定义PID参数float Kp = 1.0; // 比例系数float Ki = 0.5; // 积分系数float Kd = 0.2; // 微分系数// 定义系统变量float setpoint = 25.0; // 期望值float input = 0.0; // 输入值float output = 0.0; // 输出值// 定义误差变量float error = 0.0; // 当前误差float last_error = 0.0; // 上一次误差float integral = 0.0; // 累积误差// PID算法函数float pid_algorithm(float setpoint, float input) {// 计算误差error = setpoint - input;// 计算比例控制float proportional = Kp * error;// 计算积分控制integral += error;float integral_control = Ki * integral;// 计算微分控制float derivative = Kd * (error - last_error); // 计算输出output = proportional + integral_control + derivative;// 更新误差last_error = error;return output;}int main(){// 模拟温度传感器的输入input = 23.5;// 调用PID算法函数output = pid_algorithm(setpoint, input);// 打印输出结果printf("Output: %.2f\n", output);return 0;}```在上述代码中,我们首先定义了PID算法的参数和系统变量。

温控仪的PID参数设置

温控仪的PID参数设置

温控仪的PID参数设置对于XMT914、XMT614、XMT916温控仪的参数,和恒温控制的参数只有P、I、D、T、ALL、SOUF几个参数,下面我们分别介绍西安西曼电子科技有限公司温控仪的这几个参数的设定规则P:比例系数,P是PID参数里面最关键的一个参数,如果P设定有问题,即使其他参数怎么调节,也不会有好的控制效果, XMT914、XMT614、XMT916等温控仪出厂默认的P参数是1.6,这个适合大多数系统,如果控制效果不好,无非以下三种情况,第一:温度上升缓慢,离设定的目标值还很远时,系统已经开始频繁的进行断续调节,这种情况是P参数较大造成的,此时,可以适当的减小P 的设定,P的减小每次在原来基础上变化10%进行,调整完后再进行观察,直至升温迅速,在快接近目标值时,才开始进行调节,而且没有过大的超温现象;第二种是温度上升很快,已经马上接近目标值时,系统才开始进行断续调节,这样的情况是P参数较大造成的,可以适当的减小P的设定,使系统调节的灵敏度增加,直至系统升温平缓可控,没有较大的超温现象;第三种情况,温度的上升比较平稳、迅速,但会围绕目标值上、下频繁波动,如果发现系统控制滞后,也就是说温度已经超温,系统的输出才开始减小,这时可以减小P的设定,如果发现系统控制超前,也就是,温度还没有达到目标值,就开始减小输出,那就是超前调节,这时可以增大P的设定,直至系统趋于稳定。

总只,P的设定要考长时间无扰动观察,我们一般把P形象的解说为系统的灵敏度,也就像一个人的个性一样,P越小,灵敏度越大,性子越急,对温度的调节反应越迅速,当系统有一点误差时,就会做出大范围的调节,这样就会出现过犹不及的现象,造成系统震荡。

反之P越大,灵敏度也就越小,属于一个慢性子的人,对温度的变化反应不积极,不如实际温度里目标温度还很远,理应迅速升温,而P过大,就会反应出升温缓慢,对超温后理应减小输出也是一样的。

了解了这些,P参数的手动调节就不会有太大的问题了、I参数:I是当系统稳定后有一个相对对误差进行调节的,比如实际值一直偏离目标值有个固定的误差,而且系统惠安能保持稳定,那这种情况就该减小I的设定,使I参数代表的积分作用加强,直至相对误差的产生;也有情况是实际值围绕目标值最上、下的偏差震荡,一会高于目标值,一会低于目标值,上、下偏差的温度基本相同,这种情况,就是I参数设定太小造成的,可以适当的增大I的设定,减小积分的调节作用。

PLC/PID温控程序

PLC/PID温控程序

∙∙faic∙1楼PID温度控制的PLC程序设计温度控制是许多机器的重要的构成部分。

它的功能是将温度控制在所需要的温度范围内,然后进行工件的加工与处理。

PID控制系统是得到广泛应用的控制方法之一。

在本文中,将详细讲叙本套系统。

l 系统组成本套系统采用Omron的PLC与其温控单元以及Pro-face的触摸屏所组成。

系统包括CQM1H-51、扩展单元TC-101、GP577R以及探温器、加热/制冷单元。

l 触摸屏画面部分(见图1-a)1-a如图所见,数据监控栏内所显示的002代表现在的温度,而102表示输出的温度。

如按下开始设置就可设置参数。

需要设置的参数有六个,分别是比例带、积分时间、微分时间、滞后值、控制周期、偏移量。

它们在PLC的地址与一些开关的地址如下所列。

比例带 : DM51积分时间 : DM52微分时间 : DM53滞后值 : DM54控制周期 : DM55偏移量 : DM56数据刷新 : 22905l PLC程序部分002:PID的输入字102:PID的输出字[NETWORK]Name="Action Check" //常规检查[STATEMENTLIST]LD 253.13 //常ONOUT TR0CMP 002 #FFFF //确定温控单元是否完成初始化AND NOT 255.06 //等于OUT 041.15 //初始化完成LD TR0AND 041.15OUT TR1AND NOT 040.10 //不在参数设置状态MOV DM0050 102 //将设置温度DM50传送给PID输出字LD TR1MOV 002 DM0057 //将002传送到DM57[NETWORK]Name="Setting Start"//设置开始[STATEMENTLIST]LD 253.13OUT TR0AND 229.05 //触摸屏上的开始设置开关DIFU 080.05 //设置微分LD TR0AND 041.15AND 080.05SET 040.01 //开始设置标志位1SET 040.10 //开始设置标志位2[NETWORK]Name="Poportion"//比例带设置[STATEMENTLIST]LD 040.01OUT TR0AND NOT 042.01MOV #C110 102 //读输出边与输入边的比例带CMP 002 #C110 //比较输入字是否变成C110AND 255.06 //等于SET 042.01 //设置比例带标志LD TR0AND 042.01MOV DM0051 102 //将比例带的设定值写入输出字 CMP 002 DM0051 //是否写入AND 255.06RSET 040.01 //复位标志1RSET 042.01 //复位比例带标志SET 040.02 //向下继续设置标志[NETWORK]Name="Integral"//积分时间设置[STATEMENTLIST]LD 040.02OUT TR0AND NOT 042.02MOV #C220 102 //读输出边与输入边的积分CMP 002 #C220 //比较输入字是否变成C220AND 255.06SET 042.02 //设置积分标志LD TR0AND 042.02MOV DM0052 102 //将积分的设定值写入输出字 CMP 002 DM0052 //是否写入AND 255.06RSET 040.02RSET 042.02SET 040.03 //向下继续设置标志[NETWORK]Name="differential"//微分时间设置[STATEMENTLIST]LD 040.03OUT TR0AND NOT 042.03MOV #C330 102 //读输出边与输入边的微分CMP 002 #C330 //比较输入字是否变成C330AND 255.06SET 042.03 //设置微分标志LD TR0AND 042.03MOV DM0053 102 /将微分的设定值写入输出字 CMP 002 DM0053 //是否写入AND 255.06RSET 040.03RSET 042.03SET 040.04 //向下继续设置标志[NETWORK]Name="Hysteresis"//滞后值设置[STATEMENTLIST]LD 040.04OUT TR0AND NOT 042.04MOV #C440 102 //读输出边与输入边的滞后值CMP 002 #C440 //比较输入字是否变成C440AND 255.06SET 042.04 设置滞后值标志LD TR0AND 042.04MOV DM0054 102 /将滞后值的设定值写入输出字 CMP 002 DM0054 //是否写入AND 255.06RSET 040.04RSET 042.04SET 040.05 //向下继续设置标志[NETWORK]Name="Period"//控制周期设置[STATEMENTLIST]LD 040.05OUT TR0AND NOT 042.05MOV #C550 102 //读输出边与输入边的控制周期CMP 002 #C550 //比较输入字是否变成C550AND 255.06SET 042.05 //设置控制周期标志LD TR0AND 042.05MOV DM0055 102 将控制周期的设定值写入输出字 CMP 002 DM0055 是否写入AND 255.06RSET 040.05RSET 042.05SET 040.06 //向下继续设置标志[NETWORK]Name="Shift"//偏移量设置[STATEMENTLIST]LD 040.06OUT TR0AND NOT 042.06MOV #C660 102 //读输出边与输入边的偏移量CMP 002 #C660 //比较输入字是否变成C660AND 255.06SET 042.06 //设置偏移量标志LD TR0AND 042.06MOV DM0056 102 //将偏移量的设定值写入输出字 CMP 002 DM0056 //是否写入AND 255.06RSET 040.06RSET 042.06SET 040.00[NETWORK]Name="Return"//返回[STATEMENTLIST]LD 040.00OUT TR0AND NOT 042.00MOV #C070 102 //读输入边的处理值CMP 002 #C070 比较输入字变成C070AND 255.06SET 042.00 //返回标志LD TR0AND 042.00MOV DM0050 102 将设定温度值写入输出字RSET 040.00RSET 042.00RSET 040.10以上是本套系统的全部内容,经过反复试验,此系统可以维持温度在1°C之间变化。

简单有效的PID温控算法

简单有效的PID温控算法
S S N 1 0 0 6 — 7l 6 7
宫 赂 宝 研 亩南 拓 庶
I { ESEAR( : H AND EXl , I OR^TJ ( ) N I N LAB ( )RAr r 《 )R、
第 3 6卷 筇 1 0期
Vo 1 . 3 6 No . 1 0
2 0 I 7年 1 0

控制 器 因为结 构简 单 、 技 术 成熟 、 鲁 棒 性 强 等优 点 ,
股 采用模 糊理论 或神 经 网络对 P 1 D 参 数 进 行 线 修
正, 形 成 自适应 P I D控 制器 来控 制温 度 … 。另外 , 门子 P L C中 的 P I D温 控 程 序 采 用 了 A s h ’ o n l和
1 P I D 温 控 的 加 热 过 程
当 以一定 加热 速度 进行 加热 的同时也 伴 随着 热流 失, 如果加 热 速度 大 于热 流 失速 度 , 那 么温 度 将 升 高 ,
( 2 )积 分过 量 。过快 的积 分速 度使 得 到达设 定 温
度时, 积 分分 量大 大超 过平 衡关 系公 式所 要求 的量 。 自适 应 P I D控 制 器通过 对 P I D的参 数进 行在 线修 正, 以避免 上 述情 况 。 本 文避 开 复 杂 的 参 数 自整 定方
c o n t r o l l e r a c h i e v e d g o o d e f f e c t i n t i r e l e mp m’ a t u r e e o n t l ’ o l s y s t e m o f a s pi n n i n g d r o p t e n s i o me t e r . Th e PI D C O l r l i ’ o i l e r

C语言编写PID温度控制程序

C语言编写PID温度控制程序

(* init program *)PIDpara.enable = 1 ;使能端PIDpara.enter = 1 ;当enter为1时,检查参数并转换为内部显示。

;当enter为0时,忽略输入参数的改变并存储计算时间。

PIDpara.Y_max = 32767 ;PID输出最大值(0~~32767)PIDpara.Y_min = 0 ;PID输出最小值(0~~32767)PIDpara.dY_max = 10.0 ;输出最大容许变化量,操作变量斜坡最大值。

为0时ramp不起作用,不需计算时间PIDpara.Kp = 1.0 ;比例PIDpara.Tn = 10.0 ;积分(越小作用越大),为0时第I part和jolt-free切换不起作用且不需要任何计算时间。

= 1 ;微分PIDpara.Tf = 1 ;微分滤波时间。

若Tv不为0必须输入(初值为Tv/10),不应少于(1.4*任务的扫描时间).PIDpara.Kw = 1 ;比例项衰减系数。

Kw为1时设定值不变进行比例项计算,为小于1时,设定值乘Kw后进行比例项计算(此项不能为零)PIDpara.Kfbk = 1 ;抗积分饱和,终结阻尼值。

Kfbk为0时终结保护无效,不需要计算时间PIDpara.fbk_mode = LCPID_FBK_MODE_INTERN ;操作变量的反馈模式:内部模式(一般为内部模式)PIDpara.d_mode = LCPID_D_MODE_E ;微分模式:对偏差值进行微分计算(标准PID控制);X模式:对实际值进行微分计算(一般选次方式)PIDpara.calc_mode= LCPID_CALC_MODE_EXACT ;计算模式:精确(所有计算为双精度浮点型, 如无舍入错误和CPU计算次数过长)(一般选次方式)PIDpara FUB LCPIDpara() ;调用PID参数功能块循环程序中程序如下,此程序只对P、I、D三个参数由变量进行输值,变量可在pid程序运行中实时修改,如果大家还需要某些参数实时修改,方法相同:(* cyclic program *)PIDpara.enable = PIDpara.enablePIDpara FUB LCPIDpara() = D_Ctrl ;积分(越小作用越大),为0时第I part和jolt-free 切换不起作用且不需要任何计算时间。

51单片机温控器PID程序

51单片机温控器PID程序
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a;
if(t<=0||t>0x900) return Real_temp;
return(t);
}
void display(signed int dd)//数码管扫描函数
{
int tt=0;
tt= (unsigned int)(dd*0.625+0.5); //放大10倍输出并四舍五入
m=tt/100; //分离出十位
n=(tt%100)/10; //分离出个位
p=tt%10; //分离出小数位
P0=table[m];
out=0;
PWM=0;
I_term=0;
last_error=0;
Set_temp=41; //初始设定温度为41度
Set_temp<<=4;
Real_temp=Set_temp;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
key_value=P1;
key_value&=0x07; //提取按键键值
if(key_value!=7) //按键按下
{
if(!key_hold) //按键第一次按下
{
key_hold=1; //标志按键处于保持按下状态
switch (key_value)
{
TH0=0xFF;
TL0=0x80;
if(PWM)
{ PWM=0;

基于PID算法的水温控制系统设计报告

基于PID算法的水温控制系统设计报告

基于PID的水温控制系统设计摘要本次设计采用proteus仿真软件,以AT89C51单片机做为主控单元,运用PID控制算法,仿真实现了一个恒温控制系统。

设计中使用温度传感器DS18B20采集实时温度,不需要复杂的信号调理电路和A/D转换电路,能直接与单片机完成数据的采集和处理,使用PID算法控制加热炉仿真模型进行温度控制,总体实现了一个恒温控制仿真系统。

系统设计中包含硬件设计和软件设计两部分,硬件设计包含显示模块、按键模块、温度采集模块、温度加热模块。

软件设计的部分,采用分层模块化设计,主要有:键盘扫描、按键处理程序、液晶显示程序、继电器控制程序、温度信号处理程序。

另外以AT89C51 单片机为控制核心,利用PID 控制算法提高了水温的控制精度,使用PID 控制算法实施自动控制系统,具有控制参数精度高、反映速度快和稳定性好的特点。

关键词:proteus仿真,PID,AT89C51,DS18B20温度控制目录1 系统总体设计方案论证 (1)1.1 设计要求 (1)1.2 总体设计方案 (2)2 系统的硬件设计 (3)2.1 系统硬件构成概述 (3)2.2 各单元总体说明 (4)2.3 按键单元 (5)2.4 LCD液晶显示单元 (6)2.5 温度测试单元 (7)2.6 温度控制器件单元 (8)3 恒温控制算法研究(PID)............................................................................. 错误!未定义书签。

3.1 PID控制器的设计 (10)3.2 PID算法的流程实现方法与具体程序 (12)4 系统的软件设计 (17)4.1 统软件设计概述 (17)4.2 系统软件程序流程及程序流程图 (18)4.3 温度数据显示模块分析 (19)4.4 测试分析 (22)5 模拟仿真结果 ...................................................................................................... 错误!未定义书签。

位置式温控PID程序

位置式温控PID程序
位置式温控pid程序 e_k=sp-pv.pv;out_p=pid_p*e_k; out_i1=pid_p*e_k*ts/pid_i; out_i=out_i+out_i1; out_i=50;endif out_i=0;endif out_d=pid_p*pid_d/ts*e;e_k1=e_k; pid_out=out_p+out_i+out_d; pid_out=100;endif pid_out=0;endif pwm_on=pid_out/2; endif //程序控温 sp=sp;else sp=sp+0.003; endif touch.pv==0;endif endif //pwm程序 count=count+1; pwm_on=pwm_on-1; jare.pv=1;else jare.pv=0; endif count=0;endif endif h9cmb6x 分享于 2018-04-15 08:41ห้องสมุดไป่ตู้10.0 位置式温控pid程序 文档格式: .doc 文档页数: 2页 文档大小: 24.5k 文档热度: 文档分类: 幼儿/小学教育 -- 教育管理 文档标签: 位置式温控pid程序 系统标签: pid endif 程序 位置 pwm num
IF count==0 THEN e_k=sp-PV.PV; OUT_P=PID_P*e_k; OUT_I1=PID_P*e_k*Ts/PID_I; OUT_I=OUT_I+OUT_I1; IF OUT_I>=50 THEN OUT_I=50; ENDIF IF sp<=PV.PV THEN OUT_I=0; ENDIF E=e_k-e_k1; OUT_D=PID_P*PID_D/Ts*E; e_k1=e_k; PID_OUT=OUT_P+OUT_I+OUT_D; IF PID_OUT>=100 THEN PID_OUT=100; ENDIF IF PID_OUT<=0 THEN PID_OUT=0; ENDIF PWM_ON=PID_OUT/2;ENDIF//程序控温IF Touch.PV==1 THEN num=num+1; IF num>=2000&&num<=3000 THEN sp=sp; ELSE sp=sp+0.003; ENDIF IF num>=5000 THEN Touch.PV==0; ENDIFENDIF//PWM程序count=count+1;PWM_ON=PWM_ON-1;IF PWM_ON<=50 THEN IF PWM_ON>0 THEN JARE.PV=1; ELSE JARE.PV=0; ENDIF IF count>50 THEN count=0;ENDIFENDIF

模糊PID控制温控系统设计C语言程序代码

模糊PID控制温控系统设计C语言程序代码

模糊PID控制温控系统设计C语言程序代码请注意,由于1200字的限制,下面的代码只是模糊PID控制温控系统的一个简单示例。

如果您需要更详细和完整的代码,请提供更多的细节和规格要求。

```c#include <stdio.h>//PID参数float kp = 0.5; // 比例系数float ki = 0.2; // 积分系数float kd = 0.1; // 微分系数//PID变量float integral = 0; // 积分累计float previous_error = 0; // 上一次的误差//温度传感器读取函数,返回当前温度float read_temperatur//实现温度传感器读取的代码逻辑//返回当前温度值//控制器输出函数,将控制信号发送给执行机构void control_output(float control_signal)//实现将控制信号发送给执行机构的代码逻辑int mai//设置设定温度float setpoint = 25.0;//主循环while (1)//获取当前温度float current_temperature = read_temperature(;//计算误差float error = setpoint - current_temperature;//计算PID控制信号float p_term = kp * error;integral += ki * error;float d_term = kd * (error - previous_error);float control_signal = p_term + integral + d_term; //更新上一次的误差previous_error = error;//输出控制信号control_output(control_signal);}return 0;```上述代码中,我们首先定义了PID参数和变量,以及温度传感器读取函数和控制器输出函数。

基于PID算法的温度控制系统软件设计

基于PID算法的温度控制系统软件设计

基于PID算法的温度控制系统软件设计引言电加热炉是典型工业过程控制对象,其温度控制具有升温单向性,大惯性,纯滞后,时变性等特点,很难用数学方法建立精确的模型和确定参数。

而PID控制因其成熟,容易实现,并具有可消除稳态误差的优点,在大多数情况下可以满足系统性能要求,但其性能取决于参数的整定情况。

且快速性和超调量之间存在矛盾,使其不一定满足快速升温、超调小的技术要求。

模糊控制在快速性和保持较小的超调量方面有着自身的优势,但其理论并不完善,算法复杂,控制过程会存在稳态误差。

将模糊控制算法引入传统的加热炉控制系统构成智能模糊控制系统,利用模糊控制规则自适应在线修改PID参数,构成模糊自整定:PID控制系统,借此提高其控制效果。

基于PID控制算法,以ADuC845单片机为主体,构成一个能处理较复杂数据和控制功能的智能控制器,使其既可作为独立的单片机控制系统,又可与微机配合构成两级控制系统。

该控制器控制精度高,具有较高的灵活性和可靠性。

2温度控制系统硬件设计该系统设计的硬件设计主要由单片机主控、前向通道、后向通道、人机接口和接口扩展等模块组成,如图l所示。

由图1可见,以内含C52兼容单片机的ADuC845为控制核心.配有640KB的非易失RAM数据存储器、外扩键盘输人、320x240点阵的图形液晶显示器进行汉字、图形、曲线和数据显示,超温报警装置等外围电路;预留微型打印机接口,可以现场打印输出结果;预留RS232接口,能和PC机联机,将现场检测的数据传输至PC机来进一步处理、显示、打印和存档。

电阻炉的温度先由热电偶温度传感器检测并转换成微弱的电压信号,温度变送器将此弱信号进行非线性校正及电压放大后,由单片机内部A/D转换器将其转换成数字量。

此数字量经数字滤波、误差校正、标度变换、线性拟合、查表等处理后。

一方面将炉窑温度经人机面板上的LCD显示:另一方面将该温度值与被控制值(由键盘输入的设定温度值)比较,根据其偏差值的大小,提供给控制算法进行运算,最后输出移相控制脉冲,放大后触发可控硅导通(即控制电阻炉平均功率)。

PID温度控制程序

PID温度控制程序
=====================================================================================================*/
void PIDInit (struct PID *pp)
{
memset ( pp,0,sizeof(struct PID));
}
/***********************************************************
写一位数据子程序
***********************************************************/
void write_bit(unsigned char bitval)
dError = pp->LastError - pp->revError; // 当前微分
pp->revError = pp->LastError;
pp->LastError = Error;
return (pp->roportion * Error//比例
+ pp->Integral * pp->SumError //积分项
unsigned int Proportion; // 比例常数 Proportional Const
unsigned int Integral; // 积分常数 Integral Const
unsigned int Derivative; // 微分常数 Derivative Const
+ pp->Derivative * dError); // 微分项

PID算法温控C语言

PID算法温控C语言

PID算法温控C语言浏览次数:1964次悬赏分:80|解决时间:2008-5-23 12:57 |提问者:3849801我在做一个89S51单片机的温控试验,要求是1升水的保温。

温度任意设定,要求用C语言编写PID算法来实现温度控制(使用1个18B20传感器)要求温度精确小于0.5度。

急求高手写一段程序,让小弟学习学习最佳答案1. PID调试步骤没有一种控制算法比PID调节规律更有效、更方便的了。

现在一些时髦点的调节器基本源自PID。

甚至可以这样说:PID调节器是其它控制调节算法的妈。

为什么PID应用如此广泛、又长久不衰?因为PID解决了自动控制理论所要解决的最基本问题,既系统的稳定性、快速性和准确性。

调节PID的参数,可实现在系统稳定的前提下,兼顾系统的带载能力和抗扰能力,同时,在PID调节器中引入积分项,系统增加了一个零积点,使之成为一阶或一阶以上的系统,这样系统阶跃响应的稳态误差就为零。

由于自动控制系统被控对象的千差万别,PID的参数也必须随之变化,以满足系统的性能要求。

这就给使用者带来相当的麻烦,特别是对初学者。

下面简单介绍一下调试PID参数的一般步骤:1.负反馈自动控制理论也被称为负反馈控制理论。

首先检查系统接线,确定系统的反馈为负反馈。

例如电机调速系统,输入信号为正,要求电机正转时,反馈信号也为正(PID算法时,误差=输入-反馈),同时电机转速越高,反馈信号越大。

其余系统同此方法。

2.PID调试一般原则a.在输出不振荡时,增大比例增益P。

b.在输出不振荡时,减小积分时间常数Ti。

c.在输出不振荡时,增大微分时间常数Td。

3.一般步骤a.确定比例增益P确定比例增益P 时,首先去掉PID的积分项和微分项,一般是令Ti=0、Td=0(具体见PID的参数设定说明),使PID为纯比例调节。

输入设定为系统允许的最大值的60%~70%,由0逐渐加大比例增益P,直至系统出现振荡;再反过来,从此时的比例增益P逐渐减小,直至系统振荡消失,记录此时的比例增益P,设定PID的比例增益P为当前值的60%~70%。

pid 温控方案

pid 温控方案

pid 温控方案咱来聊聊PID温控方案哈。

一、啥是PID温控呢?你可以把温度控制想象成开汽车。

比如说,你想让汽车保持一个固定的速度(就像让温度保持在一个定值)。

1. P 比例(Proportional)部分。

这就像是你根据当前速度和目标速度的差距来踩油门或者刹车。

如果你的速度比目标速度低很多,那你就会用力踩油门(在温控里就是加大加热功率或者减小制冷功率)。

如果速度比目标速度高一点,那就轻轻踩刹车(在温控里就是稍微减小加热功率或者加大制冷功率)。

比例系数就像是你踩油门或者刹车的力度大小的一个调整参数。

如果这个系数太大,就像你踩油门太猛,可能会一下子超过目标速度(温度超调);如果系数太小,就像你踩油门太轻,可能很久都到不了目标速度(温度上升或者下降得很慢)。

2. I 积分(Integral)部分。

这部分呢,就像是你在开车过程中,如果你一直发现速度比目标速度低一点,虽然每次差距不大,但是积累起来就会让你觉得要更用力踩油门。

在温控里,如果温度总是比目标温度低一点(哪怕只是一点点偏差),积分部分就会不断累积这个偏差,然后慢慢增加加热功率(或者减小制冷功率),这样就能消除那种长时间存在的小偏差。

要是没有积分部分,可能就会一直有那么一点温度没达到目标值的情况。

3. D 微分(Differential)部分。

这就像是你在开车的时候,不但看现在的速度和目标速度的差距,还看速度变化的快慢。

比如说你正在加速,但是你发现速度增加得太快了,那你就要提前松一点油门。

在温控里,如果温度上升或者下降得特别快,微分部分就会根据这个变化速度来调整功率。

如果温度正在快速上升接近目标温度,微分部分就会减小加热功率(或者增加制冷功率),这样就能避免温度一下子冲过目标温度(超调)。

二、PID温控方案的实施步骤。

1. 确定目标温度。

这就像你开车要先确定目的地一样。

你得知道你想要达到的温度是多少,比如说你想让房间温度保持在25摄氏度,那25度就是目标温度。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

以下为PID温控程序,没有采用SFB41是因为些模块比较大,影响系统反应速度。

些温度控制系统不用微分(D)控制,只用PI控制
Kc 为回路的增
Ts 为采样的时间间隔
Ti 为积分时间MD
SPn 为采样时刻n的设定值
PVn 为采样时刻n的过程变量值
MX 为采样时刻n-1的积分项(又称为积分前项)
PID运算公式1:MPN=KC*(SPN-PVN)
PID运算公式2;MIN=KC*TS/TI*(SPN-PVN)+MX
PID运算公式3:MN=MPN+MIN
不用微分(D)控制,原工式为:MN=MPN+MIN+MDN
PI运算程序对应的DB1:
主程序对应的DB2:
模拟输入量:IW2
模拟输出量:PQDO
Kc 为回路的增
Ts 为采样的时间间隔
Ti 为积分时间MD
SPn 为采样时刻n的设定值
PVn 为采样时刻n的过程变量值
MX 为采样时刻n-1的积分项(又称为积分前项)
对应地址:
网络1和 2 是模拟采集的“模拟输入量:IW2”和组态画面上Kc Ts Ti SPn PVn 的设定值。

实际操作中不需要。

改变模拟输入量:IW2
观察模拟输出量变化:PQDO
观察模拟输出量变化:PQDO
观察模拟输出量变化:PQDO
观察模拟输出量变化:PQDO
OK!其他变量改变后一样能回到平衡:如改以下值:
Kc 为回路的增
Ts 为采样的时间间隔
Ti 为积分时间MD
SPn 为采样时刻n的设定值
以下为PID运算温控程序,没有采用SFB41是因为些模块比较大,影响系统反应速度。

些温度控制系统不用微分(D)控制,只用PI控制
下面是主程序:FB2
下面是各电机启动程序
模拟量输入,数据格式转换
模拟量输出,数据格式转换
限制输出范围:0~32767
停止后全部清零,为组态画面变量编写的程序
以下为模拟给PN当前值,SP设定值,TI积分时间,TS采样时间,KC增益量,
结果:FB2
我们看一下温度显示:
Kc DB2。

DBD 66 为回路的增
Ts DB2。

DBD74 为采样的时间间隔
Ti DB2。

DBD70 为积分时间MD
SPn DB2。

DBD78 为采样时刻n的设定值
PVn DB2。

DBD62 为采样时刻n的过程变量值
设定SPn上限值:DB2。

DBD54
设定SPn下限值:DB2。

DBD58
DB3。

DBW6为模拟量输入
DB3。

DBD8为模拟量输入最大范围
DB3。

DBD12为最大测量温度
DB3。

DBX4。

0为报警信号(SPn在传感器测量起点值以下报警)
改变:DB3。

DBW6为模拟量输入
改变:DB3。

DBW6为模拟量输入
输出接近0,可以调SPN为多位数,使PQD0为0
正常没有报警!
DB3。

DBX4。

0为报警信号(SPn在传感器测量起点值以下报警)报警!
制作:
2011.05.03。

相关文档
最新文档