Technologie van temperatuursensoren

Ontwerp van DS18B20 Digitale temperatuursensor voor STM32

DS18B20 Temperatuurdetectiedraad Roestvrijstalen sondekit

DS18B20 is een digitale temperatuursensor die een enkele bustiming gebruikt om met de host te communiceren. Alleen 1 Draad is nodig om de temperatuurgegevenslezing te voltooien;

DS18B20 heeft een ingebouwd 64-bits product serienummer voor eenvoudige identificatie. Meerdere DS18B20 -sensoren kunnen worden aangesloten 1 Draad, en via 64-bit identiteitsauthenticatie, De temperatuurinformatie verzameld van verschillende sensoren kan afzonderlijk worden gelezen.

DS18B20 Temperatuurdetectiedraad Roestvrijstalen sondekit

DS18B20 Temperatuurdetectiedraad Roestvrijstalen sondekit

DS18B20 Temperatuursensor sonde TPE overmolding Kit

DS18B20 Temperatuursensor sonde TPE overmolding Kit

1 Draad DS18B20 Temperatuursensor

1 Draad DS18B20 Temperatuursensor

Inleiding tot DS18B20
2.1 Hoofdkenmerken van DS18B20
1. Volledig digitale temperatuurconversie en output.
2. Geavanceerde enkele busgegevenscommunicatie.
3. Tot 12-bit resolutie, Met een nauwkeurigheid van maximaal ± 0,5 graden Celsius.
4. De maximale werkcyclus bij 12-bit resolutie is 750 milliseconden.
5. Parasitaire werkmodus kan worden geselecteerd.
6. Het detectietemperatuurbereik is –55 ° C ~+125 ° C (–67 ° F ~+257 ° F).
7. Ingebouwde EEPROM, Temperatuurbeperk alarmfunctie.
8. 64-Bit fotolithografie ROM, ingebouwd product serienummer, Handig voor multi-machine-verbinding.
9. Verschillende verpakkingsformulieren, aanpassen aan verschillende hardwaresystemen.

DS18B20 ChIP -pakketstructuur

DS18B20 ChIP -pakketstructuur

2.2 DS18B20 PIN -functie
GND -spanningsgrond;
DQ enkele gegevensbus;
VDD -voedingspanning;
NC lege pin;

DS18B20 CHIP RAM en EEPROM -structuurdiagram

DS18B20 CHIP RAM en EEPROM -structuurdiagram

2.3 DS18B20 Werkprincipe en toepassing
DS18B20 Temperatuurdetectie en digitale gegevensuitvoer zijn volledig geïntegreerd op één chip, Dus het heeft een sterker anti-interferentievermogen. De werkcyclus van één kan worden onderverdeeld in twee delen, namelijk temperatuurdetectie en gegevensverwerking.

18B20 heeft drie vormen van geheugenbronnen. Ze zijn: Rom alleen-lezen geheugen, Gebruikt om DS18B20ID -code op te slaan; de eerste 8 Bits zijn single-line serie code (DS18B20 -code is 19h), het volgende 48 Bits zijn het unieke serienummer van de chip; het laatste 8 Bits zijn de CRC -code (redundantiecontrole) van het bovenstaande 56 bits. De gegevens worden ingesteld bij de productie en kunnen niet door de gebruiker worden gewijzigd. DS18B20 heeft in totaal 64 Bits of Rom.

RAM -gegevensregister, gebruikt voor interne berekening en gegevenstoegang, Gegevens gaan verloren na stroomuitval, DS18B20 heeft in totaal 9 bytes van ram, Elke byte is 8 bits. De eerste en tweede bytes zijn de gegevenswaarde -informatie na temperatuurconversie; De derde en vierde bytes zijn de spiegelafbeelding van de EEPROM van de gebruiker (Vaak gebruikt voor opslag van de temperatuur alarmwaarde). De waarde ervan wordt vernieuwd wanneer de stroom wordt gereset. De vijfde byte is het spiegelbeeld van de derde EEPROM van de gebruiker. De 6e, 7e, en 8e bytes zijn telregisters, die zijn ontworpen om gebruikers in staat te stellen een hogere temperatuurresolutie te verkrijgen. Het zijn ook tijdelijke opslageenheden voor interne temperatuurconversie en berekening. De 9e byte is de CRC -code van de eerste 8 bytes. EEPROM is een niet-vluchtig geheugen dat wordt gebruikt om gegevens op te slaan die lange tijd moeten worden opgeslagen, Boven- en onderste temperatuuralarmwaarden, en verificatiegegevens. DS18B20 heeft in totaal 3 Bits van EEPROM, en er zijn spiegelafbeeldingen in RAM om de werknemersbewerking te vergemakkelijken.

DS18B20 werkt standaard in de 12-bit resolutiemodus. De 12-bit gegevens verkregen na conversie worden opgeslagen in twee 8-bit rammen van DS18B20 (de eerste twee bytes). De eerste 5 Bits in binaire banken zijn bits. Als de gemeten temperatuur groter is dan 0, deze 5 Bits zijn 0. Vermenigvuldig de gemeten waarde gewoon door 0.0625 Om de werkelijke temperatuur te krijgen. Als de temperatuur minder is dan 0, deze 5 Bits zijn 1. De gemeten waarde moet worden omgekeerd, toegevoegd door 1, en vervolgens vermenigvuldigd door 0.0625 Om de werkelijke temperatuur te krijgen. Of gebruik bitbewerking om de temperatuur te extraheren: de decimalen bezetten de lagere 4 bits, en de bovenste bits zijn gehele stukjes (Negatieve getallen worden niet overwogen).

2.4 DS18B20 Chip ROM Instructietabel
1. Lees ROM [33H] (Het hexadecimale commando woord is tussen vierkante haakjes).
Met deze opdracht kan de buscontroller de 64-bit ROM van DS18B20 lezen. Deze instructie kan alleen worden gebruikt als er slechts één DS18B20 in de bus is. Als er meer dan één is verbonden, Gegevensconflicten zullen optreden tijdens de communicatie.

2. atch rom [55H]
Deze instructie wordt gevolgd door een 64-bit serienummer uitgegeven door de controller. Wanneer er meerdere DS18B20's in de bus zijn, Alleen de chip met hetzelfde serienummer als die van de controller kan reageren, En de andere chips wachten op de volgende reset. Deze instructie is geschikt voor connectie met één chip en multi-chip.

3. Schipkamer [CCH]
Door deze instructie reageert de chip niet op de ROM -code. In het geval van een enkele bus, Deze instructie kan worden gebruikt om tijd te besparen. Als deze instructie wordt gebruikt wanneer meerdere chips zijn aangesloten, Gegevensconflicten zullen optreden, resulterend in fouten.

4. Zoek ROM [F0H]
Nadat de chip is geïnitialiseerd, Met de zoekinstructie kan de 64-bit ROM van alle apparaten worden geïdentificeerd door eliminatie wanneer meerdere chips zijn aangesloten op de bus.

5. Alarmonderzoek [I]
In het geval van meerdere chips, De alarmchipzoekinstructie reageert alleen op chips die voldoen aan de alarmconditie van temperatuur hoger dan th of kleiner dan TL. Zolang de chip niet wordt uitgeschakeld, De alarmstatus wordt gehandhaafd totdat de temperatuur opnieuw wordt gemeten en de alarmconditie niet is bereikt.

6. Schrijf scratchpad [4Eh]
Dit is de instructie om gegevens naar RAM te schrijven. De twee bytes aan gegevens die later worden geschreven, worden op het adres opgeslagen 2 (TH van alarm ram) en adres 3 (Tl van alarm ram). Het schrijfproces kan worden beëindigd door een reset -signaal.

7. Lees Scratchpad (Lees gegevens van RAM) [Beh]
Deze instructie leest gegevens van RAM, Beginnend bij het adres 0 en om te adres 9, Het lezen van de gehele RAM -gegevens voltooien. Met de chip kan het resetsignaal het leesproces beëindigen, dat is, De daaropvolgende onnodige bytes kunnen worden genegeerd om de leestijd te verminderen.

8. Kopieer scratchpad (Kopieer RAM -gegevens naar EEPROM) [48H]
Deze instructie slaat de gegevens op in RAM in EEPROM, zodat de gegevens niet verloren gaan wanneer de stroom is uitgeschakeld. Omdat de chip bezig is met de opslagverwerking van EEPROM, Wanneer de controller een leestijdslot verzendt, De bus uitgangen “0”, en wanneer het opslagwerk is voltooid, De bus zal uitgaan “1”.
In parasitaire werkmodus, Een sterke pull-up moet onmiddellijk worden gebruikt nadat deze instructie is uitgegeven en gehandhaafd voor minimaal 10 ms om de chipbewerking te behouden.

9. Converteer t (temperatuurconversie) [44H]
Na het ontvangen van deze instructie, De chip zal een temperatuurconversie uitvoeren en de geconverteerde temperatuurwaarde opslaan in de 1e en 2e adressen van RAM. Omdat de chip bezig is met de verwerking van temperatuurconversie, Wanneer de controller een leestijdslot verzendt, De bus uitgangen “0”, en wanneer het opslagwerk is voltooid, De bus zal uitgaan “1”. In parasitaire werkmodus, Een sterke pull-up moet onmiddellijk worden gebruikt nadat deze instructie is uitgegeven en gehandhaafd voor minimaal 500 ms om de chipbewerking te behouden.

10. Deck Eeprom (Kopieer de alarmwaarde in EEPROM naar RAM) [B8H]
Deze instructie kopieert de alarmwaarde in EEPROM naar de 3e en 4e bytes in RAM. Omdat de chip bezig is met het kopiëren van verwerking, Wanneer de controller een leestijdslot verzendt, De bus uitgangen “0”, en wanneer het opslagwerk is voltooid, De bus uitgangen “1”. In aanvulling, Deze instructie wordt automatisch uitgevoerd wanneer de chip wordt ingeschakeld en gereset. Op deze manier, De twee alarmbyte -bits in RAM zullen altijd het spiegelbeeld zijn van de gegevens in EEPROM.

11. Lees de voeding (Werkmodusschakelaar) [B4H]
Nadat deze instructie is uitgegeven, Er wordt een leesstijd gap uitgegeven, en de chip zal zijn stroomstatuswoord retourneren. “0” is de parasitaire machtstoestand en “1” is de externe stroomstatus.

2.5 DS18B20 Timing Diagram
2.5.1 DS18B20 RESET- EN RESSSOPRELATIE DIAGRAM
Een reset moet worden uitgevoerd vóór elke communicatie. De reset -tijd, wachttijd, en de responstijd moet strikt worden geprogrammeerd volgens de timing.
DS18B20 Lees en schrijf tijdspleet: DS18B20 Gegevenslezen en schrijven wordt bevestigd door de Time Gap Processing Bit en Command Word om informatie uit te wisselen.

DS18B20 RESET- EN RESSSOPRELATIE DIAGRAM

DS18B20 RESET- EN RESSSOPRELATIE DIAGRAM

2.5.2 Schrijf gegevens 0 en gegevens 1 naar DS18B20
In de eerste 15us van de schrijfgegevenstijd gap, De bus moet laag worden getrokken door de controller, En dan is het de chip -bemonsteringstijd voor de busgegevens. De bemonsteringstijd is 15 ~ 60us. Als de controller de bus hoog trekt tijdens de bemonsteringstijd, het betekent schrijven “1”, En als de controller de bus laag trekt, het betekent schrijven “0”.
Elk stukje transmissie moet een startbit op laag niveau van minimaal 15us hebben, en de daaropvolgende gegevens “0” of “1” moet binnen 45US worden voltooid.
De transmissietijd van het hele bit moet worden bewaard op 60 ~ 120US, anders kan de normale communicatie niet worden gegarandeerd.
Opmerking: DS18B20 leest en schrijft gegevens van het lage bit.

Schrijf gegevens 0 en gegevens 1 naar DS18B20

Schrijf gegevens 0 en gegevens 1 naar DS18B20

2.5.3 Gegevens lezen 0 en gegevens 1 Van DS18B20
De bemonsteringstijd van de controle tijdens de leesstijdspleet moet nauwkeuriger zijn. Tijdens de leestijdspleet, De host moet ook een laag niveau van ten minste 1us genereren om het begin van de leestijd aan te geven. Dan, in 15us nadat de bus is vrijgegeven, De DS18B20 verzendt het interne gegevensbit. Op dit moment, Als de bediening vaststelt dat de bus hoog is, het betekent lezen “1”, En als de bus laag is, Het betekent gegevens lezen “0”. Voordat u elk beetje leest, De controller voegt een startsignaal toe.

Lees gegevens 0 en gegevens 1 Van DS18B20

Lees gegevens 0 en gegevens 1 Van DS18B20

Opmerking: De gegevensbit moet worden gelezen binnen 15us na het begin van de leesgat om de juiste communicatie te garanderen.

Tijdens de communicatie, 8 bits van “0” of “1” worden gebruikt als een byte, en het lezen of schrijven van de byte begint vanaf het lage stukje.

2.5.4 Volgorde van leestemperatuur eenmaal (Slechts een enkele DS18B20 in de bus)

1. Stuur het reset -signaal
2. Detecteer het reactiesignaal
3. Stuur 0xcc
4. Stuur 0x44
5. Stuur het reset -signaal
6. Detecteer het reactiesignaal
7. Schrijf 0xcc
8. Schrijf 0xbe
9. Lus 8 keer om de lage byte van temperatuur te lezen
10. Lus 8 tijden om de hoge byte van temperatuur te lezen
11. Synthetiseer 16-bits temperatuurgegevens en proces

3. Stuurcode

3.1 Ds18b20.c
#erbij betrekken “DS18B20.H”
/*
Functie: DS18B20 -initialisatie
Hardwareverbinding: PB15
*/
void ds18b20_init(leegte)
{
RCC->APB2ENR|= 1<<3; //PB
Gpiob->CRH&= 0x0fffffff;
Gpiob->CRH|= 0x30000000;
Gpiob->ODR|= 1<<15; //Optrek
}

/*
Functie: Controleer of het DS18B20 -apparaat bestaat
Retourwaarde: 1 betekent dat het apparaat niet bestaat 0 betekent dat het apparaat normaal is
*/
U8 DS18B20_CHECKDEVICE(leegte) //Bevat resetpuls, detectiepuls
{
Ds18b20_output_mode();//Initialiseren naar de uitvoermodus
Ds18b20_out = 0; //Genereer resetpuls
Vertraging(750); //Genereer 750US laag niveau
Ds18b20_out = 1; //Release bus
Vertraging(15); //Wacht op DS18B20 -reactie
als(DS18B20_CLECKACK())//Detecteer bestaanpuls
{
opbrengst 1;
}
opbrengst 0;
}

/*
Functie: Detecteer bestaan ​​puls van DS18B20 -apparaat
Retourwaarde: 1 geeft fout aan 0 geeft normaal aan
*/
U8 DS18B20_CLECKACK(leegte)
{
u8 cnt=0;
Ds18b20_input_mode();//Initialiseren naar de invoermodus
terwijl(Ds18b20_in&&CNT<200) //Wacht op DS18B20 Response bestaan ​​Puls
{
Vertraging(1);
CNT ++;
}
als(CNT>= 200)opbrengst 1; //fout

CNT = 0;
terwijl((!Ds18b20_in)&&CNT<240) //Wacht tot DS18B20 de bus heeft losgelaten
{
Vertraging(1);
CNT ++;
}
als(CNT>= 240)opbrengst 1; //fout
opbrengst 0;
}

/*
Functie: Schrijf een byte
Leer eerst een beetje te schrijven.
*/
void ds18b20_writeByte(U8 cmd)
{
U8 I;
Ds18b20_output_mode(); //Initialiseren naar de uitvoermodus
voor(i = 0;i<8;I ++)
{
Ds18b20_out = 0; //Writing Time Gap genereren (Schrijf Start)
Vertraging(2);
Ds18b20_out = cmd&0X01; //Stuur het werkelijke gegevensbit
Vertraging(60); //Wacht op schrijven van voltooiing
Ds18b20_out = 1; //Laat de bus los en bereid je voor op de volgende transmissie
CMD>>= 1; //Blijf het volgende stukje gegevens verzenden
}
}

/*
Functie: Lees een byte
Leer eerst een beetje lezen.
*/
U8 DS18B20_READBYTE(leegte)
{
U8 I,Data = 0;
voor(i = 0;i<8;I ++)
{
Ds18b20_output_mode(); //Initialiseren naar de uitvoermodus
Ds18b20_out = 0; //Genereer leestijdspleet (Lees Start)
Vertraging(2);
Ds18b20_out = 1; //Release bus
Ds18b20_input_mode(); //Initialiseren naar de invoermodus
Vertraging(8); //Wacht op DS18B20 -gegevensuitvoer
gegevens>>= 1; //Vul een hoog stukje met 0, Standaard is 0
als(Ds18b20_in) gegevens|= 0x80;
Vertraging(60);
Ds18b20_out = 1; //Release bus, Wacht op het lezen van volgende stukjes gegevens
}
Retourgegevens;
}

/*
Functie: Lees eenmaal de temperatuurgegevens van DS18B20
Retourwaarde: De temperatuurgegevens lezen
Beschouwde situatie: Er is slechts één DS18B20 verbonden met de bus
*/
U16 DS18B20_READTEMP(leegte)
{
U16 TEMP = 0;
u8 temp_h,temp_l;
Ds18b20_checkdevice(); //Stuur Reset Pulse, detecteren puls
Ds18b20_writeByte(0XCC); //Sla Rom Sequence Detectie over
Ds18b20_writeByte(0x44); //Start een temperatuurconversie

//Wacht tot de temperatuurconversie is voltooid
terwijl(DS18B20_READBYTE()!= 0xff){}

Ds18b20_checkdevice(); //Stuur Reset Pulse, detecteren puls
Ds18b20_writeByte(0XCC); //Sla Rom Sequence Detectie over
Ds18b20_writeByte(0Xbe); //Lees de temperatuur

temp_l = ds18b20_readbyte(); //Lees gegevens met lage temperatuur
temp_h = ds18b20_readbyte(); //Lees gegevens op hoge temperatuur
temp = temp_l|(temp_h<<8); //Gesynthetiseerde temperatuur
Retour Temp;
}

3.2 DS18B20.H

#ifndef ds18b20_h
#Definieer ds18b20_h
#erbij betrekken “STM32F10X.H”
#erbij betrekken “sys.h”
#erbij betrekken “vertraging.h”
#erbij betrekken “DS18B20.H”
#erbij betrekken “USART.H”

/*Pakketinterface*/

//Initialiseer DS18B20 in de invoermodus
#Definieer ds18b20_input_mode() {Gpiob->CRH&= 0x0fffffff;Gpiob->CRH|= 0x80000000;}

//Initialiseer DS18B20 naar de uitvoermodus
#Definieer ds18b20_output_mode(){Gpiob->CRH&= 0x0fffffff;Gpiob->CRH|= 0x30000000;}

//DS18B20 IO -poortuitgang
#Definieer ds18b20_out pbout(15)

//DS18B20 IO -poortinvoer
#Definieer ds18b20_in pbin(15)

//Functie -verklaring
U8 DS18B20_CLECKACK(leegte);
U8 DS18B20_CHECKDEVICE(leegte);
void ds18b20_init(leegte);
U16 DS18B20_READTEMP(leegte);
U8 DS18B20_READBYTE(leegte);
void ds18b20_writeByte(U8 cmd);
#endif

POYBAGDYDXCAWKKMAAAAK8RNS4S030.PNG
3.3 Vertragingsfunctie

/*
Functie: Vertraging in ons
*/
Void DelayUS(Int ons)
{
#ifdef _systick_irq_
int i,J;
voor(i = 0;IVAL = 0; //CNT -tegenwaarde
Systick->Lading = 9*ons; //9 betekent 1US
Systick->Ctrl|= 1<<0; //Start timer
Doen
{
TMP = Systick->Ctrl; //Lees status
}terwijl((!(TMP&1<<16))&&(TMP&1<<0));
Systick->Val = 0; //CNT -tegenwaarde
Systick->Ctrl&= ~(1<<0); //Schakel de timer uit
#endif
};I ++)>

3.4 main.c Oproep ds18b20 om de temperatuur te lezen en af ​​te drukken naar de seriële poort

#erbij betrekken “STM32F10X.H”

#erbij betrekken “DS18B20.H”

U8 DS18B20_ROM[8]; //Bewaar de 64-bit ROM-code van DS18B20

Int Main(leegte)
{
U16 TEMP;
USARTX_INIT(USART1,72,115200);//Initialisatie van de seriële poort 1
Ds18b20_init(); //DS18B20 -initialisatie

/*1. Lees de 64-bit ROM-code van DS18B20*/
//Stuur Reset Pulse, Detecteer bestaanpuls
terwijl(Ds18b20_checkdevice())
{
printf(“DS18B20 -apparaat bestaat niet!\N”);
Vertraging(500);
}
//Stuur de opdracht om de 64-bit ROM-code te lezen
Ds18b20_writeByte(0x33);

//Loop gelezen 64-bit ROM-code
voor(i = 0;i<8;I ++)
{
Ds18b20_rom[i]= DS18B20_READBYTE();
printf(“Ds18b20_rom[%D]=0x%X\n”,i,Ds18b20_rom[i]);
}

terwijl(1)
{
/*2. Bedien tegelijkertijd alle DS18B20 in de bus om de temperatuur om te zetten*/
Ds18b20_checkdevice(); //Stuur Reset Pulse, detecteren puls
Ds18b20_writeByte(0XCC); //Sla Rom Sequence Detectie over
Ds18b20_writeByte(0x44); //Start een temperatuurconversie (Laat alle DS18B20 in de bus de temperatuur omzetten)
Vertraging(500); //Wacht tot alle DS18B20 -temperatuurconversies op de lijn zijn voltooid

/*3. Enkele gerichte lezing van de temperatuur van elke DS18B20*/
Ds18b20_checkdevice(); //Stuur Reset Pulse, detecteren puls
Ds18b20_writeByte(0x55); //Stuur het commando om te matchen met ROM
voor(i = 0;i<8;I ++) //Stuur 64-bits code
{
Ds18b20_writeByte(Ds18b20_rom[i]);
}
Ds18b20_writeByte(0Xbe); //Lees de temperatuur
temp = ds18b20_readbyte(); //Lees temperatuurgegevens van lage orde
temperatuur|= DS18B20_READBYTE()<<8; //Lees temperatuurgegevens van hoge orde
printf(“temp1=%d.%d\n”,temperatuur>>4,temperatuur&0XF);
printf(“temp2=%f\n”,Temp*0.0625);

Vertraging(500);
}
}