速度PID
速度PID采用增量式PI控制
源码: 内联代码片
。
void Motor_Speed_PI(motor_parameter_st *Motorx)
{
(*Motorx).PID_speed.bias = (*Motorx).actual_speed-(*Motorx).target_speed;//计算此次偏差
(*Motorx).PWM-=(*Motorx).PID_speed.Kp*((*Motorx).PID_speed.bias-(*Motorx).PID_speed.last_Bias)+(*Motorx).PID_speed.Ki*(*Motorx).PID_speed.bias; //增量式PI控制器
(*Motorx).PID_speed.last_Bias = (*Motorx).PID_speed.bias;//保存上一次偏差
}
调参策论
PID参数调整的口诀:
参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大
曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢。微分时间应加长
理想曲线两个波,前高后低4比1
一看二调多分析,调节质量不会低
转自:https://www.cnblogs.com/agvcfy/p/9467148.html
这个策略适用的是绝对式PID,对于增量式PID来说P对应绝对式中的D,I对应绝对式中的P。
测试数据
根据先绝对式PID调整时的先P后I最后D的原则
P=0;
I=0.25;//估算得
target_speed=300;(mm/s)
可以看到虽然收敛但是反应速度不够快,尝试增大I
P=0;
I=0.4;
target_speed=300;(mm/s)
用类似二分法的思想,直接将I取到0.4,发现速度曲线震荡,无收敛趋势,(0.25+0.4)/2,将I取0.3
P=0;
I=0.3;
target_speed=300;(mm/s)
曲线收敛但还不赶快,继续增加I
P=0;
I=0.35;
target_speed=300;(mm/s)震荡大,但已经有收敛趋势
P=0.4;
I=0.35;
target_speed=300;(mm/s)
加入P后震荡明显被抑制,但反应不够快,增加P
P=0.4;
I=0.35;
target_speed=300;(mm/s)
P设为0.8,曲线开始震荡,无收敛趋势,P超调了。同样二分法思想(0.4+0.8)/2,尝试将P设为0.6
P=0.6;
I=0.35;
target_speed=300;(mm/s)
虽然震荡幅度减小,但震荡依然存在,继续减小P
P=0.5;
I=0.35;
target_speed=300;(mm/s)
P=0.55;
I=0.35;
target_speed=300;(mm/s)P=0.5;
I=0.3;
target_speed=300;(mm/s)P=0.5;
I=0.2;
target_speed=300;(mm/s)
P=0.5;
I=0.1;
target_speed=300;(mm/s)
P=0.55;
I=0.05;
target_speed=300;(mm/s)
P=0.6;
I=0.05;
target_speed=300;(mm/s)
P=0.6;
I=0.1;
target_speed=300;(mm/s)
P=0.55;
I=0.1;
target_speed=300;(mm/s)P=0.45;
I=0.1;
target_speed=300;(mm/s)
P=0.4;
I=0.1;
target_speed=300;(mm/s)
P=0.35;
I=0.1;
target_speed=300;(mm/s)P=0.25;
I=0.1;
target_speed=300;(mm/s)
P=0.3;
I=0.1;
target_speed=300;(mm/s)
P=0.27;
I=0.1;
target_speed=300;(mm/s)
P=0.27;
I=0.11;
target_speed=300;(mm/s)
P=0.27;
I=0.09;
target_speed=300;(mm/s)
P=0.25;
I=0.09;
target_speed=300;(mm/s)P=0.25;
I=0.1;
target_speed=300;(mm/s)
P=0.25;
I=0.1;
target_speed=500;(mm/s)
快测试完才发现测试的时候电机是空转的,电机在空载和负载情况下的相应曲线并不相同。
所以一切重新再来。。