Arduino输出MPU6050采集数值的相关疑问,希望大家能帮忙解答。-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8161|回复: 3

Arduino输出MPU6050采集数值的相关疑问,希望大家能帮忙解答。

[复制链接]
发表于 2019-5-15 19:25 | 显示全部楼层 |阅读模式

延时2s

延时2s

延时5ms

延时5ms
发表于 2020-3-12 14:46 | 显示全部楼层
兄弟不适你这么算的
建议①不要delay看看信号隔但是毫秒更新一次。
②你看看的的642持续的几次,我数了一下是5次,一次是5ms5次是多少,还要加上原来的信号时间。
③建议毫秒级循环采集尽量不要用delay,可以用delayMicrosecond;因为delay本身带有中断的有时会影响程序。个人建议。
 楼主| 发表于 2019-5-15 19:40 | 显示全部楼层
本帖最后由 _1379_ 于 2019-5-15 20:16 编辑

图片1延时为2s时,Arduino输出到串口监视器的数值在时间间隔上基本维持在2s左右,可以理解;但图片2延时为5ms时,Arduino输出到串口监视器的数值在时间间隔上出了问题,我就不太明白了。
我最后一列显示的是elapsedTime的数值,它的意思是上一次输出到这一次输出花费的时间,我对它的理解是elapsedTime约等于(发送时间+延时的时间‘当然还有其它程序运行的时间’),在图片2中三角形处的时间就是elapsedTime,但是在五角星处所指的两个数字(是电脑显示的当前时间点)之间跨越了0.47s,这个0.47s是怎么产生的?不是每隔一个elapsedTime输出一次数值吗?这个就是我的疑问。
 楼主| 发表于 2019-5-15 19:44 | 显示全部楼层
//这个程序是读取了MPU6050的初始数据(未标定)
//并以此计算由加速度计得到的pitch和由陀螺仪得到的pitch
#include <Wire.h>
const int MPU=0x68;//MPU6050 I2Caddress
float AccX,AccY,AccZ;
float GyroX,GyroY,GyroZ;
float Acc_pitch,Gyr_pitch;
float elapsedTime,currentTime,previousTime;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Wire.begin();
  Wire.beginTransmission(MPU);       // Start communication with MPU6050 // MPU=0x68
  Wire.write(0x6B);                  // Talk to the register 6B
  Wire.write(0x00);                  // Make reset -place a 0 into the 6B register
  Wire.endTransmission(true);        //end the transmission
}
void loop() {
  // = = = Read accleromter data = = = //
  Wire.beginTransmission(MPU);
  Wire.write(0x3B);                //Start with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true);    //Read 6 reqisters total,each axis value is stored in .....
  //For a range of +-2g,we need to divide the raw values by 16384,according to the datas.....
  AccX = (Wire.read() << 8 | Wire.read()) / 16384.0; // X-axis value
  AccY = (Wire.read() << 8 | Wire.read()) / 16384.0; // Y-axis value
  AccZ = (Wire.read() << 8 | Wire.read()) / 16384.0; // Z-axis value
  // = = = Read gyroscope data = = = //
  previousTime = currentTime;          //上一次的时间存于此处
  currentTime = millis();              //本次到达此处的新时间点
  elapsedTime = (currentTime - previousTime) / 1000;    //本次与上一次的时间差转化为以秒为单位
  Wire.beginTransmission(MPU);
  Wire.write(0x43);                 // Gyro data first register address 0x43
  Wire.endTransmission(false);
  Wire.requestFrom(MPU, 6, true);     // Read 4 registers total,each axis value is stored in.....
  GyroX = (Wire.read() << 8 | Wire.read()) / 131.0; // For a 250deg/s rang we have we have to div.....
  GyroY = (Wire.read() << 8 | Wire.read()) / 131.0;
  GyroZ = (Wire.read() << 8 | Wire.read()) / 131.0;
  // = = = 计算由加速度计得来的pitch = = = //
  Acc_pitch = atan(AccY / AccZ) * 180 / PI;
  // = = = 计算由陀螺仪得来的pitch = = = //
  Gyr_pitch = Gyr_pitch + GyroX * elapsedTime;

  // Print the values on the serial monitor
  Serial.print(Acc_pitch);
  Serial.print("\t");
  Serial.print(Gyr_pitch);
  Serial.print("\t");
  Serial.println(elapsedTime);
delay(5);
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-1 04:48 , Processed in 0.076053 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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