我是靠谱客的博主 传统黑裤,最近开发中收集的这篇文章主要介绍PID控制算法C语言实现进阶积分分离的PID控制算法C语言实现抗积分饱和PID控制算法C语言实现,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
积分分离的PID控制算法C语言实现
在“位置型与增量型PID的C语言实现”一文中表达了最常规的PID表达方法。在普通 PID 控制中,引入积分环节的目的,主要是为了消除静差,提高控制精度。但是在启动、结束或大幅度增减设定时,短时间内系统输出有很大的偏差,会造成 PID 运算的积分积累,导致控制量超过执行机构可能允许的最大动作范围对应极限控制量,从而引起较大的超调,甚至是震荡。
为了克服这一问题,引入了积分分离的概念,其基本思路是 当被控量与设定值偏差较大时,取消积分作用; 当被控量接近给定值时,引入积分控制,以消除静差,提高精度。
struct_pid{
float SetSpeed;
//定义设定值
float ActualSpeed
//定义实际值
float err;
//定义偏差值
float err_last;
//定义上一个偏差值
float Kp,Ki,Kd;
//定义比例,积分,微分系数
float voltage;
//定义电压值(控制执行器的变量)
float integral;
//定义积分值
}pid;
void PID_Init(){
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.voltage=0.0;
pid.integral=0.0;
pid.Kp=0.2;
pid.Ki=0.04;
pid.Kd=0.2;
printf("PID_init end n");
}//Kp,Ki,Kd的初始化赋值相较于位置型与增量型发生了改变。
float PID_realize(float speed){
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-pid.ActualSpeed;
pid.integral+=pid.err;
if(abs(pid.err)>200)
{
index=0;
}else{
index=1;
pid.integral+=pid.err;
}
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(p
id.err-pid.err_last);
pid.err_last=pid.err;
pid.ActualSpeed=pid.voltage*1.0;
return pid.ActualSpeed;
int main(){
printf("System begin n");
PID_init();
int count=0;
while(count<1000)
{
float speed=PID_realize(200.0);//设定值为200
printf("%fn",speed);
count++;
}
return 0;
}
}
该算法可跟快达到预设值
抗积分饱和PID控制算法C语言实现
积分饱和现象是指如果系统存在一个方向的偏差,PID 控制器的输
出由于积分作用的不断累加而加大,从而导致执行机构达到极限位置,若U(k)任然增大,而执行器已经不能再增大,则系统就像失控一样,造成控制性能恶化,这种现象称为积分饱和现象或积分失控现象。
该方法的思路是在计算u(k)时,首先判断上一时刻的控制量 u(k-1)是否已经超出了极限范围: 如果u(k-1)>umax,则只累加负偏差; 如果 u(k-1)<umin,则只累加正偏差。从而避免控制量长时间停留在饱和区造成控制性能恶化。
struct _pid{
float SetSpeed; //定义设定值
float ActualSpeed; //定义实际值
float err; //定义偏差值
float err_last; //定义上一个偏差值
float Kp,Ki,Kd; //定义比例、积分、微分系数
float voltage; //定义电压值(控制执行器的变
量)
float integral; //定义积分值
float umax;
float umin;
}pid;
void PID_init(){
printf("PID_init begin n");
pid.SetSpeed=0.0;
pid.ActualSpeed=0.0;
pid.err=0.0;
pid.err_last=0.0;
pid.voltage=0.0;
pid.integral=0.0;
pid.Kp=0.2;
pid.Ki=0.1; //注意,和之前方法,这里加大了积分环节
的值
pid.Kd=0.2;
pid.umax=400;
pid.umin=-200;
printf("PID_init end n");
}
float PID_realize(float speed){
int index;
pid.SetSpeed=speed;
pid.err=pid.SetSpeed-pid.ActualSpeed;
if(pid.ActualSpeed>pid.umax) //灰色底色表示抗积分饱和的实现
{
if(abs(pid.err)>200) //蓝色标注为积分分离过程
{
index=0;
}else{
index=1;
if(pid.err<0)
{
pid.integral+=pid.err;
}
}
}else if(pid.ActualSpeed<pid.umin){
if(abs(pid.err)>200) //积分分离过程
{
index=0;
}else{
index=1;
if(pid.err>0)
{
pid.integral+=pid.err;
}
}
}else{
if(abs(pid.err)>200)
//积分分离过程
{
index=0;
}else{
index=1;
pid.integral+=pid.err;
}
}
pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(p
id.err-pid.err_last);
pid.err_last=pid.err;
pid.ActualSpeed=pid.voltage*1.0;
return pid.ActualSpeed;
}
改算法可跟快是系统稳定
最后
以上就是传统黑裤为你收集整理的PID控制算法C语言实现进阶积分分离的PID控制算法C语言实现抗积分饱和PID控制算法C语言实现的全部内容,希望文章能够帮你解决PID控制算法C语言实现进阶积分分离的PID控制算法C语言实现抗积分饱和PID控制算法C语言实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复