基于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算法:

<span style="font-size:14px;">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;
 
}</span>

这里的输入参数 angle_delta是指设定的角度和测得角度差,也就是控制理论的e(t).这里设定的角度为0度,也就是静态平衡。

关于PID参数调节,请参见原文博客:

http://www.embbnux.com/2014/05/15/avr_self_balancing_car_pid/

你可能感兴趣的:(pid,控制器,avr,自平衡智能车)