2017-05-16 2 views
0

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.

+0

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

+0

Le code peut invoquer un comportement indéfini lors du passage dans le bit de signe. – Olaf

+0

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. –

Répondre

0

Votre valeur est une valeur de 12 bits mais vous l'avez traitée comme une valeur de 16 bits.

dans le LSM303DLHC Fiche technique du registre de température est indiquée comme ceci: TEMP_OUT_H_M (31h), TEMP_OUT_L_M (32h)

Haut Registre: TEMP11, TEMP10, ..., Temp4 Grave: TEMP3, TEMP2, TEMP1, TEMP0, -, -, -, -

Les 4 premiers bits (LSB (!)) N'ont pas de valeurs de température.

Votre valeur de température est d'environ 0x130 (128-136) comme vous l'avez écrit. En binaire, il s'agit de 0000 0001 0011 0000. Les quatre premiers bits ne sont pas pertinents. Donc, vous devez lire 0000 0001 0011 qui est 0x13 qui est 19 en décimal.

Cordialement, Stefan

Edit: Soyez prudent avec les types de données! Vous essayez de déplacer une valeur d'octet de 8. Cela ne fonctionnera pas. définir vos valeurs avec int:

int16_t data_h = 0; 
int8_t data_l = 0; 

Ensuite, utilisez:

*temp = ((int16_t)((data_h << 8) | data_l)>>4); 

Tipp: Utilisez le mode de programmation de la MS Windows Calculator et jouer avec binaire et hexadécimal et des nombres décimaux.

+0

J'ai présenté vos conseils, mais il ne fonctionne toujours pas correctement IMO. Maintenant, la fonction renvoie la température d'environ 50-60 degrés Celsius. Dans ma chambre est d'environ 20 degrés Celsius. –

0

Eh bien, de mon côté, je reçois la valeur suivante quand je lis le registre temporaire dans une pièce à 20 ° C

TH=255, TL=224 

Il semble donc que la valeur 0 du registre correspond à 21 C (environ .), et je peux obtenir la valeur correcte à l'aide du code lorsque la température passe en dessous de 21 C (TH bit 7 mis à 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