ladywent 发表于 2012-7-31 14:12:35

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

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秒后,当机!串口显示卡住不动,电机转速保持在最后一刻的速度;

最后总结:加上以下代码时,才出现的问题,请问各位,以下代码该怎么写?根据角度的正负来控制电机的正反转! if (angleG >= 0)
{
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(8,LOW);
    digitalWrite(7, HIGH);
}
if (angleG < 0)
{
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(8,HIGH);
    digitalWrite(7, LOW);
}已上传视频:
http://v.youku.com/v_show/id_XNDMzOTMzMTM2.html#include "Wire.h"
#include "i2cdev.h"
#include "MPU6050.h"

MPU6050 accelgyro;
int16_t ax, ay, az;
int16_t gx, gy, gz;

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

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

unsigned long preTime = 0;
float angleG = 0;

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

void loop()
{

unsigned long now = millis();//当前时间(ms)
float dt = (now - preTime) / 1000.0;//微分时间(s)
preTime = now;//上一次采样时间(ms)


accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);//读取六轴数值

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得正值
                                                                  
float gx_revised = gx + Gry_offset;//陀螺仪x轴静态时修正后的角速度读数,向前为负值
float omega= Gyr_Gain* gx_revised;//陀螺仪,转换为向前的角速度(o/s),Gyr_Gain取负,故负负得正
float angle_dt = omega * dt;//角度的单次积分值
//angleG+= angle_dt;//陀螺仪,积分获得角度值

angleG+= (Gyr_Gain * (gx + Gry_offset)) * dt;


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


//********************************************************************/
/****以下为PWM输出代码****/
//********************************************************************

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

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

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







库文件:

还可以 发表于 2012-7-31 14:40:08

楼主把你的库文件一起传上来。

pww999 发表于 2012-7-31 15:42:12

本帖最后由 pww999 于 2012-7-31 15:51 编辑

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

最将 dt 那       /2000   ??

ladywent 发表于 2012-7-31 15:51:33

还可以 发表于 2012-7-31 14:40 static/image/common/back.gif
楼主把你的库文件一起传上来。

库文件已经上传啦

ladywent 发表于 2012-7-31 15:51:59

pww999 发表于 2012-7-31 15:42 static/image/common/back.gif
3V???? 上6V吧?加只大电解?

最将 dt 那       /2000   ??

。。。我那是两节18650锂电,电压能达到7.8V

Malc 发表于 2012-7-31 16:27:17

插上usb线用电脑调试
返回角度、电机速度等等参数,再逐个排除问题

pww999 发表于 2012-7-31 16:32:56

其待视频 {:soso_e194:}

ladywent 发表于 2012-7-31 16:50:51

本帖最后由 ladywent 于 2012-7-31 16:54 编辑

pww999 发表于 2012-7-31 16:32 static/image/common/back.gif
其待视频

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

ladywent 发表于 2012-7-31 16:53:19

Malc 发表于 2012-7-31 16:27 static/image/common/back.gif
插上usb线用电脑调试
返回角度、电机速度等等参数,再逐个排除问题

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

pww999 发表于 2012-7-31 16:54:18

本帖最后由 pww999 于 2012-7-31 17:08 编辑

将56行 0.01秒去掉 ?
那不插USB会卡吗?

ladywent 发表于 2012-7-31 17:07:32

pww999 发表于 2012-7-31 16:54 static/image/common/back.gif
那不插USB会卡吗?

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

pww999 发表于 2012-7-31 17:13:49

本帖最后由 pww999 于 2012-7-31 21:04 编辑




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

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

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

.....                        
       lastInput = Input;                                 
lastTime = now;      

Malc 发表于 2012-7-31 20:23:48

ladywent 发表于 2012-7-31 16:53 static/image/common/back.gif
我插上USB调试时,出现以下结果:
一分钟死亡后,串口调试窗口卡住,接收不到数据了,全部卡住了!!! ...

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

Randy 发表于 2012-8-1 09:56:50

L298供电和Arduino需要分开供电,不用一起供电,这样产生的影响很严重!什么什么纹波什么什么不稳定的因素都出来了!

L.anrist 发表于 2012-8-1 21:01:32

arduino与L298N的连接使用光耦隔离一般都会产生反冲的脉冲什么的单片机理所当然的会死机 不过如果准时的在一分钟的话那就另当别论你确定是一分钟?那么或许是什么溢出?
页: [1] 2 3
查看完整版本: 求助:用MPU6050,L298N控制的平衡小车,运行1分钟就死机,(含详细代码注释!已上...