/*-------------------------------------------
2 位置型PID C實現(控制電機轉速)
--------------------------------------------*/
//(1)定義PID 結構體變量
struct pid
{
float SetSpeed; //設定速度
float ActualSpeed; //實際值
float err; //k,定義偏差值
float err_last; //k-1,上一個偏差值
float err_last_next; //k-2
float Kp, Ki, Kd; //p,i,d系數
}pid;
int main()
{
int count = 0;
cout << "Please begin \n";
pid_value_init();
while (count < 100)
{
float speed = PID_realize(200.0);
cout << "value is " << speed << endl;
count++;
}
system("pause");
}
//(3) 控制算法注意:這里用了最基本的算法實現形式,沒有考慮死區問題,
//沒有設定上下限,只是對公式的一種直接的實現,后面的介紹當中還會逐漸的對此改進。
float PID_realize(float speed)
{
float incrementSpeed;
pid.SetSpeed = speed;
pid.err = pid.SetSpeed - pid.ActualSpeed;
incrementSpeed = pid.Kp * (pid.err -pid.err_last ) + pid.Ki*pid.err + pid.Kd*(pid.err -2* pid.err_last + pid.err_last_next);
pid.ActualSpeed += incrementSpeed;
pid.err_last = pid.err;
pid.err_last_next = pid.err_last;
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.err_last_next = 0;
pid.Kp = 0.1;
pid.Ki = 0.15;
pid.Kd = 0.1;
cout << "pid_value_init end \n" << endl;
system("pause");
}