J'utilise un microcontrôleur STM32F4 et une bibliothèque HAL. Je voudrais lire la température du capteur LSM303DLHC. Le code suivant est responsable de cette tâche.Comment convertir les données brutes en température utile provenant du capteur 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;
}
Selon la feuille de données et un grand nombre température tutoriel est calculée par l'expression suivante:
temp = (int16_t) ((data_h < < 8) | data_l); temp = temp/8;
Dans la pièce où je suis est d'environ 20 degrés Celsius. Ma fonction renvoie environ 128-136 valeur.
Où ai-je fait une erreur?
Merci d'avance.
lecture de la valeur et * puis * permettant la Le capteur a l'air très étrange. La lecture ne devrait-elle pas se produire entre l'activation et la désactivation? Peut-être avec un certain retard aussi, si le capteur a besoin de temps pour produire une lecture après avoir été activé. – unwind
Le code peut invoquer un comportement indéfini lors du passage dans le bit de signe. – Olaf
Après chaque mesure, le capteur de température doit être activé.La première fois que j'ai activé le capteur de température dans LSM303DLHC_init_temp(), j'ai également activé le capteur de température après chaque mesure. J'ai essayé le capteur de température activé avant lecture du registre (HAL_I2C_MEM_READ) mais le résultat est le même. –