自平衡小车
最近在用arduino板子做自平衡小车,硬件什么的都搭起来了,先前小车是平面性直立的,调节好PID之后小车能平衡了,现在将小车改为立起来的,可是怎么调都调不平衡,不知道是哪里出了问题?用的是arduino uno的板子,MPU6050传感器,1:48的电机,电池11.1v供电
问题:
1.小车前后摆动很大,摆动之后总是先前或者向后倒,怎么调节PID参数都不行,不知是怎么回事?
2.我是将6050测得的加速度转换为角度,和陀螺仪角速度进行卡尔曼滤波融合.最后输出一个角度。将这个角度作为PID的输入量,经过PID算法(增量式)之后输出一个值,我就直接将这个值作为PWM信号赋值给电机了,从而调节电机正反转,加减速,使之平衡,不知道这样可不可以?还有没有其他好的方法,目前车是不能平衡的???
3.小车分为三层,最下面一层是电机驱动,上面一层是传感器,最上面是电池,电池比较重,放上面重心就很高了,一不小心车就会失去平衡,这样可以吗?电池放在最上面能不能平衡?
4.电机不是很好,不能完全由慢变快,而是有时候会步进式的增快或者减慢,就比如说小车负重大了,电机会突然加快,而不是与PWM信号完全的吻合,需不需要换个电机呢?
5。每次改参数,下载,都很麻烦,有没有啥好的方法可以直接调节P,I,D参数的,不用修改一次下载一次再观察?
对于以上问题,大神们有什么看法??? 贴上的我的一段PID算法,我相信没有注释大家也都看得懂,参考下吧。
float setpoint=180;//180°平衡
float pid()
{
float kp=8,ki=0.01,kd=0.5;
float error,lasterror,preverror,out; //增量式PID
error = setpoint-kalAngleX; // 偏差值`
out=kp * error +ki *lasterror+ kp * preverror; // 计算输出值
Output=5*out; //PWM太小电机不会转,所以*5
Output=constrain(Output,-200,200);// 限定值域
preverror=lasterror;//存储误差,用于下次计算
lasterror=error;
return abs(Output);
}
void loop() {
if(kalAngleX>(setpoint+2)){//加2的原因是我想让小车在设定值左右2°内平衡
analogWrite(M1,pid()+3);
analogWrite(M2,LOW);
analogWrite(M3,pid());
analogWrite(M4,LOW);
}
else if(kalAngleX<(setpoint-2)){
analogWrite(M2,pid()+3);
analogWrite(M1,LOW);
analogWrite(M4,pid());
analogWrite(M3,LOW);}
else if((setpoint-2)<=kalAngleX<=(setpoint+2)){
analogWrite(M1,LOW);
analogWrite(M2,LOW);
analogWrite(M3,LOW);
analogWrite(M4,LOW);
}
页:
[1]