【发布时间】:2017-05-16 10:04:28
【问题描述】:
我使用 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 的值。
我哪里做错了?
【问题讨论】:
-
读取值并然后启用传感器看起来很奇怪。读取不应该介于启用和禁用之间吗?如果传感器在启用后需要时间来产生读数,也许还会有一些延迟。
-
代码在移入符号位时会调用未定义的行为。
-
每次测量后必须启用温度传感器。我第一次在 LSM303DLHC_init_temp() 中启用了温度传感器,然后在每次测量后我还启用了温度传感器。我在从寄存器(HAL_I2C_MEM_READ)读取之前尝试启用温度传感器,但结果是一样的。
标签: c embedded microcontroller temperature hal