Perbandingan antara Sensor suhu PT100 menyelidiki dan Modul DS18B20
1) Prinsip dasar akuisisi sinyal
① Resistansi PT100 berubah sebanding dengan suhu (semakin tinggi suhunya, semakin besar resistensinya), namun perubahan resistensinya sangat kecil, tentang 0.385 Oh / derajat;
② Rentang pengukuran suhu PT100 adalah -200℃ -200℃, dan pada 0℃, resistansinya sama persis dengan 100 Oh;
③ Arus kerja PT100 harus kurang dari 5 mA;
④ Meskipun resistansi PT100 berubah secara proporsional dengan suhu, tingkat perubahannya (yaitu, Nilai K Nilai K Nilai K) berbeda dalam rentang suhu yang berbeda.
2) Tabel perubahan ketahanan suhu PT100
3. Sirkuit penggerak PT100
1) Melalui metode pembagian tegangan, AD mengumpulkan tegangan PT100 untuk mendapatkan nilai resistansi untuk menghitung suhu
Nilai resistansi PT100 dalam air pada suhu kamar (25℃25℃25℃) adalah tentang 109.89 Oh.
Mikrokontroler mengeluarkan tegangan 3.3V, dan tegangan dibagi PT100 kira-kira:
109.89 ∗ 0.005 = 0.54945 V
Nilai AD yang dikonversi menurut rumus konversi AD adalah kira-kira:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Ketika suhu naik satu derajat, dengan asumsi bahwa resistensi PT100 hanya meningkat 0.385 Oh, nilai perubahan tegangan yang dibagi kira-kira sama dengan:
0.385 ∗ 0.005 = 0.001925 V
Nilai AD yang dikonversi menurut rumus konversi AD adalah kira-kira:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
Dalam percobaan, ditemukan hal itu disebabkan oleh tegangan 3,3V yang tidak stabil pada catu daya stm32, ADC mengumpulkan fluktuasi tegangan PT100 dan kesalahan pembagian tegangan besar. Solusi optimasinya adalah dengan merancang rangkaian sumber arus konstan. Dengan mengumpulkan tegangan PT100 dan arus sumber arus konstan, resistensi PT100 dapat diperoleh, dan kemudian nilai suhu dapat diperoleh.
2) Rangkaian sumber arus konstan berdasarkan regulator LDO (MD5333)
Ada banyak sirkuit penggerak untuk menguji PT100 di Internet, seperti rangkaian jembatan DC, rangkaian sumber arus konstan berdasarkan penguat operasional, dll.. Penulis juga menghabiskan banyak waktu dalam memilih sirkuit penggerak, mengingat sulitnya pembuatan papan dan banyaknya komponen, dan terakhir memilih rangkaian sumber arus konstan berdasarkan regulator LDO (MD5333). Diagram rangkaiannya adalah sebagai berikut:
Pada titik ini, pemilihan perangkat keras pada dasarnya telah selesai. Papan pengembangan yang digunakan adalah Zhengdian Atom F10ZET6 Elite Board
Modul DS18B20
Untuk menguji perbandingan suhu waktu nyata dan suhu PT100, modul DS18B20 ditambahkan untuk uji perbandingan kalibrasi
1) Pengantar DS18B20
DS18B20 adalah sensor suhu bus tunggal dengan kisaran suhu pengujian -55~+125℃ dan akurasi ±0,5℃. Suhu lapangan ditransmisikan secara langsung dengan cara digital bus tunggal, Yang sangat meningkatkan kemampuan anti-interferensi sistem. Itu bisa langsung membaca suhu yang diukur, dan dapat mewujudkan metode pembacaan nilai digital 9~12-bit melalui pemrograman sederhana sesuai dengan kebutuhan aktual. Kisaran tegangan operasinya adalah 3~5.5V, dan menggunakan berbagai bentuk kemasan, membuat pengaturan sistem fleksibel dan nyaman. Resolusi yang disetel dan suhu alarm yang disetel oleh pengguna disimpan di EEPROM dan masih disimpan setelah listrik mati.
2) Pengantar waktu kerja DS18B20
Semua perangkat bus tunggal memerlukan pengaturan waktu sinyal yang ketat untuk memastikan integritas data. DS18B20 memiliki 6 jenis sinyal: mengatur ulang pulsa, pulsa respons, menulis 0, menulis 1, membaca 0 dan membaca 1. Semua sinyal ini, kecuali pulsa respon, adalah sinyal sinkron yang dikirim oleh host. Dan semua perintah dan data dikirim dengan bit byte rendah terlebih dahulu.
① Reset pulsa dan pulsa respon
Semua komunikasi pada bus tunggal dimulai dengan urutan inisialisasi. Host mengeluarkan level rendah dan mempertahankan level rendah setidaknya selama 480us untuk menghasilkan pulsa reset. Kemudian tuan rumah melepaskan busnya, dan resistor pull-up 4,7K menarik bus tunggal tinggi-tinggi, dengan waktu tunda 15~60us, dan memasuki mode penerimaan (Rx). Kemudian DS18B20 menarik bus rendah sebesar 60~240us untuk menghasilkan pulsa respons tingkat rendah.
② Waktu penulisan
Waktu penulisan termasuk menulis 0 waktu dan menulis 1 waktu. Semua pengaturan waktu penulisan memerlukan setidaknya 60us, dan setidaknya diperlukan waktu pemulihan 1us antara dua waktu penulisan independen. Kedua pengaturan waktu penulisan dimulai dengan tuan rumah menurunkan bus. Menulis 1 waktu: tuan rumah mengeluarkan level rendah, penundaan untuk 2us, lalu melepaskan busnya, menunda 60us. Menulis 0 waktu: tuan rumah mengeluarkan level rendah, penundaan untuk 60us, dan kemudian melepaskan bus dengan penundaan 2us.
③ Baca waktu
Perangkat bus tunggal mengirimkan data ke host hanya ketika host mengeluarkan waktu baca. Karena itu, setelah host mengeluarkan perintah baca data, waktu baca harus segera dibuat agar budak dapat mengirimkan data. Semua pengaturan waktu baca memerlukan setidaknya 60us, dan setidaknya diperlukan waktu pemulihan 1us antara dua waktu baca independen. Setiap waktu baca diprakarsai oleh host, yang menarik bus setidaknya selama 1us. Tuan rumah harus melepaskan bus selama waktu baca dan mengambil sampel status bus dalam waktu 15us setelah waktu dimulai. Proses pengaturan waktu membaca yang khas adalah: tuan rumah mengeluarkan penundaan tingkat rendah sebesar 2us, kemudian host beralih ke mode input penundaan 12us, lalu membaca level bus tunggal saat ini, dan kemudian menunda 50us.
Setelah memahami timing bus tunggal, mari kita lihat proses pembacaan suhu khas DS18B20. Proses pembacaan suhu khas DS18B20 adalah: setel ulang → kirim SKIPROM (0xCC) → kirim perintah mulai konversi (0x44) → tunda → setel ulang → kirim perintah SKIPROM (0xCC) → kirim perintah memori (0xBE) → membaca dua byte data (yaitu. suhu) terus menerus → berakhir.
3) Diagram skematik dan konfigurasi CUBEMAX
Dari diagram skematik, terlihat DS18B20 diaktifkan oleh port PG11 untuk membuka port serial untuk mencetak informasi suhu
4) Bagian kode
Bagian kode mentransplantasikan perpustakaan ds18b20 dari Zhengdian Atom dan membuat sedikit modifikasi
#jikandef __DS18B20_H
#tentukan __DS18B20_H
#termasuk “tim.h”
/***********************************************************************************/
/* Definisi pin DS18B20 */
#tentukan DS18B20_DQ_GPIO_PORT GPIOG
#tentukan DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#tentukan DS18B20_DQ_GPIO_CLK_ENABLE() Mengerjakan{ __HAL_RCC_GPIOG_CLK_ENABLE(); }ketika(0) /* Jam port PG diaktifkan */
/**********************************************************************************************/
/* Fungsi operasi IO */
#tentukan DS18B20_DQ_OUT(X) Mengerjakan{ X ? \
HAL_GPIO_Pin Tulis(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_SET) : \
HAL_GPIO_Pin Tulis(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN, GPIO_PIN_RESET); \
}ketika(0) /* Keluaran port data */
#tentukan DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Masukan port data */
uint8_t ds18b20_init(ruang kosong); /* Inisialisasi DS18B20 */
uint8_t ds18b20_check(ruang kosong); /* Periksa apakah DS18B20 ada */
ds18b20_get_temperature pendek(ruang kosong);/* Dapatkan suhu */
#endif
5. Modul kendali jarak jauh inframerah
1) Protokol pengkodean modul nirkabel
Metode pengkodean yang banyak digunakan untuk kendali jarak jauh inframerah adalah: Protokol NEC PWM (modulasi lebar pulsa) dan protokol RC-5 dari Philips PPM (modulasi posisi pulsa). Remote control yang disertakan dengan papan pengembangan menggunakan protokol NEC, yang memiliki beberapa fitur berikut:
1. 8-alamat bit dan panjang instruksi 8-bit;
2. Alamat dan perintah dikirimkan dua kali (untuk memastikan keandalan);
3. Modulasi posisi pulsa PWM, dengan siklus tugas pembawa inframerah yang ditransmisikan mewakili “0” Dan “1”;
4. Frekuensi pembawa adalah 38Khz;
5. Waktu bitnya adalah 1,125 ms atau 2,25 ms;
Dalam protokol NEC, cara mengatur data dalam protokol ‘0’ atau '1'? Di Sini, penerima inframerah dan pemancar inframerah dipisahkan.
Pemancar inframerah: Kirim data protokol '0' = 560us transmisi sinyal pembawa + 560kami tidak ada transmisi sinyal pembawa
Kirim data protokol '1' = 560us transmisi sinyal pembawa + 1680kami tidak ada transmisi sinyal pembawa
Definisi bit pemancar inframerah ditunjukkan pada gambar di bawah
Penerima inframerah: Menerima data protokol '0' = level rendah 560us + 560kami tingkat tinggi
Menerima data protokol '1' = level rendah 560us + 1680kami tingkat tinggi
Format data perintah kendali jarak jauh NEC adalah: terminal sinkronisasi, kode alamat, alamat kode terbalik, kode kontrol, mengontrol kode terbalik. Kode sinkronisasi terdiri dari level rendah 9ms dan level tinggi 4,5ms. Kode alamat, alamat kode terbalik, kode kontrol, dan kode invers kontrol semuanya merupakan format data 8-bit. Mereka dikirim dalam urutan bit rendah pertama dan bit tinggi terakhir. Kode terbalik digunakan untuk meningkatkan keandalan transmisi.
Karena itu, penangkapan masukan dapat digunakan untuk mengukur lebar pulsa tingkat tinggi untuk mencapai decoding kendali jarak jauh.
2) Diagram skematik dan konfigurasi CUBEMAX
Dari diagram skematik, kita dapat melihat bahwa modul nirkabel diaktifkan melalui pin PB9 dan dikumpulkan melalui 4 saluran TIM4:
Pin default TIM4_CH4 bukan PB9, jadi perlu diatur secara manual, dan pengaturan interupsi diaktifkan secara bersamaan
3) Bagian kode
Tangkap keunggulan melalui fungsi panggilan balik tim
Saat ini, sinyal yang didekodekan dapat diperoleh:
Saat ini, datanya lebih kompleks dan dapat sedikit diproses:
Efeknya adalah sebagai berikut:
Dua digit terakhir adalah kode yang diterjemahkan dan kebalikannya. Saat ini, itu dapat didefinisikan sebagai makro untuk menyesuaikan ambang suhu:
Efeknya adalah sebagai berikut:
Kode bagian inframerah:
/* KODE PENGGUNA MULAI Header */
/**
******************************************************************************
* @mengajukan : utama.c
* @singkat : Badan program utama
******************************************************************************
* @Perhatian
*
* <h2><tengah>&menyalin; Hak cipta (C) 2024 STMikroelektronik.
* Semua hak dilindungi undang-undang.</tengah></h2>
*
* Komponen perangkat lunak ini dilisensikan oleh ST di bawah lisensi BSD 3-Clause,
* itu “Lisensi”; Anda tidak boleh menggunakan file ini kecuali sesuai dengan
* Lisensi. Anda dapat memperoleh salinan Lisensi di:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Tajuk AKHIR KODE PENGGUNA */
/* Termasuk ——————————————————————*/
#termasuk “utama.h”
#termasuk “tim.h”
#termasuk “penggunaan.h”
#termasuk “gpio.h”
/* Termasuk pribadi ———————————————————-*/
/* KODE PENGGUNA MULAI Termasuk */
#termasuk “stdio.h”
#termasuk “string.h”
#tentukan MAXUP 157
#tentukan MAXDOWN 87
#definisikan MINUP 221
#mendefinisikan PIKIRAN 61
/* AKHIR KODE PENGGUNA Termasuk */
/* Typedef pribadi ———————————————————–*/
/* KODE PENGGUNA MULAI PTD */
/* KODE PENGGUNA AKHIR PTD */
/* Definisi pribadi ————————————————————*/
/* KODE PENGGUNA MULAI PD */
/* KODE PENGGUNA AKHIR PD */
/* Makro pribadi ————————————————————-*/
/* KODE PENGGUNA MULAI PM */
/* KODE PENGGUNA AKHIR PM */
/* Variabel privat ———————————————————*/
/* KODE PENGGUNA MULAI PV */
uint32_t jumlah naik=0;
uint16_t Nilai Naik=0;
uint16_t Nilai Turun=0;
uint8_t isUpCapt=1;
uint16_t lebar=0;
penyangga uint16_t[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* KODE PENGGUNA AKHIR PV */
/* Prototipe fungsi pribadi ———————————————–*/
batalkan SystemClock_Config(ruang kosong);
/* KODE PENGGUNA MULAI PFP */
/* PFP AKHIR KODE PENGGUNA */
/* Kode pengguna pribadi ———————————————————*/
/* KODE PENGGUNA DIMULAI 0 */
batalkan HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *jam)
{
upCount++;
}
batalkan HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *jam)
{
jika(adalahUpCapt)//Jika penangkapan tepi meningkat
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITAS(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
jumlah naik=0;
}
kalau tidak{
Nilai Turun=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITAS(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
lebar=ValueDown+upCount*65536-ValueUp;
jika(lebar>4400&&lebar<4600)
{
penyanggaId=0;
penyangga[bufferId++]= lebar;
}
lain jika(bufferId>0)
{
penyangga[bufferId++]= lebar;
jika(bufferId>32)
{
rcvFalg=1;
penyanggaId=0;
}
}
}
}
batalkan bitBuffer2num(nomor karakter[])
{
nomor[0]=0;
nomor[1]=0;
nomor[2]=0;
nomor[3]=0;
untuk(ke dalam saya=0;Saya<32;saya++)
{
jika(penyangga[saya+1]<1000)
{
nomor[saya/8]=angka[saya/8]<<1;
}
kalau tidak
{
nomor[saya/8]=angka[saya/8]<<1;
nomor[saya/8]|=0x01;
}
}
}
/* AKHIR KODE PENGGUNA 0 */
/**
* @brief Titik masuk aplikasi.
* @retval ke dalam
*/
ke utama(ruang kosong)
{
/* KODE PENGGUNA DIMULAI 1 */
char printbuff[128]={0};
nomor karakter[4]={0};
kunci karakter=0;
/* AKHIR KODE PENGGUNA 1 */
/* Konfigurasi MCU——————————————————–*/
/* Reset semua periferal, Menginisialisasi antarmuka Flash dan Systick. */
HAL_Init();
/* KODE PENGGUNA MULAI Init */
/* KODE PENGGUNA AKHIR Init */
/* Konfigurasikan jam sistem */
SystemClock_Config();
/* KODE PENGGUNA MULAI SysInit */
/* KODE PENGGUNA AKHIR SysInit */
/* Inisialisasi semua periferal yang dikonfigurasi */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* KODE PENGGUNA DIMULAI 2 */
/* AKHIR KODE PENGGUNA 2 */
/* Lingkaran tak terbatas */
/* KODE PENGGUNA DIMULAI SAAT */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Pembaruan pengatur waktu menghasilkan interupsi
HAL_TIM_IC_Mulai_IT(&htim4,TIM_CHANNEL_4);//
ketika (1)
{
jika(rcvFalg)
{
untuk(ke dalam saya=0;Saya<4;saya++)
{
bitBuffer2num(nomor);
sprintf(penggemar cetak,”0xx “,nomor[Saya]);
HAL_UART_Transmisi(&huart1,printbuff,ketegangan(penggemar cetak),HAL_MAX_DELAY);
}
// sprintf(penggemar cetak,”%kamu “,penyangga[Saya]);
// HAL_UART_Transmisi(&huart1,printbuff,ketegangan(penggemar cetak),HAL_MAX_DELAY);
// }
HAL_UART_Transmisi(&hati1,”\rn”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%sial”,nomor[3]);
jika(nomor[3]==157)
{
printf(“111111\rn”);
}
HAL_Penundaan(1000);
/* KODE PENGGUNA BERAKHIR SEMENTARA */
/* KODE PENGGUNA DIMULAI 3 */
}
/* AKHIR KODE PENGGUNA 3 */
}
/**
* @Konfigurasi Jam Sistem singkat
* @retval Tidak ada
*/
batalkan SystemClock_Config(ruang kosong)
{
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









