It is currently Wed Oct 17, 2018 3:35 am

НИЛ АСЭМ Научно - исследовательская лаборатория автоматизированных систем экологического мониторинга

Температурный датчик DS18B20

by Admin » Sun Feb 25, 2018 7:25 am

DS18B20 – датчик температуры с интерфейсом 1-Wire.

ImageImage


Общее описание.

DS18B20 это цифровой измеритель температуры, с разрешением преобразования 9 - 12 разрядов и функцией тревожного сигнала контроля за температурой. Параметры контроля могут быть заданы пользователем и сохранены в энергонезависимой памяти датчика.

DS18B20 обменивается данными с микроконтроллером по однопроводной линии связи, используя протокол интерфейса 1-Wire.

Питание датчик может получать непосредственно от линии данных, без использования внешнего источника. В этом режиме питание датчика происходит от энергии, запасенной на паразитной емкости.

Диапазон измерения температуры составляет от -55 до +125 °C. Для диапазона от -10 до +85 °C погрешность не превышает 0,5 °C.

У каждой микросхемы DS18B20 есть уникальный серийный код длиной 64 разряда, который позволяет нескольким датчикам подключаться на одну общую линию связи. Т.е. через один порт микроконтроллера можно обмениваться данными с несколькими датчиками, распределенными на значительном расстоянии. Режим крайне удобен для использования в системах экологического контроля, мониторинга температуры в зданиях, узлах оборудования.


На рисунке 1 блок-схема датчика DS18B20. 64-битное ПЗУ (ROM) хранит уникальный серийный код устройства. Оперативная память содержит:

значение измеренной температуры (2 байта);
верхний и нижний пороговые значения срабатывания тревожного сигнала (Th, Tl);
регистр конфигурации (1 байт).
Через регистр конфигурации можно установить разрешение преобразования термодатчика. Разрешение может быть задано 9, 10, 11 или 12 бит. Регистр конфигурации и пороги тревожного сигнала содержатся в энергонезависимой памяти (EEPROM).

В микросхеме DS18B20 для обмена данными использует специализированный протокол 1-Wire корпорации Dallas. Для линии связи требуется слабый подтягивающий резистор т.к. все устройства физически подключены к одной общей шине и используют выход с тремя состояниями или выход типа открытый сток. В этой системе с одной шиной, микроконтроллер (мастер) определяет наличие устройств на шине и обменивается с ними, используя уникальный адрес для каждого устройства - 64-разрядный код. Т.к. каждый термодатчик имеет уникальный код, то число устройств, подключенных к шине, практически ни чем не ограничено.

Image
Другая особенность DS18B20 – работать без внешнего источника питания. Питание происходит через подтягивающий резистор шины и вывод DQ, во время высокого уровня шины. Сигнал высокого уровня заряжает через вывод DQ внутренний конденсатор (Cpp), энергией которого и питается микросхема при низком уровне линии связи. Этот метод в спецификации протокола 1-Wire называется ”паразитное питание”. Ничего не мешает использовать и внешнее питание для DS18B20. Подается оно на вывод Vdd.
Основная функция DS18B20 – преобразование температуры датчика в цифровой код. Разрешение преобразования задается 9, 10, 11 или 12 бит. Это соответствует разрешающей способность - 0,5 (1/2) °C, 0,25 (1/4) °C, 0,125 (1/8) °C и 0,0625 (1/16) °C. При включении питания, состояние регистра конфигурации устанавливается на разрешение 12 бит.

DS18B20 измеряет температуру в градусах по шкале Цельсия. Результат измерения представляется как 16-разрядное, знаковое число в дополнительном коде (рис. 2.) . Бит знака (S) равен 0 для положительных чисел и равен 1 для отрицательных. При разрешении 12 бит, у регистра температуры все биты значащие, т.е. имеют достоверные значения. Для разрешения 11 бит, не определен бит 0. Для 10-битного разрешения не определены биты 0, 1. При разрешении 9 бит, не достоверное значение имеют биты 0, 1 и 2. В таблице 2 показаны примеры соответствия цифровых кодов значению температуры.
Image

Image

Варианты управляющего кода (на Proton BASIC Compiler):

№1
Code: Select all
' Read a DS18S20 1-wire temperature sensor and display the temperature on the serial terminal
' Circuit diagram
' VCC 3.3 or 5 Volts
' ------------o----
'             |   |
'             |  .-.
'             |  | |
'             |  | | 4.7K
'             |  '-'
'       ____  |   |
'      / VCC|--   |
'      | DQ |-----o--> To PORTB.0
'      \ GND|--
'       ----  |
'  DS18S20    |
'            --- Gnd
'             -
'
    Include "Amicus18.inc"                          ' Configure the compiler to use a 18F25K20 at 64MHz. i.e the Amicus18 board
'
' Allocate variables
'
    Dim wRaw_Temperature As SWord                   ' Raw value from the DS18S20
    Dim fTemperature As Float                       ' Final Temperature

    Symbol DQ = PORTB.0                             ' One-wire data pin
'
' The main program starts here
'
Main:   
    While                                           ' Create an infinite loop
        OWrite DQ, 1, [$CC, $44]                    ' Start temperature conversion
        While ORead DQ, 4 = 0                       ' \
            DelayMS 10                              ' | Check for still busy converting
        Wend                                        ' /


        OWrite DQ, 1, [$CC, $BE]                    ' Setup to read the temperature
        ORead DQ, 0, [wRaw_Temperature.Byte0, wRaw_Temperature.Byte1] ' Read the temperature


        fTemperature = wRaw_Temperature / 2.0       ' Convert the temperature to a float
        If fTemperature < 0 Then                    ' Is the temperature below 0?           
           fTemperature = fTemperature + 0.5        ' Yes. So adjust the temperature value
        EndIf
        HRSOut Dec1 fTemperature, " Degrees C\r"    ' Transmit the temperature serially
    Wend


№2
Code: Select all
'Subroutine's
 '******************************* DS18B20 *********************************
Minuut1:
OWrite DQ, 1, NoSensor, [$CC, $44]           ' Zend 'Convert' opdracht (temperatuur meten)
While ORead DQ, 4, NoSensor <> 0 : Wend       ' Wacht tot conversie is voltooid... <> 0 ipv. = 0 getest ; zie hierboven
OWrite DQ, 1, NoSensor, [$CC, $BE]           ' Zend 'Read ScratchPad' opdracht
ORead  DQ, 2, NoSensor, [Verwarming.LowByte, Verwarming.HighByte, dummy, dummy, dummy, dummy, dummy, dummy] ' Lees temperatuur en plaats dit in de variabele
 
Decimalen = 0                           ' Op 0 voor de zekerheid..
Decimalen = Verwarming.LowByte << 4     ' Alleen de laatste 4 bits van Temperatuur zijn nodig.
Verwarming = Verwarming >> 4            ' Bits weer op de originele plaats zetten
Warm_Cool = Verwarming                  ; Tbv. Klimaat regeling
Decimalen = Decimalen >> 4              ' Bits weer op de originele plaats zetten
Decimalen = Decimalen * 6.25            ' Resolutie van de DS18B20 is[b][i] 0.0625 graden celcius[/i][/b].
Decimalen = Decimalen / 10

Return
NoSensor:                                ; Als sensor uitvalt dan loopt programma tenminste door!
Return                                   ; IPV. GoTo main!!!!!!!!!



№3
Code: Select all
Get_temp:
OWrite PORTC.3, 1, [$CC, $44] ' Start temperature conversion
DelayMS 10
While ORead PORTC.3, 4 = 0 :Wend 'Check for still busy convertin, wait here.
OWrite PORTC.3, 1, [$CC, $BE] ' Read the Temperature
ORead PORTC.3, 0, [temperature.LowByte,temperature.HighByte,temp,temp ,temp,temp,temp,temp]
If temperature.11 = 1 Then 'bit 11 to 15 if 1 it a negative number
sign = "-" 'sign for two compliment number
Else
sign = "+" 'sign for
EndIf
ftemp = temperature ' sign word var....
ftemp = ftemp/16 'convert to float then divide by 16 to place decimal
Print At 1,1,sign,Dec ftemp," ","C " 'print float out with sign
DelayMS 500
Return


№4
Code: Select all
Dim Temperature As    Word            ' Temperature storage
        Dim Count_remain As Byte            ' Count remaining
        Dim Count_per_c As    Byte            ' Count per degree C
        Dim Dum            As Byte                ' Dummy variable to pad OWIN

        Symbol DQ = PORTC.0                    ' One-wire data pin

        DelayMS 500                            ' Wait for PICmicro to stabilise
        Cls
Mainloop: 
        OWrite DQ, 1, [$CC, $44]               ' Start temperature conversion

        While ORead DQ, 4 = 0 : Wend        ' Check for still busy converting

        OWrite DQ, 1, [$CC, $BE]            ' Read the temperature
        ORead DQ, 0, [Temperature.LowByte, Temperature.HighByte, Dum,Dum,Dum,Dum, Count_remain, Count_per_c]

' Calculate temperature in degrees C to 2 decimal places (not valid for negative temperature)
        Temperature = (((Temperature >> 1) * 100) - 25) + (((Count_per_c - Count_remain) * 100) / Count_per_c)
        Print $FE, 1, Dec (Temperature / 100), ".", DEC2 Temperature, " C"

' Calculate temperature in degrees F to 2 decimal places (not valid for negative temperature)
        Temperature = (Temperature */ 461) + 3200
        Print $FE, $C0, Dec (Temperature / 100), ".", DEC2 Temperature, " F"

        DelayMS 1000                          ' Display once a second

        GoTo Mainloop                        ' Do it forever 


№5
Code: Select all
Device 16F877
XTAL 4

Declare LCD_TYPE ALPHA                ' Type of LCD Used is Alpha
Declare LCD_DTPIN PORTB.4           ' The control bits B0,B1,B2,B3
Declare LCD_RSPIN PORTB.2           ' RS pin on B4
Declare LCD_ENPIN PORTB.3           ' E pin on B5
Declare LCD_LINES 2                        ' Amount of LCD lines
Declare LCD_INTERFACE 4                ' Interface method is 4 bit

PORTB_PULLUPS = true
ALL_DIGITAL = TRUE

SYMBOL DQ = Portb.0                 'Place the DS1820 on bit 1 of PORTA
     
Dim Sign as Byte
Dim Cnt as Byte
Dim Count_Per_Deg as Byte
Dim Temp as Word
Dim Temp_Dec as Byte

Delayms 150                ' Let LCD warm up

Cls

Print $FE,$40,$06,$09,$09,$06,$00,$00,$00,$00             ' Send a command that creates the degree
                                                                                    '  symbol on the LCD, to print it, simply address
                                                                                    '  the character as 0, eg,
                                                                                    '  Print At 1, 1, Value, 0, "Degrees"

Again:

OWRITE DQ, 1,[$55,$10,$31,$C5,$C8,$00,$00,$00,$F4,$44]            'Send calculate temperature command
                               ' FF   I1    I2    I3    I4   I5    I6   CRC                 '   FF - Family, Ix - Address bytes,
                                                                                                     '  CRC - checksum
REPEAT
     DELAYMS 25                   ' Wait until conversion is complete
     OREAD DQ,4,[Cnt]           ' Keep reading low pulses until
UNTIL Cnt <> 0                     '  the DS1820 is finished
     
OWRITE DQ,1,[$55,$10,$31,$C5,$C8,$00,$00,$00,$F4,$BE]            'Send read scratchpad command
                               ' FF   I1    I2    I3    I4   I5    I6   CRC                 '   FF - Family, Ix - Address bytes,
                                                                                                     '  CRC - checksum checksum

OREAD DQ,2,[Temp.LOWBYTE,Temp.HIGHBYTE,Cnt,Cnt,Cnt,Cnt,Cnt,Count_Per_Deg]

Temp_Dec = (6.25 * Cnt)                                         ' Each Cnt is 1/16 of a degree, therefore 100/16 = 6.25, and that's our decimal value
Temp_Dec = 100 - Temp_Dec                             ' Invert the decimal value

If Temp.8=1 Then                                                   ' Bits 8-15 are 1 for a negative temperature and 0 for a positive
     Temp=(Temp.LowByte ^ $FF) >> 1                     ' If negative then drop the first bit, and invert the value
     If Cnt = 0 then Temp = Temp + 1                        ' If Cnt = 0 then increment Temp, as the 1820 does not do this
     Sign = "-"                                                           ' Change the sign to a negative
Else
     Temp=(Temp >> 1)                                             ' If positive then drop the first byte
     Sign = "+"                                                          ' And change the sign value to positive
Endif

' Display the data on the LCD
Print At 1,1, Sign, Dec Temp, ".", Dec DIG Temp_Dec, 1, 0,"C "
Goto Again


Литература

1. Официальная документация (datasheet) DS18B20.pdf производителя датчика – компании Dallas Semiconductor.

2. Моисеев Д.Н., Жеребин В.С. Автоматизированный лабораторный комплекс для измерения и мониторинга температуры // Научная дискуссия: вопросы математики, физики, химии, биологии. сб. ст. по материалам XLIX-L междунар. науч.-практ. конф. - № 1-2(36) . – М., Изд. «Интернаука», 2017. – С. 12-20.



На главную
Admin
Site Admin
 
Posts: 203
Joined: Wed Sep 20, 2017 9:55 am

Return to Промежуточные исследования и разработки

cron

User Menu

Login