|
之前章节已经把PID从理论到时间基本上讲完了,剩下一个位置式PID就能收尾了。赶紧更完,就开始平衡小车下一步制作了。最近也是比较忙,更贴慢了很多。不过,这个零基础教程我还是要坚持写完的。
位置式PID部分主要代码
/********************位置式 PID 控制设计************************************/unsigned int LocPIDCalc(int NextPoint){ int iError,dError; iError = SetPoint - NextPoint; //求出当前偏差 SumError += iError; //对偏差进行积分 dError = iError - LastError; //对偏差求微分 LastError = iError; //转换赋值 //返回位置式PID计算结果 return(Proportion * iError //比例项 + Integral * SumError //积分项 + Derivative * dError); //微分项}
注释已经很详细了,看了之前我的帖子应该能看的懂代码的。推导过程不明白的在往前看看吧。
之后在中断中直接调用公式即可,计算出来的结果直接赋值给PWM(计算结果既是PWM,计算出来是0,PWM就是0)
count=(short)(TIM2 -> CNT/4); TIM2 -> CNT=0;/* 计数得到增量式PID的增量数值 */PWM_Duty=LocPIDCalc(count); //将计算的PWM送入寄存器TIM_SetCompare1(TIM3,PWM_Duty);
完事了,是不是很简单。
位置式PID调参
位置式PID和增量式PID调参还是有点区别的。下面说下具体调参过程和思路。
思路还是将ID系数设为0,先调节单独的P。
当P = 2时,如下图:
是不是有点懵逼,怎么趋近一条直线了?不应该是越来越靠近目标值吗?如果你这样想的,那真是还没理解公式呀。仔细看看公式,当ID为0,只有一个P时,是不是应该就是一条直线?下面说下为啥是直线。第一次采样:假设初始化目标值为100个脉冲,第一次采样测得脉冲为0个,此时误差为100,在乘上系数2,最终占空比为200。第二次采样:假设采样50个脉冲,误差为50,乘上系数,2,最终得占空比为100.第三次采样:假设采样脉冲为25,误差为75,乘上系数2,最终占空比为150
以此循环得出结果:误差越大,占空比越大,误差越小,占空比越小,也就是说误差越大输出越大,误差越小,输出越小。在经过N次采样后,会得到一个平衡值、平衡的条件是计算出来的占空比1所对应的编码器输出值被目标值减去之后再乘上P,得出来的占空比2和占空比相同。本例程实际测得当占空比为146,使得编码器输出28个脉冲, 目标值100-28=72,72乘上P系数2=144,144和146非常接近,也就相当于平衡了。因此只有P项时,会输出一条直线。
当P = 5时,如下图:
此时抖动比较大,不过最终还会趋近直线。这里抖动大,也说明响应速度快,对比增量式PID调节方法,增量式PID调节P时,是将系统在目标值附近抖动两三下之后迅速稳定下来为最佳,我们这里也可以这样来调节,只不过增量式是趋近于目标值,而位置式是趋近于一条直线。
这里我们选择P=3,如下图:
我们看上图抖动两三下就可以趋近于一条直线,说明这个P差不多可以了。
当P = 3时,调节I,当P = 3 ,I = 1时如下图:
你会发现曲线会越过目标值,因为加入了历史误差,在第一次未达到目标值期间,累积误差都是为正的,再加上P,使得系统超过目标值。当采样值超过目标之后,累积误差就会出现负值,将会抵消一部分前面的正值误差,因此会出现不对称的情况。之前只有P时,直线上下震动的赋值是对称的,加入累积误差之后,图中横线是目标值,在目标值上方的误差值都为正(因为都是小于目标值,误差=目标值-当前值>0),说明大多数情况都是未能达到目标值。因此系统会慢慢将这些正的误差值加起来代入到系统,会使得系统慢慢趋近于目标值,而不是像上面一样形成一条直线。
当P = 3 ,I = 2时如下图:
你会发现,斜线更抖了,因为I的作用增强了,响应更快了。
加入D,当P = 3 ,I = 2,D = -0.1时如下图:曲线变得很平顺了,没有上一张图中的抖动了,这个效果还是不错的。
加入D,当P = 3 ,I = 2,D = -2时如下图:D大了会出现回弹,说明D抑制的太过了。
因此当P = 3 ,I = 2,D = -0.1使得整体效果最佳。至此,PID完结。
|
|