首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从LSM6DSO32读取温度

从LSM6DSO32读取温度
EN

Stack Overflow用户
提问于 2021-03-30 12:02:47
回答 1查看 65关注 0票数 0

我想知道在这个捕获器LSM6DSO32上读取温度的最佳方法是什么,这里是寄存器

我正在和爱特梅尔SAMD21 M0公司合作做Arduino。在这里,这就是我要做的

代码语言:javascript
复制
//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之前,我是否需要转换或转换捕获者提供的内容?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-30 12:48:11

我的问题是,你认为这种方法可以得到负的原始值吗?

下面的代码可能“工作”,但依赖于实现定义的行为。(如果int为16位,则为UB )

代码语言:javascript
复制
int16_t raw_t = buff[1] << 8 | buff[0];

总是起作用的替代方案。

代码语言:javascript
复制
uint16_t uraw = ((uint16_t) buff[1]) << 8 | buff[0];
int16_t raw = (uraw & 0x8000u) ? uraw - 65536 : uraw;

而不是double math和分配给float,也使用float数学。

代码语言:javascript
复制
// float temperature = (raw_t / 256.0) + 25.0;
float temperature = (raw_t / 256.0f) + 25.0f;

在四舍五入中可能稍微正确一些。

代码语言:javascript
复制
float temperature = (raw_t + (int32_t)25*256) / 256.0f;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66870596

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档