我使用STM32F4微控制器和HAL库。我想从LSM303DLHC传感器上读出温度。下面的代码负责此任务。
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;
}根据数据表和许多教程的温度由这个表达式计算:
temp = (int16_t)((data_h << 8) | data_l);
temp = temp/8;我所在的房间里大约有20摄氏度。我的函数返回大约128-136个值.
我在哪里搞错了?
发布于 2017-11-27 18:18:08
嗯,在我这一边,当我在20摄氏度的房间里读到临时寄存器时,我得到了以下值。
TH=255, TL=224因此,寄存器中的0值似乎对应于21℃(大约),当温度低于21℃(第7位设置为1)时,我可以使用代码得到正确的值:
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
发布于 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定义值:
int16_t data_h = 0;
int8_t data_l = 0;然后使用:
*temp = ((int16_t)((data_h << 8) | data_l)>>4);Tipp:使用MS计算器的编程模式,播放二进制数、十六进制数和十进制数。
发布于 2019-08-16 05:39:12
# 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/deghttps://stackoverflow.com/questions/43998373
复制相似问题