Porovnanie medzi Teplotný senzor PT100 sonda a Modul DS18B20
1) Základný princíp získavania signálu
① Odpor PT100 sa mení úmerne s teplotou (čím vyššia je teplota, tým väčší odpor), ale zmena odporu je veľmi malá, o 0.385 Oh / stupňa;
② Rozsah merania teploty PT100 je -200 ℃ -200 ℃, a pri 0 ℃, odpor sa presne rovná 100 Oh;
③ Pracovný prúd PT100 by mal byť menší ako 5 mA;
④ Hoci sa odpor PT100 mení úmerne s teplotou, rýchlosť jej zmeny (to je, K hodnota K hodnota K hodnota) sa líši v rôznych teplotných rozsahoch.
2) Tabuľka zmeny teplotnej odolnosti PT100
3. Obvod pohonu PT100
1) Prostredníctvom metódy delenia napätia, AD zhromažďuje napätie PT100 na získanie hodnoty odporu na výpočet teploty
Hodnota odporu PT100 vo vode pri izbovej teplote (25℃25℃25℃) je o 109.89 Oh.
Mikrokontrolér vydáva napätie 3,3V, a napätie delené PT100 je približne:
109.89 ∗ 0.005 = 0.54945 Vložka
Hodnota AD prepočítaná podľa konverzného vzorca AD je približne:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Keď teplota stúpne o jeden stupeň, za predpokladu, že odpor PT100 práve stúpa 0.385 Oh, hodnota zmeny deleného napätia sa približne rovná:
0.385 ∗ 0.005 = 0.001925 Vložka
Hodnota AD prepočítaná podľa konverzného vzorca AD je približne:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
V experimente, bolo zistené, že kvôli nestabilnému napätiu 3,3V napájacieho zdroja stm32, ADC zbieral kolísanie napätia PT100 a chyba delenia napätia bola veľká. Optimalizačným riešením je navrhnúť obvod zdroja konštantného prúdu. Zhromažďovaním napätia PT100 a prúdu zdroja konštantného prúdu, možno získať odpor PT100, a potom je možné získať hodnotu teploty.
2) Obvod zdroja konštantného prúdu založený na regulátore LDO (MD5333)
Na internete je veľa riadiacich obvodov na testovanie PT100, ako je obvod DC mostíka, obvod zdroja konštantného prúdu založený na operačnom zosilňovači, tam. Veľa času venoval autor aj výberu jazdného okruhu, vzhľadom na náročnosť výroby dosky a počet komponentov, a nakoniec zvolil obvod zdroja konštantného prúdu založený na regulátore LDO (MD5333). Schéma zapojenia je nasledovná:
V tomto bode, výber hardvéru bol v podstate dokončený. Použitá vývojová doska je Zhengdian Atom F10ZET6 Elite Board
Modul DS18B20
S cieľom otestovať porovnanie teploty v reálnom čase a teploty PT100, modul DS18B20 je pridaný na porovnávaciu skúšku kalibrácie
1) Úvod do DS18B20
DS18B20 je jednozbernicový snímač teploty s rozsahom testovacej teploty -55~+125℃ a presnosťou ±0,5℃. Teplota poľa sa priamo prenáša jednozbernicovým digitálnym spôsobom, čo výrazne zlepšuje odolnosť systému proti rušeniu. Dokáže priamo odčítať nameranú teplotu, a môže realizovať metódu čítania 9 ~ 12-bitovej digitálnej hodnoty pomocou jednoduchého programovania podľa skutočných požiadaviek. Jeho prevádzkové napätie je 3~5,5V, a používa rôzne formy balenia, vďaka čomu je nastavenie systému flexibilné a pohodlné. Nastavené rozlíšenie a teplota alarmu nastavená používateľom sa uložia do EEPROM a po výpadku napájania sa uložia.
2) Úvod do pracovného časovania DS18B20
Všetky jednozbernicové zariadenia vyžadujú prísne časovanie signálu, aby sa zabezpečila integrita dát. DS18B20 má 6 typy signálov: resetovať pulz, impulz odozvy, písať 0, písať 1, čítať 0 a čítať 1. Všetky tieto signály, okrem impulzu odozvy, sú synchrónne signály odosielané hostiteľom. A všetky príkazy a dáta sa odosielajú najskôr s nízkym bitom bajtu.
① Resetujte impulz a impulz odozvy
Všetky komunikácie na jednej zbernici začínajú inicializačnou sekvenciou. Hostiteľ vydáva nízku úroveň a udržiava nízku úroveň aspoň 480 us, aby vygeneroval resetovací impulz. Potom hostiteľ autobus uvoľní, a 4,7K pull-up rezistor ťahá jednu zbernicu vysoko, s časom oneskorenia 15~60us, a vstúpi do režimu príjmu (Rx). Potom DS18B20 stiahne zbernicu na 60 ~ 240 us, aby vygeneroval impulz odpovede na nízkej úrovni.
② Načasovanie zápisu
Časovanie zápisu zahŕňa zápis 0 načasovať a napísať 1 načasovanie. Všetky časovanie zápisu vyžaduje aspoň 60 us, a medzi dvoma nezávislými časovaním zápisu je potrebný čas obnovy aspoň 1us. Obidva časovanie zápisu začína tým, že hostiteľ stiahne zbernicu. Napíšte 1 načasovanie: hostiteľ generuje nízku úroveň, meškanie za 2us, a potom uvoľní autobus, meškanie 60us. Napíšte 0 načasovanie: hostiteľ generuje nízku úroveň, meškanie za 60 us, a následne pustí autobus s meškaním 2us.
③ Čas čítania
Zariadenia s jednou zbernicou prenášajú údaje k hostiteľovi iba vtedy, keď hostiteľ vydá čas čítania. Preto, potom, čo hostiteľ vydá príkaz na čítanie údajov, musí sa okamžite vygenerovať čas čítania, aby podriadená jednotka mohla prenášať dáta. Všetky časovania čítania vyžadujú aspoň 60 us, a medzi dvoma nezávislými časovaním čítania je potrebný čas obnovy aspoň 1us. Každé načasovanie čítania iniciuje hostiteľ, ktorý stiahne autobus aspoň na 1us. Hostiteľ musí uvoľniť zbernicu počas časovania čítania a vzorkovať stav zbernice do 15 us po spustení časovania. Typický proces časovania čítania je: hostiteľ generuje oneskorenie nízkej úrovne 2us, potom sa hostiteľ prepne na oneskorenie vstupného režimu 12us, then reads the current level of the single bus, and then delays 50us.
After understanding the single bus timing, let’s take a look at the typical temperature reading process of DS18B20. The typical temperature reading process of DS18B20 is: reset → send SKIPROM (0xCC) → send start conversion command (0x44) → delay → reset → send SKIPROM command (0xCC) → send memory command (0xBE) → read two bytes of data (tj.. teplota) continuously → end.
3) Schematic diagram and CUBEMAX configuration
From the schematic diagram, it can be seen that DS18B20 is enabled by PG11 port to open the serial port to print temperature information
4) Code part
Časť kódu transplantuje knižnicu ds18b20 Zhengdian Atom a robí drobné úpravy
#ifndef __DS18B20_H
#definujte __DS18B20_H
#zahŕňajú “tim.h”
/***********************************************************************************/
/* Definícia pinov DS18B20 */
#definujte DS18B20_DQ_GPIO_PORT GPIOG
#definujte DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#definujte DS18B20_DQ_GPIO_CLK_ENABLE() robiť{ __HAL_RCC_GPIOG_CLK_ENABLE(); }zatiaľ čo(0) /* Aktivácia hodín portu PG */
/**********************************************************************************************/
/* Funkcia IO prevádzky */
#definujte DS18B20_DQ_OUT(x) robiť{ 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); \
}zatiaľ čo(0) /* Výstup dátového portu */
#definujte DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Vstup dátového portu */
uint8_t ds18b20_init(neplatné); /* Inicializujte DS18B20 */
uint8_t ds18b20_check(neplatné); /* Skontrolujte, či existuje DS18B20 */
krátky ds18b20_get_temperature(neplatné);/* Získajte teplotu */
#endif
5. Modul infračerveného diaľkového ovládania
1) Protokol kódovania bezdrôtového modulu
Široko používané metódy kódovania pre infračervené diaľkové ovládanie sú: NEC protokol PWM (pulzná šírková modulácia) a RC-5 protokol Philips PPM (modulácia polohy impulzu). Diaľkové ovládanie dodávané s vývojovou doskou používa protokol NEC, ktorý má nasledujúce vlastnosti:
1. 8-bitová adresa a 8-bitová dĺžka inštrukcie;
2. Adresa a príkaz sa prenášajú dvakrát (na zabezpečenie spoľahlivosti);
3. PWM pulzná modulácia polohy, s pracovným cyklom prenášaného infračerveného nosiča, ktorý predstavuje “0” a “1”;
4. Nosná frekvencia je 38 kHz;
5. Bitový čas je 1,125 ms alebo 2,25 ms;
V protokole NEC, ako nastaviť údaje v protokole na ‘0’ alebo „1“? Tu, infračervený prijímač a infračervený vysielač sú oddelené.
Infračervený vysielač: Odoslať protokolové dáta „0“ = 560us prenosu nosného signálu + 560bez prenosu nosného signálu
Odoslať protokolové dáta „1“ = 560us prenosu nosného signálu + 1680bez prenosu nosného signálu
Bitová definícia infračerveného vysielača je znázornená na obrázku nižšie
Infračervený prijímač: Prijímanie údajov protokolu „0“ = nízka úroveň 560us + 560nás na vysokej úrovni
Prijímanie údajov protokolu „1“ = nízka úroveň 560us + 1680nás na vysokej úrovni
Formát údajov príkazu diaľkového ovládania NEC je: synchronizačný terminál, kód adresy, adresný inverzný kód, kontrolný kód, kontrolný inverzný kód. Synchronizačný kód pozostáva z 9 ms nízkej úrovne a 4,5 ms vysokej úrovne. Kód adresy, adresný inverzný kód, kontrolný kód, a riadiaci inverzný kód sú všetky 8-bitové dátové formáty. Posielajú sa v poradí nízky bit ako prvý a vysoký bit ako posledný. Inverzný kód sa používa na zvýšenie spoľahlivosti prenosu.
Preto, Vstupné zachytenie možno použiť na meranie šírky impulzu vysokej úrovne, aby sa dosiahlo dekódovanie diaľkového ovládania.
2) Schematic diagram and CUBEMAX configuration
From the schematic diagram, môžeme vidieť, že bezdrôtový modul je povolený cez kolík PB9 a zhromažďuje sa cez 4 kanály TIM4:
Predvolený pin TIM4_CH4 nie je PB9, takze to treba nastavit rucne, a zároveň sa zapne nastavenie prerušenia
3) Code part
Zachyťte stúpajúcu hranu pomocou funkcie spätného volania tim
V tomto čase, možno získať dekódovaný signál:
V tomto čase, údaje sú zložitejšie a dajú sa mierne spracovať:
Účinok je nasledovný:
Posledné dve číslice sú dekódovaný a jeho inverzný kód. V tomto čase, možno ho definovať ako makro na úpravu prahu teploty:
Účinok je nasledovný:
Infračervený kód časti:
/* ZAČIATOK UŽÍVATEĽSKÉHO KÓDU Hlavička */
/**
******************************************************************************
* @súbor : main.c
* @stručne : Hlavný programový orgán
******************************************************************************
* @pozornosť
*
* <h2><stred>&kopírovať; Autorské práva (c) 2024 STMicroelectronics.
* Všetky práva vyhradené.</stred></h2>
*
* Tento softvérový komponent je licencovaný spoločnosťou ST na základe licencie BSD 3-Clause,
* ten “Licencia”; Tento súbor nemôžete použiť inak, ako v súlade s
* Licencia. Kópiu licencie môžete získať na adrese:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Hlavička KONIEC UŽÍVATEĽSKÉHO KÓDU */
/* Zahŕňa ——————————————————————*/
#zahŕňajú “hlavná.h”
#zahŕňajú “tim.h”
#zahŕňajú “usart.h”
#zahŕňajú “gpio.h”
/* Súkromné zahŕňa ———————————————————-*/
/* ZAČIATOK UŽÍVATEĽSKÉHO KÓDU Obsahuje */
#zahŕňajú “stdio.h”
#zahŕňajú “reťazec.h”
#definovať MAXUP 157
#definovať MAXDOWN 87
#definovať MINUP 221
#definovať MINDOWN 61
/* KONIEC UŽÍVATEĽSKÉHO KÓDU Zahŕňa */
/* Súkromný typ definície ———————————————————–*/
/* UŽÍVATEĽSKÝ KÓD ZAČIATOK PTD */
/* UŽÍVATEĽSKÝ KÓD KONIEC PTD */
/* Súkromná definícia ————————————————————*/
/* UŽÍVATEĽSKÝ KÓD ZAČIATOK PD */
/* UŽÍVATEĽSKÝ KÓD KONIEC PD */
/* Súkromné makro ————————————————————-*/
/* UŽÍVATEĽSKÝ KÓD ZAČIATOK PM */
/* UŽÍVATEĽSKÝ KÓD KONIEC PM */
/* Súkromné premenné ———————————————————*/
/* UŽÍVATEĽSKÝ KÓD ZAČIATOK PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t šírka=0;
vyrovnávacia pamäť uint16_t[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* UŽÍVATEĽSKÝ KÓD KONIEC PV */
/* Prototypy súkromných funkcií ———————————————–*/
void SystemClock_Config(neplatné);
/* UŽÍVATEĽSKÝ KÓD ZAČIATOK PFP */
/* UŽÍVATEĽSKÝ KÓD KONIEC PFP */
/* Súkromný používateľský kód ———————————————————*/
/* ZAČIATOK UŽÍVATEĽSKÉHO KÓDU 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
ak(isUpCapt)//Ak ide o zachytenie stúpajúcej hrany
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
inak{
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;
ak(šírka>4400&&šírka<4600)
{
bufferId=0;
vyrovnávacia pamäť[bufferId++]=šírka;
}
inak ak(bufferId>0)
{
vyrovnávacia pamäť[bufferId++]=šírka;
ak(bufferId>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
void bitBuffer2num(char num[])
{
č[0]=0;
č[1]=0;
č[2]=0;
č[3]=0;
pre(int i=0;i<32;i++)
{
ak(vyrovnávacia pamäť[i+1]<1000)
{
č[i/8]=č[i/8]<<1;
}
inak
{
č[i/8]=č[i/8]<<1;
č[i/8]|=0x01;
}
}
}
/* KONIEC UŽÍVATEĽSKÉHO KÓDU 0 */
/**
* @brief Vstupný bod aplikácie.
* @retval int
*/
int main(neplatné)
{
/* ZAČIATOK UŽÍVATEĽSKÉHO KÓDU 1 */
char printbuff[128]={0};
char num[4]={0};
char key=0;
/* KONIEC UŽÍVATEĽSKÉHO KÓDU 1 */
/* Konfigurácia MCU——————————————————–*/
/* Resetovanie všetkých periférií, Inicializuje rozhranie Flash a Systick. */
HAL_Init();
/* UŽÍVATEĽSKÝ KÓD ZAČIATOK Init */
/* KONIEC UŽÍVATEĽSKÉHO KÓDU Init */
/* Nakonfigurujte systémové hodiny */
SystemClock_Config();
/* UŽÍVATEĽSKÝ KÓD ZAČIATOK SysInit */
/* KONIEC UŽÍVATEĽSKÉHO KÓDU SysInit */
/* Inicializujte všetky nakonfigurované periférne zariadenia */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* ZAČIATOK UŽÍVATEĽSKÉHO KÓDU 2 */
/* KONIEC UŽÍVATEĽSKÉHO KÓDU 2 */
/* Nekonečná slučka */
/* UŽÍVATEĽSKÝ KÓD ZAČNITE */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Aktualizácia časovača generuje prerušenie
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
zatiaľ čo (1)
{
ak(rcvFalg)
{
pre(int i=0;i<4;i++)
{
bitBuffer2num(č);
sprintf(printbuff,”0xx “,č[i]);
HAL_UART_Transmit(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%u “,vyrovnávacia pamäť[i]);
// HAL_UART_Transmit(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Transmit(&huart1,”\rn”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%drn”,č[3]);
ak(č[3]==157)
{
printf(“111111\rn”);
}
HAL_Delay(1000);
/* UŽÍVATEĽSKÝ KÓD KONIEC */
/* ZAČIATOK UŽÍVATEĽSKÉHO KÓDU 3 */
}
/* KONIEC UŽÍVATEĽSKÉHO KÓDU 3 */
}
/**
* @krátka konfigurácia systémových hodín
* @retval Žiadne
*/
void SystemClock_Config(neplatné)
{
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









