从 LSM6DSO32 读取温度
Reading temperature from LSM6DSO32
我想知道在这个 captor LSM6DSO32 上读取温度的最佳方法是什么,这里是寄存器
我正在使用 Atmel SAMD21 Cortex M0 开发 Arduino。在这里,这就是我要做的
//reading register
Wire.beginTransmission(DSO_ADDRESS);
Wire.write(0x20);
Wire.endTransmission();
Wire.requestFrom(DSO_ADDRESS, 14);
//get bytes, 14 beceause (temp,gyro,accel)
uint8_t buff[14];
Wire.readBytes(buff, 14);
int16_t raw_t = buff[1] << 8 | buff[0];
float temperature = (raw_t / 256.0) + 25.0;
我的问题是,你认为这种方法可以得到负的原始值吗?例如,如果温度为 22°,则原始值应为 -700 平均值。在分配 raw_t
之前,我是否需要转换或转换来自俘虏的东西?
My question is, do you think this method is fine to get negative raw value ?
下面的代码可能“有效”,但依赖于实现定义的行为。 (如果 int
是 16 位,则为 UB)
int16_t raw_t = buff[1] << 8 | buff[0];
总是有效的替代方案。
uint16_t uraw = ((uint16_t) buff[1]) << 8 | buff[0];
int16_t raw = (uraw & 0x8000u) ? uraw - 65536 : uraw;
而不是 double math
并分配给 float
,也使用 float
数学。
// float temperature = (raw_t / 256.0) + 25.0;
float temperature = (raw_t / 256.0f) + 25.0f;
四舍五入可能更正确。
float temperature = (raw_t + (int32_t)25*256) / 256.0f;
我想知道在这个 captor LSM6DSO32 上读取温度的最佳方法是什么,这里是寄存器
我正在使用 Atmel SAMD21 Cortex M0 开发 Arduino。在这里,这就是我要做的
//reading register
Wire.beginTransmission(DSO_ADDRESS);
Wire.write(0x20);
Wire.endTransmission();
Wire.requestFrom(DSO_ADDRESS, 14);
//get bytes, 14 beceause (temp,gyro,accel)
uint8_t buff[14];
Wire.readBytes(buff, 14);
int16_t raw_t = buff[1] << 8 | buff[0];
float temperature = (raw_t / 256.0) + 25.0;
我的问题是,你认为这种方法可以得到负的原始值吗?例如,如果温度为 22°,则原始值应为 -700 平均值。在分配 raw_t
之前,我是否需要转换或转换来自俘虏的东西?
My question is, do you think this method is fine to get negative raw value ?
下面的代码可能“有效”,但依赖于实现定义的行为。 (如果 int
是 16 位,则为 UB)
int16_t raw_t = buff[1] << 8 | buff[0];
总是有效的替代方案。
uint16_t uraw = ((uint16_t) buff[1]) << 8 | buff[0];
int16_t raw = (uraw & 0x8000u) ? uraw - 65536 : uraw;
而不是 double math
并分配给 float
,也使用 float
数学。
// float temperature = (raw_t / 256.0) + 25.0;
float temperature = (raw_t / 256.0f) + 25.0f;
四舍五入可能更正确。
float temperature = (raw_t + (int32_t)25*256) / 256.0f;