Temperatūros jutiklio technologija

Temperatūros jutiklio zondas (DS18B20 ir PT100 funkcinės grandinės dizainas)

DS18B20 schema ir „CubeMax“ konfigūracija

Palyginimas tarp PT100 temperatūros jutiklis zondas ir DS18B20 modulis
1) Pagrindinis signalo įgijimo principas
① PT100 atsparumas proporcingai keičiasi atsižvelgiant į temperatūrą (Kuo aukštesnė temperatūra, tuo didesnis pasipriešinimas), Tačiau pasipriešinimo pokytis yra labai mažas, apie 0.385 Oi / laipsnis;
② PT100 temperatūros matavimo diapazonas yra -200 ℃ -200 ℃, ir esant 0 ℃, varža lygiai lygi 100 Oi;
③ PT100 darbinė srovė turi būti mažesnė nei 5 Ma;
④ Nors PT100 atsparumas kinta proporcingai temperatūrai, jo kitimo greitis (tai yra, K reikšmė K reikšmė K reikšmė) skiriasi skirtinguose temperatūros diapazonuose.

2) PT100 temperatūros atsparumo keitimo lentelė

PT100 temperatūros atsparumo keitimo lentelė

3. PT100 pavaros grandinė

PT100 pavaros grandinė

PT100 pavaros grandinė

1) Taikant įtampos padalijimo metodą, AD renka PT100 įtampą, kad gautų atsparumo vertę temperatūrai apskaičiuoti
PT100 atsparumo vertė vandenyje kambario temperatūroje (25℃25℃25℃) yra apie 109.89 Oi.
Mikrovaldiklis išveda 3,3 V įtampą, o įtampa padalinta iš PT100 yra apytiksliai:
109.89 ∗ 0.005 = 0.54945 V

AD vertė, konvertuota pagal AD konvertavimo formulę, yra apytikslė:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682

Kai temperatūra pakyla vienu laipsniu, darant prielaidą, kad PT100 varža tiesiog padidėja 0.385 Oi, padalytos įtampos pokyčio reikšmė yra maždaug lygi:
0.385 ∗ 0.005 = 0.001925 V

AD vertė, konvertuota pagal AD konvertavimo formulę, yra apytikslė:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2

Eksperimente, nustatyta, kad dėl nestabilios stm32 maitinimo šaltinio 3,3V įtampos, ADC rinko PT100 įtampos svyravimus ir įtampos padalijimo paklaida buvo didelė. Optimizavimo sprendimas yra suprojektuoti nuolatinės srovės šaltinio grandinę. Surinkdami PT100 įtampą ir nuolatinės srovės šaltinio srovę, galima gauti PT100 atsparumą, ir tada galima gauti temperatūros reikšmę.

2) Nuolatinės srovės šaltinio grandinė, pagrįsta LDO reguliatoriumi (MD5333)
Internete yra daug vairavimo grandinių, skirtų PT100 testavimui, pavyzdžiui, nuolatinės srovės tilto grandinė, nuolatinės srovės šaltinio grandinė, pagrįsta operaciniu stiprintuvu, ir tt. Autorius taip pat daug laiko skyrė pasirinkdamas vairavimo grandinę, atsižvelgiant į lentos gamybos sudėtingumą ir komponentų skaičių, ir galiausiai pasirinko nuolatinės srovės šaltinio grandinę, pagrįstą LDO reguliatoriumi (MD5333). Grandinės schema yra tokia:

LDO reguliatoriaus nuolatinės srovės šaltinio grandinė (MD5333)

LDO reguliatoriaus nuolatinės srovės šaltinio grandinė (MD5333)

Šiuo metu, aparatūros pasirinkimas iš esmės baigtas. Naudojama kūrimo plokštė yra Zhengdian Atom F10ZET6 Elite lenta

DS18B20 modulis
Norint patikrinti realaus laiko temperatūrą ir PT100 temperatūros palyginimą, DS18B20 modulis pridedamas kalibravimo palyginimo bandymui

1) Įvadas į DS18B20
DS18B20 yra vienos magistralės temperatūros jutiklis, kurio bandymo temperatūros diapazonas yra -55–+125 ℃ ir ±0,5 ℃ tikslumas. Lauko temperatūra tiesiogiai perduodama vienos magistralės skaitmeniniu būdu, o tai labai pagerina sistemos atsparumą trukdžiams. Jis gali tiesiogiai nuskaityti išmatuotą temperatūrą, ir gali realizuoti 9–12 bitų skaitmeninės vertės nuskaitymo metodą paprastu programavimu pagal faktinius reikalavimus. Jo darbinės įtampos diapazonas yra 3–5,5 V, ir ji naudoja įvairias pakavimo formas, kad sistemos nustatymas būtų lankstus ir patogus. Nustatyta skiriamoji geba ir vartotojo nustatyta aliarmo temperatūra išsaugomi EEPROM ir vis tiek išsaugomi nutrūkus maitinimui.

DS18B20 grandinės dizainas

DS18B20 grandinės dizainas

2) Įvadas į DS18B20 darbo laiką
Visiems vienos magistralės įrenginiams reikalingas griežtas signalo laikas, kad būtų užtikrintas duomenų vientisumas. DS18B20 turi 6 signalų tipai: Iš naujo nustatyti impulsą, atsako pulsas, rašyti 0, rašyti 1, skaityti 0 ir skaityti 1. Visi šie signalai, išskyrus atsako impulsą, yra sinchroniniai signalai, kuriuos siunčia pagrindinis kompiuteris. Ir visos komandos ir duomenys pirmiausia siunčiami naudojant mažą baito bitą.

DS18B20 atstato impulsą ir atsako impulsą

DS18B20 atstato impulsą ir atsako impulsą

① Iš naujo nustatykite impulsą ir atsako impulsą
Visi ryšiai vienoje magistralėje prasideda inicijavimo seka. Pagrindinis kompiuteris išveda žemą lygį ir palaiko žemą lygį bent 480us, kad generuotų atstatymo impulsą. Tada šeimininkas išleidžia autobusą, o 4,7K traukimo rezistorius iškelia vieną magistralę aukštai, su 15–60 us vėlavimo laiku, ir pereina į priėmimo režimą (Rx). Tada DS18B20 sumažina magistralę 60–240 us, kad sukurtų žemo lygio atsako impulsą.

DS18B20 rašymo laikas

DS18B20 rašymo laikas

② Rašymo laikas
Rašymo laikas apima rašymą 0 laiką ir rašyti 1 laiko nustatymas. Visiems rašymo laikams reikia mažiausiai 60 us, ir tarp dviejų nepriklausomų rašymo laiko reikia bent 1us atkūrimo laiko. Abu rašymo laikas prasideda šeimininkui nuleidžiant autobusą. Rašyti 1 laiko nustatymas: pagrindinis kompiuteris išveda žemą lygį, vėluoja 2us, ir tada išleidžia autobusą, vėluoja 60 us. Rašyti 0 laiko nustatymas: pagrindinis kompiuteris išveda žemą lygį, vėluoja už 60 Lt, ir tada išleidžia autobusą su 2us vėlavimu.

DS18B20 Skaitymo laikas

DS18B20 Skaitymo laikas

③ Skaitymo laikas
Vienos magistralės įrenginiai perduoda duomenis į pagrindinį kompiuterį tik tada, kai pagrindinis kompiuteris nustato skaitymo laiką. Todėl, po to, kai pagrindinis kompiuteris pateikia duomenų nuskaitymo komandą, nedelsiant turi būti sugeneruotas skaitymo laikas, kad pavaldinys galėtų perduoti duomenis. Visiems skaitymo laikams reikia mažiausiai 60 us, ir tarp dviejų nepriklausomų skaitymo laiko reikia mažiausiai 1 us atkūrimo laiko. Kiekvieną skaitymo laiką inicijuoja šeimininkas, kuris traukia autobusą bent 1us. Pagrindinis kompiuteris turi atleisti magistralę skaitymo laiko nustatymo metu ir paimti magistralės būseną per 15 us nuo laiko nustatymo pradžios. Įprastas skaitymo laiko nustatymo procesas yra: pagrindinis kompiuteris išveda žemo lygio delsą 2us, tada pagrindinis kompiuteris persijungia į įvesties režimo delsą 12us, tada nuskaito esamą vienos magistralės lygį, ir tada vėluoja 50us.

DS18B20 atidaro nuoseklųjį prievadą temperatūros informacijai spausdinti

DS18B20 atidaro nuoseklųjį prievadą temperatūros informacijai spausdinti

Supratę vieno autobuso laiką, pažvelkime į tipinį DS18B20 temperatūros nuskaitymo procesą. Įprastas DS18B20 temperatūros nuskaitymo procesas yra: atstatyti → siųsti SKIPROM (0xCC) → siųsti komandą pradėti konvertuoti (0x44) → delsimas → atstatyti → siųsti SKIPROM komandą (0xCC) → siųsti atminties komandą (0xBE) → skaityti du baitus duomenų (t.y. temperatūros) nuolat → pabaiga.

3) Scheminė schema ir CUBEMAX konfigūracija
Iš scheminės schemos, matyti, kad DS18B20 yra įjungtas per PG11 prievadą, kad būtų galima atidaryti nuoseklųjį prievadą, kad būtų galima spausdinti informaciją apie temperatūrą

DS18B20 schema ir „CubeMax“ konfigūracija

DS18B20 schema ir „CubeMax“ konfigūracija

DS18B20 temperatūros ir drėgmės jutiklio sąsaja

DS18B20 temperatūros ir drėgmės jutiklio sąsaja

4) Kodo dalis
Kodo dalis perkelia Zhengdian Atom biblioteką ds18b20 ir atlieka nedidelius pakeitimus

#ifndef __DS18B20_H
#apibrėžkite __DS18B20_H

#įtraukti “laikas val”
/***********************************************************************************/
/* DS18B20 kaiščio apibrėžimas */

#apibrėžkite DS18B20_DQ_GPIO_PORT GPIOG
#apibrėžti DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#apibrėžkite DS18B20_DQ_GPIO_CLK_ENABLE() daryti{ __HAL_RCC_GPIOG_CLK_ENABLE(); }kol(0) /* PG prievado laikrodžio įjungimas */

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

/* IO veikimo funkcija */
#apibrėžkite DS18B20_DQ_OUT(x) daryti{ 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); \
}kol(0) /* Duomenų prievado išvestis */
#apibrėžkite DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Duomenų prievado įvestis */

uint8_t ds18b20_init(tuščias); /* Inicijuoti DS18B20 */
uint8_t ds18b20_check(tuščias); /* Patikrinkite, ar yra DS18B20 */
trumpas ds18b20_get_temperature(tuščias);/* Gaukite temperatūrą */

#endif

5. Infraraudonųjų spindulių nuotolinio valdymo modulis
1) Belaidžio modulio kodavimo protokolas

Plačiai naudojami infraraudonųjų spindulių nuotolinio valdymo kodavimo metodai: PWM NEC protokolas (impulsų pločio moduliacija) ir „Philips PPM“ RC-5 protokolas (impulsų padėties moduliavimas). Su kūrimo plokšte pateikiamas nuotolinio valdymo pultas naudoja NEC protokolą, kuri turi tokias savybes:

1. 8-bitų adresą ir 8 bitų komandos ilgį;

2. Adresas ir komanda perduodami du kartus (užtikrinti patikimumą);

3. PWM impulsų padėties moduliavimas, su perduodamo infraraudonųjų spindulių nešiklio darbo ciklu “0” ir “1”;

4. Nešlio dažnis yra 38 khz;

5. Bitų laikas yra 1,125 ms arba 2,25 ms;

NEC protokole, kaip nustatyti duomenis protokole į ‘0’ arba "1"? Čia, infraraudonųjų spindulių imtuvas ir infraraudonųjų spindulių siųstuvas yra atskirti.

Infraraudonųjų spindulių siųstuvas: Siųsti protokolo duomenis „0“ = 560 us nešiklio signalo perdavimo + 560mums nėra nešiklio signalo perdavimo

Siųsti protokolo duomenis „1“ = 560 us nešiklio signalo perdavimo + 1680mums nėra nešiklio signalo perdavimo

Infraraudonųjų spindulių siųstuvo bitų apibrėžimas parodytas paveikslėlyje žemiau

Infraraudonųjų spindulių imtuvas: Gauti protokolo duomenis „0“ = 560 us žemas lygis + 560mums aukštas lygis

Gauti protokolo duomenis „1“ = 560 us žemas lygis + 1680mums aukštas lygis

NEC nuotolinio valdymo komandos duomenų formatas yra: sinchronizavimo terminalas, adreso kodas, adreso atvirkštinis kodas, valdymo kodas, valdymo atvirkštinis kodas. Sinchronizacijos kodas susideda iš 9 ms žemo lygio ir 4,5 ms aukšto lygio. Adreso kodas, adreso atvirkštinis kodas, valdymo kodas, ir valdymo atvirkštinis kodas yra 8 bitų duomenų formatai. Jie siunčiami žemiausio bito pirma ir paskutinio aukšto bito tvarka. Atvirkštinis kodas naudojamas perdavimo patikimumui padidinti.

Todėl, įvesties fiksavimas gali būti naudojamas aukšto lygio impulso pločiui matuoti, kad būtų pasiektas nuotolinio valdymo pulto dekodavimas.
2) Scheminė schema ir CUBEMAX konfigūracija

Iš scheminės schemos, matome, kad belaidis modulis įjungtas per PB9 kaištį ir renkamas per 4 TIM4 kanalai:

Numatytasis TIM4_CH4 kaištis nėra PB9, todėl jį reikia nustatyti rankiniu būdu, ir tuo pačiu metu įjungiamas pertraukimo nustatymas

3) Kodo dalis
Užfiksuokite kylantį kraštą naudodami „Tim Back“ funkciją

Šiuo metu, galima gauti dekoduotą signalą:

Šiuo metu, duomenys yra sudėtingesni ir gali būti šiek tiek apdoroti:

Poveikis yra toks:
Paskutiniai du skaitmenys yra iššifruotas ir jo atvirkštinis kodas. Šiuo metu, ją galima apibrėžti kaip makrokomandą temperatūros slenksčiui reguliuoti:

Poveikis yra toks:

Infraraudonųjų spindulių dalies kodas:

/* VARTOTOJO KODO PRADĖJIMO antraštė */
/**
******************************************************************************
* @failas : pagrindinis.c
* @trumpai : Pagrindinė programos dalis
******************************************************************************
* @dėmesio
*
* <h2><centras>&kopija; Autorių teisės (c) 2024 STMikroelektronika.
* Visos teisės saugomos.</centras></h2>
*
* Šis programinės įrangos komponentas yra licencijuotas ST pagal BSD 3-Clause licenciją,
* the “Licencija”; Jūs negalite naudoti šio failo, išskyrus laikydamiesi
* Licencija. Licencijos kopiją galite gauti adresu:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* VARTOTOJO KODO PABAIGA Antraštė */
/* Apima ——————————————————————*/
#įtraukti “pagrindinis.h”
#įtraukti “laikas val”
#įtraukti “usart.h”
#įtraukti “gpio.h”

/* Privatus apima ———————————————————-*/
/* VARTOTOJO KODO PRADŽIA Apima */
#įtraukti “stdio.h”
#įtraukti “eilutė.h”
#apibrėžkite MAXUP 157
#apibrėžkite MAXDOWN 87
#apibrėžti MINUP 221
#apibrėžti MINDOWN 61
/* VARTOTOJO KODO PABAIGA Apima */

/* Privatus tipas ———————————————————–*/
/* VARTOTOJO KODO PRADĖTI PTD */

/* VARTOTOJO KODO PABAIGOS PTD */

/* Privatus apibrėžimas ————————————————————*/
/* VARTOTOJO KODAS PRADĖTI PD */
/* VARTOTOJO KODO PABAIGOS PD */

/* Privati ​​makrokomanda ————————————————————-*/
/* VARTOTOJO KODAS PRADĖTI PM */

/* VARTOTOJO KODO PABAIGOS PM */

/* Privatūs kintamieji ———————————————————*/

/* VARTOTOJO KODAS PRADĖTI PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t plotis=0;
uint16_t buferis[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* VARTOTOJO KODO PABAIGOS PV */

/* Privačių funkcijų prototipai ———————————————–*/
negalioja SystemClock_Config(tuščias);
/* VARTOTOJO KODAS PRADĖTI PFP */

/* VARTOTOJO KODO PABAIGOS PFP */

/* Privatus vartotojo kodas ———————————————————*/
/* VARTOTOJO KODO PRADĖJIMAS 0 */
negalioja HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
negalioja HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
jei(isUpCapt)//Jei tai kylančio krašto fiksavimas
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
kitur{
ValueDown=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
plotis=ValueDown+upCount*65536-ValueUp;
jei(plotis>4400&&plotis<4600)
{
bufferId=0;
buferis[bufferId++]= plotis;
}
kitaip, jei(buferio ID>0)
{
buferis[bufferId++]= plotis;
jei(buferio ID>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
negalioja bitBuffer2num(char num[])
{
nr[0]=0;
nr[1]=0;
nr[2]=0;
nr[3]=0;
už(int i=0;i<32;I ++)
{
jei(buferis[aš+1]<1000)
{
nr[i/8]=num[i/8]<<1;
}
kitur
{
nr[i/8]=num[i/8]<<1;
nr[i/8]|=0x01;
}
}
}
/* VARTOTOJO KODO PABAIGA 0 */

/**
* @brief Programos įėjimo taškas.
* @retval tarpt
*/
tarp pagrindinis(tuščias)
{
/* VARTOTOJO KODO PRADĖJIMAS 1 */
char printbuff[128]={0};
char num[4]={0};
char raktas = 0;
/* VARTOTOJO KODO PABAIGA 1 */

/* MCU konfigūracija——————————————————–*/

/* Visų išorinių įrenginių atstatymas, Inicijuoja Flash sąsają ir Systick. */
HAL_Init();

/* VARTOTOJO KODAS PRADĖTI Init */

/* VARTOTOJO KODO PABAIGA Init */

/* Konfigūruokite sistemos laikrodį */
SystemClock_Config();

/* VARTOTOJO KODAS PRADĖKITE „SysInit“. */

/* VARTOTOJO KODO PABAIGA SysInit */

/* Inicijuoti visus sukonfigūruotus periferinius įrenginius */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* VARTOTOJO KODO PRADĖJIMAS 2 */

/* VARTOTOJO KODO PABAIGA 2 */

/* Begalinė kilpa */
/* VARTOTOJO KODAS PRADĖTI KOL */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Laikmačio atnaujinimas sukuria pertraukimą
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
kol (1)
{
jei(rcvFalg)
{
už(int i=0;i<4;I ++)
{
bitBuffer2num(nr);
sprintf(printbuff,”0xx “,nr[i]);
HAL_UART_Perduoti(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%u “,buferis[i]);
// HAL_UART_Perduoti(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Perduoti(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%d\r\n”,nr[3]);
jei(nr[3]==157)
{
printf(“111111\r\n”);
}
HAL_Delay(1000);
/* VARTOTOJO KODO PABAIGA WILE */

/* VARTOTOJO KODO PRADĖJIMAS 3 */
}
/* VARTOTOJO KODO PABAIGA 3 */
}

/**
* @trumpa sistemos laikrodžio konfigūracija
* @retval Nėra
*/
negalioja SystemClock_Config(tuščias)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};