之前写了一篇我之前做的基于AVR单片机自平衡智能车的文章,当时用的控制器只是简单的一个P控制。实现自平衡控制实在是很难。今天我就来说说自平衡的PID控制。不得不说PID是个好算法,加上以后自平衡车就很稳定了。
个人原创,转载请注明原文出处,并保留原文链接:
http://www.embbnux.com/2014/05/15/avr_self_balancing_car_pid/
1、 首先讲讲PID算法:
这里的PID当然指的是数字PID,因为我们是要放到AVR单片机上运行的,数字PID算法是要放到定时器中断里面,每个一定的间隔进行刷新一次,进行一次运算。我这里的定时器中断是10ms.也是采样频率,根据卡农定理采样频率至少要大于被采集频率的最高频率的两倍,才能保证不失真。
数字PID分为位置型PID和增量型PID,其实尝试了一下,位置型PID和增量型PID的效果是一样的。我这里采用的是通过增量型PID得出位置型PID的算法。
2、 PID算法:
int angle_pid[3]; int angle_P=40; int angle_I=0; int angle_D=30; int angle_pid(int angle_delta){ int anglePID,angle_add; angle_pid[2]=angle_pid[1]; angle_pid[1]=angle_pid[0]; angle_pid[0]=angle_delta; angle_add = angle_P*(angle_pid[0]-angle_pid[1]) +angle_I*angle_pid[0]+angle_D*(angle_pid[0]-2*angle_pid[1]+angle_pid[2]); anglePID= angle_pid[1]+ angle_add; return anglePID; }
这里的输入参数 angle_delta是指设定的角度和测得角度差,也就是控制理论的e(t).这里设定的角度为0度,也就是静态平衡。
3、调试PID参数:
然后就是要调PID的三个参数angle_P、angle_ D、angle_I,我用的是凑试法。主要就是试,使得平衡车,能够稳定在设定的角度,抖动小。
对于自平衡智能车,使用PD就可以满足要求了,所以只要调节PD参数就可以了。
调试的经验是:
先是D参数为0,慢慢调大P参数,车子会稳定在平衡角,但是可以感受到反抗力比较小,再增大P参数,使得反抗力变得大一点。
没有D参数,但是给车子角度一个干扰,会产生很大的抖动。
增大D参数,给小车一个干扰,如果抖动迅速变小,这就好了。
调好PID后会发现车子变得很稳定,现在我的效果是小力的踢它,能够很快的自动回复到平衡位置。