极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 31055|回复: 16

求助:用MPU6050,L298N控制的平衡小车,运行1分钟就死机,(含详细代码注释!已上...

[复制链接]
发表于 2012-7-31 16:13:27 | 显示全部楼层 |阅读模式
已上传视频:
  1. #include "Wire.h"
  2. #include "i2cdev.h"
  3. #include "MPU6050.h"

  4. MPU6050 accelgyro;
  5. int16_t ax, ay, az;
  6. int16_t gx, gy, gz;

  7. #define Gry_offset 296//陀螺仪X轴的静态飘移。
  8. #define Gyr_Gain -0.00763//由陀螺仪X轴读数转换为角速度值,=1/131,向前方向与X轴为反方向,故乘以-1

  9. #define ACC_Gain 0.000061//由读数转换为加速度值,=1/16384
  10. #define pi 3.1415926
  11. #define K 0.715//一阶互补滤波权重取值,不知由来,可更改。

  12. unsigned long preTime = 0;
  13. float angleG = 0;

  14. void setup()
  15. {
  16.   Wire.begin();
  17.   Serial.begin(38400);
  18.   accelgyro.initialize();//MPU6050初始化。
  19.   for (int i=3; i<=9; i++)//将3,4,5,6,7,8,9定义为输出口
  20.   {
  21.     pinMode(i, OUTPUT);
  22.   }
  23.   delay(500);
  24. }

  25. void loop()
  26. {
  27.   
  28.   unsigned long now = millis();//当前时间(ms)
  29.   float dt = (now - preTime) / 1000.0;//微分时间(s)
  30.   preTime = now;//上一次采样时间(ms)

  31.   
  32.   accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);//读取六轴数值
  33.   
  34.   float Y_Accelerometer = ay * ACC_Gain;//转换为向前的加速度(g),为负值
  35.   float Z_Accelerometer = az * ACC_Gain;//转换为向下的加速度(g)
  36.   float angleA= atan(Y_Accelerometer/ Z_Accelerometer)* (-180)/ pi;//加速度仪,反正切获得弧度值,乘以180度/pi
  37.                                                                    //获得角度值,乘以-1得正值
  38.                                                                   
  39.   float gx_revised = gx + Gry_offset;//陀螺仪x轴静态时修正后的角速度读数,向前为负值
  40.   float omega= Gyr_Gain* gx_revised;//陀螺仪,转换为向前的角速度(o/s),Gyr_Gain取负,故负负得正
  41.   float angle_dt = omega * dt;//角度的单次积分值
  42.   //angleG+= angle_dt;//陀螺仪,积分获得角度值
  43.   
  44.   angleG+= (Gyr_Gain * (gx + Gry_offset)) * dt;


  45.   float A= K/ (K+ dt);//陀螺仪的权值
  46.   angleG= A* (angleG+ omega* dt)+ (1-A)* angleA;//一阶互补滤波后的输出角度(o)
  47.   delay(10);
  48.   

  49.   //********************************************************************/
  50.   /****以下为PWM输出代码****/
  51.   //********************************************************************
  52.   
  53.   if (angleG > 0)
  54.   {
  55.     digitalWrite(3, LOW);
  56.     digitalWrite(4, HIGH);
  57.     digitalWrite(8,LOW);
  58.     digitalWrite(7, HIGH);
  59.   }
  60.   if (angleG < 0)
  61.   {
  62.     digitalWrite(3, HIGH);
  63.     digitalWrite(4, LOW);
  64.     digitalWrite(8,HIGH);
  65.     digitalWrite(7, LOW);
  66.   }
  67.     int output = min(200,abs(40*angleG));//此函数输出较小值,将PWM最大值限定在200,下面起步补偿55
  68.     analogWrite(5, output+55);//左右轮都补偿起步PWM值30,左右轮电机不一致,5针ENA右轮多补偿25
  69.     analogWrite(9, output+30);//output的值在100左右时,香蕉电机才起动,汗!。
  70.     delay(10);
  71.     Serial.print("output = ");
  72.     Serial.println(output);
  73.     }
复制代码
现在问题是:
1、角度输出还比较可以,但有滞后情况;
2、小车运行1分钟左右,无论是静态还是动态都死机,最后一刻电机的速度是多少,就保持在多少速度;
就是平衡着突然卡蹦一下,就倒了!
3、是不是L298N驱动的问题?

各位达人帮帮出出主意,不胜感激!!!

我怀疑是不是硬件L298N板子的问题?请各位支招!!!谢!








库文件:
回复

使用道具 举报

发表于 2012-8-1 21:20:51 | 显示全部楼层
L298N带隔离的不。。。。不带隔离就比较纠结。还有。。禁用中断试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-2 16:14:57 | 显示全部楼层
弘毅 发表于 2012-8-1 21:20
L298N带隔离的不。。。。不带隔离就比较纠结。还有。。禁用中断试试

你好,是带隔离的,禁用中断是什么意思?能麻烦告诉我代码么?谢!!!
回复 支持 反对

使用道具 举报

发表于 2012-8-2 16:16:06 | 显示全部楼层
在串口调试中,有时发现数值过大时,min限际会失效, 所以有可能会溢出?  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-2 16:42:11 | 显示全部楼层
pww999 发表于 2012-8-2 16:16
在串口调试中,有时发现数值过大时,min限际会失效, 所以有可能会溢出?

我把Min()函数取消了,开机只要电机转动就卡机,电机不转动或我强制使电机堵转,都正常。。。
到底是L298N的问题,还是香蕉电机的问题呢???
回复 支持 反对

使用道具 举报

发表于 2012-8-9 16:06:20 | 显示全部楼层
有没有监测运行中数据呢?
我的6050有时候会读书为“0”。复位或者重新连接电源以后又恢复正常。
回复 支持 反对

使用道具 举报

发表于 2012-10-1 21:36:48 | 显示全部楼层
mcu的供电必须与l298的供电独立分开,不然很容易使mcu死机
回复 支持 反对

使用道具 举报

发表于 2012-10-14 19:57:18 | 显示全部楼层
float Y_Accelerometer = ay * ACC_Gain;//转换为向前的加速度(g),为负值

float Z_Accelerometer = az * ACC_Gain;//转换为向下的加速度(g)

float angleA= atan(Y_Accelerometer/ Z_Accelerometer)* (-180)/ pi;//加速度仪,反正切获得弧度值,乘以180度/pi

                                                                  //获得角度值,乘以-1得正值
楼主这个算法我没看明白,ACC_Gain在里面是做什么用的?按照数学公式来说的话
float angleA= atan(ay/az)* (-180)/ pi;//
应该可以可以吧
回复 支持 反对

使用道具 举报

发表于 2013-2-4 13:09:56 | 显示全部楼层
先mark一下吧,等配件全了再说
回复 支持 反对

使用道具 举报

发表于 2013-3-19 17:40:19 | 显示全部楼层
float dt = (now - preTime) / 1000.0;//微分时间(s)   这句出问题了。。。
跟硬件没关系。

回复 支持 反对

使用道具 举报

发表于 2013-7-9 15:52:52 | 显示全部楼层
crestgod 发表于 2013-3-19 17:40
float dt = (now - preTime) / 1000.0;//微分时间(s)   这句出问题了。。。
跟硬件没关系。

請問這段話有什麼問題?
還有要怎修改程式呢?
回复 支持 反对

使用道具 举报

发表于 2014-2-15 21:34:19 | 显示全部楼层
crestgod 发表于 2013-3-19 17:40
float dt = (now - preTime) / 1000.0;//微分时间(s)   这句出问题了。。。
跟硬件没关系。

应该是怎样表达的~?
回复 支持 反对

使用道具 举报

发表于 2014-2-16 20:23:17 | 显示全部楼层
陀螺仪X轴的静态飘移是怎么得到的?
回复 支持 反对

使用道具 举报

发表于 2014-2-21 12:21:33 | 显示全部楼层
陀螺仪X轴的静态飘移是怎么得到的?
回复 支持 反对

使用道具 举报

发表于 2014-5-16 11:40:42 | 显示全部楼层
crestgod 发表于 2013-3-19 17:40
float dt = (now - preTime) / 1000.0;//微分时间(s)   这句出问题了。。。
跟硬件没关系。

计算机角速度和角度?
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-7 14:21 , Processed in 0.052607 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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