Poređenje između PT100 temperaturni senzor sonda i DS18B20 modul
1) Osnovni princip akvizicije signala
① Otpor PT100 se mijenja proporcionalno s temperaturom (što je temperatura viša, što je veći otpor), ali promjena otpora je vrlo mala, o 0.385 Oh / stepen;
② Opseg mjerenja temperature PT100 je -200℃ -200℃, i na 0℃, otpor je tačno jednak 100 Oh;
③ Radna struja PT100 bi trebala biti manja od 5 mA;
④ Iako se otpor PT100 mijenja proporcionalno s temperaturom, njenu stopu promjene (to jest, K vrijednost K vrijednost K vrijednost) razlikuje se u različitim temperaturnim rasponima.
2) PT100 tablica promjene temperaturne otpornosti
3. PT100 pogonski krug
1) Metodom podjele napona, AD prikuplja PT100 napon da dobije vrijednost otpora za izračunavanje temperature
Vrijednost otpornosti PT100 u vodi na sobnoj temperaturi (25℃25℃25℃) je o 109.89 Oh.
Mikrokontroler daje napon od 3,3V, a napon podijeljen sa PT100 je približno:
109.89 ∗ 0.005 = 0.54945 V
AD vrijednost preračunata prema AD formuli konverzije je približno:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Kada temperatura poraste za jedan stepen, pod pretpostavkom da otpor PT100 samo raste 0.385 Oh, vrijednost promjene podijeljenog napona je približno jednaka:
0.385 ∗ 0.005 = 0.001925 V
AD vrijednost preračunata prema AD formuli konverzije je približno:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
U eksperimentu, Utvrđeno je da zbog nestabilnog napona od 3,3V stm32 napajanja, ADC je prikupio PT100 fluktuacije napona i greška podjele napona je bila velika. Rješenje za optimizaciju je dizajn kruga izvora konstantne struje. Sakupljanjem napona PT100 i struje izvora konstantne struje, može se dobiti otpor PT100, i tada se može dobiti vrijednost temperature.
2) Krug izvora konstantne struje baziran na LDO regulatoru (MD5333)
Postoji mnogo pogonskih kola za testiranje PT100 na Internetu, kao što je DC mostni krug, kolo izvora konstantne struje bazirano na operacionom pojačalu, itd. Autor je dosta vremena posvetio i odabiru voznog kola, s obzirom na težinu izrade ploče i broj komponenti, i na kraju izabrao kolo izvora konstantne struje bazirano na LDO regulatoru (MD5333). Šema strujnog kola je sljedeća:
U ovom trenutku, izbor hardvera je u osnovi završen. Korištena razvojna ploča je Zhengdian Atom F10ZET6 Elite Board
DS18B20 modul
Da bi se testirala temperatura u realnom vremenu i poređenje temperature PT100, DS18B20 modul je dodat za uporedni test kalibracije
1) Uvod u DS18B20
DS18B20 je senzor temperature sa jednom sabirnicom sa temperaturnim opsegom testa od -55~+125℃ i preciznošću od ±0,5℃. Temperatura polja se direktno prenosi na digitalni način sa jednom magistralom, što značajno poboljšava sposobnost sistema protiv smetnji. Može direktno očitati izmjerenu temperaturu, i može realizovati 9~12-bitni metod čitanja digitalnih vrijednosti kroz jednostavno programiranje prema stvarnim zahtjevima. Njegov radni napon je 3~5,5V, i koristi razne oblike pakovanja, čineći podešavanje sistema fleksibilnim i praktičnim. Podešena rezolucija i temperatura alarma koju je postavio korisnik pohranjuju se u EEPROM i još uvijek se pohranjuju nakon nestanka struje.
2) Uvod u radni tajming DS18B20
Svi uređaji sa jednom sabirnicom zahtijevaju strogo mjerenje vremena signala kako bi se osigurao integritet podataka. DS18B20 ima 6 vrste signala: resetovanje pulsa, odzivni puls, pisati 0, pisati 1, čitaj 0 i čitaj 1. Svi ovi signali, osim impulsa odgovora, su sinhroni signali koje šalje host. I sve komande i podaci se šalju sa niskim bitom bajta prvi.
① Resetujte puls i odzivni impuls
Sve komunikacije na jednoj magistrali počinju sa sekvencom inicijalizacije. Domaćin daje nizak nivo i održava niski nivo najmanje 480us kako bi generirao impuls za resetiranje. Tada domaćin pušta autobus, i 4.7K pull-up otpornik povlači jednu magistralu visoko, sa vremenom kašnjenja od 15~60us, i ulazi u režim prijema (Rx). Zatim DS18B20 povlači sabirnicu nisko za 60~240us da bi generirao impuls niskog nivoa odziva.
② Upišite vrijeme
Vrijeme pisanja uključuje pisanje 0 određivanje vremena i pisanje 1 tajming. Sva vremena pisanja zahtijevaju najmanje 60us, i potrebno je najmanje 1us vremena oporavka između dva nezavisna vremena pisanja. Oba vremena pisanja počinju tako što host povlači sabirnicu. Pišite 1 tajming: domaćin daje nizak nivo, kašnjenja za 2us, a zatim pušta autobus, odlaganje 60us. Pišite 0 tajming: domaćin daje nizak nivo, kašnjenja za 60us, a zatim pušta sabirnicu sa kašnjenjem od 2us.
③ Čitanje vremena
Uređaji sa jednom magistralom prenose podatke do hosta samo kada host izdaje vrijeme čitanja. Stoga, nakon što host izda naredbu za čitanje podataka, vrijeme čitanja mora biti generirano odmah kako bi slave mogao prenositi podatke. Sva vremena čitanja zahtijevaju najmanje 60us, i potrebno je najmanje 1us vremena oporavka između dva nezavisna vremena čitanja. Svako vrijeme čitanja inicira domaćin, koji povlači autobus za najmanje 1us. Domaćin mora osloboditi sabirnicu za vrijeme čitanja vremena i uzorkovati status sabirnice unutar 15us nakon početka mjerenja vremena. Tipičan proces mjerenja vremena čitanja je: domaćin daje kašnjenje niske razine od 2us, tada se domaćin prebacuje na ulazni način odgode od 12us, zatim čita trenutni nivo jedne magistrale, a zatim odlaže 50us.
Nakon razumijevanja vremena za jednu sabirnicu, pogledajmo tipičan proces očitavanja temperature za DS18B20. Tipičan proces očitavanja temperature za DS18B20 je: reset → pošalji SKIPROM (0xCC) → pošalji naredbu za početak konverzije (0x44) → kašnjenje → reset → pošalji SKIPROM komandu (0xCC) → pošalji memorijsku naredbu (0xBE) → pročitaj dva bajta podataka (tj. temperaturu) kontinuirano → kraj.
3) Šematski dijagram i CUBEMAX konfiguracija
Sa šematskog dijagrama, može se vidjeti da je DS18B20 omogućen preko PG11 porta da otvori serijski port za ispis informacija o temperaturi
4) Dio koda
Kodni dio transplantira ds18b20 biblioteku Zhengdian Atoma i pravi male modifikacije
#ifndef __DS18B20_H
#definirati __DS18B20_H
#uključiti “tim.h”
/***********************************************************************************/
/* DS18B20 pin definicija */
#definirati DS18B20_DQ_GPIO_PORT GPIOG
#definirajte DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#definirajte DS18B20_DQ_GPIO_CLK_ENABLE() uradi{ __HAL_RCC_GPIOG_CLK_ENABLE(); }dok(0) /* Omogućavanje takta PG porta */
/**********************************************************************************************/
/* IO radna funkcija */
#definirati DS18B20_DQ_OUT(x) uradi{ 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); \
}dok(0) /* Izlaz porta podataka */
#definirajte DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Unos porta podataka */
uint8_t ds18b20_init(void); /* Inicijalizirajte DS18B20 */
uint8_t ds18b20_check(void); /* Provjerite postoji li DS18B20 */
kratki ds18b20_get_temperature(void);/* Dobiti temperaturu */
#endif
5. Infracrveni daljinski upravljač
1) Protokol kodiranja bežičnog modula
Široko korištene metode kodiranja za infracrveno daljinsko upravljanje su: NEC protokol PWM (modulacija širine impulsa) i RC-5 protokol Philips PPM (modulacija pulsne pozicije). Daljinski upravljač koji dolazi uz razvojnu ploču koristi NEC protokol, koji ima sljedeće karakteristike:
1. 8-bitnu adresu i 8-bitnu dužinu instrukcije;
2. Adresa i komanda se prenose dva puta (kako bi se osigurala pouzdanost);
3. PWM modulacija impulsne pozicije, sa radnim ciklusom odašiljenog infracrvenog nosioca koji predstavlja “0” i “1”;
4. Noseća frekvencija je 38Khz;
5. Vrijeme bita je 1,125 ms ili 2,25 ms;
U NEC protokolu, kako podesiti podatke u protokolu na ‘0’ ili '1'? Evo, infracrveni prijemnik i infracrveni predajnik su odvojeni.
Infracrveni predajnik: Pošaljite podatke protokola '0' = 560us prijenosa signala nosioca + 560nema prijenosa signala nosioca
Pošaljite podatke protokola '1' = 560us prijenosa signala nosioca + 1680nema prijenosa signala nosioca
Bitna definicija infracrvenog predajnika prikazana je na donjoj slici
Infracrveni prijemnik: Primanje podataka protokola '0' = 560us nizak nivo + 560nas na visokom nivou
Primanje podataka protokola '1' = 560us nizak nivo + 1680nas na visokom nivou
Format podataka NEC daljinske komande je: terminal za sinhronizaciju, adresni kod, adresni inverzni kod, kontrolni kod, kontrolni inverzni kod. Kod za sinhronizaciju se sastoji od niskog nivoa od 9 ms i visokog nivoa od 4,5 ms. Adresni kod, adresni inverzni kod, kontrolni kod, i kontrolni inverzni kod su svi 8-bitni formati podataka. Šalju se po redoslijedu niži bit prvi i visoki bit zadnji. Inverzni kod se koristi za povećanje pouzdanosti prijenosa.
Stoga, hvatanje ulaza može se koristiti za mjerenje širine impulsa visokog nivoa kako bi se postiglo dekodiranje daljinskog upravljača.
2) Šematski dijagram i CUBEMAX konfiguracija
Sa šematskog dijagrama, možemo vidjeti da je bežični modul omogućen preko PB9 pina i prikuplja se preko 4 kanali TIM4:
Podrazumevani pin TIM4_CH4 nije PB9, pa ga treba ručno podesiti, a postavka prekida je uključena u isto vrijeme
3) Dio koda
Uhvatite rastuću ivicu kroz funkciju povratnog poziva tim
U ovo vrijeme, dekodirani signal se može dobiti:
U ovo vrijeme, podaci su složeniji i mogu se malo obraditi:
Učinak je sljedeći:
Zadnje dvije cifre su dekodirani i njegov inverzni kod. U ovo vrijeme, može se definirati kao makro za podešavanje temperaturnog praga:
Učinak je sljedeći:
Infracrveni kod dijela:
/* KORISNIČKI KOD BEGIN Zaglavlje */
/**
******************************************************************************
* @file : main.c
* @brief : Tijelo glavnog programa
******************************************************************************
* @attention
*
* <h2><centar>&kopija; Copyright (c) 2024 STMicroelectronics.
* Sva prava pridržana.</centar></h2>
*
* Ovu softversku komponentu licencira ST pod licencom BSD 3-Clause,
* the “Licenca”; Ne možete koristiti ovu datoteku osim u skladu sa
* Licenca. Kopiju licence možete dobiti na adresi:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* KRAJ KOD KORISNIKA Zaglavlje */
/* Uključuje ——————————————————————*/
#uključiti “main.h”
#uključiti “tim.h”
#uključiti “usart.h”
#uključiti “gpio.h”
/* Privatno uključuje ———————————————————-*/
/* KORISNIČKI KOD POČETAK Uključuje */
#uključiti “stdio.h”
#uključiti “string.h”
#definirati MAXUP 157
#definirati MAXDOWN 87
#definirati MINUP 221
#definiše MINDOWN 61
/* KORISNIČKI KOD KRAJ Uključuje */
/* Private typedef ———————————————————–*/
/* KORISNIČKI KOD ZAPOČNI PTD */
/* KOD KORISNIKA KRAJ PTD */
/* Privatno definirati ————————————————————*/
/* KORISNIČKI KOD ZAPOČNI PD */
/* KORISNIČKI KOD KRAJ PD */
/* Privatni makro ————————————————————-*/
/* KORISNIČKI KOD POČINJE PM */
/* KORISNIČKI KOD KRAJ PM */
/* Privatne varijable ———————————————————*/
/* KORISNIČKI KOD ZAPOČNI PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t širina=0;
uint16_t bafer[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* KOD KORISNIKA KRAJ PV */
/* Prototipovi privatnih funkcija ———————————————–*/
void SystemClock_Config(void);
/* KORISNIČKI KOD ZAPOČNI PFP */
/* KORISNIČKI KOD KRAJ PFP */
/* Privatni korisnički kod ———————————————————*/
/* KORISNIČKI KOD ZAPOČNI 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
ako(isUpCapt)//Ako je hvatanje uzlazne ivice
{
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;
}
ostalo{
ValueDown=HAL_TIM_ReadCapturedValue(Htim htim,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(Htim htim,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
width=ValueDown+upCount*65536-ValueUp;
ako(širina>4400&&širina<4600)
{
bufferId=0;
tampon[bufferId++]=width;
}
inače ako(bufferId>0)
{
tampon[bufferId++]=width;
ako(bufferId>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
void bitBuffer2num(char num[])
{
br[0]=0;
br[1]=0;
br[2]=0;
br[3]=0;
za(int i=0;i<32;i++)
{
ako(tampon[i+1]<1000)
{
br[i/8]=num[i/8]<<1;
}
ostalo
{
br[i/8]=num[i/8]<<1;
br[i/8]|=0x01;
}
}
}
/* KORISNIČKI KOD KRAJ 0 */
/**
* @brief Ulazna tačka aplikacije.
* @retval int
*/
int main(void)
{
/* KORISNIČKI KOD ZAPOČNI 1 */
char printbuff[128]={0};
char num[4]={0};
char ključ=0;
/* KORISNIČKI KOD KRAJ 1 */
/* MCU konfiguracija——————————————————–*/
/* Resetovanje svih perifernih uređaja, Inicijalizira Flash interfejs i Systick. */
HAL_Init();
/* KORISNIČKI KOD POČETAK Početni */
/* KORISNIČKI KOD KRAJ Početno */
/* Konfigurišite sistemski sat */
SystemClock_Config();
/* KORISNIČKI KOD ZAPOČNI SysInit */
/* KORISNIČKI KOD KRAJ SysInit */
/* Inicijalizirajte sve konfigurirane periferne uređaje */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* KORISNIČKI KOD ZAPOČNI 2 */
/* KORISNIČKI KOD KRAJ 2 */
/* Beskonačna petlja */
/* KORISNIČKI KOD POČINJE DOK */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Ažuriranje tajmera generiše prekid
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
dok (1)
{
ako(rcvFalg)
{
za(int i=0;i<4;i++)
{
bitBuffer2num(br);
sprintf(printbuff,”0xx “,br[i]);
HAL_UART_Transmit(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%u “,tampon[i]);
// HAL_UART_Transmit(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Transmit(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%d\r\n”,br[3]);
ako(br[3]==157)
{
printf(“111111\r\n”);
}
HAL_Delay(1000);
/* KORISNIČKI KOD END WHILE */
/* KORISNIČKI KOD ZAPOČNI 3 */
}
/* KORISNIČKI KOD KRAJ 3 */
}
/**
* @brief System Clock Configuration
* @retval Ništa
*/
void SystemClock_Config(void)
{
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









