Usporedba između PT100 senzor temperature sonda i DS18B20 modul
1) Osnovni princip akvizicije signala
① Otpor PT100 mijenja se proporcionalno s temperaturom (što je temperatura viša, veći je otpor), ali je promjena otpora vrlo mala, oko 0.385 Oh / stupanj;
② Raspon mjerenja temperature PT100 je -200℃ -200℃, i na 0℃, otpor je točno jednak 100 Oh;
③ Radna struja PT100 trebala bi biti manja od 5 mA;
④ Iako se otpor PT100 mijenja proporcionalno s temperaturom, njegovu brzinu 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) Kroz metodu podjele napona, AD prikuplja PT100 napon kako bi dobio vrijednost otpora za izračunavanje temperature
Vrijednost otpora PT100 u vodi na sobnoj temperaturi (25℃25℃25℃) je oko 109.89 Oh.
Mikrokontroler daje napon od 3,3 V, a napon podijeljen s PT100 je približno:
109.89 ∗ 0.005 = 0.54945 V
AD vrijednost pretvorena prema formuli AD pretvorbe je približno:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Kad temperatura poraste za jedan stupanj, pod pretpostavkom da otpor PT100 samo poraste 0.385 Oh, vrijednost promjene podijeljenog napona približno je jednaka:
0.385 ∗ 0.005 = 0.001925 V
AD vrijednost pretvorena prema formuli AD pretvorbe je približno:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
U eksperimentu, utvrđeno je da zbog nestabilnog napona od 3.3V napajanja stm32, ADC je prikupio PT100 fluktuacije napona i pogreška dijeljenja napona bila je velika. Optimizacijsko rješenje je dizajn kruga izvora konstantne struje. Prikupljanjem napona PT100 i struje izvora stalne struje, može se dobiti otpor PT100, a zatim se može dobiti vrijednost temperature.
2) Krug izvora konstantne struje baziran na LDO regulatoru (MD5333)
Na internetu postoji mnogo pogonskih krugova za testiranje PT100, kao što je istosmjerni mostni krug, krug izvora konstantne struje temeljen na operacijskom pojačalu, itd. Autor je dosta vremena posvetio i odabiru pogonskog kruga, s obzirom na težinu izrade ploče i broj komponenti, i konačno odabrao krug izvora konstantne struje temeljen na LDO regulatoru (MD5333). Dijagram strujnog kruga je sljedeći:
U ovom trenutku, izbor hardvera je u osnovi završen. Korištena razvojna ploča je Zhengdian Atom F10ZET6 Elite Board
DS18B20 modul
Za testiranje temperature u stvarnom vremenu i usporedbe temperature PT100, dodan je modul DS18B20 za usporedni test kalibracije
1) Uvod u DS18B20
DS18B20 je senzor temperature s jednom sabirnicom s rasponom ispitne temperature od -55~+125 ℃ i preciznošću od ±0,5 ℃. Temperatura polja se izravno prenosi na digitalni način s jednom sabirnicom, što uvelike poboljšava sposobnost sustava protiv smetnji. Može izravno očitati izmjerenu temperaturu, i može ostvariti 9~12-bitnu digitalnu metodu očitavanja vrijednosti kroz jednostavno programiranje prema stvarnim zahtjevima. Njegov radni napon je 3~5,5 V, i koristi različite oblike pakiranja, čineći postavke sustava fleksibilnim i praktičnim. Postavljena razlučivost i temperatura alarma koju je postavio korisnik pohranjuju se u EEPROM i pohranjuju se i nakon nestanka struje.
2) Uvod u radno vrijeme DS18B20
Svi uređaji s jednom sabirnicom zahtijevaju striktno vremensko određivanje signala kako bi se osigurala cjelovitost podataka. DS18B20 ima 6 vrste signala: reset puls, puls odgovora, pisati 0, pisati 1, čitati 0 i čitati 1. Svi ovi signali, osim pulsa odgovora, su sinkroni signali koje šalje host. I sve naredbe i podaci se šalju s nižim bitom bajta prvi.
① Puls resetiranja i impuls odgovora
Sve komunikacije na jednoj sabirnici počinju inicijalizacijskom sekvencom. Domaćin emitira nisku razinu i održava nisku razinu najmanje 480 us za generiranje impulsa resetiranja. Zatim domaćin pušta autobus, a 4.7K pull-up otpornik povlači pojedinačnu sabirnicu visoko, s vremenom kašnjenja od 15~60us, i ulazi u način primanja (Rx). Zatim DS18B20 povlači sabirnicu nisko za 60~240us kako bi generirao puls odgovora niske razine.
② Napišite vrijeme
Vrijeme pisanja uključuje pisanje 0 vrijeme i pisati 1 vremenski raspored. Sva vremena pisanja zahtijevaju najmanje 60 us, i potrebno je najmanje 1us vrijeme oporavka između dva neovisna vremena pisanja. Oba vremena pisanja počinju s hostom koji povlači sabirnicu. Pisati 1 vremenski raspored: domaćin emitira nisku razinu, kašnjenja za 2us, a zatim pušta autobus, kašnjenje 60us. Pisati 0 vremenski raspored: domaćin emitira nisku razinu, kašnjenja za 60 us, a zatim pušta autobus sa zakašnjenjem od 2us.
③ Očitajte vrijeme
Uređaji s jednom sabirnicom prenose podatke glavnom računalu samo kada glavno računalo izda vrijeme čitanja. Stoga, nakon što host izda naredbu za čitanje podataka, mora se odmah generirati vrijeme čitanja kako bi slave uređaj mogao slati podatke. Sva vremena čitanja zahtijevaju najmanje 60 us, i potrebno je najmanje 1us vrijeme oporavka između dva neovisna vremena čitanja. Svako vrijeme čitanja pokreće glavno računalo, koji vuče autobus za najmanje 1us. Host mora osloboditi sabirnicu tijekom vremena očitavanja i uzorkovati status sabirnice unutar 15 us nakon početka mjerenja vremena. Tipičan proces određivanja vremena čitanja je: host emitira kašnjenje niske razine od 2us, tada se glavno računalo prebacuje na odgodu načina unosa od 12us, zatim očitava trenutnu razinu pojedinačne sabirnice, a zatim kašnjenja 50us.
Nakon razumijevanja vremenskog rasporeda jedne sabirnice, pogledajmo tipični proces očitavanja temperature DS18B20. Tipičan postupak očitavanja temperature DS18B20 je: reset → pošalji SKIPROM (0Xcc) → pošalji naredbu za početak pretvorbe (0x44) → odgoda → reset → pošalji SKIPROM naredbu (0Xcc) → pošalji memorijsku naredbu (0Xbe) → pročitati dva bajta podataka (tj. temperatura) kontinuirano → kraj.
3) Shematski dijagram i CUBEMAX konfiguracija
Iz shematskog dijagrama, može se vidjeti da je DS18B20 omogućen putem PG11 priključka za otvaranje serijskog priključka za ispis informacija o temperaturi
4) Kodni dio
Dio koda presađuje biblioteku ds18b20 Zhengdian Atoma i čini male izmjene
#ifndef __DS18B20_H
#definirati __DS18B20_H
#uključivati “tim.h”
/***********************************************************************************/
/* Definicija pina DS18B20 */
#definirajte DS18B20_DQ_GPIO_PORT GPIOG
#definiraj DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#definirajte DS18B20_DQ_GPIO_CLK_ENABLE() učiniti{ __HAL_RCC_GPIOG_CLK_ONUS(); }dok(0) /* Omogući sat PG priključka */
/**********************************************************************************************/
/* IO radna funkcija */
#definirati DS18B20_DQ_OUT(x) učiniti{ 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 podatkovnog priključka */
#definirajte DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Unos porta podataka */
uint8_t ds18b20_init(poništiti); /* Inicijalizirajte DS18B20 */
uint8_t ds18b20_provjera(poništiti); /* Provjerite postoji li DS18B20 */
kratki ds18b20_get_temperature(poništiti);/* Dobiti temperaturu */
#endif
5. Infracrveni modul za daljinsko upravljanje
1) Protokol kodiranja bežičnog modula
Često korištene metode kodiranja za infracrveno daljinsko upravljanje su: NEC protokol PWM (modulacija širine impulsa) i RC-5 protokol Philips PPM (impulsna modulacija položaja). Daljinski upravljač koji dolazi s razvojnom pločom koristi NEC protokol, koji ima sljedeće karakteristike:
1. 8-bitnu adresu i 8-bitnu duljinu instrukcije;
2. Adresa i naredba se prenose dva puta (kako bi se osigurala pouzdanost);
3. PWM pulsna modulacija položaja, s radnim ciklusom odaslanog infracrvenog nosača koji predstavlja “0” i “1”;
4. Frekvencija nosača je 38Khz;
5. Bitno vrijeme je 1,125 ms ili 2,25 ms;
U NEC protokolu, kako postaviti podatke u protokolu na ‘0’ ili '1'? Ovdje, infracrveni prijemnik i infracrveni odašiljač su odvojeni.
Infracrveni odašiljač: Pošalji podatke protokola '0' = 560us prijenosa signala nosača + 560nema prijenosa signala nosača
Pošalji podatke protokola '1' = 560us prijenosa signala nosača + 1680nema prijenosa signala nosača
Definicija bita infracrvenog odašiljača prikazana je na donjoj slici
Infracrveni prijemnik: Prijem podataka protokola '0' = 560us niske razine + 560nas visoka razina
Prijem podataka protokola '1' = 560us niske razine + 1680nas visoka razina
Format podataka NEC naredbe daljinskog upravljanja je: terminal za sinkronizaciju, adresni kod, adresni inverzni kod, kontrolni kod, kontrolni inverzni kod. Kod za sinkronizaciju sastoji se od niske razine od 9 ms i visoke razine od 4,5 ms. Šifra adrese, adresni inverzni kod, kontrolni kod, i kontrolni inverzni kod svi su 8-bitni formati podataka. Šalju se redom niži bit prvi i visoki bit posljednji. Inverzni kod se koristi za povećanje pouzdanosti prijenosa.
Stoga, snimanje ulaza može se koristiti za mjerenje širine pulsa visoke razine kako bi se postiglo dekodiranje daljinskim upravljačem.
2) Shematski dijagram i CUBEMAX konfiguracija
Iz shematskog dijagrama, možemo vidjeti da je bežični modul omogućen preko PB9 pina i prikuplja kroz 4 kanala TIM4:
Zadani pin TIM4_CH4 nije PB9, pa ga je potrebno postaviti ručno, a postavka prekida je uključena u isto vrijeme
3) Kodni dio
Snimite uzlazni rub pomoću funkcije tim povratnog poziva
U ovom trenutku, može se dobiti dekodirani signal:
U ovom trenutku, podaci su složeniji i mogu se malo obraditi:
Učinak je sljedeći:
Zadnje dvije znamenke su dekodirani i njegov inverzni kod. U ovom trenutku, može se definirati kao makro za podešavanje temperaturnog praga:
Učinak je sljedeći:
Kod infracrvenog dijela:
/* KORISNIČKI KOD POČETAK Zaglavlje */
/**
******************************************************************************
* @datoteka : glavni.c
* @kratak : Glavno tijelo programa
******************************************************************************
* @Pažnja
*
* <h2><centar>&kopirati; Autorska prava (c) 2024 STMicroelectronics.
* Sva prava pridržana.</centar></h2>
*
* Ovu softversku komponentu licencirao je ST pod licencom BSD 3-Clause,
* the “Licenca”; Ne smijete koristiti ovu datoteku osim u skladu s
* Licenca. Kopiju Licence možete dobiti na:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* KORISNIČKA ŠIFRA KRAJ Zaglavlje */
/* Uključuje ——————————————————————*/
#uključivati “glavni.h”
#uključivati “tim.h”
#uključivati “usart.h”
#uključivati “gpio.h”
/* Privatno uključuje ———————————————————-*/
/* POČETAK KORISNIČKOG ŠIFRE Uključuje */
#uključivati “stdio.h”
#uključivati “niz.h”
#definirajte MAXUP 157
#definirajte MAXDOWN 87
#definirati MINUP 221
#definirati MINDOWN 61
/* KORISNIČKI KOD END Uključuje */
/* Privatni typedef ———————————————————–*/
/* KORISNIČKI KOD POČETAK PTD */
/* KORISNIČKA ŠIFRA END PTD */
/* Privatna definicija ————————————————————*/
/* KORISNIČKA ŠIFRA POČETAK PD */
/* KORISNIČKA ŠIFRA END PD */
/* Privatni makro ————————————————————-*/
/* KORISNIČKI ŠIFRA POČETAK PM */
/* KORISNIČKA ŠIFRA END PM */
/* Privatne varijable ———————————————————*/
/* KORISNIČKI ŠIFRA POČETAK PV */
uint32_t upCount=0;
uint16_t vrijednost gore=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t širina=0;
uint16_t međuspremnik[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* KORISNIČKA ŠIFRA END PV */
/* Prototipovi privatnih funkcija ———————————————–*/
void SystemClock_Config(poništiti);
/* KORISNIČKI KOD POČETAK PFP */
/* KORISNIČKA ŠIFRA END PFP */
/* Privatni korisnički kod ———————————————————*/
/* KORISNIČKA ŠIFRA POČ 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
ako(isUpCapt)//Ako je snimanje uzlaznog ruba
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
drugo{
ValueDown=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
širina=vrijednostdolje+upcount*65536-vrijednostgore;
ako(širina>4400&&širina<4600)
{
ID međuspremnika=0;
pufer[međuspremnik++]=širina;
}
inače ako(ID međuspremnika>0)
{
pufer[međuspremnik++]=širina;
ako(ID međuspremnika>32)
{
rcvFalg=1;
ID međuspremnika=0;
}
}
}
}
void bitBuffer2num(char num[])
{
br[0]=0;
br[1]=0;
br[2]=0;
br[3]=0;
za(int i=0;ja<32;i++)
{
ako(pufer[i+1]<1000)
{
br[i/8]=br[i/8]<<1;
}
drugo
{
br[i/8]=br[i/8]<<1;
br[i/8]|=0x01;
}
}
}
/* KORISNIČKA ŠIFRA KRAJ 0 */
/**
* @brief Ulazna točka aplikacije.
* @retval int
*/
Int Main(poništiti)
{
/* KORISNIČKA ŠIFRA POČ 1 */
char printbuff[128]={0};
char num[4]={0};
tipka znakova=0;
/* KORISNIČKA ŠIFRA KRAJ 1 */
/* MCU konfiguracija——————————————————–*/
/* Reset svih perifernih uređaja, Inicijalizira Flash sučelje i Systick. */
HAL_Pokretanje();
/* KORISNIČKA ŠIFRA POČETAK Počet */
/* KORISNIČKA ŠIFRA END Init */
/* Konfigurirajte sat sustava */
SystemClock_Config();
/* KORISNIČKI KOD BEGIN SysInit */
/* KORISNIČKA ŠIFRA END SysInit */
/* Inicijalizirajte sve konfigurirane periferije */
MX_GPIO_Inicij();
MX_TIM4_Pokretanje();
MX_USART1_UART_Inicij();
/* KORISNIČKA ŠIFRA POČ 2 */
/* KORISNIČKA ŠIFRA KRAJ 2 */
/* Beskonačna petlja */
/* KORISNIČKA ŠIFRA POČNI DOK */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Ažuriranje mjerača vremena generira prekid
HAL_TIM_IC_Pokreni_IT(&htim4,TIM_CHANNEL_4);//
dok (1)
{
ako(rcvFalg)
{
za(int i=0;ja<4;i++)
{
bitBuffer2num(br);
sprintf(printbuff,”0xx “,br[ja]);
HAL_UART_prijenos(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%u “,pufer[ja]);
// HAL_UART_prijenos(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_prijenos(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%d\r\n”,br[3]);
ako(br[3]==157)
{
printf(“111111\r\n”);
}
HAL_Kašnjenje(1000);
/* KORISNIČKA ŠIFRA END WHILE */
/* KORISNIČKA ŠIFRA POČ 3 */
}
/* KORISNIČKA ŠIFRA KRAJ 3 */
}
/**
* @brief Konfiguracija sata sustava
* @retval Ništa
*/
void SystemClock_Config(poništiti)
{
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









