2014-09-01 2 views
0

Я работаю над датчиком температуры ST (hts221), я использую командную связь I2C с датчиком. Я новичок в этом ...Как преобразовать значение в температуру от датчика?

У меня есть ссылка Data sheet for HTS221, а также получить значение от датчика. Но я не могу преобразовать значение в фактическую температуру.

Значение получить от датчика, как следующее:

Read HTS221 TEMP_OUT_L: 0x2a value is 0x15 
Read HTS221 TEMP_OUT_H: 0x2b value is 0xFF 
Read HTS221 T0_degC_x8: 0x32 value is 0xBF 
Read HTS221 T1_degC_x8: 0x33 value is 0xBF 
Read HTS221 T1/T0 msb: 0x35 value is 0x4 
Read HTS221 T0_OUT-3C: 0x3C value is 0x0 
Read HTS221 T0_OUT-3D: 0x3D value is 0x0 
Read HTS221 T1_OUT-3E: 0x3E value is 0x0 
Read HTS221 T1_OUT-3F: 0x3F value is 0x0 

Описание регистра температуры, как следующее изображение.

enter image description here

И это дает коэффициенты калибровки и пример преобразования температуры, как на рисунке, но я до сих пор понять, что это значит. enter image description here enter image description here

ли кто-то может научить меня, как преобразовать выше значение температуры от датчика? Я понятия не имею об этом ... Заранее спасибо.

+0

Попытка добраться до него в обратном направлении, какова была температура, когда вы получили показания, которые вы нам показываете? –

+0

Возможный дубликат [Как преобразовать значение из датчика температуры?] (Http://stackoverflow.com/questions/25322210/how-to-convert-the-value-get-from-temperature-sensor) – usr2564301

ответ

3

Вы должны прочитать следующие калибровочные регистры:

T0_degC_x8 (Calibration register 32) 
T1_degC_x8 (Calibration register 33) 
T1_T0msb (Calibration register 35) 
T0_OUT  (Calibration register 3C and 3D) 
T1_OUT  (Calibration register 3E and 3F) 

T0_degC_x8 и T1_degC_x8 являются 10 битовые значения, так что вам нужно, чтобы получить 2 последних бита из регистра 35.

Тогда это просто простая интерполяция чтобы получить измеренную температуру:

double T_DegC; 
double T0_degC = (T0_degC_x8 + (1 << 8) * (T1_T0msb & 0x03))/8.0; 
double T1_degC = (T1_degC_x8 + (1 << 6) * (T1_T0msb & 0x0C))/8.0; // Value is in 3rd and fourth bit, so we only need to shift this value 6 more bits. 
T_DegC = (T0_degC + (T_OUT - T0_OUT) * (T1_degC - T0_degC)/(T1_OUT - T0_OUT)); 

Примечание:

Нумерация регистров является шестнадцатеричной, поэтому регистры 32, 33 и 35 фактически регистрируют 0x32, 0x33 и 0x35.

+1

Вам нужно для использования некоторых бит из регистра T1/T0 msb. – user694733

+0

@ user694733 Спасибо! Я исправил свой ответ. –

+1

Я думаю, что '(1 << 8) * (T1_T0msb & 0x0C)' слишком сильно сдвигается. '(T1_T0msb & 0x0C) << 6 должно быть достаточно. – user694733

Смежные вопросы