Temperatursensorik

Design des DS18B20 Digitalen Temperatursensors für STM32

DS18B20 Temperaturerfassungsdraht Edelstahl -Sonden -Kit

DS18B20 ist ein digitaler Temperatursensor, der ein einzelnes Bus -Timing verwendet, um mit dem Host zu kommunizieren. Nur 1 Draht wird benötigt, um die Temperaturdatenlesung zu vervollständigen;

DS18B20 verfügt über eine integrierte 64-Bit-Produktseriennummer für eine einfache Identifizierung. Mehrere DS18B20 -Sensoren können mit verbunden sein mit 1 Draht, und durch 64-Bit-Identitätsauthentifizierung, Die von verschiedenen Sensoren gesammelten Temperaturinformationen können separat gelesen werden.

DS18B20 Temperaturerfassungsdraht Edelstahl -Sonden -Kit

DS18B20 Temperaturerfassungsdraht Edelstahl -Sonden -Kit

DS18B20 Temperatursensorsonde TPE-Umspritzungskit

DS18B20 Temperatursensorsonde TPE-Umspritzungskit

1 Draht DS18B20 Temperatursensor

1 Draht DS18B20 Temperatursensor

Einführung in DS18B20
2.1 Hauptmerkmale von DS18B20
1. Volldigitale Temperaturumrechnung und -ausgabe.
2. Erweiterte Single-Bus-Datenkommunikation.
3. Bis zu 12-Bit-Auflösung, mit einer Genauigkeit von bis zu ±0,5 Grad Celsius.
4. Der maximale Arbeitszyklus bei 12-Bit-Auflösung beträgt 750 Millisekunden.
5. Parasitärer Arbeitsmodus kann ausgewählt werden.
6. Der Erkennungstemperaturbereich liegt zwischen –55 °C und +125 °C (–67° F ~+257° F).
7. Eingebautes EEPROM, Temperaturgrenzalarmfunktion.
8. 64-Bit-Fotolithografie-ROM, integrierte Produktseriennummer, Praktisch für den Anschluss mehrerer Maschinen.
9. Verschiedene Verpackungsformen, Anpassung an verschiedene Hardwaresysteme.

DS18B20-Chippaketstruktur

DS18B20-Chippaketstruktur

2.2 DS18B20 Pin-Funktion
GND-Spannungsmasse;
DQ-Einzeldatenbus;
VDD-Versorgungsspannung;
NC leerer Pin;

DS18B20-Chip-RAM- und EEPROM-Strukturdiagramm

DS18B20-Chip-RAM- und EEPROM-Strukturdiagramm

2.3 Funktionsprinzip und Anwendung des DS18B20
Die DS18B20-Temperaturerkennung und die digitale Datenausgabe sind vollständig auf einem Chip integriert, Daher verfügt es über eine stärkere Anti-Interferenz-Fähigkeit. Sein Arbeitszyklus kann in zwei Teile unterteilt werden, nämlich Temperaturerfassung und Datenverarbeitung.

18B20 verfügt über drei Formen von Speicherressourcen. Sie sind: ROM-Nur-Lese-Speicher, Wird zum Speichern des DS18B20ID-Codes verwendet; der erste 8 Bits sind einzeilige Seriencodes (Der DS18B20-Code ist 19H), die folgende 48 Bits sind die eindeutige Seriennummer des Chips; der letzte 8 Bits sind der CRC-Code (Redundanzprüfung) des oben Gesagten 56 Bits. Die Daten werden bei der Produktion festgelegt und können vom Benutzer nicht geändert werden. DS18B20 hat insgesamt 64 Bits von ROM.

RAM-Datenregister, Wird für interne Berechnungen und den Datenzugriff verwendet, Daten gehen nach einem Stromausfall verloren, DS18B20 hat insgesamt 9 Bytes RAM, jedes Byte ist 8 Bits. Das erste und zweite Byte sind die Datenwertinformationen nach der Temperaturumrechnung; Das dritte und vierte Byte sind das Spiegelbild des EEPROMs des Benutzers (Wird häufig zur Speicherung von Temperaturalarmwerten verwendet). Der Wert wird aktualisiert, wenn die Stromversorgung zurückgesetzt wird. Das fünfte Byte ist das Spiegelbild des dritten EEPROMs des Benutzers. Der 6, 7Th, und das 8. Byte sind Zählregister, die so konzipiert sind, dass Benutzer eine höhere Temperaturauflösung erhalten. Sie sind auch Zwischenspeicher für die interne Temperaturumrechnung und -berechnung. Das 9. Byte ist der CRC-Code des ersten 8 Bytes. EEPROM ist ein nichtflüchtiger Speicher zum Speichern von Daten, die über einen längeren Zeitraum gespeichert werden müssen, obere und untere Temperaturalarmwerte, und Verifizierungsdaten. DS18B20 hat insgesamt 3 Bits des EEPROM, und es gibt Spiegelbilder im RAM, um die Benutzerbedienung zu erleichtern.

DS18B20 arbeitet standardmäßig im 12-Bit-Auflösungsmodus. Die nach der Konvertierung erhaltenen 12-Bit-Daten werden in zwei 8-Bit-RAMs des DS18B20 gespeichert (die ersten beiden Bytes). Der erste 5 Bits im Binärformat sind Vorzeichenbits. Wenn die gemessene Temperatur größer ist als 0, diese 5 Bits sind 0. Multiplizieren Sie einfach den Messwert mit 0.0625 um die tatsächliche Temperatur zu erhalten. Wenn die Temperatur niedriger ist als 0, diese 5 Bits sind 1. Der Messwert muss invertiert werden, hinzugefügt von 1, und dann mit multipliziert 0.0625 um die tatsächliche Temperatur zu erhalten. Oder verwenden Sie die Bit-Operation, um die Temperatur zu extrahieren: die Nachkommastellen belegen die unteren Stellen 4 Bits, und die oberen Bits sind Ganzzahlbits (negative Zahlen werden nicht berücksichtigt).

2.4 DS18B20-Chip-ROM-Anweisungstabelle
1. ROM lesen [33H] (Das hexadezimale Befehlswort steht in eckigen Klammern).
Mit diesem Befehl kann der Buscontroller das 64-Bit-ROM von DS18B20 lesen. Diese Anweisung kann nur verwendet werden, wenn nur ein DS18B20 am Bus vorhanden ist. Wenn mehr als einer angeschlossen ist, Bei der Kommunikation kommt es zu Datenkonflikten.

2. atch ROM [55H]
Auf diese Anweisung folgt eine vom Controller ausgegebene 64-Bit-Seriennummer. Wenn sich mehrere DS18B20 am Bus befinden, Nur der Chip mit der gleichen Seriennummer wie die vom Controller ausgegebene kann antworten, und die anderen Chips warten auf den nächsten Reset. Diese Anleitung ist für Single-Chip- und Multi-Chip-Verbindungen geeignet.

3. ROM überspringen [CCH]
Dieser Befehl führt dazu, dass der Chip nicht auf den ROM-Code reagiert. Im Falle eines einzelnen Busses, Mit dieser Anleitung können Sie Zeit sparen. Wenn diese Anweisung verwendet wird, wenn mehrere Chips verbunden sind, Es kommt zu Datenkonflikten, was zu Fehlern führt.

4. ROM durchsuchen [F0H]
Nachdem der Chip initialisiert wurde, Die Suchanweisung ermöglicht die Identifizierung des 64-Bit-ROMs aller Geräte durch Eliminierung, wenn mehrere Chips an den Bus angeschlossen sind.

5. Alarmsuche [JEDE]
Bei mehreren Chips, Die Alarm-Chip-Suchanweisung reagiert nur auf Chips, die die Alarmbedingung einer Temperatur über TH oder unter TL erfüllen. Solange der Chip nicht ausgeschaltet ist, Der Alarmzustand bleibt bestehen, bis die Temperatur erneut gemessen wird und der Alarmzustand nicht erreicht wird.

6. Schreiben Sie Scratchpad [4EH]
Dies ist die Anweisung zum Schreiben von Daten in den RAM. Die anschließend geschriebenen zwei Datenbytes werden unter der Adresse gespeichert 2 (TH des Alarm-RAM) und Adresse 3 (TL des Alarm-RAM). Der Schreibvorgang kann durch ein Reset-Signal beendet werden.

7. Lesen Sie Scratchpad (Daten aus dem RAM lesen) [BEH]
Dieser Befehl liest Daten aus dem RAM, beginnend mit der Adresse 0 und bis zur Adresse 9, Abschluss des Lesens der gesamten RAM-Daten. Der Chip ermöglicht es dem Reset-Signal, den Lesevorgang zu beenden, das ist, Die nachfolgenden unnötigen Bytes können ignoriert werden, um die Lesezeit zu verkürzen.

8. Scratchpad kopieren (Kopieren Sie RAM-Daten in das EEPROM) [48H]
Dieser Befehl speichert die Daten im RAM im EEPROM, sodass die Daten bei ausgeschalteter Stromversorgung nicht verloren gehen. Da der Chip mit der EEPROM-Speicherverarbeitung beschäftigt ist, wenn der Controller einen Lesezeitschlitz sendet, die Busausgänge “0”, und wann die Lagerarbeiten abgeschlossen sind, Der Bus wird ausgegeben “1”.
Im parasitären Arbeitsmodus, Unmittelbar nach Erteilung dieser Anweisung muss ein starker Pull-up durchgeführt und mindestens 10 MS lang aufrechterhalten werden, um den Chipbetrieb aufrechtzuerhalten.

9. Konvertieren Sie T (Temperaturumwandlung) [44H]
Nach Erhalt dieser Anweisung, Der Chip führt eine Temperaturumrechnung durch und speichert den umgewandelten Temperaturwert in der 1. und 2. Adresse des RAM. Da der Chip mit der Temperaturumwandlungsverarbeitung beschäftigt ist, wenn der Controller einen Lesezeitschlitz sendet, die Busausgänge “0”, und wann die Lagerarbeiten abgeschlossen sind, Der Bus wird ausgegeben “1”. Im parasitären Arbeitsmodus, Unmittelbar nach Erteilung dieser Anweisung muss ein starker Pull-up durchgeführt und mindestens 500 MS lang aufrechterhalten werden, um den Chipbetrieb aufrechtzuerhalten.

10. EEPROM zurückrufen (Kopieren Sie den Alarmwert vom EEPROM in den RAM) [B8H]
Dieser Befehl kopiert den Alarmwert im EEPROM in das 3. und 4. Byte im RAM. Da der Chip mit der Kopierverarbeitung beschäftigt ist, wenn der Controller einen Lesezeitschlitz sendet, die Busausgänge “0”, und wann die Lagerarbeiten abgeschlossen sind, die Busausgänge “1”. Zusätzlich, Diese Anweisung wird automatisch ausgeführt, wenn der Chip eingeschaltet und zurückgesetzt wird. Auf diese Weise, Die beiden Alarmbyte-Bits im RAM sind immer das Spiegelbild der Daten im EEPROM.

11. Lesen Sie Stromversorgung (Arbeitsmodusschalter) [B4H]
Nach Erteilung dieser Weisung, Es wird eine Lesezeitlücke ausgegeben, und der Chip gibt sein Leistungsstatuswort zurück. “0” ist der parasitäre Energiezustand und “1” ist der externe Energiezustand.

2.5 DS18B20 Timing-Diagramm
2.5.1 DS18B20 Reset- und Antwortbeziehungsdiagramm
Vor jeder Kommunikation muss ein Reset durchgeführt werden. Die Reset-Zeit, Wartezeit, und Reaktionszeit sollten streng entsprechend dem Timing programmiert werden.
DS18B20 Lese- und Schreibzeitlücke: Das Lesen und Schreiben von DS18B20-Daten wird durch das Zeitlückenverarbeitungsbit und das Befehlswort zum Austausch von Informationen bestätigt.

DS18B20-Reset- und Antwortbeziehungsdiagramm

DS18B20-Reset- und Antwortbeziehungsdiagramm

2.5.2 Daten schreiben 0 und Daten 1 zu DS18B20
In den ersten 15uS der Schreibdaten-Zeitlücke, Der Bus muss vom Controller auf Low gezogen werden, und dann ist es die Chip-Abtastzeit für die Busdaten. Die Abtastzeit beträgt 15~60us. Wenn der Controller den Bus während der Abtastzeit auf High zieht, es bedeutet Schreiben “1”, und wenn der Controller den Bus auf Low zieht, es bedeutet Schreiben “0”.
Jedes Übertragungsbit sollte ein Low-Level-Startbit von mindestens 15 µS haben, und die darauffolgenden Daten “0” oder “1” sollte innerhalb von 45 uS abgeschlossen sein.
Die Übertragungszeit des gesamten Bits sollte bei 60 bis 120 uS liegen, Andernfalls kann die normale Kommunikation nicht gewährleistet werden.
Notiz: DS18B20 liest und schreibt Daten vom Low-Bit.

Daten schreiben 0 und Daten 1 zu DS18B20

Daten schreiben 0 und Daten 1 zu DS18B20

2.5.3 Daten lesen 0 und Daten 1 ab DS18B20
Die Abtastzeit der Kontrolle während der Lesezeitlücke sollte genauer sein. Während der Lesezeitlücke, Der Host muss außerdem einen niedrigen Pegel von mindestens 1uS erzeugen, um den Beginn der Lesezeit anzuzeigen. Dann, in 15uS nach Freigabe des Busses, Der DS18B20 sendet das interne Datenbit. Zu diesem Zeitpunkt, wenn die Steuerung feststellt, dass der Bus hoch ist, es bedeutet lesen “1”, und wenn der Bus niedrig ist, es bedeutet, Daten zu lesen “0”. Bevor Sie jedes Bit lesen, Der Controller fügt ein Startsignal hinzu.

Daten lesen 0 und Daten 1 ab DS18B20

Daten lesen 0 und Daten 1 ab DS18B20

Notiz: Das Datenbit muss innerhalb von 15 µS nach Beginn der Leselücke gelesen werden, um eine korrekte Kommunikation sicherzustellen.

Während der Kommunikation, 8 Teile davon “0” oder “1” werden als Byte verwendet, und das Lesen oder Schreiben des Bytes beginnt beim Low-Bit.

2.5.4 Reihenfolge der einmaligen Ablesung der Temperatur (nur ein einziger DS18B20 am Bus)

1. Reset-Signal senden
2. Antwortsignal erkennen
3. Senden Sie 0xCC
4. Senden Sie 0x44
5. Reset-Signal senden
6. Antwortsignal erkennen
7. Schreiben Sie 0xcc
8. Schreiben Sie 0xbe
9. Schleife 8 Mal, um das Low-Byte der Temperatur zu lesen
10. Schleife 8 Mal, um das High-Byte der Temperatur zu lesen
11. Synthetisieren und verarbeiten Sie 16-Bit-Temperaturdaten

3. Treibercode

3.1 DS18B20.c
#enthalten “ds18b20.h”
/*
Funktion: DS18B20-Initialisierung
Hardware-Verbindung: PB15
*/
void ds18b20_init(Leere)
{
RCC->APB2ENR|=1<<3; //PB
GPIOB->CRH&=0x0FFFFFFF;
GPIOB->CRH|=0x30000000;
GPIOB->ODR|=1<<15; //Pull-up
}

/*
Funktion: Überprüfen Sie, ob das DS18B20-Gerät vorhanden ist
Rückgabewert: 1 bedeutet, dass das Gerät nicht existiert 0 bedeutet, dass das Gerät normal ist
*/
u8 DS18B20_CheckDevice(Leere) //Enthält Reset-Impuls, Erkennungsimpuls
{
DS18B20_OUTPUT_MODE();//Initialisieren Sie den Ausgabemodus
DS18B20_OUT=0; //Reset-Impuls erzeugen
DelayUs(750); //Erzeugen Sie einen niedrigen Pegel von 750us
DS18B20_OUT=1; //Bus freigeben
DelayUs(15); //Warten Sie auf die Antwort von DS18B20
Wenn(DS18B20_CleckAck())//Existenzimpuls erkennen
{
zurückkehren 1;
}
zurückkehren 0;
}

/*
Funktion: Erkennen Sie den Existenzimpuls des DS18B20-Geräts
Rückgabewert: 1 weist auf einen Fehler hin 0 zeigt normal an
*/
u8 DS18B20_CleckAck(Leere)
{
u8 cnt=0;
DS18B20_INPUT_MODE();//Initialisieren Sie den Eingabemodus
während(DS18B20_IN&&cnt<200) //Warten Sie auf den DS18B20-Antwortimpuls
{
DelayUs(1);
cnt++;
}
Wenn(cnt>=200)zurückkehren 1; //Fehler

cnt=0;
während((!DS18B20_IN)&&cnt<240) //Warten Sie, bis DS18B20 den Bus freigibt
{
DelayUs(1);
cnt++;
}
Wenn(cnt>=240)zurückkehren 1; //Fehler
zurückkehren 0;
}

/*
Funktion: Schreiben Sie ein Byte
Lernen Sie zunächst, ein wenig zu schreiben.
*/
void ds18b20_writebyte(u8 cmd)
{
u8 i;
DS18B20_OUTPUT_MODE(); //Initialisieren Sie den Ausgabemodus
für(ich=0;ich<8;i++)
{
DS18B20_OUT=0; //Schreibzeitlücke erzeugen (Schreibstart)
DelayUs(2);
DS18B20_OUT=cmd&0x01; //Aktuelles Datenbit senden
DelayUs(60); //Warten Sie, bis der Schreibvorgang abgeschlossen ist
DS18B20_OUT=1; //Geben Sie den Bus frei und bereiten Sie sich auf die nächste Übertragung vor
cmd>>=1; //Senden Sie weiterhin das nächste Datenbit
}
}

/*
Funktion: Ein Byte lesen
Lernen Sie zunächst, ein wenig zu lesen.
*/
u8 DS18B20_ReadByte(Leere)
{
u8 i,Daten=0;
für(ich=0;ich<8;i++)
{
DS18B20_OUTPUT_MODE(); //Initialisieren Sie den Ausgabemodus
DS18B20_OUT=0; //Lesezeitlücke erzeugen (Leseanfang)
DelayUs(2);
DS18B20_OUT=1; //Bus freigeben
DS18B20_INPUT_MODE(); //Initialisieren Sie den Eingabemodus
DelayUs(8); //Warten Sie auf die Datenausgabe von DS18B20
Daten>>=1; //Hohes Bit mit füllen 0, Standard ist 0
Wenn(DS18B20_IN) Daten|=0x80;
DelayUs(60);
DS18B20_OUT=1; //Bus freigeben, Warten Sie, bis das nächste Datenbit gelesen wird
}
Daten zurückgeben;
}

/*
Funktion: Lesen Sie einmal die Temperaturdaten von DS18B20
Rückgabewert: die Temperaturdaten gelesen
Überlegte Situation: Es ist nur ein DS18B20 an den Bus angeschlossen
*/
u16 DS18B20_ReadTemp(Leere)
{
u16 temp=0;
u8 temp_H,temp_L;
DS18B20_CheckDevice(); //Reset-Impuls senden, Puls erkennen
Ds18b20_writebyte(0Xcc); //Erkennung der ROM-Sequenz überspringen
Ds18b20_writebyte(0x44); //Starten Sie eine Temperaturumrechnung

//Warten Sie, bis die Temperaturumrechnung abgeschlossen ist
während(DS18B20_READBYTE()!=0xFF){}

DS18B20_CheckDevice(); //Reset-Impuls senden, Puls erkennen
Ds18b20_writebyte(0Xcc); //Erkennung der ROM-Sequenz überspringen
Ds18b20_writebyte(0Xbe); //Temperatur ablesen

temp_L=DS18B20_ReadByte(); //Lesen Sie Tieftemperaturdaten
temp_H=DS18B20_ReadByte(); //Hochtemperaturdaten lesen
temp=temp_L|(temp_H<<8); //Synthetisierte Temperatur
Temperatur zurückgeben;
}

3.2 DS18B20.h

#ifndef DS18B20_H
#Definieren Sie DS18B20_H
#enthalten “stm32f10x.h”
#enthalten “sys.h”
#enthalten “Verzögerung.h”
#enthalten “ds18b20.h”
#enthalten “usart.h”

/*Paketschnittstelle*/

//Initialisieren Sie DS18B20 im Eingabemodus
#Definieren Sie DS18B20_INPUT_MODE() {GPIOB->CRH&=0x0FFFFFFF;GPIOB->CRH|=0x80000000;}

//Initialisieren Sie DS18B20 im Ausgabemodus
#Definieren Sie DS18B20_OUTPUT_MODE(){GPIOB->CRH&=0x0FFFFFFF;GPIOB->CRH|=0x30000000;}

//DS18B20 IO-Port-Ausgang
#Definieren Sie DS18B20_OUT PBout(15)

//DS18B20 IO-Port-Eingang
#Definieren Sie DS18B20_IN PBin(15)

//Funktionsdeklaration
u8 DS18B20_CleckAck(Leere);
u8 DS18B20_CheckDevice(Leere);
void ds18b20_init(Leere);
u16 DS18B20_ReadTemp(Leere);
u8 DS18B20_ReadByte(Leere);
void ds18b20_writebyte(u8 cmd);
#endif

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
3.3 Verzögerungsfunktion

/*
Funktion: Verzögerung in uns
*/
void DelayUs(int uns)
{
#ifdef _SYSTICK_IRQ_
int i,J;
für(ich=0;iVAL=0; //CNT-Zählerwert
SysTick->LOAD=9*us; //9 bedeutet 1us
SysTick->STRG|=1<<0; //Timer starten
Tun
{
tmp=SysTick->STRG; //Status lesen
}während((!(tmp&1<<16))&&(tmp&1<<0));
SysTick->VAL=0; //CNT-Zählerwert
SysTick->STRG&=~(1<<0); //Schalten Sie den Timer aus
#endif
};i++)>

3.4 main.c Rufen Sie DS18B20 auf, um die Temperatur abzulesen und an die serielle Schnittstelle zu drucken

#enthalten “stm32f10x.h”

#enthalten “ds18b20.h”

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

int main(Leere)
{
u16 temp;
USARTx_Init(USART1,72,115200);//Initialization of serial port 1
Ds18b20_init(); //DS18B20-Initialisierung

/*1. Read the 64-bit ROM code of DS18B20*/
//Reset-Impuls senden, detect existence pulse
während(DS18B20_CheckDevice())
{
printf(“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
für(ich=0;ich<8;i++)
{
DS18B20_ROM[ich]= DS18B20_ReadByte();
printf(“DS18B20_ROM[%D]=0x%X\n”,ich,DS18B20_ROM[ich]);
}

während(1)
{
/*2. Simultaneously operate all DS18B20 on the bus to start converting temperature*/
DS18B20_CheckDevice(); //Reset-Impuls senden, Puls erkennen
Ds18b20_writebyte(0Xcc); //Erkennung der ROM-Sequenz überspringen
Ds18b20_writebyte(0x44); //Starten Sie eine Temperaturumrechnung (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(); //Reset-Impuls senden, Puls erkennen
Ds18b20_writebyte(0x55); //Send command to match ROM
für(ich=0;ich<8;i++) //Send 64-bit code
{
Ds18b20_writebyte(DS18B20_ROM[ich]);
}
Ds18b20_writebyte(0Xbe); //Temperatur ablesen
temp=DS18B20_ReadByte(); //Read low-order temperature data
Temp|=DS18B20_ReadByte()<<8; //Read high-order temperature data
printf(“temp1=%d.%d\n”,Temp>>4,Temp&0xF);
printf(“temp2=%f\n”,temp*0.0625);

DelayMs(500);
}
}