Temperatuursensor tegnologie

Temperatuursensor -sonde (Funksionele kringontwerp van DS18B20 en PT100)

DS18B20 skematiese en CUBEMAX konfigurasie

Vergelyking tussen PT100 temperatuursensor ondersoek en DS18B20 module
1) Basiese beginsel van seinverkryging
① Die weerstand van PT100 verander proporsioneel met die temperatuur (hoe hoër die temperatuur, hoe groter die weerstand), maar die weerstandsverandering is baie klein, oor 0.385 O / graad;
② Die temperatuurmetingsreeks van PT100 is -200℃ -200℃, en by 0℃, die weerstand is presies gelyk aan 100 O;
③ Die werkstroom van PT100 moet minder wees as 5 mA;
④ Alhoewel die weerstand van PT100 eweredig met die temperatuur verander, sy veranderingskoers (dit wil sê, K waarde K waarde K waarde) verskil in verskillende temperatuurreekse.

2) PT100 temperatuur weerstand verander tabel

PT100 temperatuur weerstand verander tabel

3. PT100 dryfkring

PT100 dryfkring

PT100 dryfkring

1) Deur die spanningsverdelingsmetode, AD versamel PT100-spanning om weerstandswaarde te verkry om temperatuur te bereken
Die weerstandswaarde van PT100 in water by kamertemperatuur (25℃25℃25℃) gaan oor 109.89 O.
Die mikrobeheerder lewer 3.3V spanning uit, en die spanning gedeel deur PT100 is ongeveer:
109.89 ∗ 0.005 = 0.54945 V

Die AD-waarde omgeskakel volgens die AD-omskakelingsformule is ongeveer:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682

Wanneer die temperatuur met een graad styg, aanvaar dat die weerstand van PT100 net styg met 0.385 O, die veranderingswaarde van die spanning verdeel is ongeveer gelyk aan:
0.385 ∗ 0.005 = 0.001925 V

Die AD-waarde omgeskakel volgens die AD-omskakelingsformule is ongeveer:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2

In die eksperiment, daar is gevind dat as gevolg van die onstabiele 3.3V spanning van die stm32 kragtoevoer, die ADC het PT100-spanningskommelings ingesamel en die spanningsverdelingsfout was groot. Die optimaliseringsoplossing is om 'n konstante stroombronkring te ontwerp. Deur die spanning van PT100 en die stroom van die konstante stroombron te versamel, die weerstand van PT100 kan verkry word, en dan kan die temperatuurwaarde verkry word.

2) Konstante stroombronkring gebaseer op LDO reguleerder (MD5333)
Daar is baie dryfkringe om PT100 op die internet te toets, soos DC-brugkring, konstante stroombronkring gebaseer op operasionele versterker, ens. Die skrywer het ook baie tyd spandeer om die dryfkring te kies, met inagneming van die moeilikheid om die bord te maak en die aantal komponente, en uiteindelik die konstante stroombronkring gebaseer op LDO reguleerder gekies (MD5333). Die stroombaandiagram is soos volg:

Konstante stroombronkring van LDO-reguleerder (MD5333)

Konstante stroombronkring van LDO-reguleerder (MD5333)

Op hierdie punt, die hardeware seleksie is basies voltooi. Die ontwikkelingsbord wat gebruik word, is die Zhengdian Atom F10ZET6 Elite Board

DS18B20 module
Om die intydse temperatuur- en PT100-temperatuurvergelyking te toets, die DS18B20-module word bygevoeg vir kalibrasie-vergelykingstoets

1) Inleiding tot DS18B20
DS18B20 is 'n enkelbus-temperatuursensor met 'n toetstemperatuurreeks van -55~+125℃ en 'n akkuraatheid van ±0.5℃. Die veldtemperatuur word direk op 'n enkelbus digitale manier oorgedra, wat die anti-inmengingsvermoë van die stelsel aansienlik verbeter. Dit kan die gemete temperatuur direk lees, en kan 'n 9 ~ 12-bis digitale waarde lees metode realiseer deur eenvoudige programmering volgens werklike vereistes. Die bedryfspanningsreeks is 3 ~ 5.5V, en dit gebruik 'n verskeidenheid verpakkingsvorme, maak die stelselinstelling buigsaam en gerieflik. Die vasgestelde resolusie en die alarmtemperatuur wat deur die gebruiker gestel is, word in die EEPROM gestoor en word steeds gestoor na kragonderbreking.

DS18B20 kringontwerp

DS18B20 kringontwerp

2) Inleiding tot DS18B20-werktydsberekening
Alle enkelbus-toestelle vereis streng seintydsberekening om data-integriteit te verseker. DS18B20 het 6 sein tipes: herstel pols, reaksie pols, skryf 0, skryf 1, lees 0 en lees 1. Al hierdie seine, behalwe die reaksie pols, is sinchroniese seine wat deur die gasheer gestuur word. En alle opdragte en data word eers met die lae bietjie van die greep gestuur.

DS18B20 herstel pols en reaksie pols

DS18B20 herstel pols en reaksie pols

① Stel pols en reaksie pols terug
Alle kommunikasie op die enkele bus begin met 'n inisialiseringsvolgorde. Die gasheer lewer 'n lae vlak uit en hou die lae vlak vir ten minste 480us om 'n reset-puls te genereer. Dan los die gasheer die bus, en die 4.7K-optrekweerstand trek die enkelbus hoog, met 'n vertragingstyd van 15 ~ 60 ons, en gaan na die ontvangsmodus (Rx). Dan trek DS18B20 die bus laag vir 60 ~ 240us om 'n lae-vlak reaksie pols te genereer.

DS18B20 skryf tydsberekening

DS18B20 skryf tydsberekening

② Skryf tydsberekening
Die skryftydsberekening sluit skryf in 0 tydsberekening en skryf 1 tydsberekening. Alle skryftydberekeninge vereis ten minste 60 ons, en ten minste 1us hersteltyd word benodig tussen twee onafhanklike skryftydberekeninge. Albei skryftydberekeninge begin met die gasheer wat die bus aftrek. Skryf 1 tydsberekening: die gasheer lewer 'n lae vlak uit, vertragings vir 2us, en laat dan die bus los, vertraag 60 ons. Skryf 0 tydsberekening: die gasheer lewer 'n lae vlak uit, vertragings vir 60 ons, en los dan die bus met 'n vertraging van 2us.

DS18B20 Lees Tydsberekening

DS18B20 Lees Tydsberekening

③ Lees tydsberekening
Enkelbustoestelle stuur slegs data na die gasheer wanneer die gasheer 'n leestydsberekening uitreik. Daarom, nadat die gasheer 'n leesdata-opdrag uitgereik het, 'n leestydsberekening moet onmiddellik gegenereer word sodat die slaaf data kan oordra. Alle leestydberekeninge vereis ten minste 60 ons, en ten minste 1us hersteltyd word benodig tussen twee onafhanklike leestydberekeninge. Elke leestydsberekening word deur die gasheer geïnisieer, wat die bus vir ten minste 1us aftrek. Die gasheer moet die bus vrystel tydens die leestydsberekening en die busstatus binne 15 ons na die begin van die tydsberekening monster. Die tipiese lees tydsberekening proses is: die gasheer lewer 'n lae vlak vertraging van 2us uit, dan skakel die gasheer oor na insetmodusvertraging van 12us, lees dan die huidige vlak van die enkele bus, en dan vertragings 50us.

DS18B20 maak die reekspoort oop om temperatuurinligting te druk

DS18B20 maak die reekspoort oop om temperatuurinligting te druk

Na die begrip van die enkele bus tydsberekening, kom ons kyk na die tipiese temperatuurleesproses van DS18B20. Die tipiese temperatuurleesproses van DS18B20 is: herstel → stuur SKIPROM (0xCC) → stuur begin omskakeling opdrag (0x44) → vertraging → stel terug → stuur SKIPROM-opdrag (0xCC) → stuur geheue opdrag (0xBE) → lees twee grepe data (m.a.w. temperatuur) voortdurend → einde.

3) Skematiese diagram en CUBEMAX-konfigurasie
Uit die skematiese diagram, dit kan gesien word dat DS18B20 deur PG11-poort geaktiveer is om die seriële poort oop te maak om temperatuurinligting te druk

DS18B20 skematiese en CUBEMAX konfigurasie

DS18B20 skematiese en CUBEMAX konfigurasie

DS18B20 temperatuur en humiditeit sensor koppelvlak

DS18B20 temperatuur en humiditeit sensor koppelvlak

4) Kode deel
Die kode deel oorplant die ds18b20 biblioteek van Zhengdian Atom en maak effense wysigings

#ifndef __DS18B20_H
#definieer __DS18B20_H

#insluit “tim.h”
/***********************************************************************************/
/* DS18B20 pen definisie */

#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(); }terwyl(0) /* PG-poortklok aktiveer */

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

/* IO-operasiefunksie */
#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); \
}terwyl(0) /* Datapoortuitvoer */
#definieer DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Datapoort invoer */

uint8_t ds18b20_init(nietig); /* Inisialiseer DS18B20 */
uint8_t ds18b20_check(nietig); /* Kyk of DS18B20 bestaan */
kort ds18b20_get_temperatuur(nietig);/* Kry temperatuur */

#endif

5. Infrarooi afstandbeheer module
1) Draadlose module kodering protokol

Die wyd gebruikte koderingsmetodes vir infrarooi afstandbeheer is: NEC-protokol van PWM (polswydte modulasie) en RC-5-protokol van Philips PPM (polsposisie modulasie). Die afstandbeheer wat saam met die ontwikkelingsbord kom, gebruik die NEC-protokol, wat die volgende kenmerke het:

1. 8-bietjie adres en 8-bis instruksie lengte;

2. Adres en opdrag word twee keer oorgedra (om betroubaarheid te verseker);

3. PWM polsposisie modulasie, met die dienssiklus van die uitgesaaide infrarooi draer wat verteenwoordig “0” en “1”;

4. Die drafrekwensie is 38Khz;

5. Die bistyd is 1.125ms of 2.25ms;

In die NEC-protokol, hoe om die data in die protokol op te stel ‘0’ of '1'? Hier, die infrarooi ontvanger en infrarooi sender is geskei.

Infrarooi sender: Stuur protokoldata '0' = 560us van draerseinoordrag + 560ons van geen draersein transmissie

Stuur protokoldata '1' = 560us van draerseinoordrag + 1680ons van geen draersein transmissie

Die bisdefinisie van infrarooi sender word in die figuur hieronder getoon

Infrarooi ontvanger: Ontvang protokoldata '0' = 560 ons lae vlak + 560ons hoë vlak

Ontvang protokoldata '1' = 560 ons lae vlak + 1680ons hoë vlak

Die dataformaat van NEC-afstandbeheeropdrag is: sinchronisasie terminaal, adres kode, adres inverse kode, beheer kode, beheer inverse kode. Die sinchronisasiekode bestaan ​​uit 'n 9ms lae vlak en 'n 4.5ms hoë vlak. Die adreskode, adres inverse kode, beheer kode, en beheer inverse kode is almal 8-bis data formate. Hulle word gestuur in die volgorde van lae bis eerste en hoë bis laaste. Die omgekeerde kode word gebruik om die betroubaarheid van transmissie te verhoog.

Daarom, insetvaslegging kan gebruik word om die polswydte van die hoë vlak te meet om afstandbeheerdekodering te verkry.
2) Skematiese diagram en CUBEMAX-konfigurasie

Uit die skematiese diagram, ons kan sien dat die draadlose module geaktiveer is deur die PB9 pen en versamel deur die 4 kanale van TIM4:

Die verstekpen van TIM4_CH4 is nie PB9 nie, dus moet dit met die hand ingestel word, en die onderbrekingsinstelling word terselfdertyd aangeskakel

3) Kode deel
Vang die stygende rand vas deur die tim-terugbelfunksie

Op hierdie tydstip, die gedekodeerde sein kan verkry word:

Op hierdie tydstip, die data is meer kompleks en kan effens verwerk word:

Die effek is soos volg:
Die laaste twee syfers is die gedekodeerde en sy inverse kode. Op hierdie tydstip, dit kan gedefinieer word as 'n makro om die temperatuurdrempel aan te pas:

Die effek is soos volg:

Infrarooi deelkode:

/* GEBRUIKERSKODE BEGIN Kopskrif */
/**
******************************************************************************
* @lêer : hoof.c
* @kortliks : Hoofprogramliggaam
******************************************************************************
* @aandag
*
* <h2><sentrum>&kopieer; Kopiereg (c) 2024 STMicroelectronics.
* Alle regte voorbehou.</sentrum></h2>
*
* Hierdie sagteware komponent is gelisensieer deur ST onder BSD 3-klousule lisensie,
* die “Lisensie”; Jy mag nie hierdie lêer gebruik nie, behalwe in ooreenstemming met die
* Lisensie. Jy kan 'n afskrif van die lisensie kry by:
* opensource.org/licenses/BSD-3-klousule
*
******************************************************************************
*/
/* GEBRUIKERSKODE EINDE Kopskrif */
/* Sluit in ——————————————————————*/
#insluit “hoof.h”
#insluit “tim.h”
#insluit “usart.h”
#insluit “gpio.h”

/* Privaat sluit in ———————————————————-*/
/* GEBRUIKERSKODE BEGIN Sluit in */
#insluit “stio.h”
#insluit “string.h”
#definieer MAXUP 157
#definieer MAXDOWN 87
#definieer MINUP 221
#definieer MINDOWN 61
/* GEBRUIKERSKODE EINDE Sluit in */

/* Privaat tipedef ———————————————————–*/
/* GEBRUIKERSKODE BEGIN PTD */

/* GEBRUIKERSKODE EINDE PTD */

/* Privaat definieer ————————————————————*/
/* GEBRUIKERSKODE BEGIN PD */
/* GEBRUIKERSKODE EINDE PD */

/* Privaat makro ————————————————————-*/
/* GEBRUIKERSKODE BEGIN PM */

/* GEBRUIKERSKODE EINDE PM */

/* Privaat veranderlikes ———————————————————*/

/* GEBRUIKERSKODE BEGIN 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;
/* GEBRUIKERSKODE EINDE PV */

/* Privaat funksie prototipes ———————————————–*/
nietig SystemClock_Config(nietig);
/* GEBRUIKERSKODE BEGIN PFP */

/* GEBRUIKERSKODE EINDE PFP */

/* Privaat gebruiker kode ———————————————————*/
/* GEBRUIKERSKODE BEGIN 0 */
nietig HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
nietig HAL_TIM_IC_Capture Terugbel(TIM_HandleTypeDef *htim)
{
as(isUpCapt)//As dit stygende rand vang
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
anders{
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;
as(breedte>4400&&breedte<4600)
{
bufferId=0;
buffer[bufferId++]= breedte;
}
anders as(bufferId>0)
{
buffer[bufferId++]= breedte;
as(bufferId>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
nietig bitBuffer2num(char nommer[])
{
nommer[0]=0;
nommer[1]=0;
nommer[2]=0;
nommer[3]=0;
vir(int i=0;i<32;ek++)
{
as(buffer[i+1]<1000)
{
nommer[i/8]=getal[i/8]<<1;
}
anders
{
nommer[i/8]=getal[i/8]<<1;
nommer[i/8]|=0x01;
}
}
}
/* GEBRUIKERSKODE EINDE 0 */

/**
* @brief Die aansoektoegangspunt.
* @retval int
*/
int hoof(nietig)
{
/* GEBRUIKERSKODE BEGIN 1 */
char printbuff[128]={0};
char nommer[4]={0};
char sleutel=0;
/* GEBRUIKERSKODE EINDE 1 */

/* MCU-konfigurasie——————————————————–*/

/* Herstel van alle randapparatuur, Inisialiseer die Flash-koppelvlak en die Systick. */
HAL_Init();

/* GEBRUIKERSKODE BEGIN Init */

/* GEBRUIKERSKODE EINDE Init */

/* Stel die stelselklok op */
SystemClock_Config();

/* GEBRUIKERSKODE BEGIN SysInit */

/* GEBRUIKERSKODE EINDE SysInit */

/* Inisialiseer alle gekonfigureerde randapparatuur */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* GEBRUIKERSKODE BEGIN 2 */

/* GEBRUIKERSKODE EINDE 2 */

/* Oneindige lus */
/* GEBRUIKERSKODE BEGIN TERWYL */
HAL_GPIO_TogglePin(LED0_GPIO_poort,LED0_Pen);
HAL_TIM_Base_Start_IT(&htim4);//Timer-opdatering genereer 'n onderbreking
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
terwyl (1)
{
as(rcvFalg)
{
vir(int i=0;i<4;ek++)
{
bitBuffer2num(nommer);
sprintf(drukbuff,”0xx “,nommer[i]);
HAL_UART_Send oor(&huart1,drukbuff,stren(drukbuff),HAL_MAX_DELAY);
}
// sprintf(drukbuff,”%u “,buffer[i]);
// HAL_UART_Send oor(&huart1,drukbuff,stren(drukbuff),HAL_MAX_DELAY);
// }
HAL_UART_Send oor(&huart1,”\rn”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
drukf(“%drn”,nommer[3]);
as(nommer[3]==157)
{
drukf(“111111\rn”);
}
HAL_Vertraging(1000);
/* GEBRUIKERS KODE EINDE TERWYL */

/* GEBRUIKERSKODE BEGIN 3 */
}
/* GEBRUIKERSKODE EINDE 3 */
}

/**
* @kort Stelselklokkonfigurasie
* @retval Geen
*/
nietig SystemClock_Config(nietig)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};