我使用STM32F4微控制器和HAL庫。我想從LSM303DLHC傳感器讀取溫度。以下代碼負責此任務。如何將原始數據轉換爲來自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;
}
根據數據片和許多教程溫度由該表達式計算:
溫度=(int16_t)((data_h < < 8)| DATA_L); temp = temp/8;
在我所在的房間裏大約是20攝氏度。我的函數返回大約128-136的值。
我在哪裏犯錯?
謝謝您提前。
讀值和*然後*使傳感器看起來很奇怪。不應該在啓用和禁用之間進行讀取嗎?也許有一些延遲,如果傳感器啓用後需要時間產生讀數。 – unwind
代碼可以在移入符號位時調用未定義的行爲。 – Olaf
必須啓用每個測量溫度傳感器之後。第一次啓用LSM303DLHC_init_temp()中的溫度傳感器,然後在每次測量之後,我還啓用了溫度傳感器。在從寄存器讀取(HAL_I2C_MEM_READ)之前,我嘗試啓用溫度傳感器,但結果相同。 –