极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 65700|回复: 44

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

[复制链接]
发表于 2012-7-31 14:12:35 | 显示全部楼层 |阅读模式
2012-08-03:现在我用一个JoyStick控制L298N,用MPU6050单独采集角度,电机不转动,一切正常;只要电机一转动,立即卡机!  而后,我把接MPU6050的时钟信号线SCL拔除,一切正常。确定是L298N和MPU6050犯冲。但是我看到一个视频,用的也是L298N、香蕉电机和传感器,很正常啊,是不是因为I2C接口的抗干扰能力太差?
请问有什么好些的电机驱动么?谢!



2012-08-02:今天和达人沟通,故障缩小如下:
用UNO带L298N(带光耦),电机不转动,一切正常;我强制电机堵转,也一切正常;当电机一转动或加速时,就卡机。
我用的是香蕉电机!!!此电机当PWM达到100以上时才起动,我严重怀疑是当电机启动瞬间,骤降或骤升的电流引起的反向脉冲使得Arduino卡机,问题是已经加了光耦了啊。那请问各位怎样才能解决此问题?谢!!!

现在总结应该是电机转动产生的干扰,电机输出OUT1 & OUT2间已经接了电容了,请问怎样可以消除因电机转动产生的干扰?



2012-08-01:今天新增测试如下:
Arduino板单独供电,L298N单独供电,运行5秒后,当机!串口显示卡住不动,电机转速保持在最后一刻的速度;

最后总结:加上以下代码时,才出现的问题,请问各位,以下代码该怎么写?根据角度的正负来控制电机的正反转!
  1. if (angleG >= 0)
  2.   {
  3.     digitalWrite(3, LOW);
  4.     digitalWrite(4, HIGH);
  5.     digitalWrite(8,LOW);
  6.     digitalWrite(7, HIGH);
  7.   }
  8.   if (angleG < 0)
  9.   {
  10.     digitalWrite(3, HIGH);
  11.     digitalWrite(4, LOW);
  12.     digitalWrite(8,HIGH);
  13.     digitalWrite(7, LOW);
  14.   }
复制代码
已上传视频:
  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板子的问题?请各位支招!!!谢!








库文件:

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2012-7-31 14:40:08 | 显示全部楼层
楼主把你的库文件一起传上来。
回复 支持 反对

使用道具 举报

发表于 2012-7-31 15:42:12 | 显示全部楼层
本帖最后由 pww999 于 2012-7-31 15:51 编辑

3V???? 上6V吧?加只大电解?

最将 dt 那       /2000   ??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 15:51:33 | 显示全部楼层
还可以 发表于 2012-7-31 14:40
楼主把你的库文件一起传上来。

库文件已经上传啦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 15:51:59 | 显示全部楼层
pww999 发表于 2012-7-31 15:42
3V???? 上6V吧?加只大电解?

最将 dt 那       /2000   ??

。。。我那是两节18650锂电,电压能达到7.8V
回复 支持 反对

使用道具 举报

发表于 2012-7-31 16:27:17 | 显示全部楼层
插上usb线用电脑调试
返回角度、电机速度等等参数,再逐个排除问题
回复 支持 反对

使用道具 举报

发表于 2012-7-31 16:32:56 | 显示全部楼层
其待视频 {:soso_e194:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 16:50:51 | 显示全部楼层
本帖最后由 ladywent 于 2012-7-31 16:54 编辑
pww999 发表于 2012-7-31 16:32
其待视频


已上视频,
你好,我有些就是参考你的程序,谢啦,有空加我QQ交流
QQ: 357797325
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 16:53:19 | 显示全部楼层
Malc 发表于 2012-7-31 16:27
插上usb线用电脑调试
返回角度、电机速度等等参数,再逐个排除问题


我插上USB调试时,出现以下结果:
一分钟死亡后,串口调试窗口卡住,接收不到数据了,全部卡住了!!!
请问各位有没有遇到这种情况?
是不是死机了?
什么原因?是不是哪里缺少delay()?
还是L298N的切换频率有限制?
回复 支持 反对

使用道具 举报

发表于 2012-7-31 16:54:18 | 显示全部楼层
本帖最后由 pww999 于 2012-7-31 17:08 编辑

将56行 0.01秒去掉 ?
那不插USB  会卡吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 17:07:32 | 显示全部楼层
pww999 发表于 2012-7-31 16:54
那不插USB  会卡吗?

我刚试了,插电源后,复位后,稍微动下就不动了,但能听到L298N的嗡嗡声。
回复 支持 反对

使用道具 举报

发表于 2012-7-31 17:13:49 | 显示全部楼层
本帖最后由 pww999 于 2012-7-31 21:04 编辑




之前也试  过马 的程序,也是摆动幅度较大,最后倒下,没有你卡倒的问题

你的少了这几句的?是不是简化了?

if(TimeCh >= SampleTime) {   
....

.....                          
       lastInput = Input;                                   
lastTime = now;      
回复 支持 反对

使用道具 举报

发表于 2012-7-31 20:23:48 | 显示全部楼层
ladywent 发表于 2012-7-31 16:53
我插上USB调试时,出现以下结果:
一分钟死亡后,串口调试窗口卡住,接收不到数据了,全部卡住了!!! ...

你用的什么电池供电?
看着像两节1.5v电池。。。又像锂电池
298工作电压貌似要9v左右
你再调试一次,吧arduino和298断开,看看有木有问题
如果还有那可能就是电池、298,这两个地方出问题了
回复 支持 反对

使用道具 举报

发表于 2012-8-1 09:56:50 | 显示全部楼层
L298供电和Arduino需要分开供电,不用一起供电,这样产生的影响很严重!什么什么纹波什么什么不稳定的因素都出来了!
回复 支持 反对

使用道具 举报

发表于 2012-8-1 21:01:32 | 显示全部楼层
arduino与L298N的连接使用光耦隔离  一般都会产生反冲的脉冲什么的  单片机理所当然的会死机 不过如果准时的在一分钟的话那就另当别论  你确定是一分钟?  那么或许是什么溢出?
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-4-28 19:06 , Processed in 0.042972 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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