极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14500|回复: 3

制作平衡车-MPU6050实验

[复制链接]
发表于 2014-3-30 22:06:37 | 显示全部楼层 |阅读模式
本帖最后由 zaqwsx626 于 2014-3-30 22:18 编辑

今晚用了一些时间试了下6050,参考了一下黑马的程序
我的自平衡小车D2
和飞思卡尔直立车方案

上代码
  1. #include "Wire.h"
  2. #include "I2Cdev.h"
  3. #include "MPU6050.h"

  4. #define pi 3.14159
  5. #define k 40//比例

  6. MPU6050 accelgyro;


  7. int16_t ax, ay, az;
  8. int16_t gx, gy, gz;

  9. int16_t ax0, ay0, az0;
  10. int16_t gx0, gy0, gz0;

  11. unsigned long time;
  12. float angleG;

  13. void setup()
  14. {

  15.   //接入i2c总线
  16.   Wire.begin();
  17.   Serial.begin(115200);
  18.   //初始化设备
  19.   Serial.println("Initializing I2C devices...");
  20.   accelgyro.initialize();

  21.   //链接设备
  22.   Serial.println("Testing device connections...");
  23.   Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
  24.   
  25.   time=millis();
  26.   offset();//测出陀螺仪偏移量,加计?
  27.   Serial.println(millis()-time);
  28. }

  29. void offset()
  30. {
  31.   accelgyro.getMotion6(&ax0, &ay0, &az0, &gx0, &gy0, &gz0);
  32.   for(int i=0;i<1000;i++)
  33.   {
  34.     accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  35.     //ax0=(ax+ax0)/2;
  36.     //ay0=(ay+ay0)/2;
  37.     //az0=(az+az0)/2;

  38.     gx0=(gx+gx0)/2;
  39.     gy0=(gy+gy0)/2;
  40.     gz0=(gz+gz0)/2;
  41.   }
  42. }


  43. void loop()
  44. {  
  45.   accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
  46.   int dt=millis();
  47.   
  48.   //Serial.print(ax); Serial.print(",");
  49.   //Serial.print(ay); Serial.print(",");
  50.   //Serial.print(az); Serial.print(",");

  51.   //x,y,z轴角速度
  52.   //Serial.print(gx-gx0); Serial.print(",");
  53.   //Serial.print(gy-gy0); Serial.print(",");
  54.   //Serial.println(gz-gz0);
  55.   float AccX=ax;
  56.   float AccZ=az;
  57.   float angleA = atan(AccZ / AccX) * 180 / pi;//加计计算
  58.   Serial.print(angleA);Serial.print(",");
  59.   
  60.   float GyrY=gy - gy0;//减去偏移量
  61.   dt=millis()-dt;//积分时间
  62.   float Da=angleA-angleG;//加计算出的角与陀螺积分叫做差
  63.   angleG = angleG + (k*Da+GyrY/131) * dt / 1000;//陀螺积分
  64.   Serial.println(angleG);
  65. }
复制代码




angleG = angleG + (k*Da+GyrY/131) * dt / 1000; 差值Da乘比例k后参与积分

依旧有问题:
angleG = angleG + (GyrY/131) * dt / 1000; 这句是原来参考黑马程序改的,可是不知为什么得到的角度与加计得出的角度相差很多,因此想到了飞思卡尔方案中的方法,结果看来还不错。
加速度计该怎么校准,总不能重力去除吧,毕竟用他计算了角度。
SerialChart即时性好像不怎么强,波形跟不上,该怎么解决?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-4-1 01:03:01 | 显示全部楼层
嘿嘿,被楼主的图给晃了。好平滑的曲线。仔细看程序,这个滤波是读了很多次,然后用新数值和之前的求平均值?好像最后几次的数值对结果影响比较大?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-1 16:51:15 | 显示全部楼层
shihaipeng04 发表于 2014-4-1 01:03
嘿嘿,被楼主的图给晃了。好平滑的曲线。仔细看程序,这个滤波是读了很多次,然后用新数值和之前的求平均值 ...

取陀螺仪零飘时确实是多次求平均,至于滤波倒不是求平均。学生一枚,对于滤波这些东西也不太懂,请多指点。
回复 支持 反对

使用道具 举报

发表于 2014-4-2 01:56:24 | 显示全部楼层
zaqwsx626 发表于 2014-4-1 16:51
取陀螺仪零飘时确实是多次求平均,至于滤波倒不是求平均。学生一枚,对于滤波这些东西也不太懂,请多指点 ...

最近也在看各种滤波,我觉得还是学生好,学过的还没忘太多,没学的还有机会。 像我这个早就毙了业的,啥也不会了。诶
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 23:46 , Processed in 0.038838 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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