Pid控制算法-抗积分饱和pid算法C++实现

PID控制算法的C++语言实现

六 抗积分饱和的PID控制算法C++语言实现

所谓的积分饱和现象是指如果系统存在一个方向的偏差,PID控制器的输出由于积分作用的不断累加而加大,从而导致执行机构达到极限位置,若控制器输出U(k)继续增大,执行器开度不可能再增大,此时计算机输出控制量超出了正常运行范围而进入饱和区。一旦系统出现反向偏差,u(k)逐渐从饱和区退出。进入饱和区越深则退出饱和区时间越长。在这段时间里,执行机构仍然停留在极限位置而不随偏差反向而立即做出相应的改变,这时系统就像失控一样,造成控制性能恶化,这种现象称为积分饱和现象或积分失控现象

防止积分饱和的方法之一就是抗积分饱和法,该方法的思路是在计算u(k)时,首先判断上一时刻的控制量u(k-1)是否已经超出了极限范围: 如果u(k-1)>umax,则只累加负偏差; 如果u(k-1)<umin,则只累加正偏差。从而避免控制量长时间停留在饱和区。直接贴出代码,不懂的看看前面几节的介绍.

pid.h:
#ifndef _PID_H_
#define _PID_H_
 
typedef struct _pid{
float SetSpeed;
float ActualSpeed;
float err;
float err_last;
float Kp, Ki, Kd;
float voltage;
float integral;
float umax;
float umin;
}Pid;
 
 
class Pid_control
{
public:
 
void PID_init();
float PID_realize(float speed);
 
private:
int index;
Pid pid;
};
#endif
pid.cpp:
#include <iostream>
#include "pid.h"
 
using namespace std;
 
void  Pid_control::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.1;
pid.Kd = 0.2;
pid.umax = 400;
pid.umin = -200;
}
 
float Pid_control::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*(pid.err - pid.err_last);
 
pid.err_last = pid.err;
pid.ActualSpeed = pid.voltage*1.0;
return pid.ActualSpeed;
}
main.cpp
#include "pid.h"
#include <iostream>
 
using namespace std;
 
int main()
{
Pid_control Pid;
 
Pid.PID_init();
 
int count = 0;
 
while (count<1000)
{
float speed = Pid.PID_realize(200.0);
 
cout << speed << ";" << " ";
 
count++;
}
cout << endl;
 
system("pause");
 
return 0;
}
最终的测试程序运算结果如下,可以明显的看出系统的稳定时间相对前几次来讲缩短了不少。


 

 

  • 10
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值