上一节中已经抽象出了位置性PID和增量型PID的数学表达式,这一节,重点讲解C语言代码的实现过程,算法的C语言实现过程具有一般性,通过PID算法的C语言实现,可以以此类推,设计其它算法的C语言实现。
/*-------------------------------------------
位置型PID C实现(控制电机转速)
--------------------------------------------*/
#include <iostream>
using namespace std;
void pid_value_init(void);
float PID_realize(float speed);
//(1)定义PID 结构体变量
struct pid
{
float SetSpeed; //设定速度
float ActualSpeed; //实际值
float err; //定义偏差值
float err_last; //上一个偏差值
float Kp, Ki, Kd; //p,i,d系数
float voltage; //电压值
float integral; //积分值,即积分部分的累计值
}pid;
int main()
{
int count = 0;
cout << "Please begin \n";
pid_value_init();
while (count < 1000)
{
float speed = PID_realize(200.0);
cout <<"value is " <<speed<<endl ;
count++;
}
system("pause");
}
//(3) 控制算法注意:这里用了最基本的算法实现形式,没有考虑死区问题,
//没有设定上下限,只是对公式的一种直接的实现,后面的介绍当中还会逐渐的对此改进。
float PID_realize(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.err_last = pid.err;
pid.ActualSpeed = pid.voltage *1.0;
return pid.ActualSpeed;
}
//(2) 初始化变量
void pid_value_init(void)
{
cout << "pid_value_init begin \n" << endl;
system("pause");
pid.SetSpeed = 0;
pid.ActualSpeed = 0;
pid.err = 0;
pid.err_last = 0;
pid.integral = 0;
pid.voltage = 0;
pid.Kp = 0.1;
pid.Ki = 0.1;
pid.Kd = 0.1;
cout << "pid_value_init end \n" << endl;
system("pause");
}