Teknologi Sensor Suhu

Perancangan Sensor Suhu Digital DS18B20 untuk STM32

Kit Probe Baja Tahan Karat Kawat Penginderaan Suhu DS18B20

DS18B20 adalah sensor suhu digital yang menggunakan timing bus tunggal untuk berkomunikasi dengan host. Hanya 1 Kawat diperlukan untuk menyelesaikan pembacaan data suhu;

DS18B20 memiliki nomor seri produk 64-bit bawaan untuk memudahkan identifikasi. Beberapa sensor DS18B20 dapat dihubungkan 1 Kabel, dan melalui otentikasi identitas 64-bit, informasi suhu yang dikumpulkan dari berbagai sensor dapat dibaca secara terpisah.

Kit Probe Baja Tahan Karat Kawat Penginderaan Suhu DS18B20

Kit Probe Baja Tahan Karat Kawat Penginderaan Suhu DS18B20

Kit Overmolding TPE pemeriksaan sensor suhu DS18B20

Kit Overmolding TPE pemeriksaan sensor suhu DS18B20

1 kawat sensor suhu DS18B20

1 kawat sensor suhu DS18B20

Pengantar DS18B20
2.1 Fitur utama DS18B20
1. Konversi dan keluaran suhu digital sepenuhnya.
2. Komunikasi data bus tunggal tingkat lanjut.
3. Resolusi hingga 12-bit, dengan akurasi hingga ±0,5 derajat Celcius.
4. Siklus kerja maksimum pada resolusi 12-bit adalah 750 milidetik.
5. Mode kerja parasit dapat dipilih.
6. Kisaran suhu deteksi adalah –55° C ~+125° C (–67°F ~+257°F).
7. EEPROM bawaan, fungsi alarm batas suhu.
8. 64-sedikit ROM fotolitografi, nomor seri produk bawaan, nyaman untuk koneksi multi-mesin.
9. Berbagai bentuk kemasan, beradaptasi dengan sistem perangkat keras yang berbeda.

Struktur paket chip DS18B20

Struktur paket chip DS18B20

2.2 Fungsi pin DS18B20
Ground tegangan GND;
Bus data tunggal DQ;
Tegangan catu daya VDD;
pin kosong NC;

RAM chip DS18B20 dan diagram struktur EEPROM

RAM chip DS18B20 dan diagram struktur EEPROM

2.3 Prinsip kerja dan aplikasi DS18B20
Deteksi suhu DS18B20 dan keluaran data digital terintegrasi penuh dalam satu chip, sehingga memiliki kemampuan anti-interferensi yang lebih kuat. Satu siklus kerjanya dapat dibagi menjadi dua bagian, yaitu deteksi suhu dan pemrosesan data.

18B20 memiliki tiga bentuk sumber daya memori. Benar: Memori ROM hanya-baca, digunakan untuk menyimpan kode DS18B20ID; yang pertama 8 bit adalah kode seri satu baris (Kode DS18B20 adalah 19H), berikut ini 48 bit adalah nomor seri unik dari chip; yang terakhir 8 bit adalah kode CRC (pemeriksaan redundansi) di atas 56 bit. Data diatur pada produksi dan tidak dapat diubah oleh pengguna. DS18B20 memiliki total 64 potongan ROM.

Daftar data RAM, digunakan untuk perhitungan internal dan akses data, data hilang setelah listrik padam, DS18B20 memiliki total 9 byte RAM, setiap byte adalah 8 bit. Byte pertama dan kedua adalah informasi nilai data setelah konversi suhu; byte ketiga dan keempat adalah bayangan cermin dari EEPROM pengguna (Biasa digunakan untuk penyimpanan nilai alarm suhu). Nilainya akan disegarkan saat daya direset. Byte kelima adalah bayangan cermin dari EEPROM ketiga pengguna. tanggal 6, 7th, dan byte ke-8 adalah register hitungan, yang dirancang untuk memungkinkan pengguna mendapatkan resolusi suhu yang lebih tinggi. Mereka juga merupakan unit penyimpanan sementara untuk konversi dan penghitungan suhu internal. Byte ke-9 adalah kode CRC yang pertama 8 byte. EEPROM adalah memori non-volatile yang digunakan untuk menyimpan data yang perlu disimpan dalam waktu lama, nilai alarm suhu atas dan bawah, dan verifikasi data. DS18B20 memiliki total 3 potongan EEPROM, dan terdapat gambar cermin di RAM untuk memudahkan pengoperasian pengguna.

DS18B20 bekerja dalam mode resolusi 12-bit secara default. Data 12-bit yang diperoleh setelah konversi disimpan dalam dua RAM 8-bit DS18B20 (dua byte pertama). Yang pertama 5 bit dalam biner adalah bit tanda. Jika suhu yang diukur lebih besar dari 0, ini 5 bit adalah 0. Kalikan saja nilai terukurnya dengan 0.0625 untuk mendapatkan suhu sebenarnya. Jika suhunya kurang dari 0, ini 5 bit adalah 1. Nilai yang diukur perlu dibalik, ditambahkan oleh 1, lalu dikalikan dengan 0.0625 untuk mendapatkan suhu sebenarnya. Atau gunakan operasi bit untuk mengekstrak suhu: tempat desimal menempati yang lebih rendah 4 bit, dan bit atasnya adalah bit integer (angka negatif tidak dipertimbangkan).

2.4 Tabel instruksi ROM chip DS18B20
1. Baca ROM [33H] (kata perintah heksadesimal ada dalam tanda kurung siku).
Perintah ini memungkinkan pengontrol bus membaca ROM 64-bit DS18B20. Instruksi ini hanya dapat digunakan bila hanya ada satu DS18B20 di bus. Jika lebih dari satu yang terhubung, konflik data akan terjadi selama komunikasi.

2. ambil ROM [55H]
Instruksi ini diikuti dengan nomor seri 64-bit yang dikeluarkan oleh pengontrol. Ketika ada beberapa DS18B20 di bus, hanya chip dengan nomor seri yang sama dengan yang dikeluarkan oleh pengontrol yang dapat merespons, dan chip lainnya akan menunggu reset berikutnya. Instruksi ini cocok untuk koneksi chip tunggal dan multi-chip.

3. Lewati ROM [CCH]
Instruksi ini membuat chip tidak merespon kode ROM. In the case of a single bus, this instruction can be used to save time. If this instruction is used when multiple chips are connected, data conflicts will occur, resulting in errors.

4. Search ROM [F0H]
After the chip is initialized, the search instruction allows the 64-bit ROM of all devices to be identified by elimination when multiple chips are connected to the bus.

5. Pencarian Alarm [ECH]
In the case of multiple chips, the alarm chip search instruction only responds to chips that meet the alarm condition of temperature higher than TH or less than TL. As long as the chip is not powered off, the alarm state will be maintained until the temperature is measured again and the alarm condition is not reached.

6. Tulis Scratchpad [4EH]
This is the instruction to write data to RAM. Dua byte data yang ditulis selanjutnya akan disimpan di alamat 2 (TH dari RAM alarm) dan alamat 3 (TL RAM alarm). Proses penulisan dapat dihentikan dengan sinyal reset.

7. Baca Scratchpad (membaca data dari RAM) [BEH]
Instruksi ini akan membaca data dari RAM, dimulai dari alamat 0 dan sampai ke alamat 9, menyelesaikan pembacaan seluruh data RAM. Chip ini memungkinkan sinyal reset untuk menghentikan proses pembacaan, yaitu, byte berikutnya yang tidak perlu dapat diabaikan untuk mengurangi waktu membaca.

8. Salin Scratchpad (salin data RAM ke EEPROM) [48H]
Instruksi ini menyimpan data dalam RAM ke dalam EEPROM sehingga data tidak akan hilang bila listrik dimatikan. Karena chip sedang sibuk dengan pemrosesan penyimpanan EEPROM, ketika pengontrol mengirimkan slot waktu baca, keluaran bus “0”, dan kapan pekerjaan penyimpanan selesai, bus akan keluar “1”.
Dalam mode kerja parasit, pull-up yang kuat harus digunakan segera setelah instruksi ini dikeluarkan dan dipertahankan setidaknya 10MS untuk mempertahankan pengoperasian chip.

9. Konversi T (konversi suhu) [44H]
Setelah menerima instruksi ini, chip akan melakukan konversi suhu dan menyimpan nilai suhu yang dikonversi di alamat 1 dan 2 RAM. Karena chip sibuk dengan pemrosesan konversi suhu, ketika pengontrol mengirimkan slot waktu baca, keluaran bus “0”, dan kapan pekerjaan penyimpanan selesai, bus akan keluar “1”. Dalam mode kerja parasit, pull-up yang kuat harus digunakan segera setelah instruksi ini dikeluarkan dan dipertahankan setidaknya selama 500MS untuk mempertahankan pengoperasian chip.

10. Ingat EEPROM (Salin nilai alarm di EEPROM ke RAM) [B8H]
Instruksi ini menyalin nilai alarm di EEPROM ke byte ke-3 dan ke-4 di RAM. Karena chip sedang sibuk dengan proses penyalinan, ketika pengontrol mengirimkan slot waktu baca, keluaran bus “0”, dan kapan pekerjaan penyimpanan selesai, keluaran bus “1”. Selain itu, instruksi ini akan dijalankan secara otomatis ketika chip dihidupkan dan direset. Dengan cara ini, dua bit byte alarm di RAM akan selalu menjadi bayangan cermin dari data di EEPROM.

11. Baca Catu Daya (Sakelar Mode Kerja) [B4H]
Setelah instruksi ini dikeluarkan, kesenjangan waktu baca dikeluarkan, dan chip akan mengembalikan kata status dayanya. “0” adalah negara kekuatan parasit dan “1” adalah keadaan daya eksternal.

2.5 Diagram Waktu DS18B20
2.5.1 Diagram Hubungan Reset dan Respon DS18B20
Reset harus dilakukan sebelum setiap komunikasi. Waktu pengaturan ulang, waktu tunggu, dan waktu respons harus diprogram secara ketat sesuai dengan waktunya.
DS18B20 membaca dan menulis kesenjangan waktu: Pembacaan dan penulisan data DS18B20 dikonfirmasi oleh bit pemrosesan celah waktu dan kata perintah untuk bertukar informasi.

Diagram hubungan reset dan respons DS18B20

Diagram hubungan reset dan respons DS18B20

2.5.2 Tulis data 0 dan data 1 ke DS18B20
Dalam 15uS pertama dari kesenjangan waktu penulisan data, bus perlu ditarik rendah oleh pengontrol, dan kemudian itu akan menjadi waktu pengambilan sampel chip untuk data bus. Waktu pengambilan sampel adalah 15~60uS. Jika pengontrol menarik bus tinggi-tinggi selama waktu pengambilan sampel, itu berarti menulis “1”, dan jika pengontrol menarik bus rendah, itu berarti menulis “0”.
Setiap bit transmisi harus memiliki bit awal tingkat rendah minimal 15uS, dan data selanjutnya “0” atau “1” harus diselesaikan dalam waktu 45uS.
Waktu transmisi seluruh bit harus dijaga pada 60~120uS, jika tidak, komunikasi normal tidak dapat dijamin.
Catatan: DS18B20 membaca dan menulis data dari bit rendah.

Tulis data 0 dan data 1 ke DS18B20

Tulis data 0 dan data 1 ke DS18B20

2.5.3 Membaca data 0 dan data 1 dari DS18B20
Waktu pengambilan sampel kontrol selama jeda waktu baca harus lebih akurat. Selama jeda waktu membaca, host juga harus menghasilkan level rendah minimal 1uS untuk menunjukkan dimulainya waktu baca. Kemudian, dalam 15uS setelah bus dilepaskan, DS18B20 akan mengirimkan bit data internal. Saat ini, jika kontrol menemukan bahwa busnya tinggi, itu berarti membaca “1”, dan jika busnya rendah, itu berarti membaca data “0”. Sebelum membaca setiap bit, pengontrol menambahkan sinyal start.

Membaca data 0 dan data 1 dari DS18B20

Membaca data 0 dan data 1 dari DS18B20

Catatan: Bit data harus dibaca dalam waktu 15uS dari awal celah baca untuk memastikan komunikasi yang benar.

Selama komunikasi, 8 potongan “0” atau “1” digunakan sebagai byte, dan pembacaan atau penulisan byte dimulai dari bit rendah.

2.5.4 Urutan pembacaan suhu satu kali (hanya satu DS18B20 di bus)

1. Kirim sinyal reset
2. Deteksi sinyal respons
3. Kirim 0xCC
4. Kirim 0x44
5. Kirim sinyal reset
6. Deteksi sinyal respons
7. Tulis 0xcc
8. Tulis 0xbe
9. Lingkaran 8 kali untuk membaca byte suhu rendah
10. Lingkaran 8 kali untuk membaca byte suhu yang tinggi
11. Sintesis data dan proses suhu 16-bit

3. Kode pengemudi

3.1 DS18B20.c
#termasuk “ds18b20.h”
/*
Fungsi: Inisialisasi DS18B20
Koneksi perangkat keras: PB15
*/
batal DS18B20_Init(ruang kosong)
{
RCC->APB2ENR|=1<<3; //PB
GPIOB->CRH&=0x0FFFFFF;
GPIOB->CRH|=0x30000000;
GPIOB->ODR|=1<<15; //Tarik ke atas
}

/*
Fungsi: Periksa apakah perangkat DS18B20 ada
Nilai kembalian: 1 berarti perangkat tersebut tidak ada 0 berarti perangkatnya normal
*/
u8 DS18B20_Periksa Perangkat(ruang kosong) //Berisi pulsa reset, pulsa pendeteksi
{
DS18B20_OUTPUT_MODE();//Inisialisasi ke mode keluaran
DS18B20_OUT=0; //Hasilkan pulsa reset
Tunda Kami(750); //Hasilkan 750us level rendah
DS18B20_OUT=1; //Lepaskan bis
Tunda Kami(15); //Tunggu respons DS18B20
jika(DS18B20_CleckAck())//Mendeteksi keberadaan pulsa
{
kembali 1;
}
kembali 0;
}

/*
Fungsi: Mendeteksi keberadaan pulsa perangkat DS18B20
Nilai kembalian: 1 menunjukkan kesalahan 0 menunjukkan biasa saja
*/
u8 DS18B20_CleckAck(ruang kosong)
{
u8 tidak=0;
DS18B20_INPUT_MODE();//Inisialisasi ke mode masukan
ketika(DS18B20_IN&&cnt<200) //Tunggu respon DS18B20 adanya pulsa
{
Tunda Kami(1);
tidak++;
}
jika(cnt>=200)kembali 1; //kesalahan

tidak=0;
ketika((!DS18B20_IN)&&cnt<240) //tunggu DS18B20 melepaskan bus
{
Tunda Kami(1);
tidak++;
}
jika(cnt>=240)kembali 1; //kesalahan
kembali 0;
}

/*
Fungsi: Tulis satu byte
Pertama, pelajari cara menulis sedikit.
*/
batal DS18B20_WriteByte(u8 cmd)
{
u8 saya;
DS18B20_OUTPUT_MODE(); //Inisialisasi ke mode keluaran
untuk(saya=0;Saya<8;saya++)
{
DS18B20_OUT=0; //Menghasilkan kesenjangan waktu tulis (menulis mulai)
Tunda Kami(2);
DS18B20_OUT=cmd&0x01; //Kirim bit data aktual
Tunda Kami(60); //Tunggu hingga penulisan selesai
DS18B20_OUT=1; //Lepaskan bus dan bersiap untuk transmisi berikutnya
cmd>>=1; //Lanjutkan untuk mengirim sedikit data berikutnya
}
}

/*
Fungsi: Baca satu byte
Pertama, pelajari cara membaca sedikit.
*/
u8 DS18B20_ReadByte(ruang kosong)
{
u8 saya,data=0;
untuk(saya=0;Saya<8;saya++)
{
DS18B20_OUTPUT_MODE(); //Inisialisasi ke mode keluaran
DS18B20_OUT=0; //Menghasilkan kesenjangan waktu membaca (membaca mulai)
Tunda Kami(2);
DS18B20_OUT=1; //Lepaskan bis
DS18B20_INPUT_MODE(); //Inisialisasi ke mode masukan
Tunda Kami(8); //Tunggu keluaran data DS18B20
data>>=1; //Isi bit tinggi dengan 0, standarnya adalah 0
jika(DS18B20_IN) data|=0x80;
Tunda Kami(60);
DS18B20_OUT=1; //Lepaskan bis, tunggu untuk membaca bit data berikutnya
}
mengembalikan data;
}

/*
Fungsi: Baca data suhu DS18B20 satu kali
Nilai kembalian: data suhu dibaca
Situasi yang dipertimbangkan: Hanya ada satu DS18B20 yang terhubung ke bus
*/
u16 DS18B20_ReadTemp(ruang kosong)
{
suhu u16=0;
u8 suhu_H,suhu_L;
DS18B20_Periksa Perangkat(); //Kirim pulsa reset, mendeteksi denyut nadi
DS18B20_WriteByte(0xCC); //Lewati deteksi urutan ROM
DS18B20_WriteByte(0x44); //Mulai konversi suhu

//Tunggu hingga konversi suhu selesai
ketika(DS18B20_ReadByte()!=0xFF){}

DS18B20_Periksa Perangkat(); //Kirim pulsa reset, mendeteksi denyut nadi
DS18B20_WriteByte(0xCC); //Lewati deteksi urutan ROM
DS18B20_WriteByte(0xBE); //Baca suhu

temp_L=DS18B20_ReadByte(); //Baca data suhu rendah
temp_H=DS18B20_ReadByte(); //Baca data suhu tinggi
suhu=temp_L|(suhu_H<<8); //Suhu yang disintesis
suhu kembali;
}

3.2 DS18B20.h

#ifndef DS18B20_H
#tentukan DS18B20_H
#termasuk “stm32f10x.h”
#termasuk “sy.h”
#termasuk “penundaan.h”
#termasuk “ds18b20.h”
#termasuk “penggunaan.h”

/*Antarmuka paket*/

//Inisialisasi DS18B20 ke mode input
#tentukan DS18B20_INPUT_MODE() {GPIOB->CRH&=0x0FFFFFF;GPIOB->CRH|=0x80000000;}

//Inisialisasi DS18B20 ke mode keluaran
#tentukan DS18B20_OUTPUT_MODE(){GPIOB->CRH&=0x0FFFFFF;GPIOB->CRH|=0x30000000;}

//Keluaran port IO DS18B20
#tentukan DS18B20_OUT PBout(15)

//Masukan port IO DS18B20
#tentukan DS18B20_IN PBin(15)

//Deklarasi fungsi
u8 DS18B20_CleckAck(ruang kosong);
u8 DS18B20_Periksa Perangkat(ruang kosong);
batal DS18B20_Init(ruang kosong);
u16 DS18B20_ReadTemp(ruang kosong);
u8 DS18B20_ReadByte(ruang kosong);
batal DS18B20_WriteByte(u8 cmd);
#endif

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png
3.3 Fungsi penundaan

/*
Fungsi: Keterlambatan dalam diri kita
*/
batalkan DelayUs(ke dalam kita)
{
#ifdef _SYSTICK_IRQ_
ke dalam saya,J;
untuk(saya=0;iVAL=0; //Nilai penghitung CNT
SysTick->BEBAN=9*kami; //9 berarti 1us
SysTick->CTRL|=1<<0; //Mulai pengatur waktu
Mengerjakan
{
tmp=SysTick->CTRL; //Baca statusnya
}ketika((!(tmp&1<<16))&&(tmp&1<<0));
SysTick->VAL=0; //Nilai penghitung CNT
SysTick->CTRL&=~(1<<0); //Matikan pengatur waktunya
#endif
};saya++)>

3.4 main.c Hubungi DS18B20 untuk membaca suhu dan mencetaknya ke port serial

#termasuk “stm32f10x.h”

#termasuk “ds18b20.h”

u8 DS18B20_ROM[8]; //Simpan kode ROM 64-bit DS18B20

ke utama(ruang kosong)
{
suhu u16;
USARTx_Panas(USART1,72,115200);//Inisialisasi port serial 1
DS18B20_Panas(); //Inisialisasi DS18B20

/*1. Baca kode ROM 64-bit DS18B20*/
//Kirim pulsa reset, mendeteksi keberadaan pulsa
ketika(DS18B20_Periksa Perangkat())
{
printf(“Perangkat DS18B20 tidak ada!\N”);
KeterlambatanMs(500);
}
//Kirim perintah untuk membaca kode ROM 64-bit
DS18B20_WriteByte(0x33);

//Loop membaca kode ROM 64-bit
untuk(saya=0;Saya<8;saya++)
{
DS18B20_ROM[Saya]= DS18B20_ReadByte();
printf(“DS18B20_ROM[%D]=0x%Xn”,Saya,DS18B20_ROM[Saya]);
}

ketika(1)
{
/*2. Operasikan semua DS18B20 di bus secara bersamaan untuk mulai mengubah suhu*/
DS18B20_Periksa Perangkat(); //Kirim pulsa reset, mendeteksi denyut nadi
DS18B20_WriteByte(0xCC); //Lewati deteksi urutan ROM
DS18B20_WriteByte(0x44); //Mulai konversi suhu (biarkan semua DS18B20 di bus mengubah suhu)
KeterlambatanMs(500); //Tunggu hingga semua konversi suhu DS18B20 di saluran selesai

/*3. Pembacaan target tunggal suhu setiap DS18B20*/
DS18B20_Periksa Perangkat(); //Kirim pulsa reset, mendeteksi denyut nadi
DS18B20_WriteByte(0x55); //Kirim perintah untuk mencocokkan ROM
untuk(saya=0;Saya<8;saya++) //Kirim kode 64-bit
{
DS18B20_WriteByte(DS18B20_ROM[Saya]);
}
DS18B20_WriteByte(0xBE); //Baca suhu
suhu=DS18B20_ReadByte(); //Membaca data suhu tingkat rendah
suhu|=DS18B20_ReadByte()<<8; //Membaca data suhu tingkat tinggi
printf(“suhu1=%d.%dn”,suhu>>4,suhu&0xF);
printf(“suhu2=%fn”,suhu*0,0625);

KeterlambatanMs(500);
}
}