Porównanie pomiędzy Czujnik temperatury PT100 sonda i Moduł DS18B20
1) Podstawowa zasada pozyskiwania sygnału
① Rezystancja PT100 zmienia się proporcjonalnie wraz z temperaturą (Im wyższa temperatura, tym większy opór), Ale zmiana oporu jest bardzo mała, o 0.385 Oh / stopień;
② Zakres pomiaru temperatury PT100 wynosi -200 ℃ -200 ℃, i przy 0℃, opór jest dokładnie równy 100 Oh;
③ Prąd roboczy PT100 powinien być mniejszy niż 5 mama;
④ Chociaż rezystancja PT100 zmienia się proporcjonalnie do temperatury, jego szybkość zmian (to jest, Wartość K Wartość K Wartość K) jest różny w różnych zakresach temperatur.
2) Tabela zmiany oporności temperatury PT100
3. Obwód napędowy PT100
1) Poprzez metodę podziału napięcia, AD zbiera napięcie PT100, aby uzyskać wartość rezystancji i obliczyć temperaturę
Wartość rezystancji PT100 w wodzie o temperaturze pokojowej (25℃25℃25℃) jest o 109.89 Oh.
Mikrokontroler generuje napięcie 3,3 V, a napięcie podzielone przez PT100 wynosi w przybliżeniu:
109.89 ∗ 0.005 = 0.54945 V
Wartość AD przeliczona zgodnie ze wzorem konwersji AD jest przybliżona:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Gdy temperatura wzrośnie o jeden stopień, zakładając, że opór PT100 po prostu wzrośnie 0.385 Oh, wartość zmiany podzielonego napięcia jest w przybliżeniu równa:
0.385 ∗ 0.005 = 0.001925 V
Wartość AD przeliczona zgodnie ze wzorem konwersji AD jest przybliżona:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
W eksperymencie, stwierdzono, że z powodu niestabilnego napięcia 3,3 V zasilacza stm32, ADC zarejestrował wahania napięcia PT100, a błąd podziału napięcia był duży. Rozwiązanie optymalizacyjne polega na zaprojektowaniu obwodu źródła prądu stałego. Zbierając napięcie PT100 i prąd źródła prądu stałego, można uzyskać rezystancję PT100, i wtedy można uzyskać wartość temperatury.
2) Obwód źródła prądu stałego oparty na regulatorze LDO (MD5333)
W Internecie dostępnych jest wiele obwodów sterujących do testowania PT100, takie jak obwód mostka prądu stałego, obwód źródła prądu stałego oparty na wzmacniaczu operacyjnym, itp. Autor poświęcił także dużo czasu na dobór obwodu sterującego, biorąc pod uwagę trudność wykonania płytki i liczbę elementów, i ostatecznie wybrałem obwód źródła prądu stałego oparty na regulatorze LDO (MD5333). Schemat obwodu jest następujący:
W tym momencie, wybór sprzętu został w zasadzie zakończony. Zastosowana płytka rozwojowa to płyta Zhengdian Atom F10ZET6 Elite
Moduł DS18B20
Aby przetestować porównanie temperatury w czasie rzeczywistym i temperatury PT100, dodano moduł DS18B20 do testu porównawczego kalibracji
1) Wprowadzenie do DS18B20
DS18B20 to czujnik temperatury z pojedynczą magistralą o zakresie temperatur testowych -55~+125℃ i dokładności ±0,5℃. Temperatura pola jest bezpośrednio przesyłana cyfrowo za pomocą jednej magistrali, co znacznie poprawia zdolność przeciwzakłóceniową systemu. Może bezpośrednio odczytać zmierzoną temperaturę, i może realizować 9-12-bitową metodę odczytu wartości cyfrowych poprzez proste programowanie zgodnie z rzeczywistymi wymaganiami. Jego zakres napięcia roboczego wynosi 3 ~ 5,5 V, i wykorzystuje różnorodne formy opakowań, dzięki czemu konfiguracja systemu jest elastyczna i wygodna. Ustawiona rozdzielczość oraz ustawiona przez użytkownika temperatura alarmowa zapisywane są w pamięci EEPROM i pozostają zapamiętane nawet po zaniku zasilania.
2) Wprowadzenie do pomiaru czasu pracy DS18B20
Wszystkie urządzenia z pojedynczą magistralą wymagają ścisłego taktowania sygnału, aby zapewnić integralność danych. DS18B20 ma 6 typy sygnałów: Zresetuj puls, impuls odpowiedzi, pisać 0, pisać 1, Czytać 0 i przeczytaj 1. Wszystkie te sygnały, z wyjątkiem impulsu odpowiedzi, są sygnałami synchronicznymi wysyłanymi przez hosta. Wszystkie polecenia i dane są wysyłane z młodszym bitem bajtu jako pierwszy.
① Impuls resetowania i impuls odpowiedzi
Cała komunikacja na pojedynczej magistrali rozpoczyna się od sekwencji inicjalizacji. Host wysyła niski poziom i utrzymuje go przez co najmniej 480 us, aby wygenerować impuls resetujący. Następnie gospodarz zwalnia autobus, a rezystor podciągający 4,7 K podciąga pojedynczą szynę wysoko, z czasem opóźnienia 15~60us, i przechodzi w tryb odbioru (Odbiór). Następnie DS18B20 obniża poziom magistrali na 60 ~ 240 us, aby wygenerować impuls odpowiedzi niskiego poziomu.
② Zapisz czas
Czas zapisu obejmuje zapis 0 czas i napisz 1 chronometraż. Wszystkie czasy zapisu wymagają co najmniej 60us, i wymagany jest co najmniej 1us czasu odzyskiwania pomiędzy dwoma niezależnymi czasami zapisu. Obydwa czasy zapisu rozpoczynają się od zatrzymania autobusu przez hosta. Pisać 1 chronometraż: host generuje niski poziom, opóźnienia dla 2us, i następnie zwalnia autobus, opóźnienie 60us. Pisać 0 chronometraż: host generuje niski poziom, opóźnienia dla 60us, a następnie zwalnia autobus z opóźnieniem 2 us.
③ Przeczytaj czas
Urządzenia z pojedynczą magistralą przesyłają dane do hosta tylko wtedy, gdy host wyda polecenie odczytu. Dlatego, po wydaniu przez hosta polecenia odczytu danych, należy natychmiast wygenerować czas odczytu, aby urządzenie podrzędne mogło przesyłać dane. Wszystkie czasy odczytu wymagają co najmniej 60us, i wymagany jest co najmniej 1us czasu odzyskiwania pomiędzy dwoma niezależnymi czasami odczytu. Każdy czas odczytu jest inicjowany przez hosta, który zatrzymuje autobus na co najmniej 1 nas. Host musi zwolnić magistralę w czasie odczytu i pobrać próbkę stanu magistrali w ciągu 15 us po rozpoczęciu odmierzania czasu. Typowy proces pomiaru czasu odczytu to: host generuje niski poziom opóźnienia wynoszący 2us, następnie host przełącza się na tryb wejściowy z opóźnieniem 12us, następnie odczytuje bieżący poziom pojedynczej magistrali, a następnie opóźnia 50us.
Po zrozumieniu harmonogramu pojedynczego autobusu, rzućmy okiem na typowy proces odczytu temperatury DS18B20. Typowy proces odczytu temperatury w DS18B20: zresetuj → wyślij SKIPROM (0xCC) → wyślij polecenie rozpoczęcia konwersji (0x44) → opóźnienie → reset → wyślij polecenie SKIPROM (0xCC) → wyślij polecenie pamięci (0xBE) → odczytaj dwa bajty danych (tj. temperatura) ciągle → koniec.
3) Schemat ideowy i konfiguracja CUBEMAX
Ze schematu, widać, że DS18B20 jest włączony przez port PG11, aby otworzyć port szeregowy w celu wydrukowania informacji o temperaturze
4) Część kodu
Część kodu przeszczepia bibliotekę ds18b20 Zhengdian Atom i wprowadza niewielkie modyfikacje
#ifndef __DS18B20_H
#zdefiniuj __DS18B20_H
#włączać “tim.h”
/***********************************************************************************/
/* Definicja pinów DS18B20 */
#zdefiniuj DS18B20_DQ_GPIO_PORT GPIOG
#zdefiniuj DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#zdefiniuj DS18B20_DQ_GPIO_CLK_ENABLE() Do{ __HAL_RCC_GPIOG_CLK_ENABLE(); }chwila(0) /* Włącz zegar portu PG */
/**********************************************************************************************/
/* Funkcja operacji IO */
#zdefiniuj DS18B20_DQ_OUT(X) Do{ 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); \
}chwila(0) /* Wyjście portu danych */
#zdefiniuj DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Wejście portu danych */
uint8_t ds18b20_init(próżnia); /* Zainicjuj DS18B20 */
uint8_t ds18b20_check(próżnia); /* Sprawdź, czy DS18B20 istnieje */
krótki ds18b20_get_temperature(próżnia);/* Uzyskaj temperaturę */
#koniec
5. Moduł zdalnego sterowania na podczerwień
1) Protokół kodowania modułu bezprzewodowego
Powszechnie stosowanymi metodami kodowania pilota na podczerwień są: Protokół NEC PWM (modulacja szerokości impulsu) oraz protokół RC-5 firmy Philips PPM (modulacja położenia impulsu). Pilot dostarczany z płytką rozwojową wykorzystuje protokół NEC, który ma następujące cechy:
1. 8-adres bitowy i 8-bitowa długość instrukcji;
2. Adres i polecenie przesyłane są dwukrotnie (aby zapewnić niezawodność);
3. Modulacja położenia impulsu PWM, z cyklem pracy transmitowanego nośnika podczerwieni “0” I “1”;
4. Częstotliwość nośna wynosi 38 kHz;
5. Czas bitu wynosi 1,125 ms lub 2,25 ms;
W protokole NEC, jak ustawić dane w protokole na ‘0’ lub „1”? Tutaj, odbiornik podczerwieni i nadajnik podczerwieni są oddzielone.
Nadajnik podczerwieni: Wyślij dane protokołu „0” = 560us transmisji sygnału nośnego + 560nas bez transmisji sygnału nośnego
Wyślij dane protokołu „1” = 560us transmisji sygnału nośnego + 1680nas bez transmisji sygnału nośnego
Definicję bitową nadajnika podczerwieni pokazano na poniższym rysunku
Odbiornik podczerwieni: Odbierz dane protokołu „0” = niski poziom 560us + 560u nas wysoki poziom
Odbierz dane protokołu „1” = niski poziom 560us + 1680u nas wysoki poziom
Format danych polecenia zdalnego sterowania NEC to: terminal synchronizacyjny, kod adresowy, kod odwrotny adresu, kod kontrolny, kontrolować kod odwrotny. Kod synchronizacji składa się z niskiego poziomu 9 ms i wysokiego poziomu 4,5 ms. Kod adresowy, kod odwrotny adresu, kod kontrolny, i kod odwrotny sterowania są 8-bitowymi formatami danych. Są one wysyłane w kolejności od najniższego bitu do pierwszego i wyższego bitu na końcu. Kod odwrotny stosowany jest w celu zwiększenia niezawodności transmisji.
Dlatego, przechwytywanie sygnału wejściowego może być użyte do pomiaru szerokości impulsu wysokiego poziomu w celu uzyskania zdalnego dekodowania.
2) Schemat ideowy i konfiguracja CUBEMAX
Ze schematu, widzimy, że moduł bezprzewodowy jest włączony przez pin PB9 i zbiera przez 4 kanały TIM4:
Domyślny pin TIM4_CH4 to nie PB9, więc trzeba to ustawić ręcznie, i ustawienie przerwania jest włączone w tym samym czasie
3) Część kodu
Uchwyć zbocze narastające za pomocą funkcji wywołania zwrotnego Tim
W tej chwili, można uzyskać zdekodowany sygnał:
W tej chwili, dane są bardziej złożone i można je nieco przetworzyć:
Efekt jest następujący:
Dwie ostatnie cyfry to kod zdekodowany i jego odwrotność. W tej chwili, można go zdefiniować jako makro do regulacji progu temperatury:
Efekt jest następujący:
Kod części podczerwieni:
/* Nagłówek KOD UŻYTKOWNIKA BEGIN */
/**
******************************************************************************
* @plik : główny.c
* @krótki : Główna treść programu
******************************************************************************
* @uwaga
*
* <h2><centrum>&kopia; Prawo autorskie (C) 2024 STMikroelektronika.
* Wszelkie prawa zastrzeżone.</centrum></h2>
*
* Ten komponent oprogramowania jest objęty licencją firmy ST w ramach licencji BSD 3-Clause,
* the “Licencja”; Nie możesz używać tego pliku, chyba że jest to zgodne z
* Licencja. Kopię Licencji można uzyskać pod adresem:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Nagłówek KONIEC KODU UŻYTKOWNIKA */
/* Obejmuje ——————————————————————*/
#włączać “główny.h”
#włączać “tim.h”
#włączać “usart.h”
#włączać “gpio.h”
/* Prywatne obejmuje ———————————————————-*/
/* KOD UŻYTKOWNIKA BEGIN Zawiera */
#włączać “stdio.h”
#włączać “ciąg.h”
#zdefiniuj MAXUP 157
#zdefiniuj MAXDOWN 87
#zdefiniuj MINUP 221
#zdefiniuj MINDOWN 61
/* KONIEC KODU UŻYTKOWNIKA Zawiera */
/* Prywatna definicja typu ———————————————————–*/
/* KOD UŻYTKOWNIKA ROZPOCZNIJ PTD */
/* KOD UŻYTKOWNIKA KONIEC PTD */
/* Definicja prywatna ————————————————————*/
/* KOD UŻYTKOWNIKA ROZPOCZNIJ PD */
/* KOD UŻYTKOWNIKA KONIEC PD */
/* Prywatne makro ————————————————————-*/
/* KOD UŻYTKOWNIKA POCZĄTEK PM */
/* KOD UŻYTKOWNIKA KONIEC PM */
/* Zmienne prywatne ———————————————————*/
/* KOD UŻYTKOWNIKA ROZPOCZNIJ PV */
uint32_t upCount=0;
uint16_t WartośćUp=0;
uint16_t WartośćDown=0;
uint8_t isUpCapt=1;
uint16_t szerokość=0;
bufor uint16_t[128]={0};
uint16_t buforId=0;
uint8_t rcvFalg=0;
/* KOD UŻYTKOWNIKA KONIEC PV */
/* Prototypy funkcji prywatnych ———————————————–*/
unieważnij SystemClock_Config(próżnia);
/* KOD UŻYTKOWNIKA ROZPOCZNIJ PFP */
/* KOD UŻYTKOWNIKA KONIEC PFP */
/* Prywatny kod użytkownika ———————————————————*/
/* ROZPOCZNIJ KOD UŻYTKOWNIKA 0 */
void HAL_TIM_PeriodElapsedOddzwonienie(TIM_HandleTypeDef *htim)
{
liczba+;
}
unieważnij HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
Jeśli(isUpCapt)//Jeśli jest to przechwytywanie zbocza narastającego
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
liczba w górę=0;
}
w przeciwnym razie{
ValueDown=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
szerokość=wartość w dół+liczba w górę*65536-wartość w górę;
Jeśli(szerokość>4400&&szerokość<4600)
{
identyfikator bufora=0;
bufor[buforId++]= szerokość;
}
inaczej jeśli(identyfikator bufora>0)
{
bufor[buforId++]= szerokość;
Jeśli(identyfikator bufora>32)
{
rcvFalg=1;
identyfikator bufora=0;
}
}
}
}
pusty bitBuffer2num(numer znaku[])
{
liczba[0]=0;
liczba[1]=0;
liczba[2]=0;
liczba[3]=0;
Do(int i=0;I<32;I ++)
{
Jeśli(bufor[ja+1]<1000)
{
liczba[ja/8]=liczba[ja/8]<<1;
}
w przeciwnym razie
{
liczba[ja/8]=liczba[ja/8]<<1;
liczba[ja/8]|=0x01;
}
}
}
/* KONIEC KODU UŻYTKOWNIKA 0 */
/**
* @brief Punkt wejścia aplikacji.
* @retval int
*/
int główny(próżnia)
{
/* ROZPOCZNIJ KOD UŻYTKOWNIKA 1 */
char printbuff[128]={0};
numer znaku[4]={0};
klucz znaku = 0;
/* KONIEC KODU UŻYTKOWNIKA 1 */
/* Konfiguracja MCU——————————————————–*/
/* Reset wszystkich urządzeń peryferyjnych, Inicjuje interfejs Flash i Systick. */
HAL_Init();
/* KOD UŻYTKOWNIKA ROZPOCZĘCIE Init */
/* KOD UŻYTKOWNIKA KONIEC Inicjał */
/* Skonfiguruj zegar systemowy */
SystemClock_Config();
/* KOD UŻYTKOWNIKA BEGIN SysInit */
/* KOD UŻYTKOWNIKA KONIEC SysInit */
/* Zainicjuj wszystkie skonfigurowane urządzenia peryferyjne */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* ROZPOCZNIJ KOD UŻYTKOWNIKA 2 */
/* KONIEC KODU UŻYTKOWNIKA 2 */
/* Nieskończona pętla */
/* KOD UŻYTKOWNIKA BEGIN WHILE */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Aktualizacja timera generuje przerwanie
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
chwila (1)
{
Jeśli(rcvFalg)
{
Do(int i=0;I<4;I ++)
{
bitBuffer2num(liczba);
sprintf(miłośnik druku,”0xx “,liczba[I]);
HAL_UART_Transmisja(&huart1, printbuff,stres(miłośnik druku),HAL_MAX_DELAY);
}
// sprintf(miłośnik druku,”%ty “,bufor[I]);
// HAL_UART_Transmisja(&huart1, printbuff,stres(miłośnik druku),HAL_MAX_DELAY);
// }
HAL_UART_Transmisja(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
drukuj(“%d\r\n”,liczba[3]);
Jeśli(liczba[3]==157)
{
drukuj(“111111\r\n”);
}
HAL_Opóźnienie(1000);
/* KOD UŻYTKOWNIKA KONIEC WHI */
/* ROZPOCZNIJ KOD UŻYTKOWNIKA 3 */
}
/* KONIEC KODU UŻYTKOWNIKA 3 */
}
/**
* @brief Konfiguracja zegara systemowego
* @retval Brak
*/
unieważnij SystemClock_Config(próżnia)
{
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









