2017-05-16 2 views
0

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 값을 반환합니다.

어디서 실수 했습니까?

미리 감사드립니다.

+0

:) 내가 온도가 21 C 아래가 될 때 코드를 사용하여 정확한 값을 얻을 수있다 (TH 7 1 세트) 비트 센서가 매우 이상하게 보입니다. 읽기가 활성화와 비활성화 사이에서 이루어져야하지 않습니까? 아마도 센서가 활성화 된 후에 판독 값을 생성하는 데 시간이 필요한 경우에도 지연이 발생할 수 있습니다. – unwind

+0

코드는 부호 비트로 이동할 때 정의되지 않은 동작을 호출 할 수 있습니다. – Olaf

+0

각 측정 후 온도 센서가 활성화되어야합니다.처음 LSM303DLHC_init_temp()에서 온도 센서를 활성화 한 다음 각 측정 후에도 온도 센서를 활성화했습니다. 나는 레지스터 (HAL_I2C_MEM_READ)에서 읽기 전에 온도 센서를 작동 시키려고했지만 결과는 같다. –

답변

0

귀하의 값은 12 비트 값이지만 16 비트 값처럼 취급합니다. 온도 레지스터가 다음과 같이 표시되는 LSM303DLHC 데이터 시트에

: TEMP_OUT_H_M (31H), TEMP_OUT_L_M (32H)

높은 등록 : TEMP11, TEMP10, ..., TEMP4 낮은 등록 : TEMP3, TEMP2, TEMP1, TEMP0, -, -, -

첫 번째 4 비트 (LSB (!))에는 온도 값이 없습니다.

쓴대로 임시 값은 0x130 (128-136)입니다. 이진에서는 0000 0001 0011 0000입니다. 첫 번째 4 비트는 관련이 없습니다. 그래서 0000 0001 0011을 읽어야하는데 0x13은 십진수로 19입니다.

감사합니다, 스테판

편집 : 데이터 유형에주의 ! 바이트 값을 8로 시프트하려고합니다. 작동하지 않습니다. INT와 값을 정의 :

int16_t data_h = 0; 
int8_t data_l = 0; 

그런 다음 사용

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

Tipp 다음 MS 윈도우 계산기의 프로그래밍 모드를 사용하여 바이너리와 진수와 진수와 함께 재생할 수 있습니다.

+0

당신의 충고를 소개 했는데도 IMO가 제대로 작동하지 않습니다. 이제 함수는 섭씨 50-60도 정도의 온도를 반환합니다. 내 방에서는 섭씨 20도 정도입니다. –

0

글쎄, 난

TH=255, TL=224 

C.

(20)에 방에있는 임시 레지스터를 읽을 그래서 레지스터에서 0 값이 21 C에 해당하는 것으로 보인다 때 내 옆에 나는 다음과 같은 값을 얻을 수 (약 . *를 수 있도록 그 값 * 읽기

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); 

온도 = 20.75

관련 문제