PID控制算法的C语言实现三 位置型PID的C语言实现
上一节中已经抽象出了位置性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"); }