这次萌生出写一篇Arduino和PID算法结合的文章,其实是因为刚忙完实验的事情,而实验进行过程中曾尝试着应用PID算法。虽然最后并没有用上,思考之后,我决定还是把它贴出来。
什么是PID?
PID控制是二阶线性控制,对输入偏差进行比例(P)、积分(I)、微分(D)运算来控制输出,一般用于闭环控制。
比例(P)控制积分(I)控制在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的 或简称有差系统(System with Steady-state Error)。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积 分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到接近于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后几乎无稳 态误差。微分(D)控制在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用, 其变化总是落后于误差的变化。解决的办法是使抑制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入 “比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能 够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在 调节过程中的动态特性。
详细点的引用某位网友
比例调节作用:是按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。比例作用大,可以加快调节,减少误差,但是过大的比例,使系统的稳定性下降,甚至造成系统的不稳定。积分调节作用:是使系统消除稳态误差,提高无差度。因为有误差,积分调节就进行,直至无差,积分调节停止,积分调节输出一常值。积分作用的强弱取决与积分时间常数Ti,Ti越小,积分作用就越强。反之Ti大则积分作用弱,加入积分调节可使系统稳定性下降,动态响应变慢。积分作用常与另两种调节规律结合,组成PI调节器或PID调节器。微分调节作用,微分作用反映系统偏差信号的变化率,具有预见性,能预见偏差变化的趋势,因此能产生超前的控制作用,在偏差还没有形成之前,已被微分调节作用消除。因此,可以改善系统的动态性能。在微分时间选择合适情况下,可以减少超调,减少调节时间。微分作用对噪声干扰有放大作用,因此过强的加微分调节,对系统抗干扰不利。此外,微分反应的是变化率,而当输入没有变化时,微分作用输出为零。微分作用不能单独使用,需要与另外两种调节规律相结合,组成 PD或PID控制器。
PID应用于Arduino
PID可分为位置式PID、增进式PID和步进式PID。具体区别我也不能说出一二,利用Arduino通过L298N实现对pwm控制的是采用位置式PID,主要用PD,可不用I。
位置式PID的公式:
PD控制器应用于Arduino中,主要是将误差送至pwm中来控制电路电流。
公式为:u(k)=Kp*e(k)+Kd*[e(k)-e(k-1)] 其中e(k)为误差(目标与实际之差)
代码例子
double v, error;
error = readValue1 - Pid1.target;
v = error - Pid1.preError;
Pid1.power = (int) Pid1.Kd * v + Pid1.Kp * error;//公式
Pid1.flag = Pid1.power > 0;//设定方向
Pid1.power = abs(Pid1.power);
if(Pid1.power>255) Pid1.power = 255;
Pid1.preError = error;
digitalWrite(i1Pin, Pid1.flag);
digitalWrite(i2Pin, !Pid1.flag);
analogWrite(power1Pin, Pid1.power);
参考资料:
http://blog.gkong.com/liaochangchu_117560.ashx
http://lql990832.blog.163.com/blog/static/75304655200992434744316/