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, which greatly improves the anti-interference ability of the system. It can directly read the measured temperature, and can realize a 9~12-bit digital value reading method through simple programming according to actual requirements. Its operating voltage range is 3~5.5V, and it uses a variety of packaging forms, making the system setting flexible and convenient. The set resolution and the alarm temperature set by the user are stored in the EEPROM and are still saved after power failure.
2) Introduction to DS18B20 working timing
All single-bus devices require strict signal timing to ensure data integrity. DS18B20 memiliki 6 signal types: reset pulse, response pulse, write 0, write 1, read 0 and read 1. All these signals, except the response pulse, are synchronous signals sent by the 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. Both write timings start with the host pulling down the bus. Menulis 1 waktu: the host outputs a low level, delays for 2us, and then releases the bus, delaying 60us. Menulis 0 waktu: the host outputs a low level, delays for 60us, and then releases the bus with a delay of 2us.
③ Read timing
Single-bus devices transmit data to the host only when the host issues a read timing. Karena itu, after the host issues a read data command, a read timing must be generated immediately so that the slave can transmit data. All read timings require at least 60us, and at least 1us recovery time is required between two independent read timings. Each read timing is initiated by the host, which pulls down the bus for at least 1us. The host must release the bus during the read timing and sample the bus status within 15us after the timing starts. 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









