意
f思,I是I
tegral,积分,D是Differe
tial微分。打个比方,如果现在的输出是1,目标输出是100,那么P的
作用是以最快的速度达到100,把P理解为一个系数即可;而I呢?大家学过高数的,0的积分才能是一个常数,I就是使误差为0而起调和作用;D呢?大家都知道微分是求导数,导数代表切线是吧,切线的方向就是最快到至高点的方向。这样理解,最快获得最优解,那么微分就是加快调节过程的作用了。
公式本来需要推导的,我就不来这一套了。直接贴出来:
看看最后的结果:△UkAekBek1Cek2
f这里KP是P的值,TD是D的值,1Ti是I的值,都是常数,哦,还有一个T,T是采样周期,也是已知。而ABC是由PID换算
f来的,按这个公式,就可以简化计算量了,因为PID是常数,那
么ABC可以用一个宏表示。这样看来,只需要求ekek1
ek2就可以知道△Uk的值了,按照△Uk来调节PWM的大小就
OK了。PID三个参数的确定有很多方法,不在本文讨论范围内。
采样周期也是有据可依的,不能太大,也不能太小。
PID实际编程的过程的,要注意的东西还是有几点的。PID这东西可以做得很深。1PID的诊定。凑试法,临界比例法,经验法。2T的确定,采样周期应远小于过程的扰动信号的周期,在小车程序中一般是ms级别。3目标速度何时赋值问题,如何更新新的目标速度这个问题一般的人都乎略了。目标速度肯定不是个恒定的,那么何时改变目标速度呢?4改变了目标速度,那么ekek1ek2怎么改变呢?是赋0还是要怎么变?5是不是PID要一直开着?6error为多少时就可以当速度已达到目标?7PID的优先级怎么处理,如果和图像采集有冲突怎么办?8PID的输入是速度,输出是PWM,按理说PWM产生速度,但二者不是同一个东西,有没有问题?9PID计算如何优化其速度?指针,汇编,移位?都可以试!
定义PID结构体typedefstructPID
i
tSetPoi
t设定目标DesiredValuedoubleProportio
比例常数Proportio
alCo
stdoubleI
tegral积分常数I
tegralCo
stdoubleDerivative微分常数DerivativeCo
sti
tLastErrorError1i
tPrevErrorError2PID定义相关宏
defi
eP_DATA100
fdefi
eI_DATA06defi
eD_DATA1
fdefi
eHAVE_NEW_VELOCITY0X01声明PID实体
sr