首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将原始数据转换为来自LSM303DLHC传感器的有用温度

如何将原始数据转换为来自LSM303DLHC传感器的有用温度
EN

Stack Overflow用户
提问于 2017-05-16 10:04:28
回答 3查看 1.7K关注 0票数 1

我使用STM32F4微控制器和HAL库。我想从LSM303DLHC传感器上读出温度。下面的代码负责此任务。

代码语言:javascript
复制
LSM303DLHC_Status_t LSM303DLHC_get_temp(int16_t *temp)
{
    uint8_t data_h = 0x00;
    uint8_t data_l = 0x00;
    uint16_t data_tmp = 0x00;
    uint8_t temp_enable = 0x00;

    if (HAL_I2C_Mem_Read(&hi2c1, LSM303_MAGNE_ADDRESS, TEMP_OUT_H_M, 1, &data_h, 1, 100) != HAL_OK)
    {
        return LSM303DLHC_ERROR;
    }

    if (HAL_I2C_Mem_Read(&hi2c1, LSM303_MAGNE_ADDRESS, TEMP_OUT_L_M, 1, &data_l, 1, 100) != HAL_OK)
    {
        return LSM303DLHC_ERROR;
    }

    data_tmp = (int16_t)((data_h << 8) | data_l);

    *temp = data_tmp/8;

    /*Enable temperature sensor*/
    if (HAL_I2C_Mem_Read(&hi2c1, LSM303_MAGNE_ADDRESS, CRA_REG_M, 1, &temp_enable, 1, 100) != HAL_OK)
    {
        return LSM303DLHC_ERROR;
    }

    temp_enable |= (0x01 << 7);

    if (HAL_I2C_Mem_Write(&hi2c1, LSM303_MAGNE_ADDRESS, CRA_REG_M, 1, &temp_enable, 1, 100) != HAL_OK)
    {
        return LSM303DLHC_ERROR;
    }
    /*End enable temperature sensor*/

    return LSM303DLHC_OK;
}

根据数据表和许多教程的温度由这个表达式计算:

代码语言:javascript
复制
temp = (int16_t)((data_h << 8) | data_l);
temp = temp/8;

我所在的房间里大约有20摄氏度。我的函数返回大约128-136个值.

我在哪里搞错了?

EN

回答 3

Stack Overflow用户

发布于 2017-11-27 18:18:08

嗯,在我这一边,当我在20摄氏度的房间里读到临时寄存器时,我得到了以下值。

代码语言:javascript
复制
TH=255, TL=224

因此,寄存器中的0值似乎对应于21℃(大约),当温度低于21℃(第7位设置为1)时,我可以使用代码得到正确的值:

代码语言:javascript
复制
printf("TH=%d, TL=%d\n", RegVal[0], RegVal[1]);
int16_t IntTemp = ((int16_t)RegVal[0] << 8) + RegVal[1];

printf("temp=%0.2f\n", (float)IntTemp / 128 + 21);

temp=20.75

票数 2
EN

Stack Overflow用户

发布于 2017-05-16 10:52:02

您的值是12位值,但您将其视为16位值。

在LSM303DLHC数据表中,温度寄存器显示如下: TEMP_OUT_H_M (31h),TEMP_OUT_L_M (32h)

高级寄存器: TEMP11,TEMP10,.,TEMP4低寄存器: TEMP3,TEMP2,TEMP1,TEMP0,-

前4位(LSB(!))不要有温度值。

正如您所写的,您的临时值约为0x130 (128-136)。二进制数是0000 0001 0011 0000。前四位不相关。所以你必须读0000 0001 0011,它是0x13,小数点是19。

向你问好,斯特凡

编辑:小心数据类型!你试图将一个字节值移到8。这是行不通的。用int定义值:

代码语言:javascript
复制
int16_t data_h = 0;
int8_t data_l = 0;

然后使用:

代码语言:javascript
复制
*temp = ((int16_t)((data_h << 8) | data_l)>>4);

Tipp:使用MS计算器的编程模式,播放二进制数、十六进制数和十进制数。

票数 0
EN

Stack Overflow用户

发布于 2019-08-16 05:39:12

代码语言:javascript
复制
# python

# enable Temperature sensor 
bus.write_byte_data(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_CRA_REG_M, 0x90)  

...
# read register
tempH = bus.read_byte_data(LSM303_ADDRESS_MAG, 0x31)
tempL = bus.read_byte_data(LSM303_ADDRESS_MAG, 0x32)
temp = (tempH << 8 ) +  tempL
if temp > 32767:  # 2's complement
    temp -= 65536
temperature = float( 20 + ( temp >> 4 )/ 8 )  # 16bit --> 12bit , 8LSB/deg
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43998373

复制
相关文章

相似问题

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