51单片机PID算法程序(三)增量式PID控制算法

合集下载

位置式PID控制算法和增量式PID控制算法

位置式PID控制算法和增量式PID控制算法

位置式PID控制算法和增量式PID控制算法1.位置式PID控制算法:u(t) = Kp * e(t) + Ki * ∫e(t)dt + Kd * de(t)/dt其中,u(t)为控制量,Kp为比例增益,Ki为积分增益,Kd为微分增益,e(t)为偏差即系统输出值与期望值的差值,∫e(t)dt为偏差的积分,de(t)/dt为偏差的微分。

-简单易懂:位置式PID控制算法的计算公式直接描述了控制量与偏差之间的关系,容易理解和实现。

-稳定性好:位置式PID控制算法通过不断修正控制量的大小,能够使系统快速、准确地达到期望值,具有较好的稳定性和控制精度。

-适用范围广:位置式PID控制算法适用于各种控制系统,包括线性系统和非线性系统。

2.增量式PID控制算法:增量式PID控制算法是相对于位置式PID控制算法而言的,它的基本原理是通过计算当前偏差和上一次偏差之间的差异来决定修正控制量的大小,从而达到系统稳定的状态。

增量式PID控制算法的计算公式如下:u(t)=u(t-1)+Kp*[e(t)-e(t-1)]+Ki*e(t)+Kd*[e(t)-2*e(t-1)+e(t-2)]其中,u(t)为控制量,Kp为比例增益,Ki为积分增益,Kd为微分增益,e(t)为当前的偏差,e(t-1)为上一次的偏差,e(t-2)为上两次的偏差。

增量式PID控制算法的特点:-相对稳定性好:增量式PID控制算法通过计算偏差的变化速率,能够更快地修正控制量的大小,对系统的稳定性有着较大的改善。

-抗积分饱和:增量式PID控制算法在积分项的计算中,使用了当前的偏差,而非历史的偏差,减小了积分饱和的影响。

-操作舒适性好:增量式PID控制算法的输出量是控制量的增量,对控制对象的操作更加平稳,减少了骤变和震荡。

综上所述,位置式PID控制算法和增量式PID控制算法各有其优势,应根据具体的系统需求和控制目标选择使用。

一般来说,位置式PID控制算法适用于对控制精度要求较高的系统,而增量式PID控制算法则适用于要求操作平稳度较高的系统。

增量式PID的整型算法

增量式PID的整型算法

增量式PID的整型算法对于PID控制的程序算法,很多书上都讲了。

但是,最近真正要用PID算法的时候,发现书上的代码在我们51单片机上来实现还不是那么容易的事情。

简单的说来,就是不能直接调用。

仔细分析你可以发现,教材上的、网上现行的PID实现的C语言代码几乎都是用浮点型的数据来做的,可以想象,如果我们的计算使用浮点数据,那我们的51单片机来运行的话会有多痛苦。

所以,本人自己琢磨着弄了一个整型变量来实现了PID算法,由于是用整型数来做的,所以也不是很精确,但是对于很多的使用场合,这个精度也够了。

关于系数和采样电压全部是放大10倍处理的。

所以精度不是很高,但是也不是那么低,大部分的场合都够用了。

实在觉得精度不够,可以再放大10倍或者100倍处理,但是要注意不超出整个数据类型的范围就可以了。

以下是具体的程序代码:typedef struct PIDValue{uint32 Ek_Uint32[3]; //差值保存,给定和反馈的差值uint8 EkFlag_Uint8[3]; //符号,1则对应的Ek[i]为负数,0为对应的Ek[i]为正数uint8 KP_Uint8;uint8 KI_Uint8;uint8 KD_Uint8;uint8 B_Uint8; //死区电压uint8 KP; //显示修改的时候用uint8 KI;uint8 KD;uint8 B;uint16 Uk_Uint16; //上一时刻的控制电压}PIDValueStr;PIDValueStr xdata PID;//PID = Uk + (KP*E(k) - KI*E(k-1) + KD*E(k-2));void PIDProcess(void){uint32 idata Temp[3]; //uint32 idata PostSum; //正数和uint32 idata NegSum; //负数和Temp[0] = 0;Temp[1] = 0;Temp[2] = 0;PostSum = 0;NegSum = 0;if( ADPool.Value_Uint16[UINADCH] > ADPool.Value_Uint16[UFADCH] )//给定大于反{Temp[0] = ADPool.Value_Uint16[UINADCH] - ADPool.Value_Uint16[UFADCH];//计算Ek[0]if( Temp[0] > PID.B_Uint8 ){//数值移位PID.Ek_Uint32[2] = PID.Ek_Uint32[1];PID.Ek_Uint32[1] = PID.Ek_Uint32[0];PID.Ek_Uint32[0] = Temp[0];//符号移位PID.EkFlag_Uint8[2] = PID.EkFlag_Uint8[1];PID.EkFlag_Uint8[1] = PID.EkFlag_Uint8[0];PID.EkFlag_Uint8[0] = 0; //当前EK为正数Temp[0] = (uint32)PID.KP_Uint8 * PID.Ek_Uint32[0]; // KP*EK0Temp[1] = (uint32)PID.KI_Uint8 * PID.Ek_Uint32[1]; // KI*EK1Temp[2] = (uint32)PID.KD_Uint8 * PID.Ek_Uint32[2]; // KD*EK2}}else //反馈大于给定{Temp[0] = ADPool.Value_Uint16[UFADCH] - ADPool.Value_Uint16[UINADCH]; //计算Ek[0]if( Temp[0] > PID.B_Uint8 ){//数值移位PID.Ek_Uint32[2] = PID.Ek_Uint32[1];PID.Ek_Uint32[1] = PID.Ek_Uint32[0];PID.Ek_Uint32[0] = Temp[0];//符号移位PID.EkFlag_Uint8[2] = PID.EkFlag_Uint8[1];PID.EkFlag_Uint8[1] = PID.EkFlag_Uint8[0];PID.EkFlag_Uint8[0] = 1; //当前EK为负数Temp[0] = (uint32)PID.KP_Uint8 * PID.Ek_Uint32[0]; // KP*EK0Temp[1] = (uint32)PID.KI_Uint8 * PID.Ek_Uint32[1]; // KI*EK1Temp[2] = (uint32)PID.KD_Uint8 * PID.Ek_Uint32[2]; // KD*EK2}}/*以下部分代码是讲所有的正数项叠加,负数项叠加*/if(PID.EkFlag_Uint8[0]==0){PostSum += Temp[0]; //正数和}else{NegSum += Temp[0]; //负数和} // KP*EK0if(PID.EkFlag_Uint8[1]!=0){PostSum += Temp[1]; //正数和}else{NegSum += Temp[1]; //负数和} // - kI * EK1if(PID.EkFlag_Uint8[2]==0){PostSum += Temp[2]; //正数和}else{NegSum += Temp[2]; //负数和} // KD * EK2PostSum += (uint32)_Uint16; //if( PostSum > NegSum ) // 是否控制量为正数{Temp[0] = PostSum - NegSum;if( Temp[0] < (uint32)ADPool.Value_Uint16[UMAXADCH] )//小于限幅值则为计算值输出 {_Uint16 = (uint16)Temp[0];}else{_Uint16 = ADPool.Value_Uint16[UMAXADCH]; //否则为限幅值输出}}else //控制量输出为负数,则输出0{_Uint16 = 0;}}=============================================================================== //总体调节=比例系数×压力误差+积分系数×积分误差+微分系数×(本次误差-前次误差)//P就是比例,就是输入偏差乘以一个系数;//I就是积分,就是对输入偏差进行积分运算;//D就是微分,对输入偏差进行微分运算;PIDValueStr xdata PID;void PIDCalc(unsigned int idata data1,unsigned int idata data2,unsigned int idata minfreq){unsigned int idata svdata;unsigned int idata pvdata;unsigned long idata dError,Error;unsigned long idata ResultP,ResultI,ResultD,PIDout,Result;svdata=data1;pvdata=data2;if(svdata>pvdata){Error=svdata-pvdata;// 压力偏差PID.SumError+=Error;// 积分dError=PID.LError-PID.PError;// 当前微分PID.PError=PID.LError;PID.LError=Error;ResultP=PID.KP*Error*100;// 比例项ResultI=PID.KI*(PID.SumError);// 积分项ResultD=PID.KD*dError;// 微分项PIDout=ResultP+ResultI+ResultD;Result+=PIDout;if(PIDout>=5000){PIDout=5000;PID.SumError-=Error;}else{ PIDout=ResultP+ResultI+ResultD;}}if(svdata<pvdata){Error=svdata-pvdata;// 压力偏差PID.SumError+=Error;// 积分dError=PID.LError-PID.PError;// 当前微分PID.PError=PID.LError;PID.LError=Error;ResultP=PID.KP*Error*100;//比例项ResultI=PID.KI*(PID.SumError);// 积分项ResultD=PID.KD*dError;// 微分项PIDout=ResultP+ResultI+ResultD;Result+=PIDout;if (PIDout>=5000){PIDout=0;PID.SumError-=Error;}else{ PIDout=ResultP+ResultI+ResultD;}}if (PIDout<minfreq){PIDout=0;}=PIDout; }。

51单片机pid算法程序

51单片机pid算法程序

51单片机pid算法程序51单片机是一种广泛应用于嵌入式系统开发的微控制器。

PID算法是一种常用的控制算法,用于实现系统的闭环控制。

本文将介绍如何在51单片机上实现PID算法。

PID算法是一种经典的控制算法,它能够根据系统的反馈信息,自动调整控制量,使系统的输出接近期望值。

PID算法由比例项(P 项)、积分项(I项)和微分项(D项)组成。

比例项用来根据当前误差大小调整控制量,积分项用来根据过去误差的累积值调整控制量,微分项用来根据误差的变化速度调整控制量。

在51单片机上实现PID算法,首先需要编写程序来读取系统的反馈信息和期望值。

例如,可以通过ADC模块读取传感器的信号,然后通过计算得到当前误差。

接下来,根据比例项、积分项和微分项的系数,计算PID控制量。

最后,将PID控制量输出到执行机构,例如电机或舵机,来控制系统的输出。

在编写PID算法程序时,需要注意一些细节。

首先,要根据实际系统的特点和要求来选择合适的PID参数。

比例项的系数决定了控制量对误差的敏感程度,积分项的系数决定了控制量对误差累积值的敏感程度,微分项的系数决定了控制量对误差变化速度的敏感程度。

其次,要注意处理PID算法中的积分项和微分项的累积误差。

积分项的累积误差可能会导致系统出现超调或震荡,需要适当地进行限制或清零。

微分项的累积误差可能会导致系统出现噪声放大或不稳定,需要进行滤波或限制。

最后,要注意程序的效率和实时性。

PID算法通常需要以一定的频率进行计算和更新,要保证程序能够及时响应系统的变化。

除了基本的PID算法,还可以根据具体的应用需求进行算法的优化和改进。

例如,可以引入自适应调整PID参数的方法,使系统能够根据实时的工作条件自动调整PID参数。

还可以引入前馈控制或模糊控制等方法,进一步提高系统的控制性能和鲁棒性。

51单片机是一种常用的嵌入式系统开发平台,可以很方便地实现PID算法。

通过合理选择PID参数和优化算法,可以实现对系统的精确控制。

51单片机PID算法程序增量式PID控制算法

51单片机PID算法程序增量式PID控制算法

51单片机PID算法程序增量式PID控制算法增量式PID控制算法是一种常用的控制算法,可以应用于各种控制系统中。

该算法的原理是通过计算目标值与实际值之间的差异,来调整控制系统的输出,使其逐渐接近目标值。

增量式PID控制算法的核心思想是通过对目标值与实际值之间的差异进行积分和微分计算,来调整控制系统的输出。

这样可以使得控制系统对误差的响应更加敏感,从而实现更精确的控制效果。

在51单片机中实现增量式PID控制算法,可以按照以下步骤进行:1.参数设置:首先需要设置PID控制算法的参数,包括比例系数Kp、积分系数Ki和微分系数Kd。

这些参数可以根据实际控制系统的需求进行调整。

2.变量定义:定义控制系统所需的变量,包括目标值、实际值、误差值、上一次的误差值、累积误差值等。

3.计算误差:将目标值与实际值之间的差异作为误差值进行计算。

4.计算增量输出:根据误差值以及上一次的误差值和累积误差值,计算控制系统的增量输出。

增量输出的计算公式为:增量输出=Kp*(当前误差-上一次误差)+Ki*当前误差+Kd*(当前误差-上一次误差)5.更新变量:更新控制系统所需的变量,包括上一次的误差值和累积误差值。

6.输出信号:将增量输出作为控制系统的输出信号,并进行相应的处理。

通过上述步骤,就可以实现51单片机的增量式PID控制算法。

在实际应用中,可以根据具体情况对算法进行优化和改进,以满足实际控制的需求。

总结起来,增量式PID控制算法是一种常用的控制算法,可以通过计算目标值与实际值之间的差异,调整控制系统的输出,从而实现精确的控制效果。

在51单片机中实现增量式PID控制算法,可以按照参数设置、变量定义、计算误差、计算增量输出、更新变量和输出信号等步骤进行。

根据具体情况可以对算法进行优化和改进,以满足实际控制的需求。

51单片机PID控制程序

51单片机PID控制程序
51单片机PID控制程序
基于51单片机的PID算法程序,PWM占空比输出控制或者模拟量输出。
电路相关文件 请购买后下载
电路图文件
PID温控1602显示.zip
描述:源代码
如对本电路存在疑问需与卖家交流,请点击这里讨论,卖家会第一时间给予答复;
如需对本电路进行投诉建议,请点击这里反馈给电路城,我们将在下一个工作日为您解决。
12V供电,3D打印机控制器设计
恶x男购买了:
便携式酒精测量电路+PCB源文件+源代码+BOM等
啦啦啦乐呵呵购买了:
低成本3D打印机,教你打造一个桌面3D打印机
啦啦啦乐呵呵购买了:
传感器开发资料(包含多种传感器开发资料)
huxiaodong-292388购买了:
STM8S005开源设计的多功能空气检测仪(甲醛、PM2.5、温湿度检测)
(版权归网络转载所有)
免费 下载
收藏 (9)
分享
销量
21 查看
396 1 评分
东方之子-357829
普通卖家
参数名 参数值
发布于 2019 年 05 月 26日
更新于 2019 年 08 月 24日
标签
pid算法
pid控制pwm输出
相关电路图
基于增量式PID算法的温度调节器
(电赛B题)风力摆控制系统设计(电源电路+控制源码+相关文档)
资源中心
泰克巅峰之作:MDO3000六合一混合域示波器
数字荧光,多功能搜索调试完美诠释信号波形
TDS2019C示波器:多功能自动测量的不二之选
专为教育使用者定制的高性价比示波器你值得拥有
增量式PID和位置式PID算法实现和PID库(51单片机+SBiblioteka M32+arduino完成)

51单片机PID调增量式光电编码器测速

51单片机PID调增量式光电编码器测速

编码器输出的A向脉冲接到单片机的外部中断INTO, B向脉冲接到I/O端口P1.0。

当系统工作时,首先要把INTO设置成下降沿触发,并开相应中断。

当有有效脉冲触发中断时,进行中断处理程序,判别B脉冲是高电平还是低电平,若是高电平则编码器正转,加1计数;若是低电平则编码器反转,减1计数。

基于51单片机的直流电机PID闭环调速系统原理详解与程序(2013-08-04 01:18:15)转载▼标签:分类:单片机51单片机直流电机pidpcf8591基于51单片机的直流电机PID闭环调速系统1. 电机转速反馈:原理:利用光电编码器作为转速的反馈元件,设电机转一周光电编码器发送N个PWM波形,利用测周法测量电机转速。

具体实现:将定时器0设置在计数模式,用来统计一定的时间T内接受到的脉冲个数M个,而定时器0置在计时模式,用来计时T时间。

则如果T时间接受到M 个PWM波形,而电机转一圈发出N个PWM波形,则根据测周法原理,电机的实际的转速为:real_speed=M/ ( N*T),单位转/秒。

若将定时器1置在计数模式,则PWM波形应该由P3A3脚输入。

代码实现://定时器0初始化,用来定时10msvoid Init_Timer0(void){TMOD |= 0x01; // 使用模式 1,16位定时器 ,且工作在计时模式TH0=(65536-10000)/256; // 定时 10msTL0=(65536-10000)%6;//计数器1初始化,用来统计定时器1计时250ms 内PWM 波形个数 voidInit_Timer1(void){ TMOD |= 0x50; // 使用计数模式 1, 16位计数器模式TH1=0x00; // 给定初值,由 0往上计数TL1=0x00;EA=1; // 总中断打开ET1=1; // 定时器中断打开TR1=1; }// 定时器开关打开// 定时器0的中断服务子函数, 主要完成脉冲个数的读取, 实际转速的计算和 控制以及控制结// 果输出等工作void Timer0_isr(void) interrupt 1 { unsigned char count;TH0=(65536-10000)/256; // 重新赋值 10msTL0=(65536-10000)%6;count++;if (count==25)// 如果达到250ms,则计算一次转速并进行一次控制运算{ EA=1; // ET0=1; // TR0=1; // }总中断打开定时器中断打开定时器开关打开PIDcount=0;// 清零以便于定时下一个250msTR1=0;// 关闭定时器1,统计脉冲个数real_speed=(256*TH1+TL1)*4/N;//250ms 内脉冲个数并由此计算转速TH1=0x00; // 计数器1清零,重新开始计数TL1=0x00;TR1=1;OUT=contr_PID();// 进入PID 控制 , PID 控制子函数代码在后面给出write_add(0x40,OUT);〃进行DA转换,将数字量转换为模拟量,后面会介绍到}}2. PID 控制:PID 的基本原理在这里不作具体讲解,这里主要给出PID 算法的实现,通过调节结构体中比例常数( Proportion )、积分常数( Integral )、微分常数 ( Derivative )使得转速控制达到想要的精度。

PID算法-增量(详细)

PID算法-增量(详细)

共三十六页
积分(jīfēn)调节器
e(t) t
0 y
t 0
图2积分作用(zuòyòng)响应曲线
共三十六页
比例(bǐlì)积分调节器
❖若将比例和积分两种作用结合起来(qǐ lái),就构成 PI调节器,调节规律为:

(3)
❖ PI调节器的输出特性曲线如图3所示
共三十六页
比例(bǐlì)积分调节器
❖ e(t)作为PID 控制器的输入,u(t)作为PID 控制器的 输出和被控对象的输入。
共三十六页
❖所以模拟PID控制器的控制规律为:
u(t)
K
p
e(t)
1 TI
t
e(t)dt
0
TD
de(t)
dt
uo
❖其中 : (qízhōng) u(t)——调节器的输出信号;
❖ e(t)——调节器的偏差信号,它等于给定值与测量值之差
微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有
放大作用,因此过强的加微分调节,对系统抗干扰不利。
共三十六页
❖ 三个参数要综合考虑,一般先将I,D设为0,调好 P,达到基本的响应速度和误差,再加上I,使误差 为0,这时再加入D,三个参数要反复调试,最终 达到较好的结果。不同(bù tónɡ)的控制对象,调试的 难度相差很大!
?uk第k次采样时刻的计算机输出值?ek第k次采样时刻输入的偏差值?ek?1第k1次采样时刻输入的偏差值?ki积分系数积分时间ti即为累积多少次个t?kd微分系数?u0开始进行pid控制时的原始初值应为前一次的给定值?如果采样周期取得足够小则以上近似计算可获得足够精确的结果离散控制过程与连续控制过程十分接近

51单片机PID算法程序(三)增量式PID控制算法

51单片机PID算法程序(三)增量式PID控制算法

51单片机PID算法程序(一)PID算法(原创文章,转载请注明出处/tengjingshu) 比例,积分,微分的线性组合,构成控制量u(t),称为:比例(Proportional)、积分(Integrating)、微分(Differentiation)控制,简称PID控制图1控制器公式在实际应用中,可以根据受控对象的特性和控制的性能要求,灵活地采用不同的控制组合,构成比例(P)控制器比例+积分(PI)控制器比例+积分+微分(PID)控制器式中或式中控制系统中的应用在单回路控制系统中,由于扰动作用使被控参数偏离给定值,从而产生偏差。

自动控制系统的调节单元将来自变送器的测量值与给定值相比较后产生的偏差进行比例、积分、微分(PID)运算,并输出统一标准信号,去控制执行机构的动作,以实现对温度、压力、流量、也为及其他工艺参数的自动控制。

比例作用P只与偏差成正比;积分作用I是偏差对时间的积累;微分作用D 是偏差的变化率;比例(P)控制比例控制能迅速反应误差,从而减少稳态误差。

除了系统控制输入为0和系统过程值等于期望值这两种情况,比例控制都能给出稳态误差。

当期望值有一个变化时,系统过程值将产生一个稳态误差。

但是,比例控制不能消除稳态误差。

比例放大系数的加大,会引起系统的不稳定。

图2比例(P)控制阶跃响应积分(I)控制在积分控制中,控制器的输出与输入误差信号的积分成正比关系。

为了减小稳态误差,在控制器中加入积分项,积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。

这样,即使误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减少,直到等于零。

积分(I)和比例(P)通常一起使用,称为比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。

如果单独用积分(I)的话,由于积分输出随时间积累而逐渐增大,故调节动作缓慢,这样会造成调节不及时,使系统稳定裕度下降。

图3积分(I)控制和比例积分(PI)控制阶跃相应微分(D)控制在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。

51单片机PID算法程序(三)增量式PID控制算法

51单片机PID算法程序(三)增量式PID控制算法

51单片机PID算法程序(三)增量式PID控制算法前言在之前的两篇文章中,我们分别介绍了基础PID算法和位置式PID控制算法。

在本文中,我们将介绍另一种常见的PID算法——增量式PID控制算法,以及如何在51单片机上实现增量式PID控制算法。

增量式PID控制算法简介增量式PID控制算法与位置式PID控制算法最大的区别在于输出控制量的计算方式不同。

位置式PID算法的输出控制量是与目标值的误差和历史误差之和的积分和误差的比例和微分,而增量式PID算法的输出控制量只与误差和历史误差的差值有关。

在增量式PID控制算法中,输出控制量的计算方式如下:$$ OutPut=K_p \\cdot Err+K_i \\cdot \\Delta Err+K_d \\cdot \\Delta^2 Err $$ 其中,K p、K i和K d分别是比例、积分和微分系数。

增量式PID控制算法的优点在于可以避免积分饱和、能够快速响应控制量变化,因此在某些要求高响应速度的应用中,常选择使用增量式PID控制算法。

51单片机上的增量式PID控制算法相比较于位置式PID控制算法,增量式PID控制算法的实现更加复杂,需要考虑历史误差的存储、误差的差值计算等问题。

因此,在51单片机上实现增量式PID控制算法需要一些特殊的处理方式。

我们可以通过以下三个步骤来实现增量式PID控制算法:步骤一:初始化变量在增量式PID控制算法中,需要定义一些变量,如上一次的误差值和输出控制量等。

因此,在使用增量式PID控制算法之前,需要先初始化这些变量。

//定义变量double set_point=0; //目标值double process_pv=0; //实际值double Kp=1,Ki=1,Kd=1; //PID参数double last_error=0,prev_error=0; //历史误差double output=0, dInput=0; //输出控制量和误差的差值double output_max=100.0,output_min=-100.0; //控制量范围//初始化变量void PID_Init(){last_error = 0;prev_error = 0;dInput = 0;output = 0;}步骤二:控制量计算根据增量式PID控制算法的公式,我们可以计算控制量的值。

增量式pid算法

增量式pid算法

增量式pid算法
增量式 PID 控制算法是一种改进的 PID 控制算法,它避免了
每次更新 PID 控制器输出时重新计算所有的控制参数。

该算
法将 PID 控制器的输出信号视为增量(差量)信号,即在前
一次控制信号基础上作出新的调整。

实现增量式 PID 算法的关键是保存前一次控制器的输出信号
以及相应的误差。

在每次控制周期内,首先根据当前的误差计算出 PID 控制器的增量部分,然后用前一次的控制信号加上
增量部分得到新的控制信号。

增量式 PID 算法的公式为:
Output(n) = Output(n-1) + Kp * (Error(n) - Error(n-1)) + Ki *
Error(n) + Kd * (Error(n) - 2 * Error(n-1) + Error(n-2))
其中,Output(n) 表示第 n 次控制的输出信号,Output(n-1) 表
示第n-1 次控制的输出信号,Error(n) 表示第n 次控制的误差,Error(n-1) 表示第 n-1 次控制的误差,Error(n-2) 表示第 n-2 次
控制的误差,Kp、Ki 和Kd 分别表示比例、积分和微分增益。

增量式 PID 算法的优点是可以减少计算量,提高控制器的响
应速度。

然而,由于增量式 PID 算法使用误差的差值计算增
量部分,因此对于系统初始状态的响应较慢。

此外,如果系统具有较大的噪声干扰或非线性特性,增量式 PID 算法可能出
现较大的误差累积。

因此,在实际应用中需要根据具体情况选择适当的 PID 控制算法。

51单片机PID算法程序

51单片机PID算法程序

51单片机PID算法程序51单片机(也称为STC单片机)是一种常见的单片机型号,它可以使用PID(Proportional-Integral-Derivative,比例-积分-微分)算法来实现控制系统。

PID算法可以根据系统当前的误差、误差的积分以及误差的变化率来动态调整系统的输出,使得系统达到期望的目标。

下面是一个使用51单片机实现PID算法的程序示例:```c#include <reg52.h>#include <intrins.h>//定义PID参数#define Kp 1 // 比例系数#define Ki 0.1 // 积分系数#define Kd 0.01 // 微分系数//定义控制输出范围#define OutputMax 100#define OutputMin 0//定义系统参数#define SetPoint 100 // 设定值#define SampleTime 100 // 采样时间(单位:ms)//全局变量unsigned int SetPointValue;unsigned int ProcessValue;signed int PIDOutput;unsigned int LastProcessValue;signed long Integral;signed int Error;signed int LastError;//初始化函数void InitSetPointValue = SetPoint;ProcessValue = 0;PIDOutput = 0;LastProcessValue = 0;Integral = 0;Error = 0;LastError = 0;//PID计算函数signed int PIDCalculation(signed int input)Error = SetPointValue - input; // 当前误差Integral += Error * SampleTime; // 积分项signed int dError = Error - LastError; // 当前误差的变化率PIDOutput = Kp * Error + Ki * Integral + Kd * dError; // PID 输出//限制输出在控制范围内if (PIDOutput > OutputMax)PIDOutput = OutputMax;}else if (PIDOutput < OutputMin)PIDOutput = OutputMin;}LastError = Error;return PIDOutput;//主函数void mainInit(;while (1)//获取传感器测量值ProcessValue = GetProcessValue(; // 自定义函数,获取传感器测量值//PID控制signed int controlValue = PIDCalculation(ProcessValue);//输出控制信号SetControlOutput(controlValue); // 自定义函数,设置输出控制信号//延时采样时间Delay(SampleTime); // 自定义函数,延时指定的时间}```上述示例程序在使用51单片机编写PID算法时,首先定义了PID参数(比例系数Kp、积分系数Ki和微分系数Kd)、控制输出范围(OutputMax和OutputMin)以及系统参数(设定值SetPoint和采样时间SampleTime)。

51单片机PID算法程序(三)增量式PID控制算法解读

51单片机PID算法程序(三)增量式PID控制算法解读
图1
控制器公式
在实际应用中,可以根据受控对象的特性和控制的性能要求,灵活地采用不同的控制组合,构成
比例(P)控制器
比例+积分(PI)控制器
比例+积分+微分(PID)控制器
式中
或ቤተ መጻሕፍቲ ባይዱ
式中
控制系统中的应用
在单回路控制系统中,由于扰动作用使被控参数偏离给定值,从而产生偏差。自动控制系统的调节单元将来自变送器的测量值与给定值相比较后产生的偏差进行比例、积分、微分(PID)运算,并输出统一标准信号,去控制执行机构的动作,以实现对温度、压力、流量、也为及其他工艺参数的自动控制。
T ——采样周期。
如果采样周期足够小,则(2-4)的近似计算可以获得足够精确的结果,离散控制过程与连续过程十分接近。
51单片机PID算法程序(一)PID算法
(原创文章,转载请注明出处/tengjingshu)
比例,积分,微分的线性组合,构成控制量u(t),称为:比例(Proportional)、积分(Integrating)、微分(Differentiation)控制,简称PID控制
(图1,表1)
2)Atmel8-bit AVR Microcontrollers Application Note:AVR221: Discrete PID controller
(图2,图3,图4,图5,表2)
3)使用Ziegler-Nichols方法的自整定控制
/2007-03/200733042815.htm
最好的寻找PID参数的办法是从系统的数学模型出发,从想要的反应来计算参数。很多时候一个详细的数学描述是不存在的,这时候就需要实际地调节PID的参数.
Ziegler-Nichols方法

51单片机PID的算法实现程序说课讲解

51单片机PID的算法实现程序说课讲解

51单片机PID的算法实现程序用整型变量来实现PID算法,由于是用整型数来做的,所以也不是很精确,但是对于很多的使用场合,这个精度也够了,关于系数和采样电压全部是放大10倍处理的.所以精度不是很高. 但是也不是那么低,大部分的场合都够了. 实在觉得精度不够, 可以再放大10倍或者100倍处理,但是要注意不超出整个数据类型的范围就可以了.本程序包括PID计算和输出两部分.当偏差>10度全速加热,偏差在10度以内为PID计算输出. 具体的参考代码参见下面:*///================================================================// pid.H// Operation about PID algorithm procedure// C51编译器Keil 7.08//================================================================// 作者:zhoufeng// Date :2007-08-06// All rights reserved.//================================================================#include <reg52.h>#include <intrins.h>typedef unsigned char uint8;typedef unsigned int uint16;typedef unsigned long int uint32;/**********函数声明************/void PIDOutput ();void PIDOperation ();/*****************************/typedef struct PIDValue{uint32 Ek_Uint32[3]; //差值保存,给定和反馈的差值uint8 EkFlag_Uint8[3]; //符号,1则对应的为负数,0为对应的为正数uint8 KP_Uint8;uint8 KI_Uint8;uint8 KD_Uint8;uint16 Uk_Uint16; //上一时刻的控制电压uint16 RK_Uint16; //设定值uint16 CK_Uint16; //实际值}PIDValueStr;PIDValueStr PID;uint8 out ; // 加热输出uint8 count; // 输出时间单位计数器/*********************************PID = Uk + KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式)函数入口: RK(设定值),CK(实际值),KP,KI,KD函数出口: U(K)//PID运算函数********************************/void PIDOperation (void){uint32 Temp[3]; //中间临时变量uint32 PostSum; //正数和uint32 NegSum; //负数和Temp[0] = 0;Temp[1] = 0;Temp[2] = 0;PostSum = 0;NegSum = 0;if( PID.RK_Uint16 > PID.RK_Uint16 ) //设定值大于实际值否?{if( PID.RK_Uint16 - PID.RK_Uint16 >10 ) //偏差大于10否?{_Uint16 = 100; } //偏差大于10为上限幅值输出(全速加热) else{Temp[0] = PID.RK_Uint16 - PID.CK_Uint16; //偏差<=10,计算E(k)PID.EkFlag_Uint8[1]=0; //E(k)为正数//数值移位PID.Ek_Uint32[2] = PID.Ek_Uint32[1];PID.Ek_Uint32[1] = PID.Ek_Uint32[0];PID.Ek_Uint32[0] = Temp[0];/****************************************/if( PID.Ek_Uint32[0] >PID.Ek_Uint32[1] ) //E(k)>E(k-1)否?{Temp[0]=PID.Ek_Uint32[0] - PID.Ek_Uint32[1]; //E(k)>E(k-1)PID.EkFlag_Uint8[0]=0; } //E(k)-E(k-1)为正数else{Temp[0]=PID.Ek_Uint32[0] - PID.Ek_Uint32[1]; //E(k)<E(k-1)PID.EkFlag_Uint8[0]=1; } //E(k)-E(k-1)为负数/****************************************/Temp[2]=PID.Ek_Uint32[1]*2 ; // 2E(k-1)if( (PID.Ek_Uint32[0]+ PID.Ek_Uint32[2])>Temp[2] ) //E(k-2)+E(k)>2E(k-1)否?{Temp[2]=(PID.Ek_Uint32[0]+PID.Ek_Uint32[2])-Temp[2]; //E(k-2)+E(k)>2E(k-1) PID.EkFlag_Uint8[2]=0; } //E(k-2)+E(k)-2E(k-1)为正数else{Temp[2]=Temp[2]-(PID.Ek_Uint32[0]+ PID.Ek_Uint32[2]); //E(k-2)+E(k)<2E(k-1)PID.EkFlag_Uint8[2]=1; } //E(k-2)+E(k)-2E(k-1)为负数/****************************************/Temp[0] = (uint32)PID.KP_Uint8 * Temp[0]; // KP*[E(k)-E(k-1)]Temp[1] = (uint32)PID.KI_Uint8 * PID.Ek_Uint32[0]; // KI*E(k)Temp[2] = (uint32)PID.KD_Uint8 * Temp[2]; // KD*[E(k-2)+E(k)-2E(k-1)]/*以下部分代码是讲所有的正数项叠加,负数项叠加*//**********KP*[E(k)-E(k-1)]**********/if(PID.EkFlag_Uint8[0]==0)PostSum += Temp[0]; //正数和elseNegSum += Temp[0]; //负数和/********* KI*E(k)****************/if(PID.EkFlag_Uint8[1]==0)PostSum += Temp[1]; //正数和else; //空操作,E(K)>0/****KD*[E(k-2)+E(k)-2E(k-1)]****/if(PID.EkFlag_Uint8[2]==0)PostSum += Temp[2]; //正数和elseNegSum += Temp[2]; //负数和/***************U(K)***************/PostSum += (uint32)_Uint16;if(PostSum > NegSum ) // 是否控制量为正数{ Temp[0] = PostSum - NegSum;if( Temp[0] < 100 ) //小于上限幅值则为计算值输出_Uint16 = (uint16)Temp[0];else_Uint16 = 100; //否则为上限幅值输出}else //控制量输出为负数,则输出0(下限幅值输出)_Uint16 = 0;}}else{ _Uint16 = 0; }}*********************************函数入口: U(K)函数出口: out(加热输出)//PID运算植输出函数********************************/void PIDOutput (void){static int i;i=_Uint16;if(i==0)out=1;else out=0;if((count++)==5)//如定时中断为40MS,40MS*5=0.2S(输出时间单位),加热周期20S(100等份) { //每20S PID运算一次count=0;i--;}}。

51 准连续PID控制算法.ppt

51 准连续PID控制算法.ppt
1增量式算法只与ekek1和ek2有关不需要进行累加不易引起积分饱和因此能获得较好的控制效果2增量式控制易于实现手动自动的无扰动切换3增量式算法中计算机只输出增量误动作时影响小
第五章 数字PID控制算法
Rs Es
U s
Cs
Gc s
Go s
Es et
Kp
K p Tis
K pTd s
U s u t
Gc
j
j0
j0
Байду номын сангаас
de(t) e(kT ) e(k 1)T e(k) e(k 1)
dt
T
T
u(k
)
K
P
{e(k
)
T Ti
k e( j) Td [e(k) e(k 1)]}
j0
T
Ki
K pT Ti
Kd
K pTd T
k
u(k) KP{e(k) Ki e( j) Kd[e(k) e(k 1)]} j0
U s
Cs
Gc s
Go s
Es et
Kp
K p Tis
K pTd s
U s u t
Gc
s
U s Es
Kp
1
1 TI s
Td
de t
dt
5.1 准连续PID控制算法
5.1.1 模拟PID调节器 PID调节器之所以经久不衰,主要有以下优点。
❖ 1. 技术成熟 ❖2. 易被人们熟悉和掌握 ❖3. 不需要建立数学模型 ❖4. 控制效果好
比例(P)控制 成比例的反应控制系统的偏差信号e(t)。 积分(I)控制 主要用于消除静差,提高系统的无差度 微分(D)控制 能反映偏差信号的变化速率,减少调节时间

C语言实现51单片机中的PID算法

C语言实现51单片机中的PID算法

C语言实现51单片机中的PID算法//pid.h#ifndef __PID__#define __PID__/*PID = Uk + KP*[E(k)-E(k- 1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID 算式)函数入口: RK(设定值), CK(实际值),KP,KI,KD 函数出口: U(K)*/typedef struct PIDValue{int8 KP;int8 KI;int8 KD;int8 F;int8 BITMOV;int EK[3];int UK;int RK;int CK;int UK_REAL;}pid_str;//PIDValueStr PID;void pid_exe(pid_str *PID) ;#endif//pid.c/*PID = PID->UK_REAL + PID->KP*[E(k)-E(k-1)]+PID- >KI*E(k)+PID->KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID 算式)函数入口: PID- >RK(设定值),PID->CK(实际值),PID->KP,PID->KI,PID->KD 函数出口: U(K) */#include”defines.h”#include”pid.h”#define MAXOUT 0xff//#define MAXGAP 100void pid_exe(pid_str*PID){PID->EK[2]=PID->EK[1];PID->EK[1]=PID- >EK[0];PID->EK[0]=PID->RK-PID->CK;PID->UK_REAL=PID->UK_REAL+PID->KP*(PID->EK[0]-PID->EK[1])//微分一次后积分即原数+(float) PID->KI*PID->EK[0]/PID->F//直接积分+(float)PID->KD*(PID->EK[0]-2*PID->EK[1]+PID->EK[2])*PID->F;//二阶微分后积分即一阶微分if((PID->UK_REAL>>PID->BITMOV)>=MAXOUT){PID->UK=MAXOUT;}else if(PID->UK_REAL>>PID->BITMOVUK=-MAXOUT;}else{PID->UK=PID->UK_REAL>>PID->BITMOV;}}这里我写的代码用到的是增量型的PID(即UK_REAL + PID->KP*[E(k)-E(k-1)]+PID->KI*E(k)+PID->KD*[E(k)-2E(k- 1)+E(k-2)];这句话所对应的是pid 控制量在之前pid 控制量的基础上增加的值,相当于求了一次导)。

PID算法程序增量式

PID算法程序增量式

PID算法程序增量式PID算法是一种经典的控制算法,常用于工艺控制中。

它通过不断地调整控制量以使被控量接近设定值,以达到控制系统稳定的目的。

增量式PID算法是PID算法的一种变种,它不需要保存控制量的历史数据,只需要保存当前时刻前一时刻的控制量和误差值。

本文将介绍增量式PID算法的实现原理和编程思路。

增量式PID算法的实现原理是,通过计算当前时刻的控制量增量(即控制量的变化量),并将该增量与前一时刻的控制量相加,得到当前时刻的控制量。

为了实现这一目的,需要设置三个参数Kp、Ki和Kd,分别对应比例、积分和微分控制的增益系数,以及保存前一时刻控制量的变量lastControl、前一时刻误差值的变量lastError和当前时刻误差值的变量error。

增量式PID算法的编程思路如下:1. 初始化控制量增量变量increment,设为0。

2. 在控制循环中,计算误差值error,即设定值与实际值的差。

3. 计算比例控制增量proportional,即比例增益系数Kp乘以误差值error。

4. 计算积分控制增量integral,即积分增益系数Ki乘以误差值error,再加上前一时刻的控制量增量increment。

5. 计算微分控制增量derivative,即微分增益系数Kd乘以误差值error与前一时刻误差值lastError的差。

6. 将上述计算得到的三个增量相加,得到新的控制量增量increment。

7. 将新的控制量增量increment与前一时刻的控制量lastControl相加,得到当前时刻的控制量control。

8. 更新lastControl、lastError的值,将当前时刻的控制量control赋给lastControl,将当前时刻的误差值error赋给lastError。

9. 将当前时刻的控制量control应用到被控对象上。

根据上述编程思路,我们可以实现一个简单的增量式PID控制算法的程序,如下所示:```python#PID参数Kp=0.5Ki=0.2Kd=0.1#初始化变量lastControl = 0.0lastError = 0.0increment = 0.0#控制循环while True:#读取实际值actualValue = readActualValue#读取设定值setValue = readSetValue#计算误差值error = setValue - actualValue#计算增量proportional = Kp * errorintegral = Ki * error + incrementderivative = Kd * (error - lastError)increment = proportional + integral + derivative #计算控制量control = lastControl + increment#更新变量lastControl = controllastError = error#应用控制量applyControl(control)```在以上程序中,readActualValue(函数用于读取实际值,readSetValue(函数用于读取设定值,applyControl(control)函数用于将控制量应用到被控对象上。

51单片机PID算法程序(三)增量式PID控制算法

51单片机PID算法程序(三)增量式PID控制算法

51单片机PID算法程序(三)增量式PID控制算法当执行机构需要的不是控制量的绝对值,而是控制量的增量(例如去驱动步进电动机)时,需要用PID 的“增量算法”。

增量式PID控制算法可以通过(2-4)式推导出。

由(2-4)可以得到控制器的第k-1个采样时刻的输出值为:(2-5)将(2-4)与(2-5)相减并整理,就可以得到增量式PID控制算法公式为:(2-6)其中由(2-6)可以看出,如果计算机控制系统采用恒定的采样周期T,一旦确定A、B、C,只要使用前后三次测量的偏差值,就可以由(2-6)求出控制量。

增量式PID控制算法与位置式PID算法(2-4)相比,计算量小得多,因此在实际中得到广泛的应用。

位置式PID控制算法也可以通过增量式控制算法推出递推计算公式:(2-7)(2-7)就是目前在计算机控制中广泛应用的数字递推PID控制算法。

增量式PID控制算法C51程序/*==================== =====================================================PID FunctionThe PID (比例、积分、微分) function is used in mainlycontrol applications. PIDCalc performs one iteration of the PIDalgorithm.While the PID function works, main is just a dummy program showinga typical usage.==========================================================================*/typedef struct PID{int SetPoint; //设定目标 Desired Valuelong SumError; //误差累计double Proportion; //比例常数 Proportional Constdouble Integral; //积分常数 Integral Constdouble Derivative; //微分常数 Derivative Constint LastError; //Error[-1]int PrevError; //Error[-2]} PID;static PID sPID;static PID *sptr = &sPID;/*================================================================================ Initialize PID Structure PID参数初始化===============================================================================*/ void IncPIDInit(void){sptr->SumError = 0;sptr->LastError = 0; //Error[-1]sptr->PrevError = 0; //Error[-2]sptr->Proportion = 0; //比例常数 Proportional Constsptr->Integral = 0; //积分常数Integral Constsptr->Derivative = 0; //微分常数 Derivative Constsptr->SetPoint = 0;}/*=============================================================================== 增量式PID计算部分=================================================================================*/ int IncPIDCalc(int NextPoint){register int iError, iIncpid; //当前误差iError = sptr->SetPoint - NextPoint;//增量计算iIncpid = sptr->Proportion * iError //E[k]项- sptr->Integral * sptr->LastError //E[k-1]项+ sptr->Derivative * sptr->PrevError; //E[k-2]项//存储误差,用于下次计算sptr->PrevError = sptr->LastError;sptr->LastError = iError;//返回增量值return(iIncpid);}。

增量式PID控制算法程序

增量式PID控制算法程序

增量式PID 控制算法程序( 汇编).********增量式PID 控制算法程序***********;T、TD TI、KP依次从30H, 33H, 36H, 39H开始。

;A , B, C的值依次存在BL0CK,1 BL0CK2 BL0CK3勺地址里这里R(k) 给的是定值;0RG 0000HBL0CK1 EQU 43H ;A,B ,C BL0CK2 EQU 46HBL0CK3 EQU 49HUK EQU 4CH ;存结果UKRK EQU 50HEK EQU 53H ;存放偏差值E(k)的始址EK1 EQU 56H ;存放E(k-1)的始址EK2 EQU 59H ;存放E(k-2) 的始址CK EQU 5CH ;采样数据始址BUFF EQU 60H ;暂存区BUFF1 EQU 63HBUFF2 EQU 66HREC EQU 69HTEST:MOV RK,#01H 常数Rk 的BCD码浮点数MOV RK+1,#12H ;1.25 MOVRK+2,#50HMOV 3CH,#01H 常数1 的BCD码浮点数MOV 3DH,#10HMOV 3EH,#00HMOV 40H,#01H 常数2 的BCD码浮点数MOV 41H,#20HMOV 42H,#00HMOV 30H,#01H ;T的BCD码浮点数MOV 31H,#23H ;2.34 MOV 32H,#40HMOV 33H,#01H ;Td的BCD码浮点数MOV 34H,#35H ;3.54 MOV 35H,#40HMOV 36H,#01H ;Ti 的BCD码浮点数MOV 37H,#11H ;1.12 MOV 38H,#20HMOV 39H,#01H ;Kp的BCD码浮点数MOV 3AH,#12H ;1.25 MOV 3BH,#50H MOV R0,#RK ;指向,,, 码浮点操作数LCALL BTOF ;将其转换成二进制浮点操作数MOV R0,#3CHLCALL BTOFMOV R0,#40HLCALL BTOFMOV R0,#39HLCALL BTOFMOV R0,#36H ;指向,,, 码浮点操作数Ti LCALL BTOF ;将其转换成二进制浮点操作数MOV R0,#33H ;指向,,, 码浮点操作数Td LCALL BTOF ;将其转换成二进制浮点操作数MOV R0,#30H ;指向,,, 码浮点操作数T LCALL BTOF ;将其转换成二进制浮点操作数MOV R1, #BUFF1 保存30H 中的值即T 值LCALL FMOVR0MOV R1, #36H ;计算A值(1+T/Ti+Td/T).KpLCALL FDIVMOV R1,#3CH ;常数1LCALL FADDMOV R0,#33H保存33H中的值MOV R1,#BUFFLCALL FMOVR0MOV R1,#BUFF1LCALL FDIVMOV R1,#30H ;30H里存的是T/Ti+1 LCALL FADDMOV R1,#39HLCALL FMULMOV R1 ,#BLOCK1 将结果保存在BLOCK中LCALL FMOVR0 MOV R1,#BUFF1 ;30H恢复原值MOV R0,#30HLCALL FMOVMOV R1,#BUFF ;33H恢复原值MOV R0,#33HLCALL FMOVMOV R0,#40H 计算B 的值Kp.(1+2.Td/T)MOV R1,#33HLCALL FMULMOV R1,#30HLCALL FDIVMOV R1,#3CHLCALL FADDMOV R1,#39HLCALL FMULMOV R1,#BLOCK2保存B 值到BLOCK中LCALL FMOVR0 MOV R0,#39H 计算C 的值Kp.Td/T MOV R1,#33HLCALL FMULMOV R1,#BLOCK3保存C值到BLOCK中LCALL FMOVROMOV R0,#EK1 将EK1, EK2设初值0 LCALL FCLRMOV RO,#EK2LCALL FCLRMOV REC,#03H 设; 置采样次数LOOP: MOV CK,#7eH ;采样数据暂时给了一个定值MOV CK+1,#21H ;0.002112 MOV CK+2,#12HMOV R0,#CKLCALL BTOFMOV R0,#RK保存R(k)中的值MOV R1,#BUFFLCALL FMOVR0MOV R1,#CKLCALL FSUB ;计算R(k)-C(k) 的值送给E(k) MOV R1,#EKLCALL FMOVR0MOV R1,#BUFF 恢复RK的值释放BUFF MOV R0,#RKLCALL FMOVMOV R0,#BLOCK2将B.e(k-I)的值暂存在BUFF1中MOV R1,#BUFF 保存BLCALL FMOVR0MOV R1,#EK1LCALL FMULAoi/\id nnvon乙归#3 AOI/\I 才(乙-母AOI/\I aoid nnvon 用嗨嫌冲悬曲o日w^n: >in#l od AOIAIAoi/\id nnvon ddna w# v MM ddnatfLd AOIAI0dAOi/\id nnvon 申MCIAOIAIaavd nnvon 乙ddna#1 Ld AOIAI ansd nnvon fe->i)39+(k>i)3 a-(>i)3 v ®>in #44 HdnatfLd AOIAI nniAidnnvon >i3#l Ld AOIAI 0dAOi/\id nnvon ddnatfLd AOIAI(>i)3 v: ^oonatfod AOIAIAoi/\id nnvon ddna MM ddnatfLd AOIAI 0dAOi/\idnnvon 乙ddna#1 Ld AOIAI nniAid nnvon 2>i3#l LdAOIAI 0dAOi/\id nnvon o ddna#1AOIAI 竝run日丑型島粵阴(3->i)90 Boioonatfod AOIAIAoi/\id nnvon ddna w#a MM ddnatfLd AOIAIMOV R1,#EKMOV R0,#EK1LCALL FMOVLCALL DELAY ;等待采样时刻DJNZ REC,NEXT1SJMP $NEXT1: LJMP LOOPDELAY: MOV R7,#02H DELAY1: MOV R6,#0FFH DELAY2: DJNZ R6,DELAY2 DJNZR7,DELAY1RET; (,) 标号: ,,,, 功能: 浮点数格式化; 入口条件: 待格式化浮点操作数在[R0] 中。

增量式PID控制算法

增量式PID控制算法

增量式PID控制算法U(k)=U(k-1)+Kp*[e(k)-e(k-1)]+Ki*e(k)+Kd*[e(k)-2e(k-1)+e(k-2)]其中,U(k)为当前时刻的控制量,U(k-1)为前一时刻的控制量,e(k)为当前时刻的误差,e(k-1)为前一时刻的误差,Kp、Ki和Kd为控制器的比例增益、积分增益和微分增益。

首先,增量式PID控制算法避免了积分饱和的问题。

传统的PID控制器在积分项的作用下,当系统输出接近目标值时,误差会趋于零,积分增益开始起作用,但随着时间的推移,积分项的值会越来越大,最终导致积分饱和现象。

而增量式PID控制算法是基于误差的增量进行调整,使得积分项的增量可以在控制过程中进行调整,避免了积分饱和问题的发生。

其次,增量式PID控制算法具有更好的稳定性。

传统的PID控制算法在系统变化较快或存在噪声干扰时,往往会导致控制量的抖动或振荡。

而增量式PID控制算法通过对误差的增量进行运算,可以减小系统对噪声的敏感性,提高系统的稳定性。

此外,增量式PID控制算法具有较高的控制精度。

传统的PID控制算法存在一个固定的控制增益,对于不同的系统或工况,控制精度可能不够高。

而增量式PID控制算法在每个采样周期内都会重新计算控制量的增量,使得控制精度可以根据系统动态变化进行调整,从而提高了控制精度。

综上所述,增量式PID控制算法是一种针对传统PID控制算法的改进方法,通过对误差的增量进行调整,优化了控制器的性能,提高了控制精度和稳定性。

在实际应用中,可以根据系统的特点和要求选择适当的增益参数,进行参数调整,以实现对系统的更加精确和稳定的控制。

51单片机PID算法程序

51单片机PID算法程序

51单片机PID算法程序PID控制(比例-积分-微分)是一种经典的控制算法,常用于单片机控制系统中。

PID控制算法结合了比例、积分和微分三个控制项,可以有效地调节系统的输出,使系统快速稳定地达到设定值。

PID控制算法的基本原理是通过比例、积分和微分三个部分来调节系统输出。

比例部分根据系统当前误差的大小来调节输出,积分部分根据系统过去误差的积累来调节输出,微分部分根据系统误差的变化率来调节输出。

通过合理地调节这三个部分的比例系数,可以使系统快速稳定地达到设定值,并且具有较好的鲁棒性。

下面给出一个单片机上实现PID控制算法的示例程序。

该程序使用C 语言编写,可以在常见的单片机开发环境中运行。

```c#include<reg52.h>sbit PWM=P1^0;sbit DIR=P1^1;sbit EN=P1^2;sbit Kp=0x30;sbit Ki=0x31;sbit Kd=0x32;int SetPoint = 100; //设定值int Kp = 1; //比例系数int Ki = 0.1; //积分系数int Kd = 0.2; //微分系数int GetFeedback//获取反馈值的函数,这里使用ADC等方式获取反馈值return feedback;void SetPWM(int pwm_value)//设置PWM输出的函数PWM = pwm_value;void PIDControlint Feedback = GetFeedback(;int Error = SetPoint - Feedback;static int LastError = Error;static int Integral = 0;int Derivative = Error - LastError;Integral += Error;int Output = Kp * Error + Ki * Integral + Kd * Derivative; SetPWM(Output);LastError = Error;void mainwhile(1)PIDControl(;}```在这个示例程序中,我们定义了一个PID控制函数PIDControl,用于控制系统的输出。

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

51单片机PID算法程序(一)PID算法(原创文章,转载请注明出处/tengjingshu) 比例,积分,微分的线性组合,构成控制量u(t),称为:比例(Proportional)、积分(Integrating)、微分(Differentiation)控制,简称PID控制图1控制器公式在实际应用中,可以根据受控对象的特性和控制的性能要求,灵活地采用不同的控制组合,构成比例(P)控制器比例+积分(PI)控制器比例+积分+微分(PID)控制器式中或式中控制系统中的应用在单回路控制系统中,由于扰动作用使被控参数偏离给定值,从而产生偏差。

自动控制系统的调节单元将来自变送器的测量值与给定值相比较后产生的偏差进行比例、积分、微分(PID)运算,并输出统一标准信号,去控制执行机构的动作,以实现对温度、压力、流量、也为及其他工艺参数的自动控制。

比例作用P只与偏差成正比;积分作用I是偏差对时间的积累;微分作用D 是偏差的变化率;比例(P)控制比例控制能迅速反应误差,从而减少稳态误差。

除了系统控制输入为0和系统过程值等于期望值这两种情况,比例控制都能给出稳态误差。

当期望值有一个变化时,系统过程值将产生一个稳态误差。

但是,比例控制不能消除稳态误差。

比例放大系数的加大,会引起系统的不稳定。

图2比例(P)控制阶跃响应积分(I)控制在积分控制中,控制器的输出与输入误差信号的积分成正比关系。

为了减小稳态误差,在控制器中加入积分项,积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。

这样,即使误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减少,直到等于零。

积分(I)和比例(P)通常一起使用,称为比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。

如果单独用积分(I)的话,由于积分输出随时间积累而逐渐增大,故调节动作缓慢,这样会造成调节不及时,使系统稳定裕度下降。

图3积分(I)控制和比例积分(PI)控制阶跃相应微分(D)控制在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。

由于自动控制系统有较大的惯性组件(环节)或有滞后(delay)组件,在调节过程中可能出现过冲甚至振荡。

解决办法是引入微分(D)控制,即在误差很大的时候,抑制误差的作用也很大;在误差接近零时,抑制误差的作用也应该是零。

图4微分(D)控制和比例微分(PD)控制阶跃相应总结:PI比P少了稳态误差,PID比PI反应速度更快并且没有了过冲。

PID比PI 有更快的响应和没有了过冲。

图5增益常数(系数)上升时间过冲建立时间稳态误差Kp 减少增大很小变化减小K I减少增大增加消除K D很小变化减小减少很小变化表1注意,这里的图6 典型的PID控制器对于阶跃跳变参考输入的响应参数的调整应用PID控制,必须适当地调整比例放大系数K P,积分时间T I和微分时间T D,使整个控制系统得到良好的性能。

最好的寻找PID参数的办法是从系统的数学模型出发,从想要的反应来计算参数。

很多时候一个详细的数学描述是不存在的,这时候就需要实际地调节P ID的参数.Ziegler-Nichols方法Ziegler-Nichols方法是基于系统稳定性分析的PID整定方法.在设计过程中无需考虑任何特性要求,整定方法非常简单,但控制效果却比较理想。

具体整定方法步骤如下:1. 先置I和D的增益为0,逐渐增加K P直到在输出得到一个持续的稳定的振荡。

2. 记录下振荡时的P部分的临界增益Kc,和振荡周期Pc,代到下表中计算出K P,Ti,Td。

Ziegler-Nichols整定表表2Tyreus-Luyben 整定表:表3Tyreus-Luyben的整定值减少了振荡的作用和增强了稳定性。

自动测试方法:为了确定过程的临界周期Pc和临界增益Kc,控制器会临时使它的PID算法失效,取而代之的是一个ON/OFF的继电器来让过程变为振荡的。

这两个参数很好的将过程行为进行了量化以决定PID控制器应该如何整定来得到理想的闭环回路性能。

图6参考资料1)Mixed-Signal Control Circuits Use Microcontroller for Flexibility in Impl ementing PID Algorithms,By Eamon Neary(图1,表1)2)Atmel 8-bit AVR Microcontrollers Application Note:AVR221: Discrete PI D controller(图2,图3,图4,图5,表2)3)使用Ziegler-Nichols方法的自整定控制/2007-03/200733042815.htm(图6)4)Ziegler-Nichols Method/~tbco/cm416/zn.html(表3)5)Ziegler-Nichols方法PID参数整定--随风的blog/u/4/archives/2007/97.htm6) PID控制原理教程,胡晓若编制51单片机PID算法程序(二)位置式PID控制算法(转载请注明出处/tengjingshu) 由51单片机组成的数字控制系统控制中,PID控制器是通过PID控制算法实现的。

51单片机通过AD对信号进行采集,变成数字信号,再在单片机中通过算法实现PID运算,再通过DA把控制量反馈回控制源。

从而实现对系统的伺服控制。

位置式PID控制算法位置式PID控制算法的简化示意图上图的传递函数为:(2-1)在时域的传递函数表达式(2-2)对上式中的微分和积分进行近似(2-3)式中n是离散点的个数。

于是传递函数可以简化为:(2-4)其中u(n)——第k个采样时刻的控制;K P ——比例放大系数;K i ——积分放大系数;K d ——微分放大系数;T ——采样周期。

如果采样周期足够小,则(2-4)的近似计算可以获得足够精确的结果,离散控制过程与连续过程十分接近。

(2-4)表示的控制算法直接按(2-1)所给出的PID控制规律定义进行计算的,所以它给出了全部控制量的大小,因此被称为全量式或位置式PID控制算法。

缺点:1)由于全量输出,所以每次输出均与过去状态有关,计算时要对e(k)(k=0, 1,…n)进行累加,工作量大。

2)因为计算机输出的u(n)对应的是执行机构的实际位置,如果计算机出现故障,输出u(n)将大幅度变化,会引起执行机构的大幅度变化,有可能因此造成严重的生产事故,这在实际生产中是不允许的。

位置式PID控制算法C51程序具体的PID参数必须由具体对象通过实验确定。

由于单片机的处理速度和r am资源的限制,一般不采用浮点数运算,而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算,可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余数补偿。

这个程序只是一般常用pid算法的基本架构,没有包含输入输出处理部分。

=========================================================== ==========================================*/#include <reg52.h>#include <string.h> //C语言中memset函数头文件/*========================================================== ==========================================PID FunctionThe PID (比例、积分、微分) function is used in mainlycontrol applications. PIDCalc performs one iteration of the PID algorithm.While the PID function works, main is just a dummy program showinga typical usage.=========================================================== ==========================================*/typedef struct PID {double SetPoint; // 设定目标Desired valuedouble Proportion; // 比例常数Proportional Constdouble Integral; // 积分常数Integral Constdouble Derivative; // 微分常数Derivative Constdouble LastError; // Error[-1]double PrevError; // Error[-2]double SumError; // Sums of Errors} PID;/*========================================================== ==========================================PID计算部分=========================================================== ==========================================*/double PIDCalc( PID *pp, double NextPoint ){double dError, Error;Error = pp->SetPoint - NextPoint; // 偏差pp->SumError += Error; // 积分dError = Error - pp->LastError; // 当前微分pp->PrevError = pp->LastError;pp->LastError = Error;return (pp->Proportion * Error // 比例项+ pp->Integral * pp->SumError // 积分项+ pp->Derivative * dError // 微分项);}/*========================================================== ==========================================Initialize PID Structure PID参数初始化=========================================================== ==========================================*/void PIDInit (PID *pp){memset ( pp,0,sizeof(PID));}/*========================================================== ==========================================Main Program 主程序=========================================================== ==========================================*double sensor (void)// Dummy Sensor Function{return 100.0;}void actuator(double rDelta) // Dummy Actuator Function{}void main(void){PID sPID;// PID Control Structuredouble rOut; // PID Response (Output)double rIn; // PID Feedback (Input)PIDInit ( &sPID ); // Initialize StructuresPID.Proportion = 0.5; // Set PID CoefficientssPID.Integral = 0.5;sPID.Derivative = 0.0;sPID.SetPoint = 100.0; // Set PID Setpointfor (;;) {// Mock Up of PID ProcessingrIn = sensor (); // Read InputrOut = PIDCalc ( &sPID,rIn ); // Perform PID Interationactuator ( rOut ); // Effect Needed Changes}参考资料:1)Atmel 8-bit AVR Microcontrollers Application Note:AVR221: Discrete PI D controller2)茶壶- pid C程序,好东西- 腾讯博客–Qzone/blog/38162254-12259767773)PID 调节控制做电机速度控制,SUNPLUS凌阳科技51单片机PID算法程序(三)增量式PID控制算法(转载请注明出处/tengjingshu) 当执行机构需要的不是控制量的绝对值,而是控制量的增量(例如去驱动步进电动机)时,需要用PID的“增量算法”。

相关文档
最新文档