Hőmérséklet-érzékelő technológia

Hőmérséklet érzékelő szonda (A DS18B20 és a PT100 funkcionális áramköri tervezése)

DS18B20 vázlatos és cubemax konfiguráció

Ö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

PT100 hőmérséklet-ellenállás változási táblázat

3. PT100 meghajtó áramkör

PT100 meghajtó áramkör

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ő:

LDO szabályozó állandó áramforrás áramköre (MD5333)

LDO szabályozó állandó áramforrás áramköre (MD5333)

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.

DS18B20 áramkör tervezés

DS18B20 áramkör tervezés

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.

DS18B20 reset impulzus és válaszimpulzus

DS18B20 reset impulzus és válaszimpulzus

① Á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.

DS18B20 írási időzítés

DS18B20 írási időzítés

② Í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.

DS18B20 Olvasási időzítés

DS18B20 Olvasási időzítés

③ 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.

A DS18B20 megnyitja a soros portot a hőmérsékleti információk nyomtatásához

A DS18B20 megnyitja a soros portot a hőmérsékleti információk nyomtatásához

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

DS18B20 vázlatos és cubemax konfiguráció

DS18B20 vázlatos és cubemax konfiguráció

DS18B20 hőmérséklet és páratartalom érzékelő interfész

DS18B20 hőmérséklet és páratartalom érzékelő interfész

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};