Sıcaklık sensörü teknolojisi

Sıcaklık Sensörü Probu (DS18B20 ve PT100'ün Fonksiyonel Devre Tasarımı)

DS18B20 şeması ve CUBEMAX konfigürasyonu

Arasındaki karşılaştırma PT100 sıcaklık sensörü prob ve DS18B20 Modülü
1) Sinyal ediniminin temel prensibi
① PT100'ün direnci sıcaklıkla orantılı olarak değişir (sıcaklık ne kadar yüksek olursa, direnç ne kadar büyük olursa), ancak direnç değişimi çok küçüktür, hakkında 0.385 Ah / derece;
② PT100'ün sıcaklık ölçüm aralığı -200 ℃ -200 ℃, ve 0 ℃, Direniş tam olarak eşittir 100 Ah;
③ PT100'ün çalışma akımı, 5 mA;
④ PT100 direnci sıcaklıkla orantılı olarak değişse de, değişim oranı (yani, K değeri k değeri k değeri) farklı sıcaklık aralıklarında farklı.

2) PT100 sıcaklık direnci değişim tablosu

PT100 sıcaklık direnci değişim tablosu

3. PT100 Sürücü Devresi

PT100 Sürücü Devresi

PT100 Sürücü Devresi

1) Voltaj bölümü yöntemi aracılığıyla, AD, sıcaklığı hesaplamak için direnç değeri elde etmek için PT100 voltajını toplar
Oda sıcaklığında sudaki PT100'ün direnç değeri (25℃ 25 ℃ 25 ℃) hakkında 109.89 Ah.
Mikrodenetleyici çıkışları 3.3V voltaj, ve PT100'e bölünmüş voltaj yaklaşık olarak:
109.89 ∗ 0.005 = 0.54945 V

AD dönüşüm formülüne göre dönüştürülen reklam değeri yaklaşık olarak:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682

Sıcaklık bir derece arttığında, PT100 direncinin sadece yükseldiğini varsayarsak 0.385 Ah, Bölünmüş voltajın değişim değeri yaklaşık olarak eşittir.:
0.385 ∗ 0.005 = 0.001925 V

AD dönüşüm formülüne göre dönüştürülen reklam değeri yaklaşık olarak:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2

Denemede, STM32 güç kaynağının kararsız 3.3V voltajı nedeniyle bulundu., ADC toplanan PT100 voltaj dalgalanmaları ve voltaj bölümü hatası büyüktü. Optimizasyon çözümü, sabit bir akım kaynak devresi tasarlamaktır. PT100 voltajını ve sabit akım kaynağının akımını toplayarak, PT100'ün direnci elde edilebilir, Ve sonra sıcaklık değeri elde edilebilir.

2) LDO regülatörüne dayalı sabit akım kaynak devresi (MD5333)
İnternette PT100'ü test etmek için birçok sürüş devresi var, DC köprü devresi gibi, Operasyonel amplifikatöre dayalı sabit akım kaynak devresi, vesaire. Yazar ayrıca sürüş devresini seçmek için çok zaman harcadı, Tahtayı yapmanın zorluğu ve bileşen sayısı göz önüne alındığında, ve son olarak LDO regülatörüne dayalı sabit akım kaynak devresini seçti (MD5333). Devre şeması aşağıdaki gibidir:

LDO regülatörünün sabit akım kaynak devresi (MD5333)

LDO regülatörünün sabit akım kaynak devresi (MD5333)

Bu noktada, Donanım seçimi temel olarak tamamlandı. Kullanılan geliştirme kurulu Zhengdian Atom F10ZET6 Elite Kurulu

DS18B20 Modülü
Gerçek zamanlı sıcaklığı ve PT100 sıcaklık karşılaştırmasını test etmek için, Kalibrasyon karşılaştırma testi için DS18B20 modülü eklendi

1) DS18B20'ye Giriş
DS18B20, -55 ~+125 ℃ test sıcaklığı aralığına ve ± 0.5 ℃ doğruluğuna sahip tek buçuk bir sıcaklık sensörüdür.. Saha sıcaklığı doğrudan tek buhar dijital bir şekilde iletilir, bu da sistemin etkileşim önleme yeteneğini büyük ölçüde geliştirir. Ölçülen sıcaklığı doğrudan okuyabilir, ve gerçek gereksinimlere göre basit programlama yoluyla 9 ~ 12 bit dijital değer okuma yöntemi gerçekleştirebilir. Çalışma voltajı aralığı 3 ~ 5.5V, ve çeşitli ambalaj formları kullanır, Sistem ayarını esnek ve kullanışlı hale getirmek. Kullanıcı tarafından ayarlanan çözünürlük ve alarm sıcaklığı EEPROM'da saklanır ve elektrik kesintisinden sonra hala kaydedilir.

DS18B20 Devre Tasarımı

DS18B20 Devre Tasarımı

2) DS18B20 Çalışma Zamanlamasına Giriş
Tüm tek buhar cihazları, veri bütünlüğünü sağlamak için katı sinyal zamanlaması gerektirir. DS18B20 6 Sinyal Türleri: Nabzı sıfırla, tepki darbesi, yazmak 0, yazmak 1, Okumak 0 Ve oku 1. Tüm bu sinyaller, Yanıt nabzı hariç, ana bilgisayar tarafından gönderilen eşzamanlı sinyaller. Ve tüm komutlar ve veriler önce baytın düşük biti ile gönderilir.

DS18B20 Sıfırlama Nabız ve Tepki Darbesi

DS18B20 Sıfırlama Nabız ve Tepki Darbesi

① Nabzı ve tepki darbesini sıfırlayın
Tek veri yoludaki tüm iletişim, bir başlatma sırasıyla başlar. Ana bilgisayar düşük bir seviye çıkış yapar ve sıfırlama darbesi oluşturmak için en az 480us için düşük seviyeyi tutar. Sonra ev sahibi otobüsü serbest bırakır, Ve 4.7k çekme direnci tek otobüs yüksek, 15 ~ 60us gecikme süresi ile, ve alıcı moduna girer (Rx). Ardından DS18B20, düşük seviyeli bir tepki darbesi oluşturmak için 60 ~ 240US için veriyolü alçalır.

DS18B20 Yazma Zamanlaması

DS18B20 Yazma Zamanlaması

② Zamanlama yaz
Yazma zamanlaması yazmayı içerir 0 Zamanlama ve Yazma 1 zamanlama. Tüm yazma zamanlamaları en az 60us gerektirir, ve iki bağımsız yazma zamanlaması arasında en az 1us kurtarma süresi gereklidir. Her ikisi de yazma zamanlamaları, ana bilgisayarın otobüsü çekmesi ile başlar. Yazmak 1 zamanlama: Ana bilgisayar düşük bir seviyeye çıktı, 2us için gecikmeler, Ve sonra otobüsü serbest bırakır, 60US'u geciktirmek. Yazmak 0 zamanlama: Ana bilgisayar düşük bir seviyeye çıktı, 60us için gecikmeler, ve sonra otobüsü 2US gecikmesi ile serbest bırakır.

DS18B20 Okuma Zamanlaması

DS18B20 Okuma Zamanlaması

③ Zamanlamayı okuyun
Tek buhar cihazları, yalnızca ana bilgisayar okuma zamanlaması yayınladığında ana ana bilgisayara veri iletir. Öyleyse, Ana bilgisayar bir veri komutu verdikten sonra, Köle verileri iletebilmesi için derhal bir okuma zamanlaması oluşturulmalıdır. Tüm okuma zamanlamaları en az 60us gerektirir, ve iki bağımsız okuma zamanlaması arasında en az 1us kurtarma süresi gereklidir. Her okuma zamanlaması ana bilgisayar tarafından başlatılır, en az 1us için otobüsü aşağı çeker. Ana bilgisayar okuma zamanlaması sırasında veri yolu serbest bırakmalı ve zamanlama başladıktan sonra otobüs durumunu 15us içinde örneklemeli. Tipik okuma zamanlama işlemi: Ana bilgisayar düşük seviyeli 2US gecikmesi çıktı, Daha sonra ana bilgisayar 12us giriş modu gecikmesine geçer, Sonra tek otobüsün mevcut seviyesini okur, Ve sonra 50us'u geciktirir.

DS18B20 Sıcaklık bilgilerini yazdırmak için seri bağlantı noktasını açar

DS18B20 Sıcaklık bilgilerini yazdırmak için seri bağlantı noktasını açar

Tek bus zamanlamasını anladıktan sonra, DS18B20'nin tipik sıcaklık okuma sürecine bir göz atalım. DS18B20'nin tipik sıcaklık okuma işlemi: Sıfırla → Skiprom'u gönderin (0XCC) → Başlat dönüşüm komutunu gönder (0x44) → Gecikme → Sıfırla → Skiprom komutunu gönder (0XCC) → Bellek Gönder komutu (0Xbe) → İki bayt veri okuyun (yani. sıcaklık) Sürekli → Son.

3) Şematik diyagram ve Cubemax konfigürasyonu
Şematik diyagramdan, Sıcaklık bilgilerini yazdırmak için seri bağlantı noktasını açmak için PG11 bağlantı noktası tarafından DS18B20'nin etkinleştirildiği görülebilir.

DS18B20 şeması ve CUBEMAX konfigürasyonu

DS18B20 şeması ve CUBEMAX konfigürasyonu

DS18B20 Sıcaklık ve Nem Sensörü Arayüzü

DS18B20 Sıcaklık ve Nem Sensörü Arayüzü

4) Kod parçası
Kod kısmı Zhengdian Atom'un DS18B20 kütüphanesini naklediyor ve küçük değişiklikler yapıyor

#ifndef __ds18b20_h
#__ds18b20_h tanımlayın

#katmak “Tim.H”
/***********************************************************************************/
/* DS18B20 PIN Tanımı */

#DS18B20_DQ_GPIO_PORT GPIOG'u tanımla
#DS18B20_DQ_GPIO_PIN GPIO_PIN_11'i tanımla
#DS18B20_DQ_GPIO_CLK_ENABLE tanımlayın() Yapmak{ __Hal_rcc_gpiog_clk_enable(); }sırasında(0) /* PG bağlantı noktası saati etkinleştir */

/**********************************************************************************************/

/* IO Çalışma Fonksiyonu */
#DS18B20_DQ_OUT'u tanımla(X) Yapmak{ 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); \
}sırasında(0) /* Veri bağlantı noktası çıkışı */
#DS18B20_DQ_IN HAL_GPIO_READPIN'i tanımlayın(Ds18b20_dq_gpio_port, Ds18b20_dq_gpio_pin) /* Veri bağlantı noktası girişi */

uint8_t ds18b20_init(geçersiz); /* DS18B20'yi başlat */
uint8_t ds18b20_check(geçersiz); /* DS18B20'nin var olup olmadığını kontrol edin */
Kısa DS18B20_GET_TECARATURE(geçersiz);/* Sıcaklık elde etmek */

#endif

5. Kızılötesi uzaktan kumanda modülü
1) Kablosuz Modül Kodlama Protokolü

Kızılötesi uzaktan kumanda için yaygın olarak kullanılan kodlama yöntemleri: PWM'nin NEC Protokolü (Nabız genişliği modülasyonu) ve Philips PPM'nin RC-5 Protokolü (Nabız pozisyonu modülasyonu). Geliştirme panosu ile birlikte gelen uzaktan kumanda NEC protokolünü kullanır, aşağıdaki özelliklere sahip:

1. 8-Bit Adresi ve 8 Bit Öğretim Uzunluğu;

2. Adres ve komut iki kez iletilir (Güvenilirliği sağlamak için);

3. PWM darbe pozisyon modülasyonu, iletilen kızılötesi taşıyıcının görev döngüsü ile “0” Ve “1”;

4. Taşıyıcı frekansı 38kHz;

5. Bit süresi 1.125ms veya 2.25ms;

NEC protokolünde, Protokoldeki verilerin nasıl ayarlanacağı ‘0’ veya "1"? Burada, Kızılötesi alıcı ve kızılötesi verici ayrıldı.

Kızılötesi verici: Protokol verilerini gönder "0" = 560US taşıyıcı sinyal iletim + 560Bize taşıyıcı sinyal iletimi yok

Protokol verilerini gönder "1" = 560US Taşıyıcı sinyal iletimi + 1680Bize taşıyıcı sinyal iletimi yok

Kızılötesi vericinin bit tanımı aşağıdaki şekilde gösterilmiştir.

Kızılötesi alıcı: "0" protokol verilerini alın = 560US Düşük Seviye + 560ABD Yüksek Seviye

Protokol Verileri Al "1’ = 560US Düşük Seviye + 1680ABD Yüksek Seviye

NEC uzaktan kumanda komutunun veri formatı: senkronizasyon terminali, adres kodu, Adres Ters Kodu, kontrol kodu, Ters Kodu Kontrol Et. Senkronizasyon kodu 9 ms düşük seviyeden ve 4.5 ms yüksek seviyeden oluşur. Adres kodu, Adres Ters Kodu, kontrol kodu, ve kontrol ters kodlarının hepsi 8 bit veri formatlarıdır. İlk ve yüksek bit düşük bit sırasına gönderilir.. Ters kod, iletimin güvenilirliğini artırmak için kullanılır.

Öyleyse, Giriş yakalama, uzaktan kumanda kod çözme sağlamak için yüksek seviyenin darbe genişliğini ölçmek için kullanılabilir.
2) Şematik diyagram ve Cubemax konfigürasyonu

Şematik diyagramdan, Kablosuz modülün PB9 pininden etkinleştirildiğini ve 4 Tim4 kanalları:

TIM4_CH4'ün varsayılan pimi PB9 değil, Bu yüzden manuel olarak ayarlanması gerekiyor, ve kesme ayarı aynı anda açılır

3) Kod parçası
TIM geri arama işlevinden yükselen kenarı yakalayın

Şu anda, Kod çözülmüş sinyal elde edilebilir:

Şu anda, Veriler daha karmaşıktır ve biraz işlenebilir:

Etki aşağıdaki gibidir:
Son iki basamak kod çözülmüş ve ters kodudur. Şu anda, Sıcaklık eşiğini ayarlamak için bir makro olarak tanımlanabilir:

Etki aşağıdaki gibidir:

Kızılötesi parça kodu:

/* Kullanıcı Kodu Başlatma Başlatma */
/**
******************************************************************************
* @dosya : el.c
* @kısa bilgi : Ana program gövdesi
******************************************************************************
* @dikkat
*
* <H2><merkez>&kopya; Telif hakkı (C) 2024 Stmikroelektronik.
* Her hakkı saklıdır.</merkez></H2>
*
* Bu yazılım bileşeni ST tarafından BSD 3-Clause Lisansı altında lisanslanmıştır,
* the “Lisans”; Bu dosyayı kullanamayabilirsiniz.
* Lisans. Lisansın bir kopyasını şu adresten alabilirsiniz.:
* opensource.org/licenses/bsd-3-clause
*
******************************************************************************
*/
/* Kullanıcı Kodu Son Başlığı */
/* Dahil olmak ——————————————————————*/
#katmak “Main.h”
#katmak “Tim.H”
#katmak “Usart.h”
#katmak “gpio.h”

/* Özel içerir ———————————————————-*/
/* Kullanıcı Kodu Başlangıç ​​içerir */
#katmak “stdio.h”
#katmak “String.h”
#Maxup'u tanımla 157
#Maxdown'u tanımla 87
#Minup'u tanımla 221
#Mindown'u tanımla 61
/* Kullanıcı kodu sonu içerir */

/* Özel Typedef ———————————————————–*/
/* Kullanıcı Kodu PTD Başlıyor */

/* Kullanıcı Kodu End Ptd */

/* Özel tanım ————————————————————*/
/* Kullanıcı Kodu PD Başlıyor */
/* Kullanıcı Kodu End PD */

/* Özel makro ————————————————————-*/
/* Kullanıcı Kodu Başlangıç ​​PM */

/* Kullanıcı Kodu Son PM */

/* Özel değişkenler ———————————————————*/

/* Kullanıcı Kodu PV Başlıyor */
uint32_t upcount = 0;
uint16_t valueup = 0;
uint16_t valueDown = 0;
uint8_t isupcapt = 1;
uint16_t genişlik = 0;
uint16_t arabellek[128]={0};
uint16_t BufferId = 0;
uint8_t rcvfalg = 0;
/* Kullanıcı Kodu Son PV */

/* Özel işlev prototipleri ———————————————–*/
void systemclock_config(geçersiz);
/* Kullanıcı Kodu PFP'yi Başlatıyor */

/* Kullanıcı Kodu Son PFP */

/* Özel Kullanıcı Kodu ———————————————————*/
/* Kullanıcı Kodu Başlar 0 */
void hal_tim_periodelapsedcallback(Tim_handletypedef *htim)
{
Upcount ++;
}
void hal_tim_ic_captureCallback(Tim_handletypedef *htim)
{
eğer(IsUpcapt)//Yükselen Edge Capture ise
{
Valueup = hal_tim_readcapturdValue(HTIM HTIM,Tim_channel_4);
IsUpcapt = 0;
__Hal_tim_set_capturePolarity(HTIM HTIM,Tim_channel_4, tim_icpolarity_falling);
Upcount = 0;
}
başka{
Valueedown = hal_tim_readcapturdvalue(HTIM HTIM,Tim_channel_4);
IsUpcapt = 1;
__Hal_tim_set_capturePolarity(HTIM HTIM,Tim_channel_4, tim_icpolarity_rising);
Genişlik = ValueDown+Upcount*65536-Değer;
eğer(Genişlik>4400&&Genişlik<4600)
{
BufferId = 0;
tampon[BufferId ++]= genişlik;
}
eğer(tampon>0)
{
tampon[BufferId ++]= genişlik;
eğer(tampon>32)
{
rcvfalg = 1;
BufferId = 0;
}
}
}
}
void bitBuffer2num(char num[])
{
numara[0]= 0;
numara[1]= 0;
numara[2]= 0;
numara[3]= 0;
için(int i = 0;Ben<32;I ++)
{
eğer(tampon[I+1]<1000)
{
numara[I/8]= Num[I/8]<<1;
}
başka
{
numara[I/8]= Num[I/8]<<1;
numara[I/8]|= 0x01;
}
}
}
/* Kullanıcı Kodu Sonu 0 */

/**
* @brief Uygulama giriş noktası.
* @retval int
*/
int ana(geçersiz)
{
/* Kullanıcı Kodu Başlar 1 */
char baskı[128]={0};
char num[4]={0};
Char Anahtarı = 0;
/* Kullanıcı Kodu Sonu 1 */

/* MCU Yapılandırması——————————————————–*/

/* Tüm çevre birimlerinin sıfırlanması, Flash arayüzünü ve Systick'i başlatır. */
Hal_init();

/* Kullanıcı Kodu Başlatmaya Başlar */

/* Kullanıcı Kodu End Init */

/* Sistem saatini yapılandırın */
Systemclock_config();

/* Kullanıcı Kodu Başlar Sysinit */

/* Kullanıcı Kodu End Sysinit */

/* Yapılandırılmış tüm çevre birimlerini başlatın */
Mx_gpio_init();
Mx_tim4_init();
Mx_usart1_uart_init();
/* Kullanıcı Kodu Başlar 2 */

/* Kullanıcı Kodu Sonu 2 */

/* Sonsuz döngü */
/* Kullanıcı kodu başlarken başlar */
Hal_gpio_togglepin(LED0_GPIO_PORT,LED0_PIN);
Hal_tim_base_start_it(&HTIM4);//Zamanlayıcı güncellemesi bir kesinti oluşturur
Hal_tim_ik_start_it(&htim4, tim_channel_4);//
sırasında (1)
{
eğer(rcvfalg)
{
için(int i = 0;Ben<4;I ++)
{
Bitbuffer2num(numara);
sprintf(baskı,”0xx “,numara[Ben]);
Hal_uart_transmit(&huart1, printbuff,sıyırma(baskı),Hal_max_delay);
}
// sprintf(baskı,”%u “,tampon[Ben]);
// Hal_uart_transmit(&huart1, printbuff,sıyırma(baskı),Hal_max_delay);
// }
Hal_uart_transmit(&Huart1,”\R n”,2,Hal_max_delay);
rcvfalg = 0;
}
baskı(“%d r n”,numara[3]);
eğer(numara[3]== 157)
{
baskı(“111111\R n”);
}
Hal_delay(1000);
/* Kullanıcı Kodu Sonu */

/* Kullanıcı Kodu Başlar 3 */
}
/* Kullanıcı Kodu Sonu 3 */
}

/**
* @brief Sistem Saat Yapılandırması
* @retval yok
*/
void systemclock_config(geçersiz)
{
RCC_OSCINITTYPEDEF RCC_OSCINITSTRUCT = {0};
RCC_CLKINITTYPEDEF RCC_CLINITSTRUCT = {0};