求助 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的数据,希望大神帮我看一下哪里有错 程序不错,关键是否有中断启动。 中断使能了吗? suoma 发表于 2015-5-4 10:04 static/image/common/back.gif
中断使能了吗?
放别的函数可以,就是放MPU6050的不能。。。 你的中断脚pbIn,连到哪的?用什么信号触发的? enots 发表于 2015-5-7 22:40 static/image/common/back.gif
你的中断脚pbIn,连到哪的?用什么信号触发的?
D3,触发肯定正常,高电平触发 本帖最后由 enots 于 2015-5-11 23:00 编辑
好吧, 谁告诉你的中断里面 可以做这么多事了:读取MPU值, 做浮点乘法,还要做三角函数, 还要串口打印输出.等你做完这些,黄花菜都凉咯. 尤其是那个serial.print, 它要是也靠中断工作的. 你上一个中断还没整完,它不就傻了.
现在,在某个中断里有个if语句我都很难担心它的任务太重了.
enots 发表于 2015-5-11 22:58 static/image/common/back.gif
好吧, 谁告诉你的中断里面 可以做这么多事了:读取MPU值, 做浮点乘法,还要做三角函数, 还要串口打印输出.等 ...
看起来有道理,但是根据中断定义,中断函数里面应该没什么要求啊,还是不太能理解 中断里面不要做耗时操作, avr的中断默认没有嵌套,只有优先级,你在中断里做耗时操作,且不做特别的处理,那么别的中断就可能不生效了.
那里注释掉了,这个有关系吗?
页:
[1]