本篇博客主要介绍PID控制的C++语言实现。
位置型PID控制代码实现:
#include<iostream>
using namespace std;
//PID各项参数的变量结构体
struct _pid {
float SetSpeed;//输入变量,即期望输出的变量值
float ActualSpeed;//实际输出变量,即采样回来的输出变量
float Err; //误差值
float Err_last;//上一次误差值
float Kp, Ki, Kd;//比例 积分 微分系数
float Voltage;//定义电压值,最后的输出都要转化为电压来控制
float Integral; //积分值
} pid;
//PID控制的初始化函数
//初始化完成后主要对Kp、Ki、Kd不断地调节来优化控制效果
void PID_Init() {
cout << "PID_Init begin!" << endl;
pid.SetSpeed = 0;
pid.ActualSpeed = 0;
pid.Err = 0;
pid.Err_last = 0;
pid.Kp = 0.2;
pid.Ki = 0.015;
pid.Kd = 0.2;
pid.Voltage = 0;
pid.Integral = 0;
cout << "PID_Init end!" << endl;
}
/*
PID控制的计算函数
功能:PID控制
Speed 要设定的输出变量的值
返回值调节后实际输出的值
*/
float PID_Cal(float Speed)
{
pid.SetSpeed = Speed;
pid.Err = pid.SetSpeed - pid.ActualSpeed;//误差的计算,即比例控制
pid.Integral += pid.Err;//误差相加,即积分控制
pid.Voltage = pid.Kp * pid.Err + pid.Ki * pid.Integral + pid.Kd *
(pid.Err - pid.Err_last);//根据位置型PID控制的公式
pid.Err_last = pid.Err;
pid.ActualSpeed = pid.Voltage * 1.0; //转换
return pid.ActualSpeed;//PID控制后的实际输出值
}
//main函数
int main() {
int count = 0;
cout << "SYSTEM BEGIN!" << endl;
PID_Init();
while (count < 1000)//执行1000次PID控制,并输出每一次控制的值
{
float speed = PID_Cal(200.0);
cout << "-" << count << "-" << speed << "-" << endl;
count++;
}
return 0;
}
输出结果:
增量型PID控制代码实现:
#include<iostream>
using namespace std;
//PID 各项参数的结构体
struct _pid {
float SetSpeed;//输入变量,即期望输出的变量值
float ActualSpeed;//实际输出变量,即采样回来的输出变量
float Err; //误差值
float Err_last;//上一次误差值
float Err_Next;//下一次误差值
float Kp, Ki, Kd;//比例 积分 微分系数
} pid;
//各项参数的初始化函数
void PID_Init()
{
cout << "PID_Init begin!" << endl;
pid.SetSpeed = 0;
pid.ActualSpeed = 0;
pid.Err = 0;
pid.Err_last = 0;
pid.Err_Next = 0;
pid.Kp = 0.2;
pid.Ki = 0.015;
pid.Kd = 0.2;
cout << "PID_Init end!" << endl;
}
//PID算法的计算函数
float PID_Calc(float speed) {
float incrementSpeed;
pid.SetSpeed = speed;
pid.Err = pid.SetSpeed - pid.ActualSpeed;
incrementSpeed = pid.Kp*(pid.Err - pid.Err_Next) + pid.Ki*pid.Err +
pid.Kd * (pid.Err - 2 * pid.Err_Next + pid.Err_last);
pid.ActualSpeed += incrementSpeed;
pid.Err_last = pid.Err_Next;
pid.Err_Next = pid.Err;
return pid.ActualSpeed;
}
//main函数
int main() {
int count = 0;
cout << "SYSTEM BEGIN!" << endl;
PID_Init();
while (count < 1000) {
float speed = PID_Calc(200.0);
cout << "-" << count << "-" << speed << "-" << endl;
count++;
}
return 0;
}
输出结果: