Temperatuursensor tegnologie

Ontwerp van DS18B20 digitale temperatuursensor vir STM32

DS18B20 Temperatuurwaarneming Draad Vlekvrye Staal Probe Kit

DS18B20 is 'n digitale temperatuursensor wat 'n enkele bustydsberekening gebruik om met die gasheer te kommunikeer. Slegs 1 Draad is nodig om die temperatuurdatalesing te voltooi;

DS18B20 het 'n ingeboude 64-bis produk reeksnommer vir maklike identifikasie. Verskeie DS18B20-sensors kan aan gekoppel word 1 Draad, en deur 64-bis identiteitsverifikasie, die temperatuurinligting wat van verskillende sensors ingesamel is, kan afsonderlik gelees word.

DS18B20 Temperatuurwaarneming Draad Vlekvrye Staal Probe Kit

DS18B20 Temperatuurwaarneming Draad Vlekvrye Staal Probe Kit

DS18B20 temperatuursensorsonde TPE-oorgietstel

DS18B20 temperatuursensorsonde TPE-oorgietstel

1 draad DS18B20 temperatuur sensor

1 draad DS18B20 temperatuur sensor

Inleiding tot DS18B20
2.1 Belangrikste kenmerke van DS18B20
1. Volledig digitale temperatuuromskakeling en -uitset.
2. Gevorderde enkelbus-datakommunikasie.
3. Tot 12-bis resolusie, met 'n akkuraatheid van tot ±0,5 grade Celsius.
4. Die maksimum werksiklus by 12-bis resolusie is 750 millisekondes.
5. Parasitiese werkmodus kan gekies word.
6. Die opsporingstemperatuurreeks is –55°C ~+125°C (–67° F ~+257° F).
7. Ingeboude EEPROM, temperatuur limiet alarm funksie.
8. 64-bietjie fotolitografie ROM, ingeboude produkreeksnommer, gerieflik vir multi-masjien verbinding.
9. Verskeie verpakkingsvorme, aan te pas by verskillende hardeware stelsels.

DS18B20-skyfiepakketstruktuur

DS18B20-skyfiepakketstruktuur

2.2 DS18B20 pen funksie
GND spanning grond;
DQ enkel data bus;
VDD kragtoevoer spanning;
NC leë pen;

DS18B20 chip RAM en EEPROM struktuurdiagram

DS18B20 chip RAM en EEPROM struktuurdiagram

2.3 DS18B20 werksbeginsel en toepassing
DS18B20 temperatuuropsporing en digitale data-uitset is ten volle geïntegreer op een skyfie, dus het dit sterker anti-inmenging vermoë. Sy een werksiklus kan in twee dele verdeel word, naamlik temperatuuropsporing en dataverwerking.

18B20 het drie vorme van geheuebronne. Hulle is: ROM-leesalleen geheue, gebruik om DS18B20ID-kode te stoor; die eerste 8 bisse is enkellyn-reekskode (DS18B20-kode is 19H), die volgende 48 bisse is die unieke reeksnommer van die skyfie; die laaste 8 bisse is die CRC-kode (oortolligheid tjek) van bogenoemde 56 stukkies. Die data word by produksie gestel en kan nie deur die gebruiker verander word nie. DS18B20 het 'n totaal van 64 stukkies ROM.

RAM-dataregister, gebruik vir interne berekening en datatoegang, data gaan verlore na kragonderbreking, DS18B20 het 'n totaal van 9 grepe RAM, elke greep is 8 stukkies. Die eerste en tweede grepe is die datawaarde-inligting na temperatuuromskakeling; die derde en vierde grepe is die spieëlbeeld van die gebruiker se EEPROM (word algemeen gebruik vir berging van temperatuuralarmwaardes). Die waarde daarvan sal verfris word wanneer die krag teruggestel word. Die vyfde greep is die spieëlbeeld van die gebruiker se derde EEPROM. Die 6de, 7ste, en 8ste grepe is telregisters, wat ontwerp is om gebruikers in staat te stel om hoër temperatuurresolusie te verkry. Hulle is ook tydelike bergingseenhede vir interne temperatuuromskakeling en berekening. Die 9de greep is die CRC-kode van die eerste 8 grepe. EEPROM is 'n nie-vlugtige geheue wat gebruik word om data te stoor wat vir 'n lang tyd gestoor moet word, boonste en onderste temperatuur alarmwaardes, en verifikasie data. DS18B20 het 'n totaal van 3 stukkies EEPROM, en daar is spieëlbeelde in RAM om gebruikerswerking te vergemaklik.

DS18B20 werk by verstek in 12-bis resolusiemodus. Die 12-bis data wat na omskakeling verkry word, word in twee 8-bis RAM's van DS18B20 gestoor (die eerste twee grepe). Die eerste 5 bisse in binêre is tekenbisse. As die gemete temperatuur groter is as 0, hierdie 5 stukkies is 0. Vermenigvuldig net die gemete waarde met 0.0625 om die werklike temperatuur te kry. As die temperatuur laer is as 0, hierdie 5 stukkies is 1. Die gemete waarde moet omgekeer word, bygevoeg deur 1, en dan vermenigvuldig met 0.0625 om die werklike temperatuur te kry. Of gebruik bietjie werking om temperatuur te onttrek: die desimale plekke beslaan die onderste 4 stukkies, en die boonste stukkies is heelgetalstukke (negatiewe getalle word nie oorweeg nie).

2.4 DS18B20 chip ROM instruksie tabel
1. Lees ROM [33H] (die heksadesimale opdragwoord is tussen vierkantige hakies).
Hierdie opdrag laat die busbeheerder toe om die 64-bis ROM van DS18B20 te lees. Hierdie instruksie kan slegs gebruik word wanneer daar net een DS18B20 op die bus is. As meer as een gekoppel is, datakonflikte sal tydens kommunikasie voorkom.

2. atch ROM [55H]
Hierdie instruksie word gevolg deur 'n 64-bis reeksnommer wat deur die kontroleerder uitgereik word. Wanneer daar verskeie DS18B20's op die bus is, slegs die skyfie met dieselfde reeksnommer as die een wat deur die kontroleerder uitgereik is, kan reageer, en die ander skyfies sal wag vir die volgende reset. Hierdie instruksie is geskik vir enkelskyfie- en multiskyfieverbinding.

3. Slaan ROM oor [CCH]
Hierdie instruksie maak dat die skyfie nie op die ROM-kode reageer nie. In die geval van 'n enkele bus, hierdie instruksie kan gebruik word om tyd te bespaar. As hierdie instruksie gebruik word wanneer verskeie skyfies gekoppel is, datakonflikte sal voorkom, foute tot gevolg het.

4. Soek ROM [F0H]
Nadat die skyfie geïnitialiseer is, die soekinstruksie laat toe dat die 64-bis ROM van alle toestelle geïdentifiseer word deur uitskakeling wanneer verskeie skyfies aan die bus gekoppel is.

5. Alarm Soek [ELKE]
In die geval van veelvuldige skyfies, die alarmskyfie-soekinstruksie reageer slegs op skyfies wat voldoen aan die alarmtoestand van temperatuur hoër as TH of minder as TL. Solank die chip nie afgeskakel is nie, die alarmtoestand sal gehandhaaf word totdat die temperatuur weer gemeet word en die alarmtoestand nie bereik word nie.

6. Skryf Scratchpad [4EH]
Dit is die instruksie om data na RAM te skryf. Die twee grepe data wat daarna geskryf is, sal by adres gestoor word 2 (TH van alarm RAM) en adres 3 (TL van alarm RAM). Die skryfproses kan deur 'n terugstelsein beëindig word.

7. Lees Scratchpad (lees data vanaf RAM) [BEH]
Hierdie instruksie sal data vanaf RAM lees, vanaf adres 0 en aan te spreek 9, voltooiing van die lees van die hele RAM-data. Die skyfie laat die terugstelsein toe om die leesproses te beëindig, dit wil sê, die daaropvolgende onnodige grepe kan geïgnoreer word om die leestyd te verminder.

8. Kopieer Kladblok (kopieer RAM-data na EEPROM) [48H]
Hierdie instruksie stoor die data in RAM in EEPROM sodat die data nie verlore sal gaan wanneer krag af is nie. Aangesien die skyfie besig is met EEPROM-bergingverwerking, wanneer die beheerder 'n leestydgleuf stuur, die busuitsette “0”, en wanneer die bergingswerk voltooi is, die bus sal uitvoer “1”.
In parasitiese werkmodus, 'n sterk optrek moet onmiddellik gebruik word nadat hierdie instruksie uitgereik is en vir ten minste 10MS onderhou word om skyfiewerking te handhaaf.

9. Skakel T (temperatuur omskakeling) [44H]
Na ontvangs van hierdie instruksie, die skyfie sal 'n temperatuuromskakeling uitvoer en die omgeskakelde temperatuurwaarde in die 1ste en 2de adresse van RAM stoor. Aangesien die skyfie besig is met verwerking van temperatuuromskakeling, wanneer die beheerder 'n leestydgleuf stuur, die busuitsette “0”, en wanneer die bergingswerk voltooi is, die bus sal uitvoer “1”. In parasitiese werkmodus, 'n sterk optrek moet onmiddellik gebruik word nadat hierdie instruksie uitgereik is en vir ten minste 500MS onderhou word om skyfiewerking te handhaaf.

10. Herroep EEPROM (Kopieer die alarmwaarde in EEPROM na RAM) [B8H]
Hierdie instruksie kopieer die alarmwaarde in EEPROM na die 3de en 4de grepe in RAM. Aangesien die skyfie besig is met kopieerverwerking, wanneer die beheerder 'n leestydgleuf stuur, die busuitsette “0”, en wanneer die bergingswerk voltooi is, die busuitsette “1”. Daarby, hierdie instruksie sal outomaties uitgevoer word wanneer die skyfie aangeskakel en teruggestel word. Op hierdie manier, die twee alarmgreepbisse in RAM sal altyd die spieëlbeeld van die data in EEPROM wees.

11. Lees Power Supply (Werkmodusskakelaar) [B4H]
Nadat hierdie instruksie uitgereik is, 'n leestydgaping word uitgereik, en die skyfie sal sy kragstatuswoord terugstuur. “0” is die parasitiese magstaat en “1” is die eksterne kragtoestand.

2.5 DS18B20 Tyddiagram
2.5.1 DS18B20 Terugstel- en reaksieverwantskapdiagram
'n Terugstelling moet voor elke kommunikasie uitgevoer word. Die terugsteltyd, wagtyd, en reaksietyd moet streng volgens die tydsberekening geprogrammeer word.
DS18B20 lees en skryf tyd gaping: DS18B20 data lees en skryf word bevestig deur die tyd gaping verwerking bietjie en opdrag woord om inligting uit te ruil.

DS18B20-terugstelling en reaksieverwantskapdiagram

DS18B20-terugstelling en reaksieverwantskapdiagram

2.5.2 Skryf data 0 en data 1 na DS18B20
In die eerste 15uS van die skryfdata tyd gaping, die bus moet deur die beheerder laag getrek word, en dan sal dit die skyfie-steekproeftyd vir die busdata wees. Die steekproeftyd is 15 ~ 60uS. As die beheerder die bus hoog trek tydens die monsternemingstyd, dit beteken skryf “1”, en as die beheerder die bus laag trek, dit beteken skryf “0”.
Elke stukkie transmissie moet 'n lae-vlak beginpunt van ten minste 15uS hê, en die daaropvolgende data “0” of “1” moet binne 45uS voltooi word.
Die transmissietyd van die hele bietjie moet op 60~120uS gehou word, anders kan die normale kommunikasie nie gewaarborg word nie.
Let wel: DS18B20 lees en skryf data vanaf die lae bietjie.

Skryf data 0 en data 1 na DS18B20

Skryf data 0 en data 1 na DS18B20

2.5.3 Lees data 0 en data 1 van DS18B20
Die steekproeftyd van die kontrole tydens die leestydgaping behoort meer akkuraat te wees. Tydens die lees tyd gaping, die gasheer moet ook 'n lae vlak van ten minste 1uS genereer om die begin van die leestyd aan te dui. Toe, in 15uS nadat die bus vrygelaat is, die DS18B20 sal die interne databis stuur. Op hierdie tydstip, as die beheer vind dat die bus hoog is, dit beteken lees “1”, en as die bus laag is, dit beteken om data te lees “0”. Voordat jy elke stukkie lees, die beheerder voeg 'n beginsein by.

Lees data 0 en data 1 van DS18B20

Lees data 0 en data 1 van DS18B20

Let wel: Die databis moet binne 15uS van die begin van die leesgaping gelees word om korrekte kommunikasie te verseker.

Tydens kommunikasie, 8 stukkies van “0” of “1” word as 'n greep gebruik, en die lees of skryf van die greep begin vanaf die lae bietjie.

2.5.4 Volgorde van lees temperatuur een keer (slegs 'n enkele DS18B20 op die bus)

1. Stuur terugstelsein
2. Bespeur reaksiesein
3. Stuur 0xCC
4. Stuur 0x44
5. Stuur terugstelsein
6. Bespeur reaksiesein
7. Skryf 0xcc
8. Skryf 0xbe
9. Lus 8 keer om die lae greep temperatuur te lees
10. Lus 8 keer om die hoë greep temperatuur te lees
11. Sintetiseer 16-bis temperatuur data en verwerk

3. Bestuurder kode

3.1 DS18B20.c
#insluit “ds18b20.h”
/*
Funksie: DS18B20 inisialisering
Hardeware verbinding: PB15
*/
nietig DS18B20_Init(nietig)
{
RCC->APB2ENR|=1<<3; //PB
GPIOB->CRH&=0x0FFFFFFF;
GPIOB->CRH|=0x30000000;
GPIOB->ODR|=1<<15; //Optrek
}

/*
Funksie: Kyk of die DS18B20-toestel bestaan
Retourwaarde: 1 beteken die toestel bestaan ​​nie 0 beteken die toestel is normaal
*/
u8 DS18B20_CheckDevice(nietig) //Bevat terugstelpuls, opsporing pols
{
DS18B20_OUTPUT_MODE();//Inisialiseer na uitvoermodus
DS18B20_OUT=0; //Genereer reset pols
Vertraag Ons(750); //Genereer 750 ons lae vlak
DS18B20_OUT=1; //Los bus vry
Vertraag Ons(15); //Wag vir DS18B20 reaksie
as(DS18B20_CleckAck())//Bespeur bestaanspuls
{
terugkeer 1;
}
terugkeer 0;
}

/*
Funksie: Bespeur die bestaanspuls van die DS18B20-toestel
Retourwaarde: 1 dui op fout 0 dui normaal aan
*/
u8 DS18B20_CleckAck(nietig)
{
u8 cnt=0;
DS18B20_INPUT_MODE();//Inisialiseer na invoermodus
terwyl(DS18B20_IN&&cnt<200) //Wag vir DS18B20 reaksie bestaan ​​pols
{
Vertraag Ons(1);
cnt++;
}
as(cnt>=200)terugkeer 1; //fout

cnt=0;
terwyl((!DS18B20_IN)&&cnt<240) //wag vir DS18B20 om die bus vry te stel
{
Vertraag Ons(1);
cnt++;
}
as(cnt>=240)terugkeer 1; //fout
terugkeer 0;
}

/*
Funksie: Skryf 'n greep
Leer eers hoe om 'n bietjie te skryf.
*/
nietig DS18B20_WriteByte(u8 cmd)
{
u8 ek;
DS18B20_OUTPUT_MODE(); //Inisialiseer na uitvoermodus
vir(i=0;i<8;ek++)
{
DS18B20_OUT=0; //Genereer skryftydgaping (skryf begin)
Vertraag Ons(2);
DS18B20_OUT=cmd&0x01; //Stuur werklike databis
Vertraag Ons(60); //Wag vir voltooiing van skryf
DS18B20_OUT=1; //Laat die bus los en berei voor vir die volgende uitsending
cmd>>=1; //Gaan voort om die volgende stukkie data te stuur
}
}

/*
Funksie: Lees 'n greep
Leer eers hoe om 'n bietjie te lees.
*/
u8 DS18B20_ReadByte(nietig)
{
u8 ek,data=0;
vir(i=0;i<8;ek++)
{
DS18B20_OUTPUT_MODE(); //Inisialiseer na uitvoermodus
DS18B20_OUT=0; //Genereer leestyd gaping (lees begin)
Vertraag Ons(2);
DS18B20_OUT=1; //Los bus vry
DS18B20_INPUT_MODE(); //Inisialiseer na invoermodus
Vertraag Ons(8); //Wag vir DS18B20 data-uitvoer
data>>=1; //Vul hoë bietjie met 0, verstek is 0
as(DS18B20_IN) data|=0x80;
Vertraag Ons(60);
DS18B20_OUT=1; //Los bus vry, wag vir die lees van die volgende stukkie data
}
data terugstuur;
}

/*
Funksie: Lees die temperatuurdata van DS18B20 een keer
Retourwaarde: die temperatuurdata gelees
Oorweeg situasie: Daar is net een DS18B20 gekoppel aan die bus
*/
u16 DS18B20_ReadTemp(nietig)
{
u16 temp=0;
u8 temp_H,temp_L;
DS18B20_CheckDevice(); //Stuur reset pols, pols bespeur
DS18B20_WriteByte(0xCC); //Slaan ROM-volgordebespeuring oor
DS18B20_WriteByte(0x44); //Begin 'n temperatuuromskakeling

//Wag totdat temperatuuromskakeling voltooi is
terwyl(DS18B20_ReadByte()!=0xFF){}

DS18B20_CheckDevice(); //Stuur reset pols, pols bespeur
DS18B20_WriteByte(0xCC); //Slaan ROM-volgordebespeuring oor
DS18B20_WriteByte(0xBE); //Lees temperatuur

temp_L=DS18B20_ReadByte(); //Lees lae temperatuur data
temp_H=DS18B20_ReadByte(); //Lees data oor hoë temperatuur
temp=temp_L|(temp_H<<8); //gesintetiseerde temperatuur
terugkeer temp;
}

3.2 DS18B20.h

#ifndef DS18B20_H
#definieer DS18B20_H
#insluit “stm32f10x.h”
#insluit “sys.h”
#insluit “vertraging.h”
#insluit “ds18b20.h”
#insluit “usart.h”

/*Pakketkoppelvlak*/

//Inisialiseer DS18B20 na invoermodus
#definieer DS18B20_INPUT_MODE() {GPIOB->CRH&=0x0FFFFFFF;GPIOB->CRH|=0x80000000;}

//Inisialiseer DS18B20 na uitsetmodus
#definieer DS18B20_OUTPUT_MODE(){GPIOB->CRH&=0x0FFFFFFF;GPIOB->CRH|=0x30000000;}

//DS18B20 IO poort uitset
#definieer DS18B20_OUT PBout(15)

//DS18B20 IO-poortinvoer
#definieer DS18B20_IN PBin(15)

//Funksie verklaring
u8 DS18B20_CleckAck(nietig);
u8 DS18B20_CheckDevice(nietig);
nietig DS18B20_Init(nietig);
u16 DS18B20_ReadTemp(nietig);
u8 DS18B20_ReadByte(nietig);
nietig DS18B20_WriteByte(u8 cmd);
#endif

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
3.3 Vertragingsfunksie

/*
Funksie: Vertraag in ons
*/
nietig DelayUs(int ons)
{
#ifdef _SYSTICK_IRQ_
int i,j;
vir(i=0;iVAL=0; //CNT-tellerwaarde
SysTick->LAAI=9*ons; //9 beteken 1us
SysTick->CTRL|=1<<0; //Begin timer
doen
{
tmp=SysTick->CTRL; //Lees status
}terwyl((!(tmp&1<<16))&&(tmp&1<<0));
SysTick->VAL=0; //CNT-tellerwaarde
SysTick->CTRL&=~(1<<0); //Skakel die timer af
#endif
};ek++)>

3.4 main.c Skakel DS18B20 om die temperatuur te lees en druk dit na die reekspoort

#insluit “stm32f10x.h”

#insluit “ds18b20.h”

u8 DS18B20_ROM[8]; //Stoor die 64-bis ROM-kode van DS18B20

int hoof(nietig)
{
u16 temp;
USARTx_Heat(USART1,72,115200);//Inisialisering van seriële poort 1
DS18B20_Heat(); //DS18B20 inisialisering

/*1. Lees die 64-bis ROM-kode van DS18B20*/
//Stuur reset pols, bespeur bestaanspuls
terwyl(DS18B20_CheckDevice())
{
drukf(“DS18B20-toestel bestaan ​​nie!\n”);
Vertraag Mev(500);
}
//Stuur die opdrag om die 64-bis ROM-kode te lees
DS18B20_WriteByte(0x33);

//Lus lees 64-bis ROM kode
vir(i=0;i<8;ek++)
{
DS18B20_ROM[i]= DS18B20_ReadByte();
drukf(“DS18B20_ROM[%d]=0x%Xn”,i,DS18B20_ROM[i]);
}

terwyl(1)
{
/*2. Bedryf gelyktydig alle DS18B20 op die bus om temperatuur te begin omskakel*/
DS18B20_CheckDevice(); //Stuur reset pols, pols bespeur
DS18B20_WriteByte(0xCC); //Slaan ROM-volgordebespeuring oor
DS18B20_WriteByte(0x44); //Begin 'n temperatuuromskakeling (laat alle DS18B20 op die bus die temperatuur omskakel)
Vertraag Mev(500); //Wag totdat alle DS18B20-temperatuuromskakelings op die lyn voltooi is

/*3. Enkele geteikende lesing van die temperatuur van elke DS18B20*/
DS18B20_CheckDevice(); //Stuur reset pols, pols bespeur
DS18B20_WriteByte(0x55); //Stuur opdrag om ROM te pas
vir(i=0;i<8;ek++) //Stuur 64-bis kode
{
DS18B20_WriteByte(DS18B20_ROM[i]);
}
DS18B20_WriteByte(0xBE); //Lees temperatuur
temp=DS18B20_ReadByte(); //Lees lae-orde temperatuur data
temp|=DS18B20_ReadByte()<<8; //Lees hoë-orde temperatuur data
drukf(“temp1=%d.%dn”,temp>>4,temp&0xF);
drukf(“temp2=%fn”,temp*0,0625);

Vertraag Mev(500);
}
}