基于AVR单片机: 两轮自平衡智能车(2)-PID控制器

之前写了一篇我之前做的基于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后会发现车子变得很稳定,现在我的效果是小力的踢它,能够很快的自动回复到平衡位置。

自平衡智能车_EMBBNUX

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Time limit is exhausted. Please reload the CAPTCHA.

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据