GSCmax 发表于 2015-5-3 19:47:08

求助 MPU6050

本帖最后由 GSCmax 于 2015-5-3 19:53 编辑

最近在研究MPU6050,检测物体姿态,纯新手,但是有问题来了。看代码


//这是完好的代码
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 accelgyro;

int16_t ax, ay, az;
int16_t gx, gy, gz;
float Ax, Ay, Az; //单位 g(9.8m/s^2)
float JiaoDu; //存储加速度计算出的角度

bool blinkState = false;

void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("Start");
accelgyro.initialize();
}

void loop() {
ZiTaiJianCe();
delay(10);
}

void ZiTaiJianCe() {
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
Ax = ax / 16384.00;
Ay = ay / 16384.00;
Az = az / 16384.00;
JiaoDu = atan(Ax / sqrt(Az * Az + Ay * Ay)) * 180 / 3.14;
Serial.println(JiaoDu);
blinkState = !blinkState;
}



/*----------------------------------------------------
SerialChart的代码


port=COM3
baudrate=9600

width=1366
height=200
background_color = black

grid_h_origin = 100
grid_h_step = 50
grid_h_color = #EEE
grid_h_origin_color = #CCC

grid_v_origin = 0
grid_v_step = 200
grid_v_color = #EEE
grid_v_origin_color = transparent


min=-1
max=1


color=gold
min=-90
max=90

----------------------------------------------------*///这是把MPU6050放在中断里的代码
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 accelgyro;

int pbIn = 1;// 定义中断引脚为1,也就是D3引脚
int16_t ax, ay, az;
int16_t gx, gy, gz;
float Ax, Ay, Az; //单位 g(9.8m/s^2)
float JiaoDu; //存储加速度计算出的角度

bool blinkState = false;

void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("Start");
accelgyro.initialize();
attachInterrupt(pbIn, ZiTaiJianCe, RISING); // 监视中断输入引脚的变化
}

void loop() {
//ZiTaiJianCe();
delay(10);
}

void ZiTaiJianCe() {
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
Ax = ax / 16384.00;
Ay = ay / 16384.00;
Az = az / 16384.00;
JiaoDu = atan(Ax / sqrt(Az * Az + Ay * Ay)) * 180 / 3.14;
Serial.println(JiaoDu);
blinkState = !blinkState;
}



/*----------------------------------------------------
SerialChart的代码


port=COM3
baudrate=9600

width=1366
height=200
background_color = black

grid_h_origin = 100
grid_h_step = 50
grid_h_color = #EEE
grid_h_origin_color = #CCC

grid_v_origin = 0
grid_v_step = 200
grid_v_color = #EEE
grid_v_origin_color = transparent


min=-1
max=1


color=gold
min=-90
max=90

----------------------------------------------------*/

两份代码都可以通过编译,但是第二个实验并不能输出MPU6050的数据,希望大神帮我看一下哪里有错

林定祥 发表于 2015-5-3 22:51:49

程序不错,关键是否有中断启动。

suoma 发表于 2015-5-4 10:04:30

      中断使能了吗?

GSCmax 发表于 2015-5-7 20:10:54

suoma 发表于 2015-5-4 10:04 static/image/common/back.gif
中断使能了吗?

放别的函数可以,就是放MPU6050的不能。。。

enots 发表于 2015-5-7 22:40:57

你的中断脚pbIn,连到哪的?用什么信号触发的?

GSCmax 发表于 2015-5-10 18:06:50

enots 发表于 2015-5-7 22:40 static/image/common/back.gif
你的中断脚pbIn,连到哪的?用什么信号触发的?

D3,触发肯定正常,高电平触发

enots 发表于 2015-5-11 22:58:36

本帖最后由 enots 于 2015-5-11 23:00 编辑

好吧, 谁告诉你的中断里面 可以做这么多事了:读取MPU值, 做浮点乘法,还要做三角函数, 还要串口打印输出.等你做完这些,黄花菜都凉咯. 尤其是那个serial.print, 它要是也靠中断工作的. 你上一个中断还没整完,它不就傻了.

现在,在某个中断里有个if语句我都很难担心它的任务太重了.

GSCmax 发表于 2015-5-12 20:33:25

enots 发表于 2015-5-11 22:58 static/image/common/back.gif
好吧, 谁告诉你的中断里面 可以做这么多事了:读取MPU值, 做浮点乘法,还要做三角函数, 还要串口打印输出.等 ...

看起来有道理,但是根据中断定义,中断函数里面应该没什么要求啊,还是不太能理解

enots 发表于 2015-5-12 23:21:10

中断里面不要做耗时操作, avr的中断默认没有嵌套,只有优先级,你在中断里做耗时操作,且不做特别的处理,那么别的中断就可能不生效了.

xiaozeng 发表于 2016-2-16 21:31:47

那里注释掉了,这个有关系吗?
页: [1]
查看完整版本: 求助 MPU6050