Pid控制算法-积分分离pid算法C++实现
2017-04-10 12:02
411 查看
PID控制算法的C++语言实现
五 积分分离的PID控制算法C++语言实现
通过三、四两篇文章,基本上已经弄清楚了PID控制算法的最常规的表达方法。在普通PID控制中,引入积分环节的目的,主要是为了消除静差,提高控制精度。但是在启动、结束或大幅度增减设定时,短时间内系统输出有很大的偏差,会造成PID运算的积分积累,导致控制量超过执行机构可能允许的最大动作范围对应极限控制量,从而引起较大的超调,甚至是震荡,这是绝对不允许的。为了克服这一问题,引入了积分分离的概念,其基本思路是
当被控量与设定值偏差较大时,取消积分作用; 当被控量接近给定值时,引入积分控制,以消除静差,提高精度。其具体实现代码如下:
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.04;
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;
pid.integral += pid.err;
}
pid.voltage = pid.Kp*pid.err + index*pid.Ki*pid.integral + pid.Kd*(pid.err - pid.err_last);
}
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;
}
其它部分的代码参见《PID控制算法的C++语言实现三》中的讲解,不再赘述。同样采集1000个量,会发现,系统到199所有的时间是原来时间的1/2,系统的快速性得到了提高。
相关文章推荐
- Pid控制算法-变积分的pid算法的C++实现
- Pid控制算法-位置型pid算法的C++实现
- Pid控制算法-增量型pid算法的C++实现
- Pid控制算法-抗积分饱和pid算法C++实现
- 数据结构与算法——散列表类的C++实现(分离链接散列表)
- Pid控制算法-专家PID与模糊PID的C++实现
- 杂谈PID控制算法——最终篇:C语言实现51单片机中的PID算法
- C/C++计算一重定积分和二重定积分(纯暴力算法实现)
- 体验C++中接口与实现分离的技术
- C++中接口与实现分离的技术
- 内存管理:算法及其c/c++实现 翻译五
- C++接口与实现分离的2种方法
- 动态聚类中 C-均值算法 (K-均值算法)的C++实现
- 较高人工智能的人机博弈程序实现(多个算法结合)含C++源码
- C/C++面试之算法系列--如何实现用更少的空间表示英文字母(a ~ z)构成char A[n]字符串
- 体验C++中接口与实现分离的技术
- C++模板应用——让模板定义和实现分离的方法
- 较高人工智能的人机博弈程序实现(多个算法结合)含C++源码
- 较高人工智能的人机博弈程序实现(多个算法结合)含C++源码
- 内存管理:算法及其c/c++实现 翻译七