ladywent 发表于 2012-7-31 16:13:27

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

已上传视频:
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-8-1 21:20:51

L298N带隔离的不。。。。不带隔离就比较纠结。还有。。禁用中断试试

ladywent 发表于 2012-8-2 16:14:57

弘毅 发表于 2012-8-1 21:20 static/image/common/back.gif
L298N带隔离的不。。。。不带隔离就比较纠结。还有。。禁用中断试试

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

pww999 发表于 2012-8-2 16:16:06

在串口调试中,有时发现数值过大时,min限际会失效, 所以有可能会溢出?

ladywent 发表于 2012-8-2 16:42:11

pww999 发表于 2012-8-2 16:16 static/image/common/back.gif
在串口调试中,有时发现数值过大时,min限际会失效, 所以有可能会溢出?

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

BlackCat 发表于 2012-8-9 16:06:20

有没有监测运行中数据呢?
我的6050有时候会读书为“0”。复位或者重新连接电源以后又恢复正常。

cai_mouse 发表于 2012-10-1 21:36:48

mcu的供电必须与l298的供电独立分开,不然很容易使mcu死机

zhangdeyue1 发表于 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;//
应该可以可以吧:o

葱拌豆腐 发表于 2013-2-4 13:09:56

先mark一下吧,等配件全了再说

crestgod 发表于 2013-3-19 17:40:19

float dt = (now - preTime) / 1000.0;//微分时间(s)   这句出问题了。。。
跟硬件没关系。

comet1989 发表于 2013-7-9 15:52:52

crestgod 发表于 2013-3-19 17:40 static/image/common/back.gif
float dt = (now - preTime) / 1000.0;//微分时间(s)   这句出问题了。。。
跟硬件没关系。

請問這段話有什麼問題?
還有要怎修改程式呢?

☆与☆ 发表于 2014-2-15 21:34:19

crestgod 发表于 2013-3-19 17:40 static/image/common/back.gif
float dt = (now - preTime) / 1000.0;//微分时间(s)   这句出问题了。。。
跟硬件没关系。

应该是怎样表达的~?

☆与☆ 发表于 2014-2-16 20:23:17

陀螺仪X轴的静态飘移是怎么得到的?

yaoze权 发表于 2014-2-21 12:21:33

陀螺仪X轴的静态飘移是怎么得到的?

马良 发表于 2014-5-16 11:40:42

crestgod 发表于 2013-3-19 17:40 static/image/common/back.gif
float dt = (now - preTime) / 1000.0;//微分时间(s)   这句出问题了。。。
跟硬件没关系。

计算机角速度和角度?
页: [1] 2
查看完整版本: 求助:用MPU6050,L298N控制的平衡小车,运行1分钟就死机,(含详细代码注释!已上...