China Sensor Hersteller

China Temperature Sensor & Thermistor manufacturer

DS18B20 Temperatursensor modul für 51/2,3 Mikrocontroller

Durch das vorherige Beispiel der digitalen Temperaturmessung LCD1602 glaube ich, dass ich ein grundlegendes Verständnis für die Steuerung und Verzögerung des E/A-Ports habe. Hier ist ein weiteres Beispiel für einen Temperatursensor, der ebenfalls nur den Betrieb und die Verzögerung des E/A-Ports erfordert. Lassen Sie uns zunächst eine Einführung in den Temperatursensor DS18B20 geben. Da es sich um einen Temperatursensor handelt, muss ein Sensor vorhanden sein, der die Temperatur misst. Dieser Sensor wandelt die Temperatur um ihn herum direkt in eine Zahl um und speichert sie im Notizblockspeicher. Wir müssen diesen Prozess der Temperaturerfassung und Umwandlung in ein digitales Signal nicht verstehen. Was wir tun müssen, ist den Inhalt des Speichers und einige andere Konfigurationen zu lesen. Das schematische Diagramm sieht wie folgt aus:
DS18B20 Temperatursensor mit 3 Kabeln DS18B20 Temperatursensor-Konvertierung stecker
DS18B20 Temperatursensor mit 3 Kabeln DS18B20 Temperatursensor-Konvertierungsstecker

Abbildung 1, Übersicht über den Temperatursensor DS18B20

Im DS18B20 befindet sich ein Temperatursensor (wie im Bild oben gezeigt), der die Umgebungstemperatur erfassen und das Temperaturergebnis direkt in ein digitales Signal zur Speicherung umwandeln kann. Wir müssen uns nicht um die Umwandlung des Temperatursignals in ein digitales Signal kümmern. Wo existiert also das digitale Signal? In DS18B20 gibt es einen Speicher namens ScratchPad mit insgesamt 9 Bytes (Byte0-Byte8), und die digitalen Signale werden in Byte0_LSM und Byte1_MSB gespeichert. Unter diesen ist Byte0 das Low-Bit und Byte1 das High-Bit. Tatsächlich besteht unser Zweck darin, die in Byte0 und Byte1 gespeicherten digitalen Signale zu lesen. Es ist ersichtlich, dass wir uns in unserem Denkprozess überhaupt nicht um den Erfassungsprozess kümmern müssen, obwohl der Name Temperatursensor modul lautet. Dies ist tatsächlich dasselbe wie das zuvor erwähnte LCD1602. Wir müssen lediglich lesen oder schreiben. Dafür sind Module da, wir können sie als Black Boxes behandeln. Gemäß seinen Regeln müssen Sie nur wissen, was Sie eingeben und was es produzieren wird. Sie müssen nicht auf den Zwischenprozess achten. Wir kombinieren Byte0_LSM und Byte1_MSB zu einem 16-Bit-Digitalsignal mit Byte0_LSB als Low-Bit und Byte1_MSB als High-Bit und nennen es „T-16bit“, wie in der Abbildung oben gezeigt. Wie wandelt man dieses „T-16bit“-Digitalsignal in Temperatur um? Wie aus der Abbildung ersichtlich ist, sind Bit11-Bit15 S und geben die positive und negative Temperatur an. Wenn S=0, dann ist die Temperatur positiv, wenn S=1, dann ist die Temperatur negativ. Für das folgende Bit10-Bit0 bedeutet jede Erhöhung des Wertes um eins, dass die Temperatur um 0,0625°C steigt. Beispiel: Wenn das LSB 1100 0011 lautet und das MSB 0000 0110, dann lautet die Kombination aus LSB und MSB „T-16bit“ 0000 0110 1100 0011. Die oberen 5 Bits sind 0, was darauf hinweist, dass die Temperatur positiv ist. Die restlichen 11 Bits bit10-bit0 (110 1100 0011=1731) setzen 1731×0,0625=108,1875, dann beträgt die gemessene Temperatur +108,1875°C. Wenn das LSB und MSB zusammen „T-16bit“ 1111 1110 1100 0011 beträgt, beträgt die gemessene Temperatur -108,1875 °C. Bei „T-16bit“ können wir das auch so verstehen. Jede Erhöhung von Bit0 um 1 bedeutet 20×0,0625°C und jede Änderung von Bit1 um 1 bedeutet 21×0,0625°C. Analog dazu beträgt jede Änderung in Bit4 24×0,0625°C=1°C.

Dann gibt es noch die Alarmfunktionen von Byte2_TH und Byte3_TL. In der Abbildung stellt Byte2_TH die eingestellte Höchsttemperatur und Byte3_TL die eingestellte Mindesttemperatur dar. Ebenso repräsentiert S die positive und negative Temperatur. Wenn S=0, bedeutet dies positiv; wenn S=1, dann ist die Temperatur negativ. Byte2_TH und Byte3_TL stellen den Bereich der Solltemperatur dar. Beachten Sie, dass Byte2_TH und Byte3_TL hier Bit11 bis Bit4 in „T-16bit“ entsprechen, wie im blauen Teil der Abbildung dargestellt. Wie bereits erwähnt, beträgt in „T-16bit“ jede Änderung von 1 in Bit4 1°C, sodass jede Änderung von 1 im niedrigsten Bit in Byte2_TH und Byte3_TL bedeutet, dass sich die Temperatur um 1°C ändert. Beispielsweise ist Byte2_TH auf 01111001 (121 in Dezimalzahl) eingestellt und das erste Bit ist 0, was +121 °C bedeutet. Byte3_TL ist 01001001 (73 in Dezimalzahl) und das erste Bit ist 0, was +73 °C bedeutet . Daher beträgt der Temperatur-Einstellbereich: 73–121 °C. Wenn die Temperatur in „T-16bit“ höher/gleich +121°C oder niedriger/gleich 73°C ist, wird der Alarm ausgelöst.

Der nächste Schritt besteht darin, die Genauigkeit der Temperaturerfassung festzulegen, wie in Byte4_Config in der Abbildung gezeigt. Bit5 und Bit6 sind R0 bzw. R1, und die anderen Bits sind fest. R0 und R1 können 0 bzw. 1 sein, sodass sie in vier Situationen kombiniert werden können, 00/01/10/11, entsprechend unterschiedlicher Genauigkeit, wie in der folgenden Tabelle gezeigt:

Byte5-Byte7 werden nicht angegeben, Byte8 ist CRC, der zur Erkennung von Kommunikationsfehlern verwendet wird. Lassen wir es erst einmal in Ruhe und betrachten wir zunächst den einfachen Teil

Ich glaube, dass ich durch die obige Erklärung ein vorläufiges Verständnis von DS18B20 habe. Lassen Sie uns nun darüber sprechen, wie es mit dem Mikrocontroller kommuniziert. DS18B20 verfügt über insgesamt drei Pins, zwei Power-Pins (positive und negative Stromversorgung) und einen Daten-Pin DQ. Das Strukturdiagramm ist unten dargestellt. Die schwarze Schale zeigt nach oben, die Stifte nach unten und die flache Oberfläche zeigt zu Ihnen. Der erste Pin links ist GND. Wenn die positiven und negativen Pole des DS18B20 vertauscht angeschlossen werden, kann es zu Verbrennungen kommen.

Es ist ersichtlich, dass die Kommunikation zwischen dem Mikrocontroller und DS18B20 nur auf dieser Leitung basieren kann. Darüber hinaus können mehrere DS18B20 gleichzeitig an diese Leitung angeschlossen werden. Wie kommuniziert der Mikrocontroller über diese einzige Leitung genau mit mehreren DS18B20? Der Mikrocontroller weiß nicht, ob sich ein DS18B20 auf der DQ-Leitung befindet, ob mehrere davon vorhanden sind oder ob einer vorhanden ist, der aber defekt ist. Genauso wie Menschen kommunizieren: Wenn Sie nicht wissen, was im Raum vor sich geht, sagen Sie zuerst „Hallo“ und fragen Sie, ob jemand da ist. Gleiches gilt auch für Mikrocontroller. Lassen Sie uns zunächst eine Initialisierung durchführen, Hallo sagen und prüfen, ob 18B20 auf der DQ-Leitung steht. Wie man Hallo sagt, ist das gleiche wie beim oben erwähnten LCD1602, natürlich gemäß den Regeln von DS18B20. Der Mikrocontroller muss DQ zunächst für mindestens 480 μS auf Low ziehen und dann DQ freigeben. Wenn nach etwa 15–60 μs ein DS18B20 in der Leitung ist und normal funktioniert, zieht der DS18B20 den DQ auf niedrig und hält ihn für 60–240 μs aufrecht. Der Mikrocontroller prüft dieses Signal, um festzustellen, ob ein DS18B20 in der Leitung vorhanden ist, der normal funktionieren kann. Es gibt so viele DS18B20, wie es Signale gibt. Dies ist die Regel von DS18B20 wie folgt:
Der Prozess der Umwandlung der Temperatur des DS18B20-Sensors in ein digitales Signal
Kann ich nach der Initialisierung mit DS18B20 kommunizieren? Wenn mehrere DS18B20 online sind, mit welchem ​​möchten Sie kommunizieren? Daher müssen Sie vor der Kommunikation zunächst das Ziel identifizieren. Hier nehmen wir den einfachsten DS18B20. Sobald Sie einen verstanden haben, können Sie natürlich mehrere DS18B20 steuern. Schauen wir uns an, wie man den Initialisierungscode schreibt.

Schritt 1: Zuerst wird der DQ niedrig gehalten und bei mindestens 480Us gehalten. Hier nehmen wir 500U für die Versicherung

Schritt 2: Geben Sie den Bus frei (DQ = 1). Nach einer Wartezeit von etwa 15 bis 60 Minuten zieht DS18B20 den DQ auf Low. Soll ich hier also 15Us oder 60Us wählen?

Schritt 3: Zu diesem Zeitpunkt zieht DS18B20 das DQ-Low-Signal (L_DQ) für 60-240Us. Soll ich also 60Us oder 240Us wählen?

Beachten Sie, dass unser Zweck hier darin besteht, zu erkennen, ob DS18B20 das DQ-Signal (L_DQ) herunterzieht. Wie lange müssen wir also in Schritt 2 nach der Freigabe des Busses (DQ=1) verzögern (Tdelay), um das Signal zu lesen, ob DQ gleich 0 ist?

Machen wir eine extreme Annahme, die Minimal- und Maximalwerte

(1) In Schritt 2 gibt der Mikrocontroller den Bus frei (DQ=1) und nach einer Wartezeit von 15Us (Mindestwert) zieht DS18B20 DQ auf Low. In Schritt 3 wurde der DQ für 60Us (Mindestwert) nach unten gezogen.

In diesem Fall, wenn Tdelay>75Us, können Sie das L_DQ-Signal nicht erkennen. Daher sollte Tdelay weniger als 75Us betragen.

(2) In Schritt 2 gibt der Mikrocontroller den Bus frei (DQ=1) und nach einer Wartezeit von 60Us (Maximalwert) zieht DS18B20 DQ auf Low. In Schritt 3 dauerte der DQ-Pulldown 60/240Us (zwei Situationen).

In diesem Fall, wenn Tdelay<60Us, können Sie das L_DQ-Signal nicht erkennen. Wenn Sie beispielsweise Tdelay=50Us festlegen und dann DQ lesen, ist DQ immer noch 1. Warum? Denn nach 60U
DS18B20-Chip-Verkabelung methode
DS18B20 zieht DQ nur nach unten. Daher Tdelay>60Us.

Zusammenfassend beträgt die Versicherungszeit: 75Us>Tdelay>60Us, und der Code lautet wie folgt:

void ds18b20_init(void)

{

DQ=0;//den Bus auf Low ziehen

VerzögerungUs(240); //Verzögerung 526Us

DQ=1;//Den Bus freigeben

delayUs(28);//delay 66Us (zwischen 60-75Us)

if(DQ==0)

{

LED1=0;//(Setzen Sie eine LED, wenn DQ=0 erkannt wird, leuchten Sie LED1)

}

anders

{

LED2=0;

}

delayUs(240);//Bitte beachten Sie, dass nach dem Lesen von DQ weiterhin 480Us verzögert werden

}

Das ID-Signal von DS18B20 befindet sich im ROM, daher können wir das Lesen des ROM hier überspringen (ROM[CCh] überspringen).

Als nächstes kommt der Teil der Kommunikation mit DS18B20. DS18B20 ist passiv, wenn es eingeschaltet ist, was bedeutet, dass es passiv ist und ohne Anweisungen nicht funktioniert. Daher besteht die erste Anweisung des Mikrocontrollers an DS18B20 darin, ihn mit der Temperaturmessung beginnen zu lassen (Convert T [44h]). Was macht DS18B20, wenn es diesen Befehl empfängt? Hier kehren wir zu Abbildung 1 zurück, über die wir zuvor gesprochen haben. DS18B20 beginnt, die Umgebungstemperatur zu erfassen, wandelt die Temperatur in digitale Signale um und speichert sie in Byte0 und Byte1 im ScratchPad. Von hier aus wissen wir, dass wir nur einen Befehl benötigen, „Convert T“, damit DS18B20 mit der Temperaturmessung und -speicherung beginnen kann. Es ist uns egal, wie dieser Prozess abläuft. Von hier aus sehen wir, dass es eigentlich keinen wesentlichen Unterschied zwischen dem Steuerungsmodul DS18B20 und dem LCD1602-Modul gibt. Wir müssen nur die Regeln lesen. Diese Regeln stammen aus den Chip-Handbüchern. Einfach ausgedrückt geht es darum, das Chip-Handbuch zu lesen und zu verstehen. Dieser Punkt wird tatsächlich von vielen Anfängern ignoriert, die nicht bereit oder nicht gewohnt sind, das Chip-Handbuch zu lesen. Da DS18B20 eine gewisse Zeit benötigt, um das Temperatursignal in ein digitales Signal umzuwandeln, müssen wir vor der Ausgabe des nächsten Befehls prüfen, ob DS18B20 noch funktioniert. Wenn Sie es vereinfachen möchten, verwenden Sie eine Verzögerung. Nach Abschluss der Konvertierung befindet sich DS18B20 wieder in einem passiven Zustand und dieser Konvertierungsprozess ist nicht kontinuierlich. Wenn Sie möchten, dass es erneut konvertiert wird, müssen Sie daher den Befehl „Convert T“ erneut ausführen.

Wie erteilt man also Anweisungen? Dies beinhaltet den Teil „DS18B20-Schreiben“. Schauen Sie im Datenblatt nach und suchen Sie nach dem „Write Timing“.

Schauen wir uns zunächst an, wie der Mikrocontroller 0 und 1 in DS18B20 schreibt.

(1) Schreiben 0: DQ wird auf Low gezogen und mindestens 60Us gehalten. Bei etwa 15-60Us beginnt DS18B20 mit der Datenannahme

(2) Schreiben Sie 1: Ziehen Sie DQ auf Low, verzögern Sie 2Us und lassen Sie dann DQ los. Zu diesem Zeitpunkt zieht der Pull-up-Widerstand DQ mit einer Verzögerung von mindestens 60Us auf High. Bei 15-60Us beginnt DS18B20, Daten zu empfangen

Der Code zum Schreiben der Anweisung lautet also wie folgt

void ds18b20_com(unsigned char mycom)

{

unsigned char temp;

unsigned char i;

für (i=0;i<8;i++)

{

temp=mycom & 0x01;

if (temp==1)

{

DQ=0;

_nop_();

_nop_();

DQ=1;

VerzögerungUs(35);

}

anders

{

DQ=0;

VerzögerungUs(35);

DQ=1;

}
mycom>>=1;
}
}
Wenn Sie also den Befehl ds18b20_com(0xcch)//skip rom ausgeben möchten, weiß DS18B20, dass das Lesen des ROM übersprungen werden muss. Wenn Sie den Befehl Convert T, ds18b20_com (0x44h) senden möchten, startet DS18B20 die Temperaturkonvertierung und speichert die ersten beiden Bytes im ScratchPad.

Wenn die Konvertierung abgeschlossen ist, werden die Daten in Byte0 und Byte1 gespeichert und die nächste Aufgabe besteht darin, Byte0 und Byte1 zu lesen. Hierbei ist zu beachten, dass vor jeder vom Mikrocontroller gesendeten Anweisung folgendes lauten muss: Initialisierung->ROM-Anweisung->Funktionsanweisung. Dies ist im Chip-Handbuch angegeben. Bevor Sie Byte0 und Byte1 lesen, müssen Sie es daher erneut initialisieren, ROM überspringen ([CCh]), und Sie können Byte0 und Byte1 lesen. Führen Sie dann Byte0 und Byte1 zusammen und konvertieren Sie sie dann in Temperatur.

Sehen wir uns nun an, wie man DS18B20 liest. Schauen Sie auch im Chip-Handbuch nach, um das Lese-Timing-Diagramm zu finden.

DS18B20 möchte Daten an den Mikrocontroller senden. Woher weiß DS18B20 also, wann der Mikrocontroller anfängt, nach Daten zu fragen? Auch hier gibt es eine Regel: Wenn der Mikrocontroller DQ auf Low zieht, verzögert er 1Us und gibt dann DQ frei. Zu diesem Zeitpunkt weiß DS18B20, dass der Mikrocontroller beginnt, Daten anzufordern. Wenn DS18B20 zu diesem Zeitpunkt 0 schreiben möchte, ziehen Sie DQ auf niedrig. Im Gegenteil, wenn es 1 schreiben möchte, halten Sie DQ auf hoch. Die gelesenen Dateninformationen werden vom Mikrocontroller gesendet, DS18B20 gibt die Daten aus und der Mikrocontroller sammelt die Daten. Dieser Vorgang muss in 15Us abgeschlossen sein und dann um 45Us verzögert werden. Sicherheitshalber nehmen wir hier 65Us. Zwischen zwei Lesevorgängen muss ein Abstand von mindestens 1U liegen. Daher ist es einfach, den Code für den Mikrocontroller zum Lesen von DS18B20 zu erhalten:

unsigned int ds18b20_read(void)

{
unsigned char temp1=0;
unsigned int temp2=0;
unsigned int temp=0;
unsigned char i;
für (i=0;i<8;i++)

{
temp1>>=1;
DQ=0;
_nop_();
_nop_();
DQ=1;
if(DQ==1)
temp1 |=0x80;
VerzögerungUs(35);
}

für (i=0;i<8;i++)

{
temp2>>=1;
DQ=0;
_nop_();
_nop_();
DQ=1;

if(DQ==1)
temp2 |=0x80;
VerzögerungUs(35);

}

temp2 <<=8;
temp=temp1+temp2;
Rücklauftemperatur;

}
Anhand der beiden Beispiele LCD1602 und DS18B20 lässt sich erkennen, dass die Steuerung dieser beiden Module eigentlich nur das Pin-Steuerungs- und Verzögerungsprogramm des Mikrocontrollers nutzt. Der Schwerpunkt und die Schwierigkeit liegen im Verständnis der Kontrollregeln jedes Moduls. Tatsächlich können diese durch sorgfältiges Lesen des entsprechenden Chip-Handbuchs gefunden werden. Die Steuer- und Verzögerungsteile der Mikrocontroller-Pins unterscheiden sich nicht vom Betrieb der LED. Kein Wunder, dass manche Leute sagen, dass man schon die Hälfte des Mikrocontrollers gelernt hat, wenn man den Betrieb von LEDs wirklich versteht. Später werden wir LED immer wieder als Beispiel verwenden, um andere verwandte Inhalte von Mikrocontrollern zu erläutern.
PREV:Beispiel für die Temperaturmessung des digitalen Temperatursensors DS18B20
NEXT:So Funktioniert der Intelligente Sensor DS18B20

RELATED POSTS




Skype

WhatsApp

WangWang

QQ
Email me

Mail to us