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ė
3. 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:
Š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.
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ą.
① 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ą.
② 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.
③ 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.
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ą
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};
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









