极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10246|回复: 1

自平衡小车

[复制链接]
发表于 2014-7-27 19:27:23 | 显示全部楼层 |阅读模式
最近在用arduino板子做自平衡小车,硬件什么的都搭起来了,先前小车是平面性直立的,调节好PID之后小车能平衡了,现在将小车改为立起来的,可是怎么调都调不平衡,不知道是哪里出了问题?

用的是arduino uno的板子,MPU6050传感器,1:48的电机,电池11.1v供电
问题:
1.小车前后摆动很大,摆动之后总是先前或者向后倒,怎么调节PID参数都不行,不知是怎么回事?

2.我是将6050测得的加速度转换为角度,和陀螺仪角速度进行卡尔曼滤波融合.最后输出一个角度。将这个角度作为PID的输入量,经过PID算法(增量式)之后输出一个值,我就直接将这个值作为PWM信号赋值给电机了,从而调节电机正反转,加减速,使之平衡,不知道这样可不可以?还有没有其他好的方法,目前车是不能平衡的???

3.小车分为三层,最下面一层是电机驱动,上面一层是传感器,最上面是电池,电池比较重,放上面重心就很高了,一不小心车就会失去平衡,这样可以吗?电池放在最上面能不能平衡?

4.电机不是很好,不能完全由慢变快,而是有时候会步进式的增快或者减慢,就比如说小车负重大了,电机会突然加快,而不是与PWM信号完全的吻合,需不需要换个电机呢?
5。每次改参数,下载,都很麻烦,有没有啥好的方法可以直接调节P,I,D参数的,不用修改一次下载一次再观察?

对于以上问题,大神们有什么看法???
回复

使用道具 举报

 楼主| 发表于 2014-7-27 19:30:20 | 显示全部楼层
贴上的我的一段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);
                    }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-19 02:14 , Processed in 0.034669 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表