本帖最后由 xyxdwh 于 2012-12-27 00:40 编辑
请朋友们看看我刚买的九轴传感器里的加速度传感器Z轴是不是硬件坏了? zAcc的值一直是511
下面是测试代码
#include <Wire.h> // IIC运行库
int ADXAddress = 0xa7 >> 1; // ADXL345的I2C地址
int L3GAddress = 0x69; // L3G4200D的I2C地址
int HMCAddress = 0x1E; // HMC5883L的I2C地址
byte vL, vH; // 存放低位、高位值
int xAcc, yAcc, zAcc; // 存放加速度值
int xGyro, yGyro, zGyro; // 存放角速度值
int xMag, yMag, zMag; // 存放地磁场值
void setup()
{
Serial.begin(38400); // 定义串口
Wire.begin();
delay(100);
Serial.println("starting up....");
writeRegister(ADXAddress, 0x2D, 0b00001000); // 测量模式
// 配置ADXL345
writeRegister(L3GAddress, 0x20, 0b00001111); // 设置睡眠模式、x, y, z轴使能
writeRegister(L3GAddress, 0x21, 0b00000000); // 选择高通滤波模式和高通截止频率
writeRegister(L3GAddress, 0x22, 0b00000000); // 设置中断模式
writeRegister(L3GAddress, 0x23, 0b00110000); // 设置量程(2000dps)、自检状态、SPI模式
writeRegister(L3GAddress, 0x24, 0b00000000); // FIFO & 高通滤波
// 配置L3G4200D(2000 deg/sec)
writeRegister(HMCAddress, 0x02, 0x00); // 连续测量
// 配置HMC5883L
delay(2000);
}
void loop() {
getAccValues();
Serial.print("xAcc=");
Serial.print(xAcc);
Serial.print(" yAcc=");
Serial.print(yAcc);
Serial.print(" zAcc=");
Serial.println(zAcc);
delay(100);
getGyroValues();
Serial.print("xGyro=");
Serial.print(xGyro);
Serial.print(" yGyro=");
Serial.print(yGyro);
Serial.print(" zGyro=");
Serial.println(zGyro);
delay(100);
getMagValues();
Serial.print("xMag=");
Serial.print(xMag);
Serial.print(" yMag=");
Serial.print(yMag);
Serial.print(" zMag=");
Serial.println(zMag);
Serial.println();
delay(1000);
}
void getAccValues() { // 加速度值读取
vL = readRegister(ADXAddress, 0x32);
vH = readRegister(ADXAddress, 0x33);
xAcc = (vH << 8) | vL;
vL = readRegister(ADXAddress, 0x34);
vH = readRegister(ADXAddress, 0x35);
yAcc = (vH << 8) | vL;
vL = readRegister(ADXAddress, 0x36);
vH = readRegister(ADXAddress, 0x37);
zAcc = (vH << 8) | vL;
}
void getGyroValues() { // 角速度值读取
vL = readRegister(L3GAddress, 0x28);
vH = readRegister(L3GAddress, 0x29);
xGyro = (vH << 8) | vL;
vL = readRegister(L3GAddress, 0x2A);
vH = readRegister(L3GAddress, 0x2B);
yGyro = (vH << 8) | vL;
vL = readRegister(L3GAddress, 0x2C);
vH = readRegister(L3GAddress, 0x2D);
zGyro = (vH << 8) | vL;
}
void getMagValues() { // 磁场值读取
vH = readRegister(HMCAddress, 0x03);
vL = readRegister(HMCAddress, 0x04);
xMag = (vH << 8) | vL;
vH = readRegister(HMCAddress, 0x05);
vL = readRegister(HMCAddress, 0x06);
yMag = (vH << 8) | vL;
vH = readRegister(HMCAddress, 0x07);
vL = readRegister(HMCAddress, 0x08);
zMag = (vH << 8) | vL;
}
int readRegister(int deviceAddress, byte address) {
// 读寄存器
int v;
Wire.beginTransmission(deviceAddress);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(deviceAddress, 1);
while(!Wire.available()) {}
v = Wire.read();
return v;
}
void writeRegister(int deviceAddress, byte address, byte val) {
// 写寄存器
Wire.beginTransmission(deviceAddress);
Wire.write(address);
Wire.write(val);
Wire.endTransmission();
}
|