Perbandingan antara Sensor suhu PT100 kuar dan Modul DS18B20
1) Prinsip asas pemerolehan isyarat
① Rintangan PT100 berubah secara berkadar dengan suhu (semakin tinggi suhu, semakin besar rintangan), tetapi perubahan rintangan adalah sangat kecil, mengenai 0.385 Oh / ijazah;
② Julat pengukuran suhu PT100 ialah -200℃ -200℃, dan pada 0 ℃, rintangan adalah betul-betul sama dengan 100 Oh;
③ Arus kerja PT100 hendaklah kurang daripada 5 ma;
④ Walaupun rintangan PT100 berubah secara berkadar dengan suhu, kadar perubahannya (itu, Nilai K nilai K nilai K) berbeza dalam julat suhu yang berbeza.
2) Jadual perubahan rintangan suhu PT100
3. Litar pemacu PT100
1) Melalui kaedah pembahagian voltan, AD mengumpul voltan PT100 untuk mendapatkan nilai rintangan untuk mengira suhu
Nilai rintangan PT100 dalam air pada suhu bilik (25℃ 25 ℃ 25 ℃) adalah kira -kira 109.89 Oh.
Mikropengawal mengeluarkan voltan 3.3V, dan voltan dibahagikan dengan PT100 adalah lebih kurang:
109.89 ∗ 0.005 = 0.54945 V
Nilai AD yang ditukar mengikut formula penukaran AD adalah lebih kurang:
0.54945 / 3.3 ∗ 4096 = 681.98 ≈ 682
Apabila suhu meningkat satu darjah, dengan mengandaikan bahawa rintangan PT100 hanya meningkat sebanyak 0.385 Oh, nilai perubahan voltan dibahagikan adalah lebih kurang sama dengan:
0.385 ∗ 0.005 = 0.001925 V
Nilai AD yang ditukar mengikut formula penukaran AD adalah lebih kurang:
0.001925 / 3.3 ∗ 4096 = 2.39 ≈ 2
Dalam eksperimen, didapati bahawa disebabkan oleh voltan 3.3V yang tidak stabil bekalan kuasa stm32, ADC mengumpul turun naik voltan PT100 dan ralat pembahagian voltan adalah besar. Penyelesaian pengoptimuman adalah untuk mereka bentuk litar sumber arus malar. Dengan mengumpul voltan PT100 dan arus sumber arus malar, rintangan PT100 boleh diperolehi, dan kemudian nilai suhu boleh diperolehi.
2) Litar sumber arus malar berdasarkan pengatur LDO (MD5333)
Terdapat banyak litar pemanduan untuk menguji PT100 di Internet, seperti litar jambatan DC, litar punca arus malar berdasarkan penguat kendalian, dll. Penulis juga banyak meluangkan masa dalam memilih litar pemanduan, mengambil kira kesukaran membuat papan dan bilangan komponen, dan akhirnya memilih litar sumber arus malar berdasarkan pengatur LDO (MD5333). Gambar rajah litar adalah seperti berikut:
Pada ketika ini, pemilihan perkakasan pada dasarnya telah selesai. Papan pembangunan yang digunakan ialah Papan Elit Zhengdian Atom F10ZET6
Modul DS18B20
Untuk menguji suhu masa nyata dan perbandingan suhu PT100, modul DS18B20 ditambah untuk ujian perbandingan penentukuran
1) Pengenalan kepada DS18B20
DS18B20 ialah sensor suhu bas tunggal dengan julat suhu ujian -55~+125℃ dan ketepatan ±0.5℃. Suhu medan dihantar terus dalam cara digital bas tunggal, yang sangat meningkatkan keupayaan anti-gangguan sistem. Ia boleh membaca terus suhu yang diukur, dan boleh merealisasikan kaedah membaca nilai digital 9~12-bit melalui pengaturcaraan mudah mengikut keperluan sebenar. Julat voltan kendaliannya ialah 3~5.5V, dan ia menggunakan pelbagai bentuk pembungkusan, menjadikan tetapan sistem fleksibel dan mudah. Resolusi yang ditetapkan dan suhu penggera yang ditetapkan oleh pengguna disimpan dalam EEPROM dan masih disimpan selepas kegagalan kuasa.
2) Pengenalan kepada masa kerja DS18B20
Semua peranti bas tunggal memerlukan pemasaan isyarat yang ketat untuk memastikan integriti data. DS18B20 mempunyai 6 jenis isyarat: menetapkan semula nadi, nadi tindak balas, tulis 0, tulis 1, Baca 0 dan membaca 1. Semua isyarat ini, kecuali nadi tindak balas, adalah isyarat segerak yang dihantar oleh hos. Dan semua arahan dan data dihantar dengan bit rendah bait dahulu.
① Tetapkan semula nadi dan nadi tindak balas
Semua komunikasi pada bas tunggal bermula dengan urutan permulaan. Hos mengeluarkan tahap rendah dan mengekalkan tahap rendah sekurang-kurangnya 480us untuk menjana nadi tetapan semula. Kemudian tuan rumah melepaskan bas, dan perintang tarik naik 4.7K menarik bas tunggal tinggi, dengan masa tunda 15~60us, dan memasuki mod penerimaan (Rx). Kemudian DS18B20 menarik bas rendah untuk 60~240us untuk menjana nadi tindak balas peringkat rendah.
② Tulis masa
Masa menulis termasuk menulis 0 masa dan menulis 1 masa. Semua masa tulis memerlukan sekurang-kurangnya 60us, dan sekurang-kurangnya 1us masa pemulihan diperlukan antara dua pemasaan tulis bebas. Kedua-dua masa tulis bermula dengan hos menurunkan bas. tulis 1 masa: hos mengeluarkan tahap yang rendah, kelewatan untuk 2us, dan kemudian melepaskan bas, menangguhkan 60us. tulis 0 masa: hos mengeluarkan tahap yang rendah, kelewatan untuk 60us, dan kemudian melepaskan bas dengan kelewatan 2us.
③ Baca masa
Peranti bas tunggal menghantar data kepada hos hanya apabila hos mengeluarkan masa baca. Oleh itu, selepas hos mengeluarkan arahan data baca, pemasaan baca mesti dijana dengan segera supaya hamba boleh menghantar data. Semua pemasaan membaca memerlukan sekurang-kurangnya 60us, dan sekurang-kurangnya 1us masa pemulihan diperlukan antara dua pemasaan bacaan bebas. Setiap masa bacaan dimulakan oleh hos, yang menarik ke bawah bas untuk sekurang-kurangnya 1us. Hos mesti melepaskan bas semasa masa membaca dan mencuba status bas dalam lingkungan 15us selepas masa bermula. Proses pemasaan bacaan biasa ialah: hos mengeluarkan kelewatan tahap rendah sebanyak 2us, kemudian hos bertukar kepada kelewatan mod input sebanyak 12us, kemudian membaca tahap semasa bas tunggal, dan kemudian menangguhkan 50us.
Selepas memahami masa bas tunggal, mari kita lihat proses bacaan suhu biasa DS18B20. Proses bacaan suhu biasa DS18B20 ialah: set semula → hantar SKIPROM (0xCC) → hantar arahan penukaran mula (0x44) → kelewatan → set semula → hantar arahan SKIPROM (0xCC) → hantar arahan memori (0xBE) → baca dua bait data (i.e. suhu) berterusan → tamat.
3) Gambar rajah skema dan konfigurasi CUBEMAX
Daripada rajah skematik, dapat dilihat bahawa DS18B20 didayakan oleh port PG11 untuk membuka port bersiri untuk mencetak maklumat suhu
4) Bahagian kod
Bahagian kod memindahkan perpustakaan ds18b20 Zhengdian Atom dan membuat sedikit pengubahsuaian
#ifndef __DS18B20_H
#takrifkan __DS18B20_H
#termasuk “tim.h”
/***********************************************************************************/
/* Takrifan pin DS18B20 */
#takrifkan DS18B20_DQ_GPIO_PORT GPIOG
#takrifkan DS18B20_DQ_GPIO_PIN GPIO_PIN_11
#tentukan DS18B20_DQ_GPIO_CLK_ENABLE() buat{ __HAL_RCC_GPIOG_CLK_ENABLE(); }sementara(0) /* Jam port PG dayakan */
/**********************************************************************************************/
/* Fungsi operasi IO */
#takrifkan DS18B20_DQ_OUT(x) buat{ 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); \
}sementara(0) /* Output port data */
#tentukan DS18B20_DQ_IN HAL_GPIO_ReadPin(DS18B20_DQ_GPIO_PORT, DS18B20_DQ_GPIO_PIN) /* Input port data */
uint8_t ds18b20_init(batal); /* Mulakan DS18B20 */
uint8_t ds18b20_check(batal); /* Semak sama ada DS18B20 wujud */
ds18b20_get_temperature pendek(batal);/* Dapatkan suhu */
#endif
5. Modul kawalan jauh inframerah
1) Protokol pengekodan modul wayarles
Kaedah pengekodan yang digunakan secara meluas untuk kawalan jauh inframerah ialah: Protokol NEC PWM (modulasi lebar nadi) dan protokol RC-5 Philips PPM (modulasi kedudukan nadi). Alat kawalan jauh yang disertakan dengan papan pembangunan menggunakan protokol NEC, yang mempunyai ciri-ciri berikut:
1. 8-alamat bit dan panjang arahan 8-bit;
2. Alamat dan arahan dihantar dua kali (untuk memastikan kebolehpercayaan);
3. Modulasi kedudukan nadi PWM, dengan kitaran tugas pembawa inframerah yang dihantar mewakili “0” dan “1”;
4. Kekerapan pembawa ialah 38Khz;
5. Masa bit ialah 1.125ms atau 2.25ms;
Dalam protokol NEC, bagaimana untuk menetapkan data dalam protokol kepada ‘0’ atau '1'? Di sini, penerima inframerah dan pemancar inframerah diasingkan.
Pemancar inframerah: Hantar data protokol '0' = 560us penghantaran isyarat pembawa + 560kami tiada penghantaran isyarat pembawa
Hantar data protokol '1' = 560us penghantaran isyarat pembawa + 1680kami tiada penghantaran isyarat pembawa
Takrifan bit pemancar inframerah ditunjukkan dalam rajah di bawah
Penerima inframerah: Terima data protokol '0' = 560us tahap rendah + 560kita tahap tinggi
Terima data protokol '1' = 560us tahap rendah + 1680kita tahap tinggi
Format data arahan kawalan jauh NEC ialah: terminal penyegerakan, kod alamat, alamat kod songsang, kod kawalan, mengawal kod songsang. Kod penyegerakan terdiri daripada tahap rendah 9ms dan tahap tinggi 4.5ms. Kod alamat, alamat kod songsang, kod kawalan, dan kod songsang kawalan adalah semua format data 8-bit. Mereka dihantar dalam susunan bit rendah dahulu dan bit tinggi terakhir. Kod songsang digunakan untuk meningkatkan kebolehpercayaan penghantaran.
Oleh itu, tangkapan input boleh digunakan untuk mengukur lebar nadi tahap tinggi untuk mencapai penyahkodan alat kawalan jauh.
2) Gambar rajah skema dan konfigurasi CUBEMAX
Daripada rajah skematik, kita dapat melihat bahawa modul wayarles didayakan melalui pin PB9 dan mengumpul melalui 4 saluran TIM4:
Pin lalai TIM4_CH4 bukan PB9, jadi ia perlu ditetapkan secara manual, dan tetapan sampukan dihidupkan pada masa yang sama
3) Bahagian kod
Tangkap kelebihan yang semakin meningkat melalui fungsi panggil balik tim
Pada masa ini, isyarat yang dinyahkod boleh diperolehi:
Pada masa ini, data adalah lebih kompleks dan boleh diproses sedikit:
Kesannya adalah seperti berikut:
Dua digit terakhir ialah yang dinyahkod dan kod songsangnya. Pada masa ini, ia boleh ditakrifkan sebagai makro untuk melaraskan ambang suhu:
Kesannya adalah seperti berikut:
Kod bahagian inframerah:
/* KOD PENGGUNA BERMULA Pengepala */
/**
******************************************************************************
* @fail : utama.c
* @ringkas : Badan program utama
******************************************************************************
* @perhatian
*
* <h2><pusat>&salinan; Hak Cipta (c) 2024 STMikroelektronik.
* Semua hak terpelihara.</pusat></h2>
*
* Komponen perisian ini dilesenkan oleh ST di bawah lesen 3-Klausa BSD,
* The “Lesen”; Anda tidak boleh menggunakan fail ini kecuali dengan mematuhi
* Lesen. Anda boleh mendapatkan salinan Lesen di:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* KOD PENGGUNA TAMAT Pengepala */
/* Termasuk ——————————————————————*/
#termasuk “utama.h”
#termasuk “tim.h”
#termasuk “usart.h”
#termasuk “gpio.h”
/* Persendirian termasuk ———————————————————-*/
/* KOD PENGGUNA BERMULA Termasuk */
#termasuk “stdio.h”
#termasuk “rentetan.h”
#tentukan MAXUP 157
#tentukan MAXDOWN 87
#tentukan MINUP 221
#takrifkan MINDOWN 61
/* KOD PENGGUNA TAMAT Termasuk */
/* Private typedef ———————————————————–*/
/* KOD PENGGUNA MULAKAN PTD */
/* KOD PENGGUNA TAMAT PTD */
/* Definisi peribadi ————————————————————*/
/* KOD PENGGUNA BERMULA PD */
/* KOD PENGGUNA TAMAT PD */
/* Makro peribadi ————————————————————-*/
/* KOD PENGGUNA MULAKAN PM */
/* KOD PENGGUNA TAMAT PM */
/* Pembolehubah persendirian ———————————————————*/
/* KOD PENGGUNA BERMULA PV */
uint32_t upCount=0;
uint16_t ValueUp=0;
uint16_t ValueDown=0;
uint8_t isUpCapt=1;
uint16_t lebar=0;
penimbal uint16_t[128]={0};
uint16_t bufferId=0;
uint8_t rcvFalg=0;
/* KOD PENGGUNA TAMAT PV */
/* Prototaip fungsi peribadi ———————————————–*/
batal SystemClock_Config(batal);
/* KOD PENGGUNA MULAKAN PFP */
/* KOD PENGGUNA TAMAT PFP */
/* Kod pengguna peribadi ———————————————————*/
/* KOD PENGGUNA BERMULA 0 */
batal HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
upCount++;
}
batalkan HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
jika(isUpCapt)//Jika ia semakin meningkat
{
ValueUp=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=0;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_FALLING);
upCount=0;
}
lain{
ValueDown=HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_4);
isUpCapt=1;
__HAL_TIM_SET_CAPTUREPOLARITY(htim,TIM_CHANNEL_4,TIM_ICPOLARITY_RISING);
width=ValueDown+upCount*65536-ValueUp;
jika(lebar>4400&&lebar<4600)
{
bufferId=0;
penampan[bufferId++]=lebar;
}
lain jika(bufferId>0)
{
penampan[bufferId++]=lebar;
jika(bufferId>32)
{
rcvFalg=1;
bufferId=0;
}
}
}
}
batal bitBuffer2num(char num[])
{
bilangan[0]=0;
bilangan[1]=0;
bilangan[2]=0;
bilangan[3]=0;
untuk(int i=0;i<32;i++)
{
jika(penampan[i+1]<1000)
{
bilangan[i/8]= bilangan[i/8]<<1;
}
lain
{
bilangan[i/8]= bilangan[i/8]<<1;
bilangan[i/8]|=0x01;
}
}
}
/* KOD PENGGUNA TAMAT 0 */
/**
* @brief Titik kemasukan permohonan.
* @retval int
*/
int utama(batal)
{
/* KOD PENGGUNA BERMULA 1 */
char printbuff[128]={0};
char num[4]={0};
kunci char=0;
/* KOD PENGGUNA TAMAT 1 */
/* Konfigurasi MCU——————————————————–*/
/* Tetapkan semula semua peranti, Memulakan antara muka Flash dan Systick. */
HAL_Init();
/* KOD PENGGUNA BERMULA Init */
/* KOD PENGGUNA TAMAT Init */
/* Konfigurasikan jam sistem */
SystemClock_Config();
/* KOD PENGGUNA MULAKAN SysInit */
/* KOD PENGGUNA TAMAT SysInit */
/* Mulakan semua persisian yang dikonfigurasikan */
MX_GPIO_Init();
MX_TIM4_Init();
MX_USART1_UART_Init();
/* KOD PENGGUNA BERMULA 2 */
/* KOD PENGGUNA TAMAT 2 */
/* Gelung tak terhingga */
/* KOD PENGGUNA BERMULA SEMASA */
HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
HAL_TIM_Base_Start_IT(&htim4);//Kemas kini pemasa menjana gangguan
HAL_TIM_IC_Start_IT(&htim4,TIM_CHANNEL_4);//
sementara (1)
{
jika(rcvFalg)
{
untuk(int i=0;i<4;i++)
{
bitBuffer2num(bilangan);
sprintf(printbuff,”0xx “,bilangan[i]);
HAL_UART_Transmit(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
}
// sprintf(printbuff,”%u “,penampan[i]);
// HAL_UART_Transmit(&huart1,printbuff,stren(printbuff),HAL_MAX_DELAY);
// }
HAL_UART_Transmit(&huart1,”\r\n”,2,HAL_MAX_DELAY);
rcvFalg=0;
}
printf(“%d\r\n”,bilangan[3]);
jika(bilangan[3]==157)
{
printf(“111111\r\n”);
}
HAL_Delay(1000);
/* KOD PENGGUNA TAMAT SEMASA */
/* KOD PENGGUNA BERMULA 3 */
}
/* KOD PENGGUNA TAMAT 3 */
}
/**
* @brief Konfigurasi Jam Sistem
* @retval Tiada
*/
batal SystemClock_Config(batal)
{
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









