- Membandingkan ADC di Arduino dan STM32F103C8
- ADC dalam STM32
- Bagaimana Sinyal Analog ditukar menjadi Format Digital
- Pin ADC dalam STM32F103C8T6
- Komponen Diperlukan
- Rajah dan Penjelasan Litar
- Pengaturcaraan STM32 untuk membaca nilai ADC
Satu ciri umum yang digunakan di hampir setiap aplikasi yang disematkan adalah modul ADC (Analog to Digital Converter). Ini Analog kepada Converters digital boleh membaca voltan dari sensor analog seperti suhu sensor, sensor Tilt, sensor Semasa, Flex sensor dan banyak lagi. Oleh itu, dalam tutorial ini kita akan belajar bagaimana menggunakan ADC di STM32F103C8 untuk membaca voltan Analog menggunakan Energia IDE. Kami akan menghubungkan potensiometer kecil ke papan STM32 Blue Pill dan membekalkan voltan yang berbeza ke pin Analog, membaca voltan dan memaparkannya pada skrin LCD 16x2.
Membandingkan ADC di Arduino dan STM32F103C8
Di papan Arduino, ia mengandungi 6 saluran (8 saluran di Mini dan Nano, 16 di Mega), 10-bit ADC dengan julat voltan input 0V – 5V. Ini bermaksud bahawa ia akan memetakan voltan input antara 0 dan 5 volt menjadi nilai integer antara 0 dan 1023. Sekarang dalam STM32F103C8 kita mempunyai 10 saluran, ADC 12-Bit dengan julat input 0V -3.3V. Ia akan memetakan voltan input antara 0 dan 3.3 volt menjadi nilai integer antara 0 dan 4095.
ADC dalam STM32
ADC yang tertanam dalam mikrokontroler STM32 menggunakan prinsip SAR (register penghampiran berturut-turut), yang mana penukaran dilakukan dalam beberapa langkah. Bilangan langkah penukaran adalah sama dengan bilangan bit dalam penukar ADC. Setiap langkah didorong oleh jam ADC. Setiap jam ADC menghasilkan satu bit dari hasil ke output. Reka bentuk dalaman ADC didasarkan pada teknik kapasitor beralih. Sekiranya anda baru menggunakan STM32, baca tutorial Bermula dengan STM32 kami.
Resolusi 12-bit
ADC ini adalah ADC 10-saluran 12-bit. Di sini istilah 10 saluran menyiratkan bahawa terdapat 10 pin ADC yang mana kita dapat mengukur voltan analog. Istilah 12-bit menyiratkan resolusi ADC. 12-bit bermaksud 2 hingga kekuatan sepuluh (2 12) iaitu 4096. Ini adalah bilangan langkah sampel untuk ADC kami, jadi julat nilai ADC kami adalah dari 0 hingga 4095. Nilai akan meningkat dari 0 hingga 4095 berdasarkan nilai voltan per langkah, yang dapat dikira dengan formula
VOLTAGE / LANGKAH = RUJUKAN Voltage / 4096 = (3.3 / 4096 = 8.056mV) seunit.
Bagaimana Sinyal Analog ditukar menjadi Format Digital
Sebagai komputer hanya menyimpan dan memproses nilai binari / digital (1 dan 0). Jadi isyarat Analog seperti output sensor dalam volt harus ditukar menjadi nilai digital untuk diproses dan penukarannya harus tepat. Apabila voltan analog input diberikan kepada STM32 pada input Analognya, nilai analog dibaca dan disimpan dalam pembolehubah integer. Nilai Analog yang tersimpan (0-3.3V) diubah menjadi nilai integer (0-4096) menggunakan formula di bawah:
INPUT VOLTAGE = (Nilai ADC / Resolusi ADC) * Voltan Rujukan
Ketetapan = 4096
Rujukan = 3.3V
Pin ADC dalam STM32F103C8T6
Terdapat 10 Pin Analog di STM32 dari PA0 hingga PB1.
Juga periksa cara menggunakan ADC dalam Mikrokontroler lain:
- Bagaimana Menggunakan ADC di Arduino Uno?
- Memadankan ADC0808 dengan Mikrokontroler 8051
- Menggunakan Modul ADC Mikrokontroler PIC
- Tutorial ADP Raspberry Pi
- Cara menggunakan ADC dalam MSP430G2 - Mengukur Voltan Analog
Komponen Diperlukan
- STM32F103C8
- LCD 16 * 2
- Potensiometer 100k
- Papan roti
- Menyambung wayar
Rajah dan Penjelasan Litar
Gambarajah litar ke antara muka 16 * 2 LCD dan Input Analog ke papan STM32F103C8T6 ditunjukkan di bawah.
Sambungan yang dilakukan untuk LCD diberikan di bawah:
No Pin LCD |
Nama Pin LCD |
Nama Pin STM32 |
1 |
Tanah (Gnd) |
Tanah (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin dari Pusat Potensiometer |
4 |
Daftar Pilih (RS) |
PB11 |
5 |
Baca / Tulis (RW) |
Tanah (G) |
6 |
Aktifkan (EN) |
PB10 |
7 |
Bit Data 0 (DB0) |
Tiada Sambungan (NC) |
8 |
Bit Data 1 (DB1) |
Tiada Sambungan (NC) |
9 |
Bit Data 2 (DB2) |
Tiada Sambungan (NC) |
10 |
Bit Data 3 (DB3) |
Tiada Sambungan (NC) |
11 |
Bit Data 4 (DB4) |
PB0 |
12 |
Bit Data 5 (DB5) |
PB1 |
13 |
Bit Data 6 (DB6) |
PC13 |
14 |
Bit Data 7 (DB7) |
PC14 |
15 |
Positif LED |
5V |
16 |
Negatif LED |
Tanah (G) |
Sambungan dibuat mengikut jadual yang diberikan di atas. Terdapat dua Potensiometer yang ada di litar, yang pertama digunakan untuk pembahagi voltan yang dapat digunakan untuk mengubah voltan dan memberikan input analog ke STM32. Pin kiri potensiometer ini mendapat voltan positif input dari STM32 (3.3V) dan pin kanan disambungkan ke tanah, pin pusat potensiometer disambungkan ke pin input analog (PA7) STM32. Potensiometer lain digunakan untuk mengubah kontras paparan LCD. Sumber kuasa untuk STM32 disediakan melalui bekalan kuasa USB dari PC atau Laptop.
Pengaturcaraan STM32 untuk membaca nilai ADC
Dalam tutorial sebelumnya, kami mengetahui mengenai Programming STM32F103C8T6 Board menggunakan USB Port. Oleh itu, kita tidak memerlukan pengaturcara FTDI sekarang. Cukup sambungkan ke PC melalui port USB STM32 dan mulakan pengaturcaraan dengan ARDUINO IDE. Memprogram STM32 anda dalam ARDUINO IDE untuk membaca voltan analog sangat mudah. Ia sama seperti papan arduino. Tidak perlu menukar pin pelompat STM32.
Dalam program ini akan membaca nilai analog dan mengira voltan dengan nilai tersebut dan kemudian memaparkan kedua, nilai analog dan digital, pada skrin LCD.
Pertama tentukan pin LCD. Ini menentukan pin STM32 mana pin LCD disambungkan. Anda boleh mengubah mengikut keperluan anda.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // sebutkan nama pin dengan LCD yang disambungkan
Seterusnya, kami memasukkan fail tajuk untuk paparan LCD. Ini memanggil perpustakaan yang mengandungi kod bagaimana STM32 harus berkomunikasi dengan LCD. Pastikan juga fungsi Liquid Crystal dipanggil dengan nama pin yang baru kita tentukan di atas.
#sertakan
Di dalam fungsi setup () , kami hanya akan memberikan pesan intro untuk ditampilkan di layar LCD. Anda boleh belajar mengenai menghubungkan LCD dengan STM32.
lcd.begin (16, 2); // Kami menggunakan lcd.clear 16 * 2 LCD (); // Kosongkan skrin lcd.setCursor (0, 0); // Pada baris pertama lajur pertama lcd.prin t ("CIRCUITDIGEST"); // Cetak lcd.setCursor ini (0, 1); // Pada secound baris colum pertama n lcd.print ("STM32F103C8"); // Cetak thi s tunda (2000); // tunggu dua saat lcd.clear (); // Kosongkan skrin lcd.setCursor (0, 0); // Pada baris pertama lcd.print lajur pertama ("MENGGUNAKAN ADC IN"); // Cetak lcd.setCursor ini (0,1); // Pada baris kedua lajur pertama lcd.print ("STM32F103C8"); // Cetak kelewatan ini (2000); // tunggu dua saat lcd.clear (); // Kosongkan skrin
Akhirnya, di dalam fungsi gelung tak terhingga () , kita mula membaca voltan analog yang dibekalkan ke pin PA7 dari potensiometer. Seperti yang telah kita bincangkan, mikrokontroler adalah peranti digital dan tidak dapat langsung membaca tahap voltan. Dengan menggunakan teknik SAR tahap voltan dipetakan dari 0 hingga 4096. Nilai-nilai ini disebut nilai ADC, untuk mendapatkan nilai ADC ini, gunakan garis berikut
int val = analogRead (A7); // baca nilai ADC dari pin PA 7
Di sini fungsi analogRead () digunakan untuk membaca nilai analog pin. Akhirnya kami menyimpan nilai ini dalam pemboleh ubah yang disebut " val ". Jenis pemboleh ubah ini adalah bilangan bulat kerana kita hanya akan mendapat nilai antara 0 hingga 4096 untuk disimpan dalam pemboleh ubah ini.
Langkah seterusnya adalah mengira nilai voltan dari nilai ADC. Untuk melakukan ini, kita mempunyai formula berikut
Voltan = (Nilai ADC / Resolusi ADC) * Voltag Rujukan e
Dalam kes kami, kami sudah mengetahui bahawa resolusi ADC mikrokontroler kami adalah 4096. Nilai ADC juga terdapat pada baris sebelumnya dan menyimpan pemboleh ubah yang disebut val. The voltan rujukan adalah sama dengan voltan di mana pengawal mikro beroperasi. Apabila papan STM32 dihidupkan melalui kabel USB maka voltan operasi adalah 3.3V. Anda juga boleh mengukur voltan operasi dengan menggunakan multimeter melintasi Vcc dan pin ground di papan. Jadi formula di atas sesuai dengan kes kita seperti yang ditunjukkan di bawah
voltan apungan = (apungan (val) / 4096) * 3.3; // formula untuk menukar nilai ADC ke voltag e
Anda mungkin keliru dengan garis terapung (val). Ini digunakan untuk mengubah variabel "val" dari jenis data int menjadi jenis data "float". Penukaran ini diperlukan kerana hanya jika kita mendapat hasil val / 4096 di float kita dapat menggandakannya 3.3. Sekiranya nilainya diterima dalam bilangan bulat, ia akan selalu 0 dan hasilnya juga akan menjadi sifar. Setelah kami mengira nilai dan voltan ADC, yang tinggal hanyalah memaparkan hasilnya pada layar LCD yang dapat dilakukan dengan menggunakan baris berikut
lcd.setCursor (0, 0); // tetapkan kursor ke lajur 0, baris 0 lcd.print ("ADC Val:"); lcd.print (val); // Paparkan nilai ADC lcd.setCursor (0, 1); // tetapkan kursor ke lajur 0, baris 1 lcd.print ("Voltage:"); lcd.print (voltan); // Voltan paparan
Kod lengkap dan Video Demonstrasi diberikan di bawah.