3502|5

9805

帖子

24

TA的资源

版主

楼主
 

@ST的大神,HTS221传感器的Tx_DegC为什么要乘8储存? [复制链接]

 最近在研究HTS221温湿度传感器在计算温湿度时有一个地方没弄明白
以温度为例,计算温度需要读取T_OUT
还需要读取T0_DegC_x8、T1DegC_x8、T0_OUT和T1_OUT
通过线性插值法计算出T_OUT对应的温度
可以看出T0_OUT是在T0_DegC温度下的ADC输出,T1_OUT是在T1DegC温度下的ADC输出
Tx_DegC在保存时为什么要乘8,开始我觉得应该是希望在寄存器位数有限的情况下提高校准温度的精度
比如,如果不考虑负温度,正常的温度区间是0~120度,Tx_DegC_x8是10位寄存器,最大值是1024
将Tx_DegC_x8除8可以得到0.125摄氏度的分辨率
我在一颗HTS221里读取到的T0_DegC_x8是163,T1DegC_x8是282
对应的T0_DegC和T1_DegC应该是20.37和35.25



但是在官方提供的几个代码里看到Tx_DegC_x8和Tx_DegC的类型都是int16类型的
官方数据手册中手册中Tx_DegC_x8是无符号类型的,可以理解的是Tx_DegC_x8只有10位
保存在int16的类型里并不会影响符号位
但是在做除8运算时官方的代码直接使用了T0_degC = T0_degC_x8_u16 >> 3;
无论是将结果保存在T0_degC 还是向右移3位都相当于把小数部分给丢弃了
在后边的运算时不会对结果产生影响吗?
如果Tx_degC不需要小数部分,为什么不直接将Tx_degC 存储在一个8位的寄存器里边呢?
Tx_degC乘8储存的意义是什么?






最新回复

可以这么理解,如果对精度要求高的话,最好是保留小数位。  详情 回复 发表于 2017-9-29 08:18
点赞 关注(1)
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复
举报

60

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
可以把代码分享出来看下么?

点评

BlueMicrosystem2_V2.2.0\Drivers\BSP\Components\hts221 [mw_shl_code=c,true]/** * @brief Read HTS221 temperature output registers, and calculate temperature. * @param *handle Device handle.  详情 回复 发表于 2017-9-26 13:45
 
 
 

回复

9805

帖子

24

TA的资源

版主

板凳
 
jmsht33 发表于 2017-9-26 13:37
可以把代码分享出来看下么?

BlueMicrosystem2_V2.2.0\Drivers\BSP\Components\hts221

hts221.rar (16.9 KB, 下载次数: 13)

  1. /**
  2. * [url=home.php?mod=space&uid=159083]@brief[/url]  Read HTS221 temperature output registers, and calculate temperature.
  3. * @param  *handle Device handle.
  4. * @param  Pointer to the returned temperature value that must be divided by 10 to get the value in ['C].
  5. * @retval Error code [HTS221_OK, HTS221_ERROR].
  6. */
  7. HTS221_Error_et HTS221_Get_Temperature(void *handle, int16_t *value)
  8. {
  9.   int16_t T0_out, T1_out, T_out, T0_degC_x8_u16, T1_degC_x8_u16;
  10.   int16_t T0_degC, T1_degC;
  11.   uint8_t buffer[4], tmp;
  12.   float   tmp_f;

  13.   if(HTS221_ReadReg(handle, HTS221_T0_DEGC_X8, 2, buffer))
  14.     return HTS221_ERROR;
  15.   if(HTS221_ReadReg(handle, HTS221_T0_T1_DEGC_H2, 1, &tmp))
  16.     return HTS221_ERROR;

  17.   T0_degC_x8_u16 = (((uint16_t)(tmp & 0x03)) << 8) | ((uint16_t)buffer[0]);
  18.   T1_degC_x8_u16 = (((uint16_t)(tmp & 0x0C)) << 6) | ((uint16_t)buffer[1]);
  19.   T0_degC = T0_degC_x8_u16 >> 3;
  20.   T1_degC = T1_degC_x8_u16 >> 3;

  21.   if(HTS221_ReadReg(handle, HTS221_T0_OUT_L, 4, buffer))
  22.     return HTS221_ERROR;

  23.   T0_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];
  24.   T1_out = (((uint16_t)buffer[3]) << 8) | (uint16_t)buffer[2];

  25.   if(HTS221_ReadReg(handle, HTS221_TEMP_OUT_L_REG, 2, buffer))
  26.     return HTS221_ERROR;

  27.   T_out = (((uint16_t)buffer[1]) << 8) | (uint16_t)buffer[0];

  28.   tmp_f = (float)(T_out - T0_out) * (float)(T1_degC - T0_degC) / (float)(T1_out - T0_out)  +  T0_degC;
  29.   tmp_f *= 10.0f;

  30.   *value = ( int16_t )tmp_f;

  31.   return HTS221_OK;
  32. }
复制代码

个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(中级)

4
 
其实,是可以直接做除8运算,而不是>>3,因为温度是支持小数的,而在官方的代码里,因为用了u16的类型,“/8”和“>>3”的结果是一样的,除非用浮点型。

我们sensor的寄存器是16位的,最后的结果是需要“/8”才能对应为°C,并不是特意去“乘以8”

点评

是不是可以这样理解 HTS221在出厂校准时并不是在整数温度下进行的,比如30摄氏度,40摄氏度 因为如果是整数温度就可以直接使用一个7位寄存器(如果不要负温度),0~127直接读取就可以,不需要转换 实际上校准时的  详情 回复 发表于 2017-9-26 21:13
个人签名ST MEMS技术讨论群:415506792
 
 
 

回复

9805

帖子

24

TA的资源

版主

5
 
jmsht33 发表于 2017-9-26 18:31
其实,是可以直接做除8运算,而不是>>3,因为温度是支持小数的,而在官方的代码里,因为用了u16的类型,“/ ...

是不是可以这样理解
HTS221在出厂校准时并不是在整数温度下进行的,比如30摄氏度,40摄氏度
因为如果是整数温度就可以直接使用一个7位寄存器(如果不要负温度),0~127直接读取就可以,不需要转换
实际上校准时的温度包含小数(可以校准时比较方便,这样不用把温度恒定到一个特定值),用一个16位的寄存器存储,除8后就可以得到一个温度精度在0.125摄氏度的数值(1/8=0.125)

实际使用时应该使用Tx_DegC_x8除8后存在一个浮点变量里,得到一个包含小数的校准温度
ST的工程师在写SHT221代码时忽略了校准温度的小数才使用int16的类型,但这会让测量结果增加最大近1摄氏度的误差

这样理解对吗?

点评

可以这么理解,如果对精度要求高的话,最好是保留小数位。  详情 回复 发表于 2017-9-29 08:18
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

46

帖子

0

TA的资源

一粒金砂(中级)

6
 
littleshrimp 发表于 2017-9-26 21:13
是不是可以这样理解
HTS221在出厂校准时并不是在整数温度下进行的,比如30摄氏度,40摄氏度
因为如果是 ...

可以这么理解,如果对精度要求高的话,最好是保留小数位。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表