Температурен сензор

За измерването на въздушната температура е използван цифров температурен сензор на фирмата Dallas/Maxim DS18B20. Диапазоните на измерване на сензора са -55$ ^{\circ}$ C  +125$ ^{\circ}$ C като се гарантира точност 0.5$ ^{\circ}$ C от производителя за диапазона -25$ ^{\circ}$ C  +125$ ^{\circ}$ C. Сензорът комуникира с микроконтролера посредством OneWireTMпротокол на Maxim. На Фиг.2.18 е показана блоковата схема на сензора.

Figure: Блокова схема на DS18B20 [24]
\includegraphics[width=400pt]{figs/Fig29.pdf.ps}

Всеки един сензор има уникален 64битов сериен код, което позволява свързването на много такива по същия комуникационен проводник. Буферната памет (scratchpad memmory) двубайтов температурен регистър, който записва цифровия изход от температурния сензор. Допълнително тя съдържа и еднобайтов конфугурационен регистър, който позволява да бъде променяна разделителната способност на измерванията от 9 до 12 бита. T$ _{H}$ и T$ _{L}$ регистрите са енергонезависим EEPROM, затова те си запазват стойността когато сензора е изключен. DS18B20 използва еднопроводен OneWire протокол за обмен. Шината се нуждае от маломощен пул-ъп резистор тъй като физическия порт на OneWire модула е с отворен дрейн.

Информацията за тепмературата е съхранена като 16 битов допълнителен код в температурния регистър. На Фиг. 2.19 е показан формата на температурния регистър.

Figure: Формат на температурния регистър на DS18B20
\includegraphics[width=400pt]{figs/Fig30.pdf.ps}

Четенето на информацията от чипа става чрез OneWire библиотеката на mikroC. Показан е част от кода за четене на температурата:

Ow_Reset(&PORTE, 2);                         // OneWire рестарт
Ow_Write(&PORTE, 2, 0xCC);                   // подай команда SKIP_ROM
Ow_Write(&PORTE, 2, 0x44);                   // подай команда за преобр на
Delay_us(120);                               // темрературата - CONVERT_T

Ow_Reset(&PORTE, 2);                         // Onewire рестарт
Ow_Write(&PORTE, 2, 0xCC);                   // подай команда SKIP_ROM
Ow_Write(&PORTE, 2, 0xBE);                   // чети от буф памет READ_SCRATCHPAD
Delay_us(120);

temp =  Ow_Read(&PORTE, 2);                  // прочети MSB
temp = (Ow_Read(&PORTE, 2) << 8) + temp;     // прочети LSB и добави към temp

if (temp & 0x8000) {  // условие за определяне на температурния знак
minus = 1;            // температурата е отрицателна
temp = ~temp + 1; }
else {
minus = 0;            // температурата не е отрицателна
}
temp_whole = temp >> RES_SHIFT ;        // извлечи цяло число 1**
temp_whole_1 = (temp_whole/10)%10 ;     // извлечи цяло число *1*
temp_whole_2 = temp_whole%10 ;          // извлечи цяло число **1
temp_fraction  = temp << (4-RES_SHIFT); // извлечи след зап 1**
temp_fraction_1 =  temp_fraction%10 ;   // извлечи десета *1*
temp_fraction_2 = (temp_fraction/10)%10;// извлечи стотна **1



Deyan Levski 2013-06-22