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 값을 반환합니다.
어디서 실수 했습니까?
미리 감사드립니다.
:) 내가 온도가 21 C 아래가 될 때 코드를 사용하여 정확한 값을 얻을 수있다 (TH 7 1 세트) 비트 센서가 매우 이상하게 보입니다. 읽기가 활성화와 비활성화 사이에서 이루어져야하지 않습니까? 아마도 센서가 활성화 된 후에 판독 값을 생성하는 데 시간이 필요한 경우에도 지연이 발생할 수 있습니다. – unwind
코드는 부호 비트로 이동할 때 정의되지 않은 동작을 호출 할 수 있습니다. – Olaf
각 측정 후 온도 센서가 활성화되어야합니다.처음 LSM303DLHC_init_temp()에서 온도 센서를 활성화 한 다음 각 측정 후에도 온도 센서를 활성화했습니다. 나는 레지스터 (HAL_I2C_MEM_READ)에서 읽기 전에 온도 센서를 작동 시키려고했지만 결과는 같다. –