Primerjava med Temperaturni senzor PT100 sonda in Modul DS18B20
1) Osnovni princip zajemanja signala
① Upornost PT100 se spreminja sorazmerno s temperaturo (višja je temperatura, večji je upor), vendar je sprememba upora zelo majhna, približno 0.385 Oh / stopnja;
② Obseg temperature PT100 je -200 ℃ -200 ℃, in pri 0 ℃, upor je popolnoma enak 100 Oh;
③ Delovni tok PT100 mora biti manjši od 5 mA;
④ Čeprav se odpornost PT100 s temperaturo sorazmerno spremeni, njegova sprememba sprememb (to je, K Vrednost k Vrednost K vrednost) je drugačna v različnih temperaturnih območjih.
2) Tabela spreminjanja temperaturne odpornosti PT100
3. PT100 pogonski vezje
1) Prek metode delitve napetosti, AD zbira napetost PT100 za pridobitev vrednosti upora za izračun temperature
Vrednost upora PT100 v vodi pri sobni temperaturi (25℃ 25 ℃ 25 ℃) je približno 109.89 Oh.
Mikrokontroler oddaja 3,3 V napetost, in napetost, deljena s PT100, je približno:
109.89 ∗ 0.005 = 0.54945 V
Vrednost oglasa, pretvorjena v skladu s formulo pretvorbe AD, je približno:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Ko se temperatura dvigne za eno stopnjo, ob predpostavki, da se odpor PT100 samo dvigne 0.385 Oh, Sprememba vrednost deljene napetosti je približno enaka:
0.385 ∗ 0.005 = 0.001925 V
Vrednost oglasa, pretvorjena v skladu s formulo pretvorbe AD, je približno:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
V poskusu, Ugotovljeno je bilo, da zaradi nestabilne 3,3 V napetosti napajanja STM32, ADC je zbral nihanja napetosti PT100 in napaka pri delitvi napetosti je bila velika. Rešitev za optimizacijo je oblikovati konstantno tokostno tokokrog. Z zbiranjem napetosti PT100 in toka vira konstantnega toka, Upor PT100 je mogoče dobiti, in potem lahko dobite temperaturno vrednost.
2) Konstanten tokovni izvorni vezje, ki temelji na regulatorju LDO (MD5333)
Na internetu je veliko vozniških tokokrogov za testiranje PT100, kot je DC Most Circuit, konstanten tokovni izvorni vezje, ki temelji na operativnem ojačevalniku, itd. Avtor je tudi veliko časa porabil za izbiro vozniškega vezja, Glede na težave pri izdelavi deske in števila komponent, in na koncu izbral konstantno tokovno vezje na podlagi regulatorja LDO (MD5333). Diagram vezja je naslednji:
Na tej točki, Izbira strojne opreme je v bistvu dokončana. Uporabljena razvojna plošča je elitna plošča Zhengdian Atom F10zet6
Modul DS18B20
Da bi preizkusili primerjavo temperature v realnem času in temperaturo PT100, Za test primerjave kalibracije je dodan modul DS18B20
1) Uvod v DS18B20
DS18B20 je temperaturni senzor z enim vklopom s preskusnim temperaturnim območjem -55 ~+125 ℃ in natančnostjo ± 0,5 ℃. Temperatura polja se neposredno prenaša na digitalni način, kar močno izboljša sposobnost proti interferenci sistema. Lahko neposredno prebere izmerjeno temperaturo, in lahko s preprostim programiranjem uresničimo metodo odčitavanja digitalne vrednosti 9 ~ 12-bitno v skladu z dejanskimi zahtevami. Njen razpon delovne napetosti je 3 ~ 5,5 V, in uporablja različne embalažne obrazce, zaradi česar je sistemska nastavitev prilagodljiva in priročna. Nastavljena ločljivost in temperatura alarma, ki jo nastavi uporabnik.
2) Uvod v delovni čas DS18B20
Vse naprave z enim pobudam potrebujejo strog čas signala, da se zagotovi celovitost podatkov. DS18B20 ima 6 Vrste signala: ponastavite impulz, odzivni impulz, pisati 0, pisati 1, branje 0 in preberite 1. Vsi ti signali, razen odzivnega impulza, so sinhroni signali, ki jih pošlje gostitelj. In vsi ukazi in podatki se najprej pošljejo z nizkim koščkom bajta.
① Ponastavite impulz in odzivni impulz
Vsa komunikacija na enem avtobusu se začne z inicializacijskim zaporedjem. Gostitelj oddaja nizko raven in ohranja nizko raven za vsaj 480us, da ustvari ponastavitveni impulz. Nato gostitelj sprosti avtobus, in 4,7k vlečni upor potegne en sam avtobus visoko, s časom zamude 15 ~ 60us, in vstopi v način sprejemanja (Rx). Nato DS18B20 potegne vodilo nizko za 60 ~ 240us, da ustvari impulz odziva na nizki ravni.
② Napišite čas
Čas pisanja vključuje pisanje 0 čas in pisanje 1 čas. Vsi časi pisanja zahtevajo vsaj 60U, in med dvema neodvisnima časom pisanja je potreben vsaj 1US čas obnovitve. Oba pisanja začnejo s tem, da gostitelj potegne po avtobusu. Pisati 1 čas: Gostitelj oddaja nizko raven, zamude za 2us, in nato sprosti avtobus, zakasnitev 60US. Pisati 0 čas: Gostitelj oddaja nizko raven, zamude za 60us, in nato avtobus sprosti z zamudo 2U.
③ Preberite čas
Naprave z enim pobudam prenašajo podatke gostitelju samo, ko gostitelj izda čas branja. Zato, Ko gostitelj izda ukaz za branje podatkov, Čas odčitanja je treba ustvariti takoj, da lahko suženj prenaša podatke. Vsi časi branja zahtevajo vsaj 60us, in med dvema neodvisnima časom branja je potreben vsaj 1US čas obnovitve. Vsak čas branja sproži gostitelj, ki z avtobusom potegne vsaj 1us. Gostitelj mora med časom odčitanja izpustiti avtobus in po začetku časa vzorčiti stanje avtobusa znotraj 15US. Tipičen postopek branja je: gostitelj oddaja zamudo z nizko raven 2us, Nato gostitelj preklopi na zakasnitev vhodnega načina 12US, Nato prebere trenutno raven posameznega avtobusa, in nato zamuja 50US.
Po razumevanju časa enega avtobusa, Oglejmo si tipičen postopek odčitavanja temperature DS18B20. Tipičen postopek odčitavanja temperature DS18B20 je: Ponastavitev → Pošlji Skiprom (0xCC) → Pošlji ukaz za pretvorbo Start (0x44) → Zamuda → Ponastavitev → Pošlji ukaz Skiprom (0xCC) → Pošlji ukaz pomnilnika (0xBE) → Preberite dva bajta podatkov (tj. temperaturo) neprekinjeno → konec.
3) Shematski diagram in konfiguracija kubemaxa
Iz shematičnega diagrama, Vidimo, da DS18B20 vrat PG11 omogoči odpiranje serijskih vrat za tiskanje informacij o temperaturi
4) Kodni del
Kodni del presadi knjižnico DS18B20 Zhengdian Atoma in rahlo spremeni
#IFNDEF __DS18B20_H
#Določite __DS18B20_H
#vključiti “Tim.H”
/***********************************************************************************/
/* DS18B20 PIN definicija */
#Določite ds18b20_dq_gpio_port gpiog
#Določite DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#Določite DS18B20_DQ_GPIO_CLK_ENABLE() naredi{ __HAL_RCC_GPIOG_CLK_ENABLE(); }medtem ko(0) /* PG pristaniška ura omogoči */
/**********************************************************************************************/
/* Funkcija delovanja IO */
#Določite DS18B20_DQ_OUT(x) naredi{ 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); \
}medtem ko(0) /* Izhod podatkovnih vrat */
#Določite ds18b20_dq_in hal_gpio_readpin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Vnos podatkovnih vrat */
UINT8_T DS18B20_INIT(praznina); /* Inicializirajte DS18B20 */
UINT8_T DS18B20_CHECK(praznina); /* Preverite, ali DS18B20 obstaja */
Kratek DS18B20_GET_TEMPERATURE(praznina);/* Dobiti temperaturo */
#endif
5. Infrardeči modul daljinskega upravljalnika
1) Protokol za kodiranje brezžičnega modula
Široko uporabljene metode kodiranja za infrardeče daljinske upravljalnike so: NEC protokol PWM (Modulacija širine impulza) in RC-5 protokol Philips PPM (Modulacija položaja impulza). Daljinski nadzor, ki je priložen razvojni plošči, uporablja protokol NEC, ki ima naslednje funkcije:
1. 8-Naslov bita in 8-bitna dolžina pouka;
2. Naslov in ukaz se prenašata dvakrat (Da bi zagotovili zanesljivost);
3. Modulacija položaja impulza PWM, z delovnim ciklom posredovanega infrardečega prevoznika “0” in “1”;
4. Frekvenca nosilca je 38kHz;
5. Čas bitja je 1,125 ms ali 2,25 ms;
V protokolu NEC, kako nastaviti podatke v protokolu na ‘0’ ali '1'? Tukaj, Infrardeči sprejemnik in infrardeči oddajnik sta ločena.
Infrardeči oddajnik: Pošljite podatke protokola '0' = 560us prenosa nosilca + 560nas brez prenosa nosilca
Pošljite podatke protokola '1' = 560us prenosa nosilca + 1680nas brez prenosa nosilca
Bit definicija infrardečega oddajnika je prikazana na spodnji sliki
Infrardeči sprejemnik: Prejemajte podatke protokola '0' = 560us nizka raven + 560ZDA na visoki ravni
Prejemajte podatke protokola '1' = 560us nizka raven + 1680ZDA na visoki ravni
Oblika podatkovnega ukaza NEC na daljavo je: terminal sinhronizacije, koda naslova, naslov inverzna koda, kontrolna koda, Nadziraj inverzno kodo. Sinhronizacijska koda je sestavljena iz nizke 9 ms in visoke 4,5 ms. Koda naslova, naslov inverzna koda, kontrolna koda, in kontrolna inverzna koda so vsi 8-bitni formati podatkov. Poslani so v vrstnem redu z nizkim bitjem najprej in zadnje. Inverzna koda se uporablja za povečanje zanesljivosti prenosa.
Zato, Zajem vhodnega zajema se lahko uporabi za merjenje širine impulza visoke ravni za doseganje daljinskega krmilnega dekodiranja.
2) Shematski diagram in konfiguracija kubemaxa
Iz shematičnega diagrama, Vidimo, da je brezžični modul omogočeno skozi PB9 PIN in se zbira skozi 4 Kanali Tim4:
Privzeti zatič tim4_ch4 ni PB9, zato ga je treba nastaviti ročno, in nastavitev prekinitve je vklopljena hkrati
3) Kodni del
Zajem naraščajočega roba s funkcijo povratnega klica Tim
V tem času, dekodirani signal je mogoče dobiti:
V tem času, podatki so bolj zapleteni in jih je mogoče rahlo obdelati:
Učinek je naslednji:
Zadnji dve števki sta dekodirani in njena inverzna koda. V tem času, lahko ga opredelimo kot makro za prilagoditev temperaturnega praga:
Učinek je naslednji:
Infrardeča koda dela:
/* Uporabniška koda Začnite glavo */
/**
******************************************************************************
* @file : roko.C
* @Brief : Glavni program programa
******************************************************************************
* @attention
*
* <h2><center>&kopijo; Avtorske pravice (c) 2024 Stmikroelektronika.
* Vse pravice pridržane.</center></h2>
*
* To programsko komponento licencira ST v skladu z licenco BSD 3-Clause,
* the “Dovoljenje”; Te datoteke ne smete uporabljati, razen v skladu z
* Dovoljenje. Lahko pridobite kopijo licence na:
* OpenSource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Glava končne kode uporabniške kode */
/* Vključuje ——————————————————————*/
#vključiti “main.h”
#vključiti “Tim.H”
#vključiti “USART.H”
#vključiti “gpio.h”
/* Zasebno vključuje ———————————————————-*/
/* Uporabniška koda Začetek */
#vključiti “stdio.h”
#vključiti “String.H”
#Določite Maxup 157
#Določite Maxdown 87
#Določite minup 221
#Določite MindOwn 61
/* Konec uporabniške kode vključuje */
/* Zasebni Typedef ———————————————————–*/
/* Uporabniška koda Začnite PTD */
/* Uporabniška koda End Ptd */
/* Zasebna definiranje ————————————————————*/
/* Uporabniška koda Začni PD */
/* Uporabniška koda konec pd */
/* Zasebni makro ————————————————————-*/
/* Uporabniška koda Začni pm */
/* Uporabniška koda konec pm */
/* Zasebne spremenljivke ———————————————————*/
/* Uporabniška koda Začni pv */
UINT32_T UPCOUNT = 0;
UINT16_T VALUAUP = 0;
UINT16_T VALUEDOON = 0;
uint8_t isupcapt = 1;
uint16_t širina = 0;
UINT16_T medpomnilnik[128]={0};
UINT16_T BUFFERID = 0;
UINT8_T RCVFALG = 0;
/* Uporabniška koda End PV */
/* Prototipi zasebnih funkcij ———————————————–*/
void Systemclock_config(praznina);
/* Uporabniška koda Začnite PFP */
/* Uporabniška koda konec pfp */
/* Zasebna uporabniška koda ———————————————————*/
/* Uporabniška koda se začne 0 */
void hal_tim_periodelapsedCallback(Tim_handletypedef *htim)
{
Upcount ++;
}
void hal_tim_ic_captureCallback(Tim_handletypedef *htim)
{
če(isupcapt)//Če je naraščajoči zajem roba
{
Valup = hal_tim_readCapturedValue(Htim htim,Tim_channel_4);
isupCapt = 0;
__HAL_TIM_SET_CAPTUREPOLARITOY(Htim htim,Tim_channel_4, tim_icpolarity_falling);
Upcount = 0;
}
drugače{
ValueDown = hal_tim_readCapturedValue(Htim htim,Tim_channel_4);
isupCapt = 1;
__HAL_TIM_SET_CAPTUREPOLARITOY(Htim htim,Tim_channel_4, tim_icpolarity_rising);
širina = vrednotenje+UpCount*65536-valueUp;
če(širina>4400&&širina<4600)
{
BUFFERID = 0;
pufer[BUFFERID ++]= širina;
}
drugače, če(BUMPERID>0)
{
pufer[BUFFERID ++]= širina;
če(BUMPERID>32)
{
RCVFALG = 1;
BUFFERID = 0;
}
}
}
}
void Bitbuffer2num(Char Num[])
{
Številka[0]= 0;
Številka[1]= 0;
Številka[2]= 0;
Številka[3]= 0;
za(int i = 0;i<32;i ++)
{
če(pufer[i+1]<1000)
{
Številka[I/8]= Num[I/8]<<1;
}
drugače
{
Številka[I/8]= Num[I/8]<<1;
Številka[I/8]|= 0x01;
}
}
}
/* Konec uporabniške kode 0 */
/**
* @Breif Vstopna točka aplikacije.
* @retVal Int
*/
int main(praznina)
{
/* Uporabniška koda se začne 1 */
char printbuff[128]={0};
Char Num[4]={0};
Char ključ = 0;
/* Konec uporabniške kode 1 */
/* Konfiguracija MCU——————————————————–*/
/* Ponastavitev vseh perifernih naprav, Inicializira bliskavinski vmesnik in sistick. */
Hal_init();
/* Uporabniška koda začne init */
/* Uporabniška koda konec */
/* Konfigurirajte sistemsko uro */
Systemclock_config();
/* Uporabniška koda začne sysinit */
/* Uporabniška koda End sysinit */
/* Inicializirajte vse konfigurirane periferne naprave */
Mx_gpio_init();
Mx_tim4_init();
Mx_usart1_uart_init();
/* Uporabniška koda se začne 2 */
/* Konec uporabniške kode 2 */
/* Neskončna zanka */
/* Uporabniška koda se začne, medtem ko */
HAL_GPIO_TOGGLEPIN(LED0_GPIO_PORT,LED0_PIN);
Hal_tim_base_start_it(&htim4);//Posodobitev časovnika ustvari prekinitev
Hal_tim_ic_start_it(&htim4, tim_channel_4);//
medtem ko (1)
{
če(RCVFALG)
{
za(int i = 0;i<4;i ++)
{
bitbuffer2num(Številka);
sprintf(Printbuff,”0xx “,Številka[i]);
Hal_uart_transmit(&Huart1, printbuff,strlen(Printbuff),Hal_max_delay);
}
// sprintf(Printbuff,”%u “,pufer[i]);
// Hal_uart_transmit(&Huart1, printbuff,strlen(Printbuff),Hal_max_delay);
// }
Hal_uart_transmit(&Huart1,”\r n”,2,Hal_max_delay);
RCVFALG = 0;
}
printf(“%d r n”,Številka[3]);
če(Številka[3]== 157)
{
printf(“111111\r n”);
}
Hal_delay(1000);
/* Koda kode uporabnike, medtem ko */
/* Uporabniška koda se začne 3 */
}
/* Konec uporabniške kode 3 */
}
/**
* @Brief System Clock Configuracija
* @retVal None
*/
void Systemclock_config(praznina)
{
RCC_OSCINITTYPEDEF RCC_OSCINITCTRUCT = {0};
RCC_CLKINTITTYPEDEF RCC_CLKINTITCT = {0};