|
用同样的程序读取mpu6050的数据,结果due和uno的读数不一样,due的读数是错的,程序如下,哪位大佬帮忙解答一下
- #include "Wire.h"
- #include "I2Cdev.h"
- long accelX; // 定义为全局变量,可直接在函数内部使用
- float gForceX;
- long gyroZ;
- float rotZ;
- int angle;
- void setup()
- {
- Serial.begin(9600);
- Wire.begin();
- setupMPU();
- }
- void loop() {
- recordAccelRegisters();
- recordGyroRegisters();
- angle=180/3.14*acos(gForceX);
- Serial.print(rotZ+1.2);Serial.print(", ");
- Serial.print(angle);Serial.println(", ");
- delay(100);
- }
- void setupMPU(){
- // REGISTER 0x6B/REGISTER 107:Power Management 1
- Wire.beginTransmission(0b1101000); //This is the I2C address of the MPU (b1101000/b1101001 for AC0 low/high datasheet Sec. 9.2)
- Wire.write(0x6B); //Accessing the register 6B/107 - Power Management (Sec. 4.30)
- Wire.write(0b00000000); //Setting SLEEP register to 0, using the internal 8 Mhz oscillator
- Wire.endTransmission();
-
- // REGISTER 0x1b/REGISTER 27:Gyroscope Configuration
- Wire.beginTransmission(0b1101000); //I2C address of the MPU
- Wire.write(0x1B); //Accessing the register 1B - Gyroscope Configuration (Sec. 4.4)
- Wire.write(0x00000000); //Setting the gyro to full scale +/- 250deg./s (转化为rpm:250/360 * 60 = 41.67rpm) 最高可以转化为2000deg./s
- Wire.endTransmission();
-
- // REGISTER 0x1C/REGISTER 28:ACCELEROMETER CONFIGURATION
- Wire.beginTransmission(0b1101000); //I2C address of the MPU
- Wire.write(0x1C); //Accessing the register 1C - Acccelerometer Configuration (Sec. 4.5)
- Wire.write(0b00000000); //Setting the accel to +/- 2g(if choose +/- 16g,the value would be 0b00011000)
- Wire.endTransmission();
- }
-
- void recordAccelRegisters() {
- // REGISTER 0x3B~0x40/REGISTER 59~64
- Wire.beginTransmission(0b1101000); //I2C address of the MPU
- Wire.write(0x3B); //Starting register for Accel Readings
- Wire.endTransmission();
- Wire.requestFrom(0b1101000,2); //Request Accel Registers (3B - 40)
- // 使用了左移<<和位运算|。Wire.read()一次读取1bytes,并在下一次调用时自动读取下一个地址的数据
- while(Wire.available() < 2); // Waiting for all the 6 bytes data to be sent from the slave machine (必须等待所有数据存储到缓冲区后才能读取)
- accelX = Wire.read()<<8|Wire.read(); //Store first two bytes into accelX (自动存储为定义的long型值)
- processAccelData();
- }
-
- void processAccelData(){
- gForceX = accelX / 16384.0; //float = long / float
- }
-
- void recordGyroRegisters() {
- // REGISTER 0x43~0x48/REGISTER 67~72
- Wire.beginTransmission(0b1101000); //I2C address of the MPU
- Wire.write(0x47); //Starting register for Gyro Readings
- Wire.endTransmission();
- Wire.requestFrom(0b1101000,2); //Request Gyro Registers (43 ~ 48)
- while(Wire.available() < 2);
- gyroZ = Wire.read()<<8|Wire.read(); //Store last two bytes into accelZ
- processGyroData();
- }
-
- void processGyroData() {
- rotZ = gyroZ / 131.0;
- }
复制代码
|
|