Technologie van temperatuursensoren

Sonde van de temperatuursensor (Functioneel circuitontwerp van DS18B20 en PT100)

DS18B20-schema en CUBEMAX-configuratie

Vergelijking tussen PT100 temperatuursensor sonde en DS18B20-module
1) Basisprincipe van signaalverwerving
① De weerstand van PT100 verandert evenredig met de temperatuur (Hoe hoger de temperatuur, Hoe groter de weerstand), Maar de weerstandsverandering is erg klein, over 0.385 Oh / rang;
② Het temperatuurmeetbereik van de PT100 is -200℃ -200℃, en bij 0℃, de weerstand is precies gelijk aan 100 Oh;
③ De werkstroom van PT100 moet minder zijn dan 5 mA;
④ Hoewel de weerstand van PT100 evenredig verandert met de temperatuur, zijn veranderingssnelheid (dat is, K-waarde K-waarde K-waarde) is verschillend in verschillende temperatuurbereiken.

2) PT100 Temperatuurweerstand Wijziging Tabel

PT100 Temperatuurweerstand Wijziging Tabel

3. PT100 aandrijfcircuit

PT100 aandrijfcircuit

PT100 aandrijfcircuit

1) Via de spanningsdelingsmethode, AD verzamelt de PT100-spanning om de weerstandswaarde te verkrijgen en de temperatuur te berekenen
De weerstandswaarde van PT100 in water bij kamertemperatuur (25℃25℃25℃) gaat over 109.89 Oh.
De microcontroller levert een spanning van 3,3 V, en de spanning gedeeld door PT100 is ongeveer:
109.89 ∗ 0.005 = 0.54945 V

De AD-waarde omgerekend volgens de AD-conversieformule is bij benadering:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682

Als de temperatuur één graad stijgt, ervan uitgaande dat de weerstand van PT100 gewoon stijgt 0.385 Oh, de veranderingswaarde van de verdeelde spanning is ongeveer gelijk aan:
0.385 ∗ 0.005 = 0.001925 V

De AD-waarde omgerekend volgens de AD-conversieformule is bij benadering:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2

In het experiment, het bleek dat dit te wijten was aan de onstabiele 3,3V-spanning van de stm32-voeding, de ADC verzamelde PT100-spanningsschommelingen en de spanningsdelingsfout was groot. De optimalisatieoplossing is het ontwerpen van een broncircuit met constante stroom. Door de spanning van PT100 en de stroom van de constante stroombron te verzamelen, de weerstand van PT100 kan worden verkregen, en dan kan de temperatuurwaarde worden verkregen.

2) Constante stroombroncircuit gebaseerd op LDO-regelaar (MD5333)
Er zijn veel stuurcircuits voor het testen van de PT100 op internet, zoals DC-brugcircuit, constante stroombroncircuit gebaseerd op een operationele versterker, enz. De auteur heeft ook veel tijd besteed aan het selecteren van het rijcircuit, Gezien de moeilijkheid om het bord te maken en het aantal componenten, en koos uiteindelijk het constante stroombroncircuit op basis van LDO -regulator (MD5333). Het circuitdiagram is als volgt:

Constante stroombroncircuit van LDO -regulator (MD5333)

Constante stroombroncircuit van LDO -regulator (MD5333)

Op dit punt, De hardware -selectie is in principe voltooid. Het gebruikte ontwikkelingsbord is het Zhengdian Atom F10Zet6 Elite Board

DS18B20-module
Om de realtime temperatuur en PT100-temperatuurvergelijking te testen, De DS18B20 -module is toegevoegd voor kalibratievergelijkingstest

1) Inleiding tot DS18B20
DS18B20 is een temperatuursensor met één bus met een testtemperatuurbereik van -55 ~+125 ℃ en een nauwkeurigheid van ± 0,5 ℃. De veldtemperatuur wordt direct op een digitale manier van één bus verzonden, wat het anti-interferentievermogen van het systeem aanzienlijk verbetert. Het kan de gemeten temperatuur direct aflezen, en kan een 9~12-bits leesmethode voor digitale waarden realiseren door middel van eenvoudige programmering volgens de werkelijke vereisten. Het bedrijfsspanningsbereik is 3 ~ 5,5 V, en er wordt gebruik gemaakt van een verscheidenheid aan verpakkingsvormen, waardoor de systeeminstelling flexibel en gemakkelijk is. De ingestelde resolutie en de door de gebruiker ingestelde alarmtemperatuur worden opgeslagen in de EEPROM en blijven ook na stroomuitval bewaard.

DS18B20-circuitontwerp

DS18B20-circuitontwerp

2) Inleiding tot de werktiming van de DS18B20
Alle apparaten met één bus vereisen een strikte signaaltiming om de gegevensintegriteit te garanderen. DS18B20 heeft 6 signaal typen: reset puls, reactiepuls, schrijven 0, schrijven 1, lezen 0 en lees 1. Al deze signalen, behalve de responspuls, zijn synchrone signalen verzonden door de host. En alle opdrachten en gegevens worden eerst met het lage bit van de byte verzonden.

DS18B20 resetpuls en responspuls

DS18B20 resetpuls en responspuls

① Resetpuls en reactiepuls
Alle communicatie op de enkele bus begint met een initialisatiesequentie. De host geeft een laag niveau af en houdt het lage niveau minimaal 480us aan om een ​​resetpuls te genereren. Vervolgens laat de gastheer de bus vrij, en de pull-up-weerstand van 4,7 K trekt de enkele bus hoog, met een vertragingstijd van 15~60us, en gaat naar de ontvangstmodus (Rx). Vervolgens trekt DS18B20 de bus 60~240us laag om een ​​responspuls op laag niveau te genereren.

DS18B20 schrijftiming

DS18B20 schrijftiming

② Schrijf timing
De schrijftiming omvat schrijven 0 timing en schrijven 1 timing. Alle schrijftimings vereisen minimaal 60us, en er is minimaal 1us hersteltijd vereist tussen twee onafhankelijke schrijftimings. Beide schrijftimings beginnen met de gastheer die de bus naar beneden trekt. Schrijven 1 timing: De host voert een laag niveau uit, Vertragingen voor 2US, en laat vervolgens de bus vrij, 60US vertragen. Schrijven 0 timing: De host voert een laag niveau uit, Vertragingen voor 60US, en laat vervolgens de bus vrij met een vertraging van 2US.

DS18B20 Lees timing

DS18B20 Lees timing

③ Lees timing
Single-Bus-apparaten verzenden gegevens alleen naar de host wanneer de host een leestiming uitgeeft. Daarom, Nadat de host een opdracht voor het lezen van gegevens heeft afgeeft, Een leestiming moet onmiddellijk worden gegenereerd, zodat de slaaf gegevens kan verzenden. Alle leestimings vereisen minimaal 60US, en ten minste 1US hersteltijd is vereist tussen twee onafhankelijke leestimings. Elke leestiming wordt geïnitieerd door de host, die de bus naar beneden trekt voor minstens 1US. De host moet de bus vrijgeven tijdens de leestiming en de busstatus binnen 15us proeven nadat de timing begint. Het typische leestimingproces is: De host voert een lage vertraging van 2U's uit, Vervolgens schakelt de host over naar de vertraging van de invoermodus van 12US, Lees vervolgens het huidige niveau van de enkele bus, en vertraagt ​​dan 50US.

DS18B20 opent de seriële poort om temperatuurinformatie af te drukken

DS18B20 opent de seriële poort om temperatuurinformatie af te drukken

Na het begrijpen van de enkele bustiming, Laten we eens kijken naar het typische temperatuurleesproces van DS18B20. Het typische temperatuurleesproces van DS18B20 is: Reset → Stuur Skiprom (0XCC) → Start Conversion -opdracht verzenden (0x44) → Vertraging → Reset → Opdracht Skiprom verzenden (0XCC) → Commando verzenden geheugen (0Xbe) → Lees twee bytes aan gegevens (d.w.z. temperatuur) continu → einde.

3) Schematische diagram en Cubemax -configuratie
Van het schematische diagram, het is te zien dat DS18B20 door de PG11-poort is ingeschakeld om de seriële poort te openen om temperatuurinformatie af te drukken

DS18B20-schema en CUBEMAX-configuratie

DS18B20-schema en CUBEMAX-configuratie

DS18B20 temperatuur- en vochtigheidssensorinterface

DS18B20 temperatuur- en vochtigheidssensorinterface

4) Codegedeelte
Het codegedeelte transplanteert de ds18b20-bibliotheek van Zhengdian Atom en brengt kleine wijzigingen aan

#ifndef __DS18B20_H
#definieer __DS18B20_H

#erbij betrekken “tim.h”
/***********************************************************************************/
/* DS18B20-pindefinitie */

#definieer DS18B20_DQ_GPIO_PORT GPIOG
#definieer DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#definieer DS18B20_DQ_GPIO_CLK_ENABLE() Doen{ __HAL_RCC_GPIOG_CLK_ENABLE(); }terwijl(0) /* PG-poortklok inschakelen */

/**********************************************************************************************/

/* IO-bedieningsfunctie */
#definieer DS18B20_DQ_OUT(X) Doen{ 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); \
}terwijl(0) /* Uitgang datapoort */
#definieer DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Datapoortingang */

uint8_t ds18b20_init(leegte); /* Initialiseer DS18B20 */
uint8_t ds18b20_check(leegte); /* Controleer of DS18B20 bestaat */
korte ds18b20_get_temperatuur(leegte);/* Temperatuur verkrijgen */

#endif

5. Infrarood afstandsbedieningsmodule
1) Coderingsprotocol voor draadloze modules

De veelgebruikte coderingsmethoden voor infrarood afstandsbediening zijn: NEC -protocol van PWM (Pulsbreedtemodulatie) en RC-5-protocol van Philips PPM (Pulspositiemodulatie). De afstandsbediening die bij het ontwikkelingsbord wordt geleverd, gebruikt het NEC -protocol, die de volgende functies heeft:

1. 8-Bit-adres en 8-bit instructiellengte;

2. Adres en opdracht worden twee keer verzonden (Om betrouwbaarheid te waarborgen);

3. PWM Puls Position Modulatie, met de duty cyclus van de verzonden infrarooddrager die vertegenwoordigt “0” En “1”;

4. De carrierfrequentie is 38 kHz;

5. De bittijd is 1,125 ms of 2,25 ms;

In het NEC -protocol, Hoe de gegevens in het protocol in te stellen op ‘0’ of ‘1’? Hier, De infraroodontvanger en infraroodzender zijn gescheiden.

Infrarood zender: Verzend protocolgegevens ‘0’ = 560US van drager signaaloverdracht + 560ons van geen transmissie voor dragersignaal

Verzend protocolgegevens ‘1’ = 560us draaggolfsignaaloverdracht + 1680ons van geen transmissie voor dragersignaal

De bitdefinitie van de infraroodzender wordt weergegeven in de onderstaande afbeelding

Infrarood ontvanger: Ontvang protocolgegevens ‘0’ = 560us laag niveau + 560ons hoog niveau

Ontvang protocolgegevens ‘1’ = 560us laag niveau + 1680ons hoog niveau

Het gegevensformaat van de NEC-afstandsbedieningsopdracht is: synchronisatie-terminal, adrescode, adres inverse code, controlecode, controle inverse code. De synchronisatiecode bestaat uit een laag niveau van 9 ms en een hoog niveau van 4,5 ms. De adrescode, adres inverse code, controlecode, en besturingsinverse code zijn allemaal 8-bits dataformaten. Ze worden verzonden in de volgorde van laag bit eerst en hoog bit als laatste. De inverse code wordt gebruikt om de betrouwbaarheid van de verzending te vergroten.

Daarom, Inputcapture kan worden gebruikt om de pulsbreedte van het hoge niveau te meten om decodering van afstandsbediening te bereiken.
2) Schematische diagram en Cubemax -configuratie

Van het schematische diagram, We kunnen zien dat de draadloze module is ingeschakeld via de PB9 -pin en verzamelt door de 4 kanalen van Tim4:

De standaardpen van Tim4_CH4 is niet PB9, Het moet dus handmatig worden ingesteld, en de onderbrekingsinstelling is tegelijkertijd ingeschakeld

3) Codegedeelte
Leg de stijgende rand vast via de tim callback -functie

Op dit moment, Het gedecodeerde signaal kan worden verkregen:

Op dit moment, De gegevens zijn complexer en kunnen enigszins worden verwerkt:

Het effect is als volgt:
De laatste twee cijfers zijn de gedecodeerde en de omgekeerde code. Op dit moment, Het kan worden gedefinieerd als een macro om de temperatuurdrempel aan te passen:

Het effect is als volgt:

Infrarood deelcode:

/* Gebruikerscode Begin koptekst */
/**
******************************************************************************
* @bestand : hand.c
* @kort : Hoofdprogramma -body
******************************************************************************
* @aandacht
*
* <H2><centrum>&kopiëren; Copyright (C) 2024 Stmicro -elektronica.
* Alle rechten voorbehouden.</centrum></H2>
*
* Dit softwareonderdeel is gelicentieerd door ST onder de BSD 3-Clause-licentie,
* de “Licentie”; U mag dit bestand alleen gebruiken in overeenstemming met de
* Licentie. U kunt een kopie van de licentie verkrijgen op:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* GEBRUIKERSCODE EINDE Koptekst */
/* Inclusief ——————————————————————*/
#erbij betrekken “hoofd.h”
#erbij betrekken “tim.h”
#erbij betrekken “USART.H”
#erbij betrekken “gpio.h”

/* Privé omvat ———————————————————-*/
/* GEBRUIKERSCODE BEGIN Inclusief */
#erbij betrekken “stdio.h”
#erbij betrekken “string.h”
#MAXUP definiëren 157
#definieer MAXDOWN 87
#MINUP definiëren 221
#MINDOWN definiëren 61
/* GEBRUIKERSCODE EINDE Inclusief */

/* Privé typedef ———————————————————–*/
/* GEBRUIKERSCODE BEGIN PTD */

/* GEBRUIKERSCODE EINDE PTD */

/* Privé definiëren ————————————————————*/
/* GEBRUIKERSCODE BEGINNEN PD */
/* GEBRUIKERSCODE EINDE PD */

/* Privé-macro ————————————————————-*/
/* GEBRUIKERSCODE BEGIN PM */

/* GEBRUIKERSCODE EINDE PM */

/* Privévariabelen ———————————————————*/

/* GEBRUIKERSCODE BEGINNEN PV */
uint32_t upCount=0;
uint16_t WaardeUp=0;
uint16_t WaardeDown=0;
uint8_t isUpCapt=1;
uint16_t breedte=0;
uint16_t-buffer[128]={0};
uint16_t bufferId=0;
uint8_t rcvfalg = 0;
/* GEBRUIKERSCODE EINDE PV */

/* Prototypes voor privéfuncties ———————————————–*/
ongeldig SystemClock_Config(leegte);
/* GEBRUIKERSCODE BEGIN PFP */

/* GEBRUIKERSCODE EINDE PFP */

/* Privé gebruikerscode ———————————————————*/
/* GEBRUIKERSCODE BEGINNEN 0 */
void hal_tim_periodelapsed callback(Tim_HandletyPedef *Htim)
{
UPCOUNT ++;
}
void hal_tim_ic_capturecallback(Tim_HandletyPedef *Htim)
{
als(isUpcapt)//Als het een stijgende randopvang is
{
ValueUp = hal_tim_readcapturedValue(Htim Htim,Tim_channel_4);
isUpcapt = 0;
__Hal_tim_set_capturepolariteit(Htim Htim,Tim_channel_4, tim_icpolarity_falling);
UPCOUNT = 0;
}
anders{
Gewone hoorgave = hal_tim_readcapturedValue(Htim Htim,Tim_channel_4);
isUpcapt = 1;
__Hal_tim_set_capturepolariteit(Htim Htim,Tim_channel_4, tim_icpolarity_rising);
width = gewaardeerd+upcount*65536-valueUp;
als(breedte>4400&&breedte<4600)
{
bufferid = 0;
buffer[bufferid ++]= breedte;
}
anders als(buffel>0)
{
buffer[bufferid ++]= breedte;
als(buffel>32)
{
rcvfalg = 1;
bufferid = 0;
}
}
}
}
void bitbuffer2num(Char Num[])
{
num[0]= 0;
num[1]= 0;
num[2]= 0;
num[3]= 0;
voor(int i = 0;i<32;I ++)
{
als(buffer[I+1]<1000)
{
num[I/8]= Num[I/8]<<1;
}
anders
{
num[I/8]= Num[I/8]<<1;
num[I/8]|= 0x01;
}
}
}
/* Gebruikerscode einde 0 */

/**
* @Brief the Application Entry Point.
* @retval int
*/
Int Main(leegte)
{
/* GEBRUIKERSCODE BEGINNEN 1 */
Char printbuff[128]={0};
Char Num[4]={0};
CHAR -sleutel = 0;
/* Gebruikerscode einde 1 */

/* MCU -configuratie——————————————————–*/

/* Reset van alle randapparatuur, Initialiseert de flash -interface en de systick. */
Hal_init();

/* Gebruikerscode Begin init */

/* Gebruikerscode End Init */

/* Configureer de systeemklok */
SystemClock_Config();

/* Gebruikerscode begint met sysinit */

/* Gebruikerscode eindt sysinit */

/* Initialiseer alle geconfigureerde randapparatuur */
Mx_gpio_init();
Mx_tim4_init();
Mx_usart1_uart_init();
/* GEBRUIKERSCODE BEGINNEN 2 */

/* Gebruikerscode einde 2 */

/* Oneindige lus */
/* Gebruikerscode begint terwijl */
Hal_gpio_togglepin(LED0_GPIO_PORT,LED0_PIN);
Hal_tim_base_start_it(&Htim4);//Timer -update genereert een interrupt
Hal_tim_ic_start_it(&htim4, tim_channel_4);//
terwijl (1)
{
als(rcvfalg)
{
voor(int i = 0;i<4;I ++)
{
bitbuffer2num(num);
sprintf(printbuff,”0XX “,num[i]);
Hal_uart_transmit(&Huart1, printbuff,strellen(printbuff),Hal_max_delay);
}
// sprintf(printbuff,”%u “,buffer[i]);
// Hal_uart_transmit(&Huart1, printbuff,strellen(printbuff),Hal_max_delay);
// }
Hal_uart_transmit(&Huart1,”\r\n”,2,Hal_max_delay);
rcvfalg = 0;
}
printf(“%d\r\n”,num[3]);
als(num[3]== 157)
{
printf(“111111\r\n”);
}
Hal_delay(1000);
/* Gebruikerscode eindigt terwijl */

/* GEBRUIKERSCODE BEGINNEN 3 */
}
/* Gebruikerscode einde 3 */
}

/**
* @Brief System Clock Configuration
* @retval geen
*/
ongeldig SystemClock_Config(leegte)
{
Rcc_oscinittyPedef rcc_oscinitstruct = {0};
Rcc_clkinittypedef rcc_clkinitstruct = {0};