Srovnání mezi Senzor teploty PT100 sonda a Modul DS18B20
1) Základní princip získávání signálu
① Odpor PT100 se mění úměrně s teplotou (čím vyšší je teplota, Čím větší je odpor), Změna odporu je však velmi malá, o 0.385 Ó / stupeň;
② Rozsah měření teploty PT100 je -200 ℃ -200 ℃, a při 0 ℃, Odpor se přesně rovná 100 Ó;
③ Pracovní proud PT100 by měl být menší než 5 Ma;
④ Ačkoli se odpor PT100 mění úměrně s teplotou, jeho míra změny (to je, K hodnota k hodnota k hodnota k hodnota) se liší v různých teplotních rozsazích.
2) Tabulka změny odolnosti teploty PT100
3. PT100 Drive Circuit
1) Metodou dělení napětí, AD shromažďuje napětí PT100 pro získání hodnoty odporu pro výpočet teploty
Hodnota odporu PT100 ve vodě při teplotě místnosti (25℃ 25 ℃ 25 ℃) je asi 109.89 Ó.
Mikrokontrolér vydává napětí 3,3 V, a napětí děleno PT100 je přibližně:
109.89 ∗ 0.005 = 0.54945 PROTI
Hodnota reklamy převedená podle vzorce převodu reklamy je přibližně přibližně:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Když teplota stoupá o jeden stupeň, za předpokladu, že odpor PT100 právě stoupá 0.385 Ó, Hodnota změny rozděleného napětí je přibližně stejná:
0.385 ∗ 0.005 = 0.001925 PROTI
Hodnota reklamy převedená podle vzorce převodu reklamy je přibližně přibližně:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
V experimentu, Bylo zjištěno, že kvůli nestabilnímu 3,3 V napětí napájecího zdroje STM32, ADC shromáždila kolísání napětí PT100 a chyba dělení napětí byla velká. Optimalizačním řešením je navrhnout zdrojový obvod s konstantním proudem. Shromažďováním napětí PT100 a proudu zdroje konstantního proudu, Lze získat odpor PT100, a pak lze získat teplotní hodnotu.
2) Zdrojový obvod s konstantním proudem založený na regulátoru LDO (MD5333)
Existuje mnoho hnacích obvodů pro testování PT100 na internetu, například obvod DC Bridge, zdrojový obvod s konstantním proudem založený na operačním zesilovači, atd. Autor také strávil spoustu času při výběru hnacího obvodu, s ohledem na obtížnost výroby desky a počtu komponent, a nakonec si vybral zdrojový obvod s konstantním proudem na základě regulátoru LDO (MD5333). Diagram obvodu je následující:
V tuto chvíli, Výběr hardwaru byl v zásadě dokončen. Použitá vývojová rada je Zhengdian Atom F10ZET6 Elite Board
Modul DS18B20
Za účelem testování teploty v reálném čase a srovnání teploty PT100, Modul DS18B20 je přidán pro test porovnání kalibrace
1) Úvod do DS18B20
DS18B20 je teplotní senzor s jedním busicí s testovací teplotou ve výši -55 ~+125 ℃ a přesností ± 0,5 ℃. Teplota pole je přímo přenášena digitálním způsobem, což výrazně zlepšuje schopnost systému systému. Může přímo číst naměřenou teplotu, a může realizovat 9 ~ 12bitovou metodu čtení digitální hodnoty prostřednictvím jednoduchého programování podle skutečných požadavků. Jeho rozsah provozního napětí je 3 ~ 5,5 V, a používá různé balení, Zatčení systému systému. Rozlišení sady a teplota alarmu nastavená uživatelem jsou uloženy v EEPROM a po selhání napájení jsou stále uloženy.
2) Úvod do DS18B20 Working Načasování
Všechna zařízení s jedním busem vyžadují přísné načasování signálu, aby byla zajištěna integrita dat. DS18B20 má 6 typy signálu: resetovat puls, Pulse odpovědi, napsat 0, napsat 1, číst 0 a číst 1. Všechny tyto signály, kromě pulsu odpovědi, jsou synchronní signály zaslané hostitelem. A všechny příkazy a data jsou zasílána s nízkým kouskem bajtu jako první.
① Resetování pulsu a odpovědi
Veškerá komunikace na jednom sběrnici start s inicializační sekvencí. Hostitel vydává nízkou úroveň a udržuje nízkou úroveň pro nejméně 480US, aby vytvořil resetovací puls. Pak hostitel uvolní autobus, a 4,7k pull-up rezistor vytáhne jediný sběrnice vysoko, s dobou zpoždění 15 ~ 60US, a vstupuje do režimu přijímání (Rx). Poté DS18B20 zatáhne sběrnicí sběrnice na 60 ~ 240US, aby vytvořil puls odezvy nízké úrovně.
② Napište načasování
Načasování zápisu zahrnuje zápis 0 Načasování a psaní 1 načasování. Všechny časování zápisu vyžadují alespoň 60US, a mezi dvěma nezávislými časováními zápisu je vyžadována alespoň 1US doba zotavení. Oba načasování zápisu začínají hostitelem, který stáhne autobus. Napsat 1 načasování: hostitel vydává nízkou úroveň, zpoždění pro 2US, a pak uvolní autobus, Zpoždění 60US. Napsat 0 načasování: hostitel vydává nízkou úroveň, zpoždění pro 60US, a poté uvolní autobus se zpožděním 2US.
③ Číst načasování
Zařízení pro jednobus přenášejí data na hostitele pouze tehdy, když hostitel vydá načasování čtení. Proto, Poté, co hostitel vydá příkaz čtení dat, Načasování čtení musí být vygenerováno okamžitě, aby otrok mohl přenášet data. Všechny časování čtení vyžadují alespoň 60US, a mezi dvěma nezávislými časováním čtení je vyžadována alespoň 1US doba zotavení. Každé načasování čtení je iniciováno hostitelem, který stáhne autobus alespoň 1US. Hostitel musí během načasování čtení uvolnit sběrnici a po zahájení načasování ochutnat stav sběrnice do 15US. Typický proces načasování čtení je: hostitel vydává nízkou úroveň zpoždění 2US, pak hostitel přepne na zpoždění vstupního režimu 12US, pak čte aktuální úroveň jediného sběru, a pak zpoždění 50US.
Po porozumění načasování jediného sběrnice, Pojďme se podívat na typický proces čtení teploty DS18B20. Typický proces čtení teploty DS18B20 je: Reset → Odeslat skiprom (0XCC) → Odeslat příkaz start konverze (0x44) → Zpoždění → Reset → Odeslat příkaz Skiprom (0XCC) → Odeslat příkaz paměti (0Xbe) → Přečtěte si dva bajty dat (tj. teplota) nepřetržitě → konec.
3) Schematický diagram a konfigurace Cubemax
Ze schématu, Je vidět, že DS18B20 je povoleno port PG11, aby otevřel sériový port pro tisk teploty teploty
4) Část kódu
Část kódu transplantuje knihovnu DS18B20 zhengdiánského atomu a provádí mírné úpravy
#ifndef __ds18b20_h
#Definujte __ds18b20_h
#zahrnout “Tim.H”
/***********************************************************************************/
/* Definice pinů DS18B20 */
#Definujte ds18b20_dq_gpio_port gpiog
#Definujte ds18b20_dq_gpio_pin gpio_pin_11
#Definujte ds18b20_dq_gpio_clk_enable() dělat{ __Hal_rcc_gpiog_clk_enable(); }zatímco(0) /* PG Port Clock Enable */
/**********************************************************************************************/
/* Funkce provozu IO */
#Definujte ds18b20_dq_out(x) dělat{ 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); \
}zatímco(0) /* Výstup datového portu */
#Definujte DS18B20_DQ_IN HAL_GPIO_READPIN(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Vstup datového portu */
uint8_t ds18b20_init(neplatné); /* Inicializace DS18B20 */
uint8_t ds18b20_check(neplatné); /* Zkontrolujte, zda existuje DS18B20 */
Krátký ds18b20_get_temperature(neplatné);/* Získejte teplotu */
#Endif
5. Modul infračerveného dálkového ovládání
1) Protokol kódování bezdrátového modulu
Široce používané metody kódování pro infračervené dálkové ovládání jsou: NEC protokol PWM (Modulace šířky pulsu) a RC-5 protokol Phips PPM (Modulace pozice pulsu). Dálkové ovládání, které přichází s vývojovou deskou, používá protokol NEC, který má následující funkce:
1. 8-bitová adresa a 8bitová délka instrukce;
2. Adresa a příkaz jsou přenášeny dvakrát (zajistit spolehlivost);
3. Modulace pozice PWM PULSE, s pracovním cyklem přenášeného infračerveného nosiče “0” a “1”;
4. Frekvence nosiče je 38 kHz;
5. Bit čas je 1,125 ms nebo 2,25 ms;
V protokolu NEC, jak nastavit data v protokolu ‘0’ nebo „1“? Zde, Infračervený přijímač a infračervený vysílač jsou odděleny.
Infračervený vysílač: Odeslat data protokolu „0“ = 560US přenosu signálu nosiče + 560nás bez přenosu signálu nosiče
Odeslat data protokolu „1“ = 560US přenosu signálu nosiče + 1680nás bez přenosu signálu nosiče
Definice bitu infračerveného vysílače je znázorněna na obrázku níže
Infračervený přijímač: Přijímat data protokolu ‘0’ = 560US Nízká úroveň + 560americká vysoká úroveň
Přijímat data protokolu ‘1’ = 560US Nízká úroveň + 1680americká vysoká úroveň
Formát dat příkazu Nec Remote Control je: Synchronizační terminál, Kód adresy, adresa inverzní kód, Řídicí kód, Ovládací inverzní kód. Synchronizační kód se skládá z nízké úrovně 9 ms a vysoké úrovně 4,5 ms. Kód adresy, adresa inverzní kód, Řídicí kód, a kontrolní inverzní kód jsou všechny 8bitové formáty dat. Jsou zasílány v pořadí nejprve a nejprve na posledním kousku. Inverzní kód se používá ke zvýšení spolehlivosti přenosu.
Proto, Zachycení vstupu lze použít k měření šířky pulsu vysoké úrovně k dosažení dekódování dálkového ovládání.
2) Schematický diagram a konfigurace Cubemax
Ze schématu, Vidíme, že bezdrátový modul je povolen přes kolík PB9 a shromažďuje se 4 Kanály Tim4:
Výchozí pin Tim4_CH4 není PB9, Je tedy třeba nastavit ručně, a nastavení přerušení je zapnuto současně
3) Část kódu
Zachyťte rostoucí hranu funkcí zpětného volání Tim
V tuto chvíli, lze získat dekódovaný signál:
V tuto chvíli, Data jsou složitější a lze je mírně zpracovat:
Účinek je následující:
Poslední dvě číslice jsou dekódované a jeho inverzní kód. V tuto chvíli, Lze jej definovat jako makro pro úpravu prahu teploty:
Účinek je následující:
Infračervené kód části:
/* Uživatelský kód Začátek záhlaví */
/**
******************************************************************************
* @soubor : hand.c
* @stručný : Hlavní tělo programu
******************************************************************************
* @Pozor
*
* <H2><centrum>&kopie; Copyright (C) 2024 Stmicroelectronics.
* Všechna práva vyhrazena.</centrum></H2>
*
* Tato komponenta softwaru je licencována společností ST v rámci licence BSD 3-klauzule,
* The “Licence”; Tento soubor nemusíte používat s výjimkou dodržování
* Licence. Můžete získat kopii licence na:
* openSource.org/licenses/bsd-3-lause
*
******************************************************************************
*/
/* Záhlaví koncového kódu uživatele */
/* Zahrnuje ——————————————————————*/
#zahrnout “main.h”
#zahrnout “Tim.H”
#zahrnout “usart.h”
#zahrnout “gpio.h”
/* Soukromé zahrnuje ———————————————————-*/
/* Začátek kódu uživatelského kódu zahrnuje */
#zahrnout “stdio.h”
#zahrnout “string.h”
#Definujte Maxup 157
#Definujte Maxdown 87
#Definujte MINUP 221
#Definujte Mindown 61
/* Konec uživatelského kódu zahrnuje */
/* Soukromé typedef ———————————————————–*/
/* Uživatelský kód začíná PTD */
/* Uživatelský kód konec PTD */
/* Soukromé definovat ————————————————————*/
/* Uživatelský kód začíná PD */
/* Uživatelský kód konec PD */
/* Soukromé makro ————————————————————-*/
/* Uživatelský kód začíná PM */
/* Uživatelský kód konec PM */
/* Soukromé proměnné ———————————————————*/
/* Uživatelský kód začíná PV */
uint32_t upCount = 0;
uint16_t valueUp = 0;
uint16_t valueDown = 0;
uint8_t iSupCapt = 1;
uint16_t šířka = 0;
vyrovnávací paměť uint16_t[128]={0};
uint16_t bufferid = 0;
uint8_t rcvfalg = 0;
/* Uživatelský kód konec PV */
/* Prototypy soukromé funkce ———————————————–*/
Void Systemsclock_Config(neplatné);
/* Uživatelský kód začíná PFP */
/* Uživatelský kód konec PFP */
/* Soukromý uživatelský kód ———————————————————*/
/* Začněte uživatelský kód 0 */
void hal_tim_periodelapsedCallback(Tim_handletepedef *htim)
{
UPCOUNT ++;
}
Void HAL_TIM_IC_CaptureCallback(Tim_handletepedef *htim)
{
-li(iSupCapt)//Pokud je to rostoucí hrana
{
ValueUp = HAL_TIM_READCapturedValue(Htim htim,Tim_channel_4);
iSupCapt = 0;
__Hal_Tim_Set_CapturePolarity(Htim htim,Tim_channel_4, tim_icpolarity_falling);
UPCOUNT = 0;
}
jiný{
ValueDown = HAL_TIM_READCapturedValue(Htim htim,Tim_channel_4);
iSupCapt = 1;
__Hal_Tim_Set_CapturePolarity(Htim htim,Tim_channel_4, tim_icpolarity_rising);
WIDTH = VÝPOJECTOWN+UPCOUNT*65536-valueup;
-li(šířka>4400&&šířka<4600)
{
bufferid = 0;
vyrovnávací paměť[Bufferid ++]= šířka;
}
jinak, pokud(Bufferid>0)
{
vyrovnávací paměť[Bufferid ++]= šířka;
-li(Bufferid>32)
{
RCVFALG = 1;
bufferid = 0;
}
}
}
}
void bitbuffer2num(char nm[])
{
num[0]= 0;
num[1]= 0;
num[2]= 0;
num[3]= 0;
pro(int i = 0;i<32;i ++)
{
-li(vyrovnávací paměť[i+1]<1000)
{
num[i/8]= num[i/8]<<1;
}
jiný
{
num[i/8]= num[i/8]<<1;
num[i/8]|= 0x01;
}
}
}
/* Uživatelský kód konec 0 */
/**
* @Brief Vstupní bod aplikace.
* @retval int
*/
int main(neplatné)
{
/* Začněte uživatelský kód 1 */
char printbuff[128]={0};
char nm[4]={0};
Char Key = 0;
/* Uživatelský kód konec 1 */
/* Konfigurace MCU——————————————————–*/
/* Resetovat všechny periferie, Inicializuje rozhraní Flash a Systick. */
Hal_init();
/* Uživatelský kód začněte */
/* Uživatelský kód INIT */
/* Nakonfigurujte systémové hodiny */
SystemClock_Config();
/* Uživatelský kód Začíná sysinita */
/* Uživatelský kód konec Sysinit */
/* Inicializujte všechny nakonfigurované periferie */
Mx_gpio_init();
Mx_tim4_init();
Mx_usart1_uart_init();
/* Začněte uživatelský kód 2 */
/* Uživatelský kód konec 2 */
/* Nekonečná smyčka */
/* Uživatelský kód začíná */
Hal_gpio_togglepin(LED0_GPIO_PORT,LED0_PIN);
Hal_tim_base_start_it(&htim4);//Aktualizace časovače generuje přerušení
Hal_tim_ic_start_it(&htim4, tim_channel_4);//
zatímco (1)
{
-li(RCVFALG)
{
pro(int i = 0;i<4;i ++)
{
bitbuffer2num(num);
Sprintf(Printbuff,”0xx “,num[i]);
Hal_uart_transmit(&Huart1, Printbuff,strlen(Printbuff),Hal_max_delay);
}
// Sprintf(Printbuff,”%u “,vyrovnávací paměť[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”,num[3]);
-li(num[3]== 157)
{
Printf(“111111\r n”);
}
Hal_delay(1000);
/* Uživatelský kód končí, zatímco */
/* Začněte uživatelský kód 3 */
}
/* Uživatelský kód konec 3 */
}
/**
* @Brief System Hoding Configuration
* @retval žádný
*/
Void Systemsclock_Config(neplatné)
{
Rcc_oscinititpedef rcc_oscinitstruct = {0};
Rcc_clkinitypedef rcc_clkinitStruct = {0};