我想从 LSM6DSO32 捕捉器中读取一些寄存器。但我有一个问题,我得到的价值观很奇怪。我使用 Atmel SAMD21 Cortex M0 和 i2C 与捕获者通信。首先,我将我的捕获器设置为 8g 和 500°,以便像这样的陀螺仪
#define DSO_ADDRESS 0x6A
void setup() {
SerialUSB.begin(115200);
while(!SerialUSB);
Wire.begin();
//gyro 500°
Wire.beginTransmission(DSO_ADDRESS);
Wire.write(0x11);
Wire.write(0x44);
Wire.endTransmission();
//accel 8g
Wire.beginTransmission(DSO_ADDRESS);
Wire.write(0x10);
Wire.write(0x48);
Wire.endTransmission();
}
对我来说,这是有效的,因为如果我在获得 0x48 值后读取 0x10,并且如果我尝试读取我注册的人,我会得到好的值 0x6C。
之后我尝试读取寄存器值,我的 readSensor 函数
//gloabl variables to store values
int temperature;
int gyro_raw[3] = {0, 0, 0};
int acc_raw[3] = {0 , 0 , 0};
void readSensor(){
Wire.beginTransmission(DSO_ADDRESS);
Wire.write(0x20);
Wire.endTransmission();
Wire.requestFrom(DSO_ADDRESS, 14);
uint8_t buff[14];
Wire.readBytes(buff, 14);
temperature = buff[1] << 8 | buff[0];
gyro_raw[X] = buff[3] << 8 | buff[2];
gyro_raw[Y] = buff[5] << 8 | buff[4];
gyro_raw[Z] = buff[7] << 8 | buff[6];
acc_raw[X] = buff[9] << 8 | buff[8];
acc_raw[Y] = buff[11] << 8 | buff[10];
acc_raw[Z] = buff[13] << 8 | buff[12];
}
因此,如果我调用这个函数 2000 次以获取偏移量,我会得到非常奇怪的值
long gyro_offset[3] = {0, 0, 0};
int max_samples = 500;
for (int i = 0; i < max_samples; i++) {
readSensor();
gyro_offset[X] += gyro_raw[X];
gyro_offset[Y] += gyro_raw[Y];
gyro_offset[Z] += gyro_raw[Z];
delay(50);
}
gyro_offset[X] /= max_samples;
gyro_offset[Y] /= max_samples;
gyro_offset[Z] /= max_samples;
X
Y
并且Z
由值 0,1 和 2 定义。所以如果我打印gyro_offset[X]
我得到值 23,这对我来说是正常的,但是因为gyro_offset[Y]
我gyro_offset[Z]
在 65514 附近得到了一个很大的值,对我来说这些不是很好,不是吗?