Vergleich zwischen PT100-Temperatursensor Sonde und DS18B20-Modul
1) Grundprinzip der Signalerfassung
① Der Widerstand von PT100 ändert sich proportional mit der Temperatur (desto höher die Temperatur, desto größer der Widerstand), aber die Widerstandsänderung ist sehr gering, um 0.385 Oh / Grad;
② Der Temperaturmessbereich von PT100 beträgt -200℃ -200℃, und bei 0℃, Der Widerstand ist genau gleich 100 Oh;
③ Der Arbeitsstrom von PT100 sollte kleiner sein als 5 mA;
④ Obwohl sich der Widerstand von PT100 proportional mit der Temperatur ändert, seine Änderungsrate (das ist, K-Wert K-Wert K-Wert) ist in verschiedenen Temperaturbereichen unterschiedlich.
2) Tabelle zur Änderung des Temperaturwiderstands PT100
3. PT100-Antriebsschaltung
1) Durch die Spannungsteilungsmethode, AD erfasst die PT100-Spannung, um einen Widerstandswert zur Berechnung der Temperatur zu erhalten
Der Widerstandswert von PT100 in Wasser bei Raumtemperatur (25℃25℃25℃) geht es darum 109.89 Oh.
Der Mikrocontroller gibt eine Spannung von 3,3 V aus, und die Spannung geteilt durch PT100 beträgt ungefähr:
109.89 ∗ 0.005 = 0.54945 V
Der nach der AD-Umrechnungsformel umgerechnete AD-Wert beträgt ca:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Wenn die Temperatur um ein Grad steigt, unter der Annahme, dass der Widerstand von PT100 gerade um ansteigt 0.385 Oh, der Änderungswert der geteilten Spannung ist ungefähr gleich:
0.385 ∗ 0.005 = 0.001925 V
Der nach der AD-Umrechnungsformel umgerechnete AD-Wert beträgt ca:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
Im Experiment, Es wurde festgestellt, dass dies auf die instabile 3,3-V-Spannung des STM32-Netzteils zurückzuführen ist, Der ADC erfasste PT100-Spannungsschwankungen und der Spannungsteilungsfehler war groß. Die Optimierungslösung besteht darin, eine Konstantstromquellenschaltung zu entwerfen. Durch Erfassung der Spannung von PT100 und des Stroms der Konstantstromquelle, Der Widerstand von PT100 kann erhalten werden, und dann kann der Temperaturwert erhalten werden.
2) Konstantstromquellenschaltung basierend auf einem LDO-Regler (MD5333)
Im Internet gibt es viele Ansteuerschaltungen zum Testen von PT100, wie etwa eine Gleichstrombrückenschaltung, Konstantstromquellenschaltung auf Basis eines Operationsverstärkers, usw. Auch bei der Auswahl der Fahrstrecke hat sich der Autor viel Zeit genommen, unter Berücksichtigung der Schwierigkeit, die Platine herzustellen, und der Anzahl der Komponenten, und entschied sich schließlich für die Konstantstromquellenschaltung basierend auf dem LDO-Regler (MD5333). Der Schaltplan ist wie folgt:
An dieser Stelle, Die Hardware-Auswahl ist grundsätzlich abgeschlossen. Als Entwicklungsboard kommt das Zhengdian Atom F10ZET6 Elite Board zum Einsatz
DS18B20-Modul
Um den Echtzeit-Temperatur- und PT100-Temperaturvergleich zu testen, Für den Kalibrierungsvergleichstest wird das DS18B20-Modul hinzugefügt
1) Einführung in DS18B20
DS18B20 ist ein Single-Bus-Temperatursensor mit einem Testtemperaturbereich von -55 bis +125 °C und einer Genauigkeit von ±0,5 °C. Die Feldtemperatur wird direkt über einen einzigen Bus digital übertragen, Dies verbessert die Anti-Interferenz-Fähigkeit des Systems erheblich. Es kann die gemessene Temperatur direkt ablesen, und kann durch einfache Programmierung entsprechend den tatsächlichen Anforderungen eine 9- bis 12-Bit-Methode zum Lesen digitaler Werte realisieren. Der Betriebsspannungsbereich liegt zwischen 3 und 5,5 V, und es verwendet eine Vielzahl von Verpackungsformen, Dadurch wird die Systemeinstellung flexibel und bequem. Die eingestellte Auflösung und die vom Benutzer eingestellte Alarmtemperatur werden im EEPROM gespeichert und bleiben auch nach einem Stromausfall erhalten.
2) Einführung in das Arbeitstiming des DS18B20
Alle Single-Bus-Geräte erfordern ein striktes Signal-Timing, um die Datenintegrität sicherzustellen. DS18B20 hat 6 Signalarten: Reset-Impuls, Antwortimpuls, schreiben 0, schreiben 1, lesen 0 und lesen 1. All diese Signale, außer dem Antwortimpuls, sind synchrone Signale, die vom Host gesendet werden. Und alle Befehle und Daten werden mit dem niederwertigen Bit des Bytes zuerst gesendet.
① Reset-Impuls und Antwortimpuls
Die gesamte Kommunikation auf dem einzelnen Bus beginnt mit einer Initialisierungssequenz. Der Host gibt einen Low-Pegel aus und hält den Low-Pegel mindestens 480us lang, um einen Reset-Impuls zu erzeugen. Dann gibt der Host den Bus frei, und der 4,7K-Pull-up-Widerstand zieht den einzelnen Bus hoch, mit einer Verzögerungszeit von 15~60us, und wechselt in den Empfangsmodus (Rx). Dann zieht DS18B20 den Bus für 60 bis 240 µs auf Low, um einen Antwortimpuls mit niedrigem Pegel zu erzeugen.
② Schreiben Sie das Timing
Der Schreibzeitpunkt umfasst das Schreiben 0 Timing und Schreiben 1 Timing. Alle Schreibzeiten erfordern mindestens 60us, und zwischen zwei unabhängigen Schreibzeitpunkten ist eine Wiederherstellungszeit von mindestens 1 us erforderlich. Beide Schreibzeiten beginnen damit, dass der Host den Bus herunterzieht. Schreiben 1 Timing: Der Host gibt einen niedrigen Pegel aus, Verzögerungen für 2us, und gibt dann den Bus frei, Verzögerung 60us. Schreiben 0 Timing: Der Host gibt einen niedrigen Pegel aus, Verzögerungen für 60us, und gibt dann den Bus mit einer Verzögerung von 2us frei.
③ Lesen Sie das Timing ab
Single-Bus-Geräte übertragen Daten nur dann an den Host, wenn der Host einen Lesezeitpunkt ausgibt. daher, nachdem der Host einen Befehl zum Lesen von Daten ausgegeben hat, Es muss sofort ein Lesezeitpunkt generiert werden, damit der Slave Daten senden kann. Alle Lesezeiten erfordern mindestens 60us, und zwischen zwei unabhängigen Lesezeitpunkten ist eine Wiederherstellungszeit von mindestens 1 us erforderlich. Jeder Lesezeitpunkt wird vom Host initiiert, was den Bus für mindestens 1us herunterzieht. Der Host muss den Bus während des Lese-Timings freigeben und den Busstatus innerhalb von 15 µs nach Beginn des Timings abfragen. Der typische Lese-Timing-Prozess ist: Der Host gibt eine Verzögerung mit niedrigem Pegel von 2us aus, dann wechselt der Host in den Eingabemodus mit einer Verzögerung von 12us, liest dann den aktuellen Pegel des einzelnen Busses, und verzögert sich dann um 50us.
Nachdem Sie das Einzelbus-Timing verstanden haben, Werfen wir einen Blick auf den typischen Temperaturmessvorgang des DS18B20. Der typische Temperaturmessvorgang von DS18B20 ist: zurücksetzen → SKIPROM senden (0Xcc) → Befehl zum Starten der Konvertierung senden (0x44) → Verzögerung → Zurücksetzen → SKIPROM-Befehl senden (0Xcc) → Speicherbefehl senden (0Xbe) → zwei Datenbytes lesen (d.h.. Temperatur) kontinuierlich → Ende.
3) Schematische Darstellung und CUBEMAX-Konfiguration
Aus dem schematischen Diagramm, Es ist ersichtlich, dass DS18B20 über den PG11-Anschluss aktiviert ist, um den seriellen Anschluss zum Drucken von Temperaturinformationen zu öffnen
4) Codeteil
Der Codeteil überträgt die ds18b20-Bibliothek von Zhengdian Atom und nimmt geringfügige Änderungen vor
#ifndef __DS18B20_H
#Definieren Sie __DS18B20_H
#enthalten “tim.h”
/***********************************************************************************/
/* DS18B20-Pin-Definition */
#Definieren Sie DS18B20_DQ_GPIO_PORT GPIOG
#Definieren Sie DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#Definieren Sie DS18B20_DQ_GPIO_CLK_ENABLE() Tun{ __HAL_RCC_GPIOG_CLK_ENABLE(); }während(0) /* PG-Port-Taktaktivierung */
/**********************************************************************************************/
/* IO-Betriebsfunktion */
#Definieren Sie DS18B20_DQ_OUT(X) Tun{ X ? \
HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_RESET); \
}während(0) /* Datenport-Ausgabe */
#Definieren Sie DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Datenport-Eingang */
uint8_t ds18b20_init(Leere); /* Initialisieren Sie DS18B20 */
uint8_t ds18b20_check(Leere); /* Überprüfen Sie, ob DS18B20 vorhanden ist */
kurz ds18b20_get_temperature(Leere);/* Temperatur ermitteln */
#endif
5. Infrarot-Fernbedienungsmodul
1) Kodierungsprotokoll für drahtlose Module
Die am weitesten verbreiteten Codierungsmethoden für Infrarot-Fernbedienungen sind: NEC-Protokoll von PWM (Pulsweitenmodulation) und RC-5-Protokoll von Philips PPM (Pulspositionsmodulation). Die mit dem Entwicklungsboard gelieferte Fernbedienung verwendet das NEC-Protokoll, welches die folgenden Funktionen hat:
1. 8-Bitadresse und 8-Bit-Befehlslänge;
2. Adresse und Befehl werden doppelt übertragen (Zuverlässigkeit zu gewährleisten);
3. PWM-Pulspositionsmodulation, wobei der Arbeitszyklus des übertragenen Infrarotträgers dargestellt wird “0” Und “1”;
4. Die Trägerfrequenz beträgt 38 kHz;
5. Die Bitzeit beträgt 1,125 ms oder 2,25 ms;
Im NEC-Protokoll, wie man die Daten im Protokoll einstellt ‘0’ oder „1“? Hier, Der Infrarotempfänger und der Infrarotsender sind getrennt.
Infrarotsender: Sendeprotokolldaten „0“ = 560us der Trägersignalübertragung + 560uns keine Trägersignalübertragung
Sendeprotokolldaten „1“ = 560us der Trägersignalübertragung + 1680uns keine Trägersignalübertragung
Die Bitdefinition des Infrarotsenders ist in der folgenden Abbildung dargestellt
Infrarotempfänger: Empfangsprotokolldaten „0“ = 560us niedriger Pegel + 560uns auf hohem Niveau
Empfangsprotokolldaten „1“ = 560us niedriger Pegel + 1680uns auf hohem Niveau
Das Datenformat des NEC-Fernsteuerungsbefehls ist: Synchronisationsterminal, Adresscode, Adress-Inverscode, Steuercode, Steuern Sie den inversen Code. Der Synchronisationscode besteht aus einem 9 ms langen Low-Level und einem 4,5 ms langen High-Level. Der Adresscode, Adress-Inverscode, Steuercode, und Steuerinverscode sind alle 8-Bit-Datenformate. Sie werden in der Reihenfolge Low-Bit zuerst und High-Bit zuletzt gesendet. Der inverse Code wird verwendet, um die Zuverlässigkeit der Übertragung zu erhöhen.
daher, Mit der Eingangserfassung kann die Impulsbreite des Hochpegels gemessen werden, um eine Fernbedienungsdekodierung zu erreichen.
2) Schematische Darstellung und CUBEMAX-Konfiguration
Aus dem schematischen Diagramm, Wir können sehen, dass das drahtlose Modul über den PB9-Pin aktiviert wird und über den sammelt 4 Kanäle von TIM4:
Der Standard-Pin von TIM4_CH4 ist nicht PB9, Daher muss es manuell eingestellt werden, und die Interrupt-Einstellung wird gleichzeitig aktiviert
3) Codeteil
Erfassen Sie die steigende Flanke über die Tim-Callback-Funktion
Zu diesem Zeitpunkt, Das dekodierte Signal kann erhalten werden:
Zu diesem Zeitpunkt, Die Daten sind komplexer und können leicht verarbeitet werden:
Der Effekt ist wie folgt:
Die letzten beiden Ziffern sind der dekodierte und sein inverser Code. Zu diesem Zeitpunkt, Es kann als Makro definiert werden, um den Temperaturschwellenwert anzupassen:
Der Effekt ist wie folgt:
Infrarot-Teilecode:
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @Datei : main.c
* @knapp : Hauptprogrammteil
******************************************************************************
* @Aufmerksamkeit
*
* <h2><Center>&Kopie; Copyright (C) 2024 STMicroelectronics.
* Alle Rechte vorbehalten.</Center></h2>
*
* Diese Softwarekomponente wird von ST unter der BSD 3-Clause-Lizenz lizenziert,
* Die “Lizenz”; Sie dürfen diese Datei nur in Übereinstimmung mit den verwenden
* Lizenz. Eine Kopie der Lizenz erhalten Sie unter:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* USER CODE END Header */
/* Inklusive ——————————————————————*/
#enthalten “main.h”
#enthalten “tim.h”
#enthalten “usart.h”
#enthalten “gpio.h”
/* Privat beinhaltet ———————————————————-*/
/* BENUTZERCODE ANFANG Enthält */
#enthalten “stdio.h”
#enthalten “string.h”
#Definieren Sie MAXUP 157
#Definieren Sie MAXDOWN 87
#Definieren Sie MINUP 221
#Definieren Sie MINDOWN 61
/* BENUTZERCODE ENDE Enthält */
/* Private Typdefinition ———————————————————–*/
/* BENUTZERCODE ANFANG PTD */
/* BENUTZERCODE ENDE PTD */
/* Privat definieren ————————————————————*/
/* BENUTZERCODE ANFANG PD */
/* BENUTZERCODE ENDE PD */
/* Privates Makro ————————————————————-*/
/* BENUTZERCODE ANFANG PM */
/* BENUTZERCODE ENDE PM */
/* Private Variablen ———————————————————*/
/* BENUTZERCODE ANFANG PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t Breite=0;
uint16_t-Puffer[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* BENUTZERCODE ENDE PV */
/* Private Funktionsprototypen ———————————————–*/
void SystemClock_Config(Leere);
/* BENUTZERCODE BEGIN PFP */
/* BENUTZERCODE ENDE PFP */
/* Privater Benutzercode ———————————————————*/
/* BENUTZERCODE ANFANG 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
Wenn(isUpCapt)//Wenn es sich um die Erfassung steigender Flanken handelt
{
ValueUp=HAL_TIM_ReadCapturedValue(htim htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
anders{
ValueDown=HAL_TIM_ReadCapturedValue(htim htim,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(htim htim,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
width=ValueDown+upCount*65536-ValueUp;
Wenn(Breite>4400&&Breite<4600)
{
Puffer-ID=0;
Puffer[bufferId++]=Breite;
}
sonst wenn(Puffer-ID>0)
{
Puffer[bufferId++]=Breite;
Wenn(Puffer-ID>32)
{
rcvFalg=1;
Puffer-ID=0;
}
}
}
}
void bitBuffer2num(Zeichennum[])
{
Num[0]=0;
Num[1]=0;
Num[2]=0;
Num[3]=0;
für(int i=0;ich<32;i++)
{
Wenn(Puffer[i+1]<1000)
{
Num[i/8]=Anzahl[i/8]<<1;
}
anders
{
Num[i/8]=Anzahl[i/8]<<1;
Num[i/8]|=0x01;
}
}
}
/* BENUTZERCODE ENDE 0 */
/**
* @brief Der Anwendungseinstiegspunkt.
* @retval int
*/
int main(Leere)
{
/* BENUTZERCODE ANFANG 1 */
char printbuff[128]={0};
Zeichennum[4]={0};
Zeichenschlüssel=0;
/* BENUTZERCODE ENDE 1 */
/* MCU-Konfiguration——————————————————–*/
/* Zurücksetzen aller Peripheriegeräte, Initialisiert die Flash-Schnittstelle und den Systick. */
HAL_Init();
/* BENUTZERCODE ANFANG Init */
/* BENUTZERCODE ENDE Init */
/* Konfigurieren Sie die Systemuhr */
SystemClock_Config();
/* BENUTZERCODE BEGIN SysInit */
/* BENUTZERCODE ENDE SysInit */
/* Initialisieren Sie alle konfigurierten Peripheriegeräte */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* BENUTZERCODE ANFANG 2 */
/* BENUTZERCODE ENDE 2 */
/* Endlosschleife */
/* BENUTZERCODE BEGIN WHILE */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Die Timer-Aktualisierung erzeugt einen Interrupt
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
während (1)
{
Wenn(rcvFalg)
{
für(int i=0;ich<4;i++)
{
bitBuffer2num(Num);
sprintf(Druckbuff,”0xx “,Num[ich]);
HAL_UART_Transmit(&huart1,printbuff,stren(Druckbuff),HAL_MAX_DELAY);
}
// sprintf(Druckbuff,”%u “,Puffer[ich]);
// HAL_UART_Transmit(&huart1,printbuff,stren(Druckbuff),HAL_MAX_DELAY);
// }
HAL_UART_Transmit(&huart1,”\rn”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%drn”,Num[3]);
Wenn(Num[3]==157)
{
printf(“111111\rn”);
}
HAL_Delay(1000);
/* BENUTZERCODE ENDE WÄHREND */
/* BENUTZERCODE ANFANG 3 */
}
/* BENUTZERCODE ENDE 3 */
}
/**
* @brief Systemuhrkonfiguration
* @retval Keine
*/
void SystemClock_Config(Leere)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
English
Afrikaans
العربية
বাংলা
bosanski jezik
Български
Català
粤语
中文(简体)
中文(漢字)
Hrvatski
Čeština
Nederlands
Eesti keel
Suomi
Français
Deutsch
Ελληνικά
हिन्दी; हिंदी
Magyar
Bahasa Indonesia
Italiano
日本語
한국어
Latviešu valoda
Lietuvių kalba
македонски јазик
Bahasa Melayu
Norsk
پارسی
Polski
Português
Română
Русский
Cрпски језик
Slovenčina
Slovenščina
Español
Svenska
ภาษาไทย
Türkçe
Українська
اردو
Tiếng Việt









