Temperatursensorteknologi

Temperatursensorsonde (Funksjonell kretsdesign av DS18B20 og PT100)

DS18B20-skjema og CUBEMAX-konfigurasjon

Sammenligning mellom PT100 temperatursensor sonde og DS18B20 modul
1) Grunnleggende prinsipp for signalinnsamling
① Motstanden til PT100 endres proporsjonalt med temperaturen (jo høyere temperatur, jo større motstand), men motstandsendringen er veldig liten, ca 0.385 Åh / grad;
② Temperaturmåleområdet til PT100 er -200 ℃ -200 ℃, og ved 0℃, motstanden er nøyaktig lik 100 Åh;
③ Arbeidsstrømmen til PT100 bør være mindre enn 5 mA;
④ Selv om motstanden til PT100 endres proporsjonalt med temperaturen, dens endringshastighet (det er, K-verdi K-verdi K-verdi) er forskjellig i forskjellige temperaturområder.

2) PT100 endringstabell for temperaturmotstand

PT100 endringstabell for temperaturmotstand

3. PT100 drivkrets

PT100 drivkrets

PT100 drivkrets

1) Gjennom spenningsdelingsmetoden, AD samler PT100-spenning for å oppnå motstandsverdi for å beregne temperatur
Motstandsverdien til PT100 i vann ved romtemperatur (25℃25℃25℃) handler om 109.89 Åh.
Mikrokontrolleren sender ut 3,3V spenning, og spenningen delt på PT100 er omtrentlig:
109.89 ∗ 0.005 = 0.54945 V

AD-verdien konvertert i henhold til AD-konverteringsformelen er omtrentlig:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682

Når temperaturen stiger med én grad, forutsatt at motstanden til PT100 bare stiger med 0.385 Åh, endringsverdien til spenningen delt er omtrent lik:
0.385 ∗ 0.005 = 0.001925 V

AD-verdien konvertert i henhold til AD-konverteringsformelen er omtrentlig:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2

I eksperimentet, det ble funnet at på grunn av den ustabile 3,3V spenningen til stm32 strømforsyningen, ADC-en samlet PT100-spenningssvingninger og spenningsdelingsfeilen var stor. Optimaliseringsløsningen er å designe en konstantstrømkildekrets. Ved å samle spenningen til PT100 og strømmen til konstantstrømkilden, motstanden til PT100 kan oppnås, og deretter kan temperaturverdien oppnås.

2) Konstant strømkildekrets basert på LDO-regulator (MD5333)
Det er mange kjørekretser for testing av PT100 på Internett, slik som DC-brokrets, konstant strømkildekrets basert på operasjonsforsterker, osv. Forfatteren brukte også mye tid på å velge kjørekrets, med tanke på vanskeligheten med å lage brettet og antall komponenter, og til slutt valgte konstantstrømkildekretsen basert på LDO-regulator (MD5333). Kretsskjemaet er som følger:

Konstant strømkildekrets til LDO-regulator (MD5333)

Konstant strømkildekrets til LDO-regulator (MD5333)

På dette tidspunktet, maskinvarevalget er i hovedsak fullført. Utviklingsbrettet som brukes er Zhengdian Atom F10ZET6 Elite Board

DS18B20 modul
For å teste sanntidstemperaturen og PT100 temperatursammenligning, DS18B20-modulen er lagt til for kalibreringssammenligningstest

1) Introduksjon til DS18B20
DS18B20 er en enkeltbuss temperatursensor med et testtemperaturområde på -55~+125 ℃ og en nøyaktighet på ±0,5 ℃. Felttemperaturen overføres direkte på en enkeltbuss digital måte, noe som i stor grad forbedrer systemets anti-interferensevne. Den kan direkte lese den målte temperaturen, og kan realisere en 9~12-biters digital verdilesingsmetode gjennom enkel programmering i henhold til faktiske krav. Driftsspenningsområdet er 3~5,5V, og den bruker en rekke emballasjeformer, gjør systeminnstillingen fleksibel og praktisk. Den innstilte oppløsningen og alarmtemperaturen som er angitt av brukeren, lagres i EEPROM og lagres fortsatt etter strømbrudd.

DS18B20 kretsdesign

DS18B20 kretsdesign

2) Introduksjon til DS18B20 arbeidstiming
Alle enkeltbussenheter krever streng signaltiming for å sikre dataintegritet. DS18B20 har 6 signaltyper: tilbakestille puls, responspuls, skrive 0, skrive 1, lese 0 og lese 1. Alle disse signalene, bortsett fra responspulsen, er synkrone signaler sendt av verten. Og alle kommandoer og data sendes med den lave biten av byten først.

DS18B20 tilbakestilt puls og responspuls

DS18B20 tilbakestilt puls og responspuls

① Tilbakestill puls og responspuls
All kommunikasjon på enkeltbussen starter med en initialiseringssekvens. Verten sender ut et lavt nivå og holder det lave nivået i minst 480us for å generere en tilbakestillingspuls. Så slipper programlederen bussen, og 4,7K pull-up motstanden trekker enkeltbussen høyt, med en forsinkelsestid på 15~60us, og går inn i mottaksmodus (Rx). Deretter trekker DS18B20 bussen lavt i 60~240us for å generere en responspuls på lavt nivå.

DS18B20 skrivetiming

DS18B20 skrivetiming

② Skriv timing
Skrivetidspunktet inkluderer skriving 0 timing og skriv 1 timing. Alle skrivetider krever minst 60us, og det kreves minst 1us gjenopprettingstid mellom to uavhengige skrivetidspunkter. Begge skrivetidspunktene starter med at verten trekker ned bussen. Skrive 1 timing: verten gir ut et lavt nivå, forsinkelser for 2us, og slipper så bussen, forsinker 60us. Skrive 0 timing: verten gir ut et lavt nivå, forsinkelser for 60us, og slipper deretter bussen med en forsinkelse på 2us.

DS18B20 Read Timing

DS18B20 Read Timing

③ Les timing
Enkeltbussenheter overfører data til verten bare når verten utsteder en lesetiming. Derfor, etter at verten utsteder en lesedatakommando, en lesetiming må genereres umiddelbart slik at slaven kan overføre data. Alle lesetider krever minst 60us, og det kreves minst 1us gjenopprettingstid mellom to uavhengige lesetidspunkter. Hver lesetiming initieres av verten, som trekker ned bussen i minst 1us. Verten må frigjøre bussen under lesetimingen og prøve bussstatusen innen 15us etter at timingen starter. Den typiske lesetimingsprosessen er: verten sender ut en lavnivåforsinkelse på 2us, så bytter verten til inngangsmodusforsinkelse på 12us, leser deretter gjeldende nivå for enkeltbussen, og deretter forsinker 50us.

DS18B20 åpner serieporten for å skrive ut temperaturinformasjon

DS18B20 åpner serieporten for å skrive ut temperaturinformasjon

Etter å ha forstått den enkle busstimingen, la oss ta en titt på den typiske temperaturlesingsprosessen til DS18B20. Den typiske temperaturavlesningsprosessen til DS18B20 er: tilbakestill → send SKIPROM (0XCC) → send start konverteringskommando (0x44) → forsinkelse → tilbakestill → send SKIPROM-kommando (0XCC) → send minnekommando (0Xbe) → les to byte med data (dvs. temperatur) kontinuerlig → slutt.

3) Skjematisk diagram og CUBEMAX-konfigurasjon
Fra det skjematiske diagrammet, det kan sees at DS18B20 er aktivert av PG11-porten for å åpne serieporten for å skrive ut temperaturinformasjon

DS18B20-skjema og CUBEMAX-konfigurasjon

DS18B20-skjema og CUBEMAX-konfigurasjon

DS18B20 temperatur- og fuktighetssensorgrensesnitt

DS18B20 temperatur- og fuktighetssensorgrensesnitt

4) Kodedel
Kodedelen transplanterer ds18b20-biblioteket til Zhengdian Atom og gjør små modifikasjoner

#ifndef __DS18B20_H
#definer __DS18B20_H

#inkludere “tim.h”
/***********************************************************************************/
/* DS18B20 pin definisjon */

#definere DS18B20_DQ_GPIO_PORT GPIOG
#definer DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#definere DS18B20_DQ_GPIO_CLK_ENABLE() gjøre{ __HAL_RCC_GPIOG_CLK_ENABLE(); }mens(0) /* PG port klokke aktivert */

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

/* IO-driftsfunksjon */
#definere DS18B20_DQ_OUT(x) gjøre{ 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); \
}mens(0) /* Dataportutgang */
#definere DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Dataportinngang */

uint8_t ds18b20_init(ugyldig); /* Initialiser DS18B20 */
uint8_t ds18b20_check(ugyldig); /* Sjekk om DS18B20 eksisterer */
kort ds18b20_get_temperature(ugyldig);/* Få temperatur */

#endif

5. Infrarød fjernkontrollmodul
1) Kodeprotokoll for trådløs modul

De mye brukte kodemetodene for infrarød fjernkontroll er: NEC-protokoll for PWM (pulsbreddemodulasjon) og RC-5-protokollen til Philips PPM (pulsposisjonsmodulasjon). Fjernkontrollen som følger med utviklingskortet bruker NEC-protokollen, som har følgende funksjoner:

1. 8-bitadresse og 8-bits instruksjonslengde;

2. Adresse og kommando overføres to ganger (for å sikre pålitelighet);

3. PWM pulsposisjonsmodulasjon, med driftssyklusen til den overførte infrarøde bæreren som representerer “0” og “1”;

4. Bærefrekvensen er 38Khz;

5. Bittiden er 1,125ms eller 2,25ms;

I NEC-protokollen, hvordan sette dataene i protokollen til ‘0’ eller "1"? Her, den infrarøde mottakeren og den infrarøde senderen er atskilt.

Infrarød sender: Send protokolldata '0' = 560us av bæresignaloverføring + 560oss av ingen bærer signaloverføring

Send protokolldata '1' = 560us av bæresignaloverføring + 1680oss av ingen bærer signaloverføring

Bitdefinisjonen for infrarød sender er vist i figuren nedenfor

Infrarød mottaker: Motta protokolldata '0' = 560us lavt nivå + 560oss på høyt nivå

Motta protokolldata '1' = 560us lavt nivå + 1680oss på høyt nivå

Dataformatet til NEC-fjernkontrollkommandoen er: synkroniseringsterminal, adressekode, adresse invers kode, kontrollkode, kontroll invers kode. Synkroniseringskoden består av et 9ms lavt nivå og et 4,5ms høyt nivå. Adressekoden, adresse invers kode, kontrollkode, og kontrollinvers kode er alle 8-biters dataformater. De sendes i rekkefølgen lav bit først og høy bit sist. Den inverse koden brukes for å øke påliteligheten til overføringen.

Derfor, input capture kan brukes til å måle pulsbredden til det høye nivået for å oppnå fjernkontrolldekoding.
2) Skjematisk diagram og CUBEMAX-konfigurasjon

Fra det skjematiske diagrammet, vi kan se at den trådløse modulen er aktivert gjennom PB9-pinnen og samles gjennom 4 kanaler til TIM4:

Standardpinnen til TIM4_CH4 er ikke PB9, så det må stilles inn manuelt, og avbruddsinnstillingen er slått på samtidig

3) Kodedel
Fang den stigende kanten gjennom tim-tilbakeringingsfunksjonen

På dette tidspunktet, det dekodede signalet kan oppnås:

På dette tidspunktet, dataene er mer komplekse og kan behandles litt:

Effekten er som følger:
De to siste sifrene er den dekodede og dens inverse koden. På dette tidspunktet, den kan defineres som en makro for å justere temperaturterskelen:

Effekten er som følger:

Infrarød delkode:

/* BRUKERKODE BEGIN Header */
/**
******************************************************************************
* @fil : main.c
* @kort : Hovedprogramtekst
******************************************************************************
* @oppmerksomhet
*
* <h2><senter>&kopiere; Opphavsrett (c) 2024 STMicroelectronics.
* Alle rettigheter forbeholdt.</senter></h2>
*
* Denne programvarekomponenten er lisensiert av ST under BSD 3-klausul lisens,
* de “Tillatelse”; Du kan ikke bruke denne filen unntatt i samsvar med
* Tillatelse. Du kan få en kopi av lisensen på:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* BRUKERKODE SLUTT Overskrift */
/* Inkluderer ——————————————————————*/
#inkludere “hoved.h”
#inkludere “tim.h”
#inkludere “usart.h”
#inkludere “gpio.h”

/* Privat inkluderer ———————————————————-*/
/* BRUKERKODE BEGIN Inkluderer */
#inkludere “stdio.h”
#inkludere “streng.h”
#definer MAKSUP 157
#definer MAXDOWN 87
#definer MINUP 221
#definer MINDOWN 61
/* BRUKERKODE SLUTT Inkluderer */

/* Privat typedef ———————————————————–*/
/* BRUKERKODE START PTD */

/* BRUKERKODE SLUTT PTD */

/* Privat definer ————————————————————*/
/* BRUKERKODE BEGYNN PD */
/* BRUKERKODE SLUTT PD */

/* Privat makro ————————————————————-*/
/* BRUKERKODE BEGYNN PM */

/* BRUKERKODE SLUTT PM */

/* Private variabler ———————————————————*/

/* BRUKERKODE BEGYNN PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t width=0;
uint16_t buffer[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* BRUKERKODE SLUTT PV */

/* Prototyper for private funksjoner ———————————————–*/
void SystemClock_Config(ugyldig);
/* BRUKERKODE START PFP */

/* BRUKERKODE SLUTT PFP */

/* Privat brukerkode ———————————————————*/
/* BRUKERKODE BEGYNN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
ugyldig HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
hvis(isUpCapt)//Hvis det er stigende kantfangst
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
ellers{
ValueDown=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
width=ValueDown+upCount*65536-ValueUp;
hvis(bredde>4400&&bredde<4600)
{
bufferId=0;
buffer[bufferId++]=bredde;
}
annet hvis(bufferId>0)
{
buffer[bufferId++]=bredde;
hvis(bufferId>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
ugyldig bitBuffer2num(røye num[])
{
num[0]=0;
num[1]=0;
num[2]=0;
num[3]=0;
til(int i=0;jeg<32;i++)
{
hvis(buffer[i+1]<1000)
{
num[i/8]=antall[i/8]<<1;
}
ellers
{
num[i/8]=antall[i/8]<<1;
num[i/8]|=0x01;
}
}
}
/* BRUKERKODE SLUTT 0 */

/**
* @brief Applikasjonsinngangspunktet.
* @retval int
*/
Int Main(ugyldig)
{
/* BRUKERKODE BEGYNN 1 */
røye printbuff[128]={0};
røye num[4]={0};
char key=0;
/* BRUKERKODE SLUTT 1 */

/* MCU-konfigurasjon——————————————————–*/

/* Tilbakestilling av alle eksterne enheter, Initialiserer Flash-grensesnittet og Systick. */
HAL_Init();

/* BRUKERKODE BEGIN Init */

/* BRUKERKODE SLUTT Init */

/* Konfigurer systemklokken */
SystemClock_Config();

/* BRUKERKODE START SysInit */

/* BRUKERKODE SLUTT SysInit */

/* Initialiser alle konfigurerte eksterne enheter */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* BRUKERKODE BEGYNN 2 */

/* BRUKERKODE SLUTT 2 */

/* Uendelig løkke */
/* BRUKERKODE BEGYNNER MENS */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Timeroppdatering genererer et avbrudd
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
mens (1)
{
hvis(rcvFalg)
{
til(int i=0;jeg<4;i++)
{
bitBuffer2num(num);
sprintf(printbuff,”0xx “,num[jeg]);
HAL_UART_Send(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%u “,buffer[jeg]);
// HAL_UART_Send(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Send(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%d\r\n”,num[3]);
hvis(num[3]==157)
{
printf(“111111\r\n”);
}
HAL_Forsinkelse(1000);
/* BRUKERKODE SLUTTER MENS */

/* BRUKERKODE BEGYNN 3 */
}
/* BRUKERKODE SLUTT 3 */
}

/**
* @brief Systemklokkekonfigurasjon
* @retval Ingen
*/
void SystemClock_Config(ugyldig)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};