// PID参数初始化
void Init_pid(PID*p, float kp, float ki, float kd)
{
p->kp = kp;
p->ki = ki;
p->kd = kd;
p->error = 0;
p->error_last = 0;
p->error_next = 0;
}
// 设定期待的值
void pid_set_speed(PID* p, float val)
{
p->set_speed = val;
}
// 增量式PID核心算法,返回增量
float pid_update(PID*p, float actual)
{
p->error = p->set_speed - actual;
p->increment_speed = p->kp*(p->error - p->error_next)+
p->ki* p->error+
p->kd * (p- >error - 2*p->error_next +
p->error_last);
p->error_last = p->error_next;
p->error_next = p->error;
return p->increment_speed;
}
那怎么使用????
比如,我想通过电机吹动一块纸板,通过吹出的角度来控制PWM.....
辣么,怎么办咧???
首先,找出每一度对应的PWM。 我们可以将PWM的占空比调到100%,看能吹出多大角度;
然后,最大的PWM的值 / 最大的角度 = 每一度对应的PWM值。。。(这个pwm值不一定是100,可以是1000,2000,看你的定义)
最后,将pwm和PID输出的增量关联起来。
get_pwm += get_increase*12.5; //12.5是 每一度对应的PWM值
好了,剩下的工作就是慢慢调节Kp, Ki, Kd.