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控制方法,具体实现流程如下: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调节方法比例(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温控***********************************************************************/#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程序设计(梯形图语言)教学文案

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算法的温度控制功能。
我们需要了解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参数设置对于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的设定,减小积分的调节作用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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。