Összehasonlítás között PT100 hőmérséklet érzékelő szonda és DS18B20 modul
1) A jelszerzés alapelve
① A PT100 ellenállása arányosan megváltozik a hőmérsékleten (Minél magasabb a hőmérséklet, Minél nagyobb az ellenállás), de az ellenállás megváltozása nagyon kicsi, körülbelül 0.385 Ó / fokozat;
② A PT100 hőmérséklet mérési tartománya -200 ℃ -200 ℃, és 0 ℃-on, az ellenállás pontosan egyenlő 100 Ó;
③ A PT100 üzemi áramának kisebbnek kell lennie, mint 5 mA;
④ Bár a PT100 ellenállása a hőmérséklettel arányosan változik, változási sebessége (vagyis, K érték K érték K érték) különböző hőmérsékleti tartományokban eltérő.
2) PT100 hőmérséklet-ellenállás változási táblázat
3. PT100 meghajtó áramkör
1) Feszültségosztásos módszerrel, Az AD összegyűjti a PT100 feszültségét, hogy megkapja az ellenállásértéket a hőmérséklet kiszámításához
A PT100 ellenállás értéke vízben szobahőmérsékleten (25℃25℃25℃) kb 109.89 Ó.
A mikrokontroller 3,3 V feszültséget ad ki, és a feszültség osztva PT100-zal kb:
109.89 ∗ 0.005 = 0.54945 V
Az AD konverziós képlet szerint átszámított AD érték kb:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Amikor a hőmérséklet egy fokkal emelkedik, feltételezve, hogy a PT100 ellenállása csak emelkedik 0.385 Ó, a feszültség osztott változási értéke megközelítőleg egyenlő:
0.385 ∗ 0.005 = 0.001925 V
Az AD konverziós képlet szerint átszámított AD érték kb:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
A kísérletben, megállapították, hogy az stm32 tápegység instabil 3,3V-os feszültsége miatt, az ADC összegyűjtötte a PT100 feszültségingadozásait, és a feszültségosztási hiba nagy volt. Az optimalizálási megoldás egy állandó áramforrás áramkör tervezése. A PT100 feszültségének és az állandó áramforrás áramának összegyűjtésével, a PT100 ellenállása érhető el, és akkor megkapható a hőmérsékleti érték.
2) LDO szabályozón alapuló állandó áramforrás áramkör (MD5333)
Az interneten számos meghajtó áramkör létezik a PT100 tesztelésére, mint például az egyenáramú hídáramkör, működési erősítőn alapuló állandó áramforrás áramkör, stb. A szerző sok időt fordított a vezetési kör kiválasztására is, figyelembe véve a tábla elkészítésének nehézségét és az alkatrészek számát, végül az LDO szabályozón alapuló állandó áramforrás áramkört választotta (MD5333). A kapcsolási rajz a következő:
Ezen a ponton, a hardverválasztás lényegében befejeződött. A használt fejlesztőkártya a Zhengdian Atom F10ZET6 Elite Board
DS18B20 modul
A valós idejű hőmérséklet és a PT100 hőmérséklet összehasonlításának tesztelése érdekében, a DS18B20 modult adjuk hozzá a kalibrációs összehasonlító teszthez
1) A DS18B20 bemutatása
A DS18B20 egybuszos hőmérséklet-érzékelő -55-+125 ℃ teszthőmérséklet-tartománnyal és ±0,5 ℃ pontossággal. A terepi hőmérsékletet közvetlenül egybuszos digitális módon továbbítják, ami nagymértékben javítja a rendszer interferencia-elhárító képességét. Közvetlenül leolvashatja a mért hőmérsékletet, és 9-12 bites digitális értékolvasási módszert valósíthat meg egyszerű programozással a tényleges igényeknek megfelelően. Üzemi feszültségtartománya 3-5,5V, és különféle csomagolási formákat használ, rugalmassá és kényelmessé teszi a rendszerbeállítást. A beállított felbontás és a felhasználó által beállított riasztási hőmérséklet az EEPROM-ban tárolódik, és áramszünet után is elmentésre kerül.
2) A DS18B20 munkaidőzítésének bemutatása
Minden egybuszos eszköz szigorú jelidőzítést igényel az adatok integritásának biztosítása érdekében. A DS18B20 rendelkezik 6 jeltípusok: reset impulzus, válaszimpulzus, írj 0, írj 1, olvas 0 és olvasni 1. Mindezek a jelek, kivéve a válaszimpulzust, a gazdagép által küldött szinkron jelek. És minden parancs és adat először a bájt alacsony bitjével kerül elküldésre.
① Állítsa vissza az impulzust és a válaszimpulzust
Minden kommunikáció az egyetlen buszon inicializálási sorrenddel kezdődik. A gazdagép alacsony szintet ad ki, és az alacsony szintet legalább 480 us-ig tartja, hogy visszaállítási impulzust generáljon. Aztán a házigazda elengedi a buszt, és a 4.7K felhúzó ellenállás magasra húzza az egyetlen buszt, 15-60 us késleltetési idővel, és vételi módba lép (Rx). Ezután a DS18B20 lehúzza a buszt 60-240us-ig, hogy alacsony szintű válaszimpulzust generáljon.
② Írja be az időzítést
Az írási időzítés tartalmazza az írást is 0 időzítés és írás 1 időzítés. Minden írási időzítéshez legalább 60 us szükséges, és legalább 1 us helyreállítási idő szükséges két független írási időzítés között. Mindkét írási időzítés úgy kezdődik, hogy a gazdagép leállítja a buszt. Írj 1 időzítés: a gazdagép alacsony szintet ad ki, 2us késések, majd elengedi a buszt, 60 us késés. Írj 0 időzítés: a gazdagép alacsony szintet ad ki, 60 dollár késések, majd 2us késéssel elengedi a buszt.
③ Olvasási időzítés
Az egybuszos eszközök csak akkor továbbítanak adatokat a gazdagépnek, ha a gazdagép olvasási időzítést ad ki. Ezért, miután a gazdagép kiadta az adatolvasási parancsot, azonnal létre kell hozni egy olvasási időzítést, hogy a slave adatokat továbbíthasson. Minden olvasási időzítéshez legalább 60 us szükséges, és legalább 1 us helyreállítási idő szükséges két független olvasási időzítés között. Minden olvasási időzítést a gazdagép kezdeményez, ami legalább 1us-ra lehúzza a buszt. A gazdagépnek fel kell szabadítania a buszt az olvasási időzítés alatt, és mintát kell vennie a busz állapotából az időzítés kezdete után 15 órán belül.. A tipikus olvasási időzítési folyamat az: a gazdagép alacsony szintű 2us késleltetést ad ki, majd a gazdagép 12us bemeneti mód késleltetésre vált, majd beolvassa az egyetlen busz aktuális szintjét, majd 50 us-t késik.
Miután megértette az egyetlen busz időzítését, vessünk egy pillantást a DS18B20 tipikus hőmérséklet-leolvasási folyamatára. A DS18B20 tipikus hőmérséklet-leolvasási folyamata az: reset → SKIPROM küldése (0XCC) → küldje el a konverziós indítási parancsot (0x44) → késleltetés → reset → SKIPROM parancs küldése (0XCC) → memóriaparancs küldése (0XBE) → két bájt adat olvasása (azaz. hőmérséklet) folyamatosan → vége.
3) Sematikus diagram és CUBEMAX konfiguráció
A sematikus diagramból, látható, hogy a DS18B20 a PG11 porton keresztül lehetővé teszi a soros port megnyitását a hőmérsékleti információk nyomtatásához
4) Kód rész
A kódrész átülteti a Zhengdian Atom ds18b20 könyvtárát, és apró módosításokat hajt végre
#ifndef __DS18B20_H
#definiálja a __DS18B20_H
#tartalmaz “tim.h”
/***********************************************************************************/
/* DS18B20 tű definíció */
#definiálja a DS18B20_DQ_GPIO_PORT GPIOG-t
#DS18B20_DQ_GPIO_PIN GPIO_PIN_11 meghatározása
#definiálja a DS18B20_DQ_GPIO_CLK_ENABLE-t() csinál{ __HAL_RCC_GPIOG_CLK_ENABLE(); }míg(0) /* PG port óra engedélyezése */
/**********************************************************************************************/
/* IO működési funkció */
#definiálja a DS18B20_DQ_OUT(x) csinál{ 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); \
}míg(0) /* Adatport kimenet */
#definiálja a DS18B20_DQ_IN HAL_GPIO_ReadPin értéket(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Adatport bemenet */
uint8_t ds18b20_init(üres); /* Inicializálja a DS18B20-at */
uint8_t ds18b20_check(üres); /* Ellenőrizze, hogy létezik-e a DS18B20 */
rövid ds18b20_get_temperature(üres);/* Mérje meg a hőmérsékletet */
#endif
5. Infravörös távirányító modul
1) Vezeték nélküli modul kódolási protokoll
Az infravörös távirányítók széles körben használt kódolási módszerei a: A PWM NEC protokollja (impulzus szélesség moduláció) és a Philips PPM RC-5 protokollja (impulzus fázismoduláció). A fejlesztőkártyához mellékelt távirányító a NEC protokollt használja, amely a következő tulajdonságokkal rendelkezik:
1. 8-bitcím és 8 bites utasításhossz;
2. A cím és a parancs kétszer kerül továbbításra (a megbízhatóság biztosítása érdekében);
3. PWM impulzushelyzet moduláció, az átvitt infravörös vivő munkaciklusával “0” és “1”;
4. A vivőfrekvencia 38 khz;
5. A bitidő 1,125 ms vagy 2,25 ms;
Az NEC protokollban, hogyan kell beállítani a protokollban szereplő adatokat ‘0’ vagy "1"? Itt, az infravörös vevő és az infravörös adó el van választva.
Infravörös adó: Protokolladatok küldése „0” = 560 us vivőjel átvitel + 560hordozójel átvitel nélkül
Protokolladatok küldése „1” = 560 us vivőjelátvitel + 1680hordozójel átvitel nélkül
Az infravörös adó bitdefiníciója az alábbi ábrán látható
Infravörös vevő: Protokolladatok fogadása „0” = 560 us alacsony szint + 560nálunk magas szinten
Protokolladatok fogadása „1” = 560 us alacsony szint + 1680nálunk magas szinten
A NEC távirányító parancs adatformátuma a: szinkronizálási terminál, cím kód, cím inverz kódja, vezérlő kód, inverz kód vezérlése. A szinkronizációs kód egy 9 ms-os alacsony és egy 4,5 ms-os magas szintből áll. A cím kódja, cím inverz kódja, vezérlő kód, és a vezérlő inverz kód mind 8 bites adatformátum. A rendszer az alacsony bit első és a magas bit utolsó sorrendjében kerül elküldésre. Az inverz kódot az átvitel megbízhatóságának növelésére használják.
Ezért, bemeneti rögzítés használható a magas szint impulzusszélességének mérésére a távirányítós dekódolás elérése érdekében.
2) Sematikus diagram és CUBEMAX konfiguráció
A sematikus diagramból, láthatjuk, hogy a vezeték nélküli modul engedélyezve van a PB9 tűn keresztül, és gyűjti a 4 a TIM4 csatornái:
A TIM4_CH4 alapértelmezett érintkezője nem PB9, tehát manuálisan kell beállítani, és a megszakítás beállítása egyidejűleg bekapcsol
3) Kód rész
Rögzítse a felfutó élt a tim visszahívás funkcióval
Ebben az időben, a dekódolt jelet megkaphatjuk:
Ebben az időben, az adatok összetettebbek és kissé feldolgozhatók:
A hatás a következő:
Az utolsó két számjegy a dekódolt és annak fordított kódja. Ebben az időben, makróként definiálható a hőmérsékleti küszöb beállításához:
A hatás a következő:
Infravörös alkatrészkód:
/* FELHASZNÁLÓI KÓD BEGIN Fejléc */
/**
******************************************************************************
* @fájl : fő.c
* @rövid : Fő programtörzs
******************************************************************************
* @Figyelem
*
* <h2><központ>&másolat; Szerzői jog (c) 2024 STMicroelectronics.
* Minden jog fenntartva.</központ></h2>
*
* Ezt a szoftverkomponenst az ST licenceli a BSD 3-Clause licenc alapján,
* a “Engedély”; Ezt a fájlt nem használhatja, kivéve a
* Engedély. A Licenc másolatát a címen szerezheti be:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* FELHASZNÁLÓI KÓD VÉGE Fejléc */
/* Tartalmazza ——————————————————————*/
#tartalmaz “fő.h”
#tartalmaz “tim.h”
#tartalmaz “usart.h”
#tartalmaz “gpio.h”
/* Privát tartalmazza ———————————————————-*/
/* FELHASZNÁLÓI KÓD KEZDÉSE Tartalmazza */
#tartalmaz “stdio.h”
#tartalmaz “húr.h”
#határozza meg a MAXUP-ot 157
#határozza meg a MAXDOWN-t 87
#határozza meg a MINUP-ot 221
#definiálja a MINDOWN-t 61
/* FELHASZNÁLÓI KÓD VÉGE Tartalmazza */
/* Privát typedef ———————————————————–*/
/* FELHASZNÁLÓI KÓD KEZDŐ PTD */
/* FELHASZNÁLÓI KÓD VÉGE PTD */
/* Privát meghatározás ————————————————————*/
/* FELHASZNÁLÓI KÓD KEZDŐ PD */
/* FELHASZNÁLÓI KÓD VÉGE PD */
/* Privát makró ————————————————————-*/
/* FELHASZNÁLÓI KÓD KEZDÉS PM */
/* FELHASZNÁLÓI KÓD VÉGE PM */
/* Privát változók ———————————————————*/
/* FELHASZNÁLÓI KÓD KEZDŐ PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t szélesség=0;
uint16_t puffer[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* FELHASZNÁLÓI KÓD VÉGE PV */
/* Privát funkciójú prototípusok ———————————————–*/
void SystemClock_Config(üres);
/* FELHASZNÁLÓI KÓD PFP KEZDÉS */
/* FELHASZNÁLÓI KÓD VÉGE PFP */
/* Privát felhasználói kód ———————————————————*/
/* FELHASZNÁLÓI KÓD KEZDÉSE 0 */
érvénytelen HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
érvénytelen HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
ha(isUpCapt)//Ha felfutó élrögzítésről van szó
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
más{
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;
ha(szélesség>4400&&szélesség<4600)
{
bufferId=0;
puffer[bufferId++]=szélesség;
}
különben ha(pufferazonosító>0)
{
puffer[bufferId++]=szélesség;
ha(pufferazonosító>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
érvénytelen bitBuffer2num(char num[])
{
sz[0]=0;
sz[1]=0;
sz[2]=0;
sz[3]=0;
számára(int i=0;én<32;i++)
{
ha(puffer[i+1]<1000)
{
sz[i/8]=szám[i/8]<<1;
}
más
{
sz[i/8]=szám[i/8]<<1;
sz[i/8]|=0x01;
}
}
}
/* FELHASZNÁLÓI KÓD VÉGE 0 */
/**
* @brief Az alkalmazás belépési pontja.
* @retval int
*/
int fő(üres)
{
/* FELHASZNÁLÓI KÓD KEZDÉSE 1 */
char printbuff[128]={0};
char num[4]={0};
char kulcs=0;
/* FELHASZNÁLÓI KÓD VÉGE 1 */
/* MCU konfiguráció——————————————————–*/
/* Az összes periféria visszaállítása, Inicializálja a Flash interfészt és a Systick-et. */
HAL_Init();
/* FELHASZNÁLÓI KÓD BEGIN Init */
/* FELHASZNÁLÓI KÓD VÉGE Init */
/* Állítsa be a rendszerórát */
SystemClock_Config();
/* FELHASZNÁLÓI KÓD A SysInit indítása */
/* FELHASZNÁLÓI KÓD VÉGE SysInit */
/* Inicializálja az összes konfigurált perifériát */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* FELHASZNÁLÓI KÓD KEZDÉSE 2 */
/* FELHASZNÁLÓI KÓD VÉGE 2 */
/* Végtelen hurok */
/* FELHASZNÁLÓI KÓD KEZDÉS ALATT */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Az időzítő frissítése megszakítást generál
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
míg (1)
{
ha(rcvFalg)
{
számára(int i=0;én<4;i++)
{
bitBuffer2num(sz);
sprintf(printbuff,”0xx “,sz[én]);
HAL_UART_Transmit(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%u “,puffer[én]);
// HAL_UART_Transmit(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Transmit(&huart1,”\rn”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%drn”,sz[3]);
ha(sz[3]==157)
{
printf(“111111\rn”);
}
HAL_Delay(1000);
/* A FELHASZNÁLÓI KÓD VÉGE MIG */
/* FELHASZNÁLÓI KÓD KEZDÉSE 3 */
}
/* FELHASZNÁLÓI KÓD VÉGE 3 */
}
/**
* @rövid rendszeróra-konfiguráció
* @retval Nincs
*/
void SystemClock_Config(üres)
{
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









