Technologia czujników temperatury

Projektowanie cyfrowego czujnika temperatury DS18B20 dla STM32

DS18B20 Zestaw sondy ze stali nierdzewnej z drutu stali nierdzewnej

DS18B20 to cyfrowy czujnik temperatury, który wykorzystuje czas pojedynczego magistrali do komunikacji z hostem. Tylko 1 Potrzebny jest drut do ukończenia odczytu danych temperatury;

DS18B20 ma wbudowany 64-bitowy numer seryjny produktu dla łatwej identyfikacji. Wiele czujników DS18B20 można podłączyć do 1 Drut, oraz poprzez 64-bitowe uwierzytelnianie tożsamości, Informacje o temperaturze zebrane z różnych czujników można odczytać osobno.

DS18B20 Zestaw sondy ze stali nierdzewnej z drutu stali nierdzewnej

DS18B20 Zestaw sondy ze stali nierdzewnej z drutu stali nierdzewnej

Sonda czujnika temperatury DS18B20 Zestaw do formowania TPE

Sonda czujnika temperatury DS18B20 Zestaw do formowania TPE

1 przewód czujnika temperatury DS18B20

1 przewód czujnika temperatury DS18B20

Wprowadzenie do DS18B20
2.1 Główne cechy DS18B20
1. W pełni cyfrowa konwersja i wyjście temperatury.
2. Zaawansowana komunikacja danych za pomocą pojedynczej magistrali.
3. Rozdzielczość do 12 bitów, z dokładnością do ±0,5 stopnia Celsjusza.
4. Maksymalny cykl pracy przy rozdzielczości 12-bitowej wynosi 750 milisekundy.
5. Można wybrać pasożytniczy tryb pracy.
6. Zakres temperatury detekcji wynosi –55°C ~+125°C (–67°F ~+257°F).
7. Wbudowana pamięć EEPROM, funkcja alarmu ograniczenia temperatury.
8. 64-bitowa pamięć ROM z fotolitografią, wbudowany numer seryjny produktu, wygodne w przypadku połączenia wielu maszyn.
9. Różne formy opakowań, dostosować się do różnych systemów sprzętowych.

Struktura pakietu chipów DS18B20

Struktura pakietu chipów DS18B20

2.2 Funkcja pinów DS18B20
Masa napięcia GND;
Pojedyncza magistrala danych DQ;
Napięcie zasilania VDD;
NC pusty pin;

Schemat struktury pamięci RAM i EEPROM układu DS18B20

Schemat struktury pamięci RAM i EEPROM układu DS18B20

2.3 Zasada działania i zastosowanie DS18B20
Detekcja temperatury DS18B20 i cyfrowe wyjście danych są w pełni zintegrowane w jednym chipie, więc ma silniejszą zdolność przeciwzakłóceniową. Jego jeden cykl pracy można podzielić na dwie części, mianowicie wykrywanie temperatury i przetwarzanie danych.

18B20 ma trzy formy zasobów pamięci. Są: Pamięć ROM tylko do odczytu, używany do przechowywania kodu DS18B20ID; pierwszy 8 bity są jednowierszowym kodem szeregowym (Kod DS18B20 to 19H), następujące 48 bity to unikalny numer seryjny chipa; ostatni 8 bity to kod CRC (kontrola redundancji) z powyższych 56 bity. Dane są ustalane fabrycznie i użytkownik nie może ich zmienić. DS18B20 ma w sumie 64 kawałki ROMu.

Rejestr danych RAM, wykorzystywane do wewnętrznych obliczeń i dostępu do danych, dane zostaną utracone po awarii zasilania, DS18B20 ma w sumie 9 bajtów pamięci RAM, każdy bajt jest 8 bity. Pierwszy i drugi bajt to informacja o wartości danych po konwersji temperatury; trzeci i czwarty bajt są lustrzanym odbiciem pamięci EEPROM użytkownika (powszechnie używane do przechowywania wartości alarmów temperatury). Jego wartość zostanie odświeżona po zresetowaniu zasilania. Piąty bajt jest lustrzanym odbiciem trzeciej pamięci EEPROM użytkownika. 6, 7t, a ósmy bajt to rejestry zliczające, które zostały zaprojektowane tak, aby umożliwić użytkownikom uzyskanie wyższej rozdzielczości temperatury. Stanowią także tymczasowe jednostki magazynujące służące do przeliczania i obliczania temperatury wewnętrznej. Dziewiąty bajt to kod CRC pierwszego 8 bajty. EEPROM to pamięć nieulotna służąca do przechowywania danych, które muszą być przechowywane przez długi czas, górne i dolne wartości alarmowe temperatury, i dane weryfikacyjne. DS18B20 ma w sumie 3 bity EEPROM, a w pamięci RAM znajdują się odbicia lustrzane, aby ułatwić użytkownikowi obsługę.

DS18B20 domyślnie pracuje w trybie rozdzielczości 12-bitowej. 12-bitowe dane uzyskane po konwersji są przechowywane w dwóch 8-bitowych pamięciach RAM DS18B20 (pierwsze dwa bajty). Pierwszy 5 bity w formacie binarnym są bitami znaku. Jeżeli zmierzona temperatura jest wyższa niż 0, te 5 bity są 0. Wystarczy pomnożyć zmierzoną wartość przez 0.0625 aby uzyskać rzeczywistą temperaturę. Jeśli temperatura jest niższa niż 0, te 5 bity są 1. Zmierzoną wartość należy odwrócić, dodany przez 1, a następnie pomnożone przez 0.0625 aby uzyskać rzeczywistą temperaturę. Lub użyj operacji bitowej, aby wyodrębnić temperaturę: miejsca po przecinku zajmują dolną część 4 bity, a górne bity są bitami całkowitymi (liczby ujemne nie są brane pod uwagę).

2.4 Tabela instrukcji ROM układu DS18B20
1. Przeczytaj ROM [33H] (szesnastkowe słowo polecenia podano w nawiasach kwadratowych).
To polecenie umożliwia kontrolerowi magistrali odczytanie 64-bitowej pamięci ROM DS18B20. Instrukcję tę można zastosować tylko wtedy, gdy na magistrali znajduje się tylko jeden DS18B20. Jeśli podłączonych jest więcej niż jeden, Podczas komunikacji wystąpią konflikty danych.

2. podłącz ROM [55H]
Po tej instrukcji następuje 64-bitowy numer seryjny nadawany przez kontroler. Gdy w magistrali znajduje się wiele DS18B20, Odpowiedzi może udzielić jedynie chip o tym samym numerze seryjnym, co wydany przez kontroler, a pozostałe żetony będą czekać na kolejny reset. Niniejsza instrukcja jest odpowiednia dla połączeń jednoukładowych i wieloukładowych.

3. Pokój statku [CCH]
Ta instrukcja powoduje, że chip nie reaguje na kod ROM. W przypadku pojedynczego autobusu, tę instrukcję można wykorzystać, aby zaoszczędzić czas. Jeśli ta instrukcja jest używana, gdy podłączonych jest wiele chipów, wystąpią konflikty danych, skutkując błędami.

4. Wyszukaj ROM [F0H]
Po zainicjowaniu chipa, instrukcja wyszukiwania umożliwia identyfikację 64-bitowej pamięci ROM wszystkich urządzeń poprzez eliminację, gdy do magistrali podłączonych jest wiele układów scalonych.

5. Wyszukiwanie alarmów [KAŻDY]
W przypadku wielu żetonów, instrukcja wyszukiwania chipów alarmowych reaguje tylko na chipy, które spełniają warunek alarmowy o temperaturze wyższej niż TH lub niższej niż TL. Dopóki chip nie jest wyłączony, stan alarmowy będzie utrzymywany do czasu ponownego pomiaru temperatury i nie osiągnięcia stanu alarmowego.

6. Napisz Scratchpad [4EH]
Jest to instrukcja zapisu danych do pamięci RAM. Następnie zapisane dwa bajty danych zostaną zapisane pod adresem 2 (TH pamięci RAM alarmu) i adres 3 (TL pamięci RAM alarmu). Proces zapisu można zakończyć sygnałem resetu.

7. Przeczytaj Scratchpad (odczytać dane z pamięci RAM) [BEH]
Ta instrukcja odczyta dane z pamięci RAM, zaczynając od adresu 0 i do adresu 9, zakończenie odczytu całych danych RAM. Chip pozwala sygnałowi resetującemu zakończyć proces odczytu, to jest, kolejne niepotrzebne bajty można zignorować, aby skrócić czas odczytu.

8. Skopiuj Scratchpad (skopiuj dane RAM do EEPROM) [48H]
Ta instrukcja przechowuje dane w pamięci RAM w pamięci EEPROM, dzięki czemu dane nie zostaną utracone po wyłączeniu zasilania. Ponieważ chip jest zajęty przetwarzaniem pamięci EEPROM, gdy kontroler wysyła szczelinę czasową odczytu, wyjścia magistrali “0”, i kiedy prace związane z magazynowaniem zostaną zakończone, autobus wyjedzie “1”.
W pasożytniczym trybie pracy, natychmiast po wydaniu tej instrukcji należy zastosować mocne podciągnięcie i utrzymywać je przez co najmniej 10 ms, aby utrzymać działanie chipa.

9. Konwertuj T (konwersja temperatury) [44H]
Po otrzymaniu tej instrukcji, chip dokona konwersji temperatury i zapisze przekonwertowaną wartość temperatury pod pierwszym i drugim adresem pamięci RAM. Ponieważ chip jest zajęty przetwarzaniem konwersji temperatury, gdy kontroler wysyła szczelinę czasową odczytu, wyjścia magistrali “0”, i kiedy prace związane z magazynowaniem zostaną zakończone, autobus wyjedzie “1”. W pasożytniczym trybie pracy, natychmiast po wydaniu tej instrukcji należy zastosować mocne podciągnięcie i utrzymać je przez co najmniej 500 ms, aby utrzymać działanie chipa.

10. Przypomnij sobie EEPROM (Skopiuj wartość alarmu z EEPROM do RAM) [B8H]
This instruction copies the alarm value in EEPROM to the 3rd and 4th bytes in RAM. Since the chip is busy with copying processing, gdy kontroler wysyła szczelinę czasową odczytu, wyjścia magistrali “0”, i kiedy prace związane z magazynowaniem zostaną zakończone, wyjścia magistrali “1”. Ponadto, this instruction will be automatically executed when the chip is powered on and reset. W ten sposób, the two alarm byte bits in RAM will always be the mirror image of the data in EEPROM.

11. Read Power Supply (Working Mode Switch) [B4H]
After this instruction is issued, a read time gap is issued, and the chip will return its power status word. “0” is the parasitic power state and “1” is the external power state.

2.5 DS18B20 Timing Diagram
2.5.1 DS18B20 Reset and Response Relationship Diagram
A reset must be performed before each communication. The reset time, waiting time, and response time should be strictly programmed according to the timing.
DS18B20 read and write time gap: Odczyt i zapis danych DS18B20 potwierdzany jest bitem przetwarzającym przerwę czasową i słowem rozkazującym do wymiany informacji.

Schemat relacji resetowania i odpowiedzi DS18B20

Schemat relacji resetowania i odpowiedzi DS18B20

2.5.2 Zapisz dane 0 i dane 1 do DS18B20
W ciągu pierwszych 15uS przerwy czasowej zapisu danych, autobus musi zostać pociągnięty nisko przez kontroler, i wtedy będzie to czas próbkowania chipa dla danych magistrali. Czas próbkowania wynosi 15 ~ 60uS. Jeśli sterownik podciągnie magistralę wysoko w czasie próbkowania, to znaczy pisać “1”, i jeśli kontroler obniży poziom autobusu, to znaczy pisać “0”.
Każdy bit transmisji powinien mieć bit startu niskiego poziomu o wartości co najmniej 15uS, i kolejne dane “0” Lub “1” powinno zostać zakończone w ciągu 45uS.
Czas transmisji całego bitu powinien wynosić 60~120uS, w przeciwnym razie nie można zagwarantować normalnej komunikacji.
Notatka: DS18B20 odczytuje i zapisuje dane z dolnego bitu.

Zapisz dane 0 i dane 1 do DS18B20

Zapisz dane 0 i dane 1 do DS18B20

2.5.3 Odczytywanie danych 0 i dane 1 z DS18B20
Czas próbkowania kontroli podczas przerwy czasowej odczytu powinien być dokładniejszy. W przerwie w czytaniu, host musi również wygenerować niski poziom co najmniej 1uS, aby wskazać początek czasu odczytu. Następnie, w 15uS po zwolnieniu autobusu, DS18B20 wyśle ​​wewnętrzny bit danych. W tej chwili, jeśli sterowanie stwierdzi, że autobus jest wysoki, to znaczy czytać “1”, i jeśli autobus jest niski, oznacza to odczytywanie danych “0”. Przed przeczytaniem każdego fragmentu, sterownik dodaje sygnał startu.

Przeczytaj dane 0 i dane 1 z DS18B20

Przeczytaj dane 0 i dane 1 z DS18B20

Notatka: Aby zapewnić poprawną komunikację, bit danych musi zostać odczytany w ciągu 15 uS od początku przerwy odczytowej.

Podczas komunikacji, 8 kawałki “0” Lub “1” są używane jako bajt, a odczyt lub zapis bajtu rozpoczyna się od najniższego bitu.

2.5.4 Kolejność jednokrotnego odczytu temperatury (tylko jeden DS18B20 w autobusie)

1. Wyślij sygnał resetowania
2. Wykryj sygnał odpowiedzi
3. Wyślij 0xCC
4. Wyślij 0x44
5. Wyślij sygnał resetowania
6. Wykryj sygnał odpowiedzi
7. Napisz 0xcc
8. Napisz 0xbe
9. Pętla 8 razy, aby odczytać młodszy bajt temperatury
10. Pętla 8 razy, aby odczytać starszy bajt temperatury
11. Syntetyzuj 16-bitowe dane i proces dotyczące temperatury

3. Kod sterownika

3.1 DS18B20.c
#włączać “ds18b20.h”
/*
Funkcjonować: Inicjalizacja DS18B20
Połączenie sprzętowe: PB15
*/
nieważne DS18B20_Init(próżnia)
{
RCC->APB2ENR|=1<<3; //PB
GPIOB->CRH&=0x0FFFFFF;
GPIOB->CRH|=0x30000000;
GPIOB->ODR|=1<<15; //Podciąganie
}

/*
Funkcjonować: Sprawdź, czy urządzenie DS18B20 istnieje
Wartość zwracana: 1 oznacza, że ​​urządzenie nie istnieje 0 oznacza, że ​​urządzenie działa normalnie
*/
u8 DS18B20_CheckDevice(próżnia) //Zawiera impuls resetujący, impuls detekcyjny
{
DS18B20_OUTPUT_MODE();//Zainicjuj do trybu wyjściowego
DS18B20_OUT=0; //Wygeneruj impuls resetujący
Opóźnij nas(750); //Wygeneruj niski poziom 750us
DS18B20_OUT=1; //Zwolnić autobus
Opóźnij nas(15); //Poczekaj na odpowiedź DS18B20
Jeśli(DS18B20_CleckAck())//Wykryj impuls istnienia
{
powrót 1;
}
powrót 0;
}

/*
Funkcjonować: Wykryj impuls istnienia urządzenia DS18B20
Wartość zwracana: 1 wskazuje błąd 0 wskazuje na normalne
*/
u8 DS18B20_CleckAck(próżnia)
{
u8cnt=0;
DS18B20_INPUT_MODE();//Zainicjuj w trybie wprowadzania
chwila(DS18B20_IN&&cnt<200) //Wait for DS18B20 response existence pulse
{
Opóźnij nas(1);
cnt++;
}
Jeśli(cnt>=200)powrót 1; //błąd

cnt=0;
chwila((!DS18B20_IN)&&cnt<240) //wait for DS18B20 to release the bus
{
Opóźnij nas(1);
cnt++;
}
Jeśli(cnt>=240)powrót 1; //błąd
powrót 0;
}

/*
Funkcjonować: Write a byte
First learn how to write a bit.
*/
unieważnij DS18B20_WriteByte(u8 cmd)
{
u8 i;
DS18B20_OUTPUT_MODE(); //Zainicjuj do trybu wyjściowego
Do(i=0;I<8;I ++)
{
DS18B20_OUT=0; //Generate write time gap (write start)
Opóźnij nas(2);
DS18B20_OUT=cmd&0x01; //Send actual data bit
Opóźnij nas(60); //Wait for write completion
DS18B20_OUT=1; //Release the bus and prepare for the next transmission
cmd>>=1; //Continue to send the next bit of data
}
}

/*
Funkcjonować: Read a byte
First learn how to read a bit.
*/
u8 DS18B20_ReadByte(próżnia)
{
u8 i,data=0;
Do(i=0;I<8;I ++)
{
DS18B20_OUTPUT_MODE(); //Zainicjuj do trybu wyjściowego
DS18B20_OUT=0; //Generate read time gap (read start)
Opóźnij nas(2);
DS18B20_OUT=1; //Zwolnić autobus
DS18B20_INPUT_MODE(); //Zainicjuj w trybie wprowadzania
Opóźnij nas(8); //Wait for DS18B20 data output
dane>>=1; //Fill high bit with 0, default is 0
Jeśli(DS18B20_IN) dane|=0x80;
Opóźnij nas(60);
DS18B20_OUT=1; //Zwolnić autobus, wait for reading next bit of data
}
Dane zwracające;
}

/*
Funkcjonować: Read the temperature data of DS18B20 once
Wartość zwracana: the temperature data read
Considered situation: There is only one DS18B20 connected to the bus
*/
u16 DS18B20_ReadTemp(próżnia)
{
u16 temp=0;
u8 temp_H,temp_L;
DS18B20_CheckDevice(); //Send reset pulse, detect pulse
DS18B20_WriteByte(0xCC); //Skip ROM sequence detection
DS18B20_WriteByte(0x44); //Rozpocznij konwersję temperatury

//Poczekaj na zakończenie konwersji temperatury
chwila(DS18B20_ReadByte()!=0xFF){}

DS18B20_CheckDevice(); //Send reset pulse, detect pulse
DS18B20_WriteByte(0xCC); //Skip ROM sequence detection
DS18B20_WriteByte(0xBE); //Przeczytaj temperaturę

temp_L=DS18B20_ReadByte(); //Odczytaj dane o niskiej temperaturze
temp_H=DS18B20_ReadByte(); //Odczytaj dane dotyczące wysokiej temperatury
temp=temp_L|(temp_H<<8); //Syntetyzowana temperatura
temperatura powrotu;
}

3.2 DS18B20.h

#ifndef DS18B20_H
#zdefiniuj DS18B20_H
#włączać “stm32f10x.h”
#włączać “sys.h”
#włączać “opóźnienie.h”
#włączać “ds18b20.h”
#włączać “usart.h”

/*Interfejs pakietu*/

//Zainicjuj DS18B20 w trybie wejściowym
#zdefiniuj DS18B20_INPUT_MODE() {GPIOB->CRH&=0x0FFFFFF;GPIOB->CRH|=0x80000000;}

//Zainicjuj DS18B20 do trybu wyjściowego
#zdefiniuj DS18B20_OUTPUT_MODE(){GPIOB->CRH&=0x0FFFFFF;GPIOB->CRH|=0x30000000;}

//Wyjście portu IO DS18B20
#zdefiniuj DS18B20_OUT PBout(15)

//Wejście portu IO DS18B20
#zdefiniuj DS18B20_IN PBin(15)

//Deklaracja funkcji
u8 DS18B20_CleckAck(próżnia);
u8 DS18B20_CheckDevice(próżnia);
nieważne DS18B20_Init(próżnia);
u16 DS18B20_ReadTemp(próżnia);
u8 DS18B20_ReadByte(próżnia);
unieważnij DS18B20_WriteByte(u8 cmd);
#koniec

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
3.3 Funkcja opóźnienia

/*
Funkcjonować: Opóźnienie w nas
*/
unieważnij OpóźnienieUs(w nas)
{
#ifdef _SYSTICK_IRQ_
int,J;
Do(i=0;iVAL=0; //Wartość licznika CNT
SysTick->OBCIĄŻENIE=9*nas; //9 oznacza 1nas
SysTick->KLAWISZ KONTROLNY|=1<<0; //Uruchom minutnik
Do
{
tmp=SysTick->KLAWISZ KONTROLNY; //Przeczytaj stan
}chwila((!(tmp&1<<16))&&(tmp&1<<0));
SysTick->WARTOŚĆ=0; //Wartość licznika CNT
SysTick->KLAWISZ KONTROLNY&=~(1<<0); //Wyłącz minutnik
#koniec
};I ++)>

3.4 main.c Wywołaj DS18B20, aby odczytać temperaturę i wydrukować ją na porcie szeregowym

#włączać “stm32f10x.h”

#włączać “ds18b20.h”

u8 DS18B20_ROM[8]; //Store the 64-bit ROM code of DS18B20

int główny(próżnia)
{
u16 temp;
USARTx_Init(USART1,72,115200);//Initialization of serial port 1
DS18B20_Ciepło(); //Inicjalizacja DS18B20

/*1. Read the 64-bit ROM code of DS18B20*/
//Send reset pulse, detect existence pulse
chwila(DS18B20_CheckDevice())
{
drukuj(“DS18B20 device does not exist!\N”);
DelayMs(500);
}
//Send the command to read the 64-bit ROM code
DS18B20_WriteByte(0x33);

//Loop read 64-bit ROM code
Do(i=0;I<8;I ++)
{
DS18B20_ROM[I]= DS18B20_ReadByte();
drukuj(“DS18B20_ROM[%D]=0x%X\n”,I,DS18B20_ROM[I]);
}

chwila(1)
{
/*2. Simultaneously operate all DS18B20 on the bus to start converting temperature*/
DS18B20_CheckDevice(); //Send reset pulse, detect pulse
DS18B20_WriteByte(0xCC); //Skip ROM sequence detection
DS18B20_WriteByte(0x44); //Rozpocznij konwersję temperatury (let all DS18B20 on the bus convert the temperature)
DelayMs(500); //Wait for all DS18B20 temperature conversions on the line to complete

/*3. Single targeted reading of the temperature of each DS18B20*/
DS18B20_CheckDevice(); //Send reset pulse, detect pulse
DS18B20_WriteByte(0x55); //Send command to match ROM
Do(i=0;I<8;I ++) //Send 64-bit code
{
DS18B20_WriteByte(DS18B20_ROM[I]);
}
DS18B20_WriteByte(0xBE); //Przeczytaj temperaturę
temp=DS18B20_ReadByte(); //Read low-order temperature data
temp|=DS18B20_ReadByte()<<8; //Read high-order temperature data
drukuj(“temp1=%d.%d\n”,temp>>4,temp&0xF);
drukuj(“temp2=%f\n”,temp*0.0625);

DelayMs(500);
}
}