- Membandingkan ADC di Arduino dan STM32F103C8
- ADC di STM32
- Bagaimana Sinyal Analog diubah menjadi Format Digital
- Pin ADC di STM32F103C8T6
- Komponen Diperlukan
- Diagram Sirkuit dan Penjelasannya
- Pemrograman STM32 untuk membaca nilai ADC
Salah satu fitur umum yang digunakan di hampir setiap aplikasi tertanam adalah modul ADC (Analog to Digital Converter). Ini Analog ke Converter digital dapat membaca tegangan dari sensor analog seperti sensor suhu, sensor Tilt, sensor sekarang, Flex sensor dan banyak lagi. Jadi dalam tutorial ini kita akan belajar bagaimana menggunakan ADC di STM32F103C8 untuk membaca tegangan Analog menggunakan Energia IDE. Kami akan menghubungkan potensiometer kecil ke papan Pill Biru STM32 dan memasok tegangan yang bervariasi ke pin Analog, membaca voltase dan menampilkannya pada layar LCD 16x2.
Membandingkan ADC di Arduino dan STM32F103C8
Di papan Arduino, ini berisi 6 saluran (8 saluran di Mini dan Nano, 16 di Mega), ADC 10-bit dengan rentang tegangan input 0V – 5V. Ini berarti akan memetakan tegangan input antara 0 dan 5 volt menjadi nilai integer antara 0 dan 1023. Sekarang dalam kasus STM32F103C8 kami memiliki 10 saluran, ADC 12-Bit dengan kisaran input 0V -3,3V. Ini akan memetakan tegangan input antara 0 dan 3,3 volt menjadi nilai integer antara 0 dan 4095.
ADC di STM32
ADC yang tertanam dalam mikrokontroler STM32 menggunakan prinsip SAR (successive apximation register), di mana konversi dilakukan dalam beberapa langkah. Jumlah langkah konversi sama dengan jumlah bit pada konverter ADC. Setiap langkah digerakkan oleh jam ADC. Setiap jam ADC menghasilkan satu bit dari hasil ke keluaran. Desain internal ADC didasarkan pada teknik kapasitor-sakelar. Jika Anda baru mengenal STM32, lihat tutorial Memulai STM32 kami.
Resolusi 12-bit
ADC ini adalah ADC 10 saluran 12-bit. Di sini istilah 10 saluran menyiratkan bahwa ada 10 pin ADC yang dapat digunakan untuk mengukur tegangan analog. Istilah 12-bit menyiratkan resolusi ADC. 12-bit artinya 2 pangkat sepuluh (2 12) yaitu 4096. Ini adalah jumlah sample langkah untuk ADC kita, jadi range nilai ADC kita akan dari 0 sampai 4095. Nilainya akan meningkat dari 0 sampai 4095 berdasarkan nilai tegangan per langkah, yang dapat dihitung dengan rumus
TEGANGAN / LANGKAH = TEGANGAN REFERENSI / 4096 = (3.3 / 4096 = 8.056mV) per unit.
Bagaimana Sinyal Analog diubah menjadi Format Digital
Karena komputer menyimpan dan memproses hanya nilai biner / digital (1 dan 0). Jadi sinyal analog seperti keluaran sensor dalam volt harus diubah menjadi nilai digital untuk diproses dan konversi harus akurat. Ketika tegangan analog input diberikan ke STM32 pada input Analognya, nilai analog dibaca dan disimpan dalam variabel integer. Nilai Analog yang disimpan itu (0-3,3V) diubah menjadi nilai bilangan bulat (0-4096) menggunakan rumus di bawah ini:
TEGANGAN INPUT = (Nilai ADC / Resolusi ADC) * Tegangan Referensi
Resolusi = 4096
Referensi = 3.3V
Pin ADC di STM32F103C8T6
Ada 10 Pin Analog di STM32 dari PA0 hingga PB1.
Periksa juga cara menggunakan ADC di Mikrokontroler lain:
- Bagaimana cara menggunakan ADC di Arduino Uno?
- Menghubungkan ADC0808 dengan Mikrokontroler 8051
- Menggunakan Modul ADC Mikrokontroler PIC
- Tutorial ADC Raspberry Pi
- Cara menggunakan ADC di MSP430G2 - Mengukur Tegangan Analog
Komponen Diperlukan
- STM32F103C8
- LCD 16 * 2
- Potensiometer 100k
- Papan tempat memotong roti
- Menghubungkan kabel
Diagram Sirkuit dan Penjelasannya
Diagram sirkuit untuk menghubungkan LCD 16 * 2 dan Input Analog ke papan STM32F103C8T6 ditunjukkan di bawah ini.
Koneksi yang dilakukan untuk LCD diberikan di bawah ini:
Pin LCD Tidak Ada |
Nama Pin LCD |
Nama Pin STM32 |
1 |
Tanah (Gnd) |
Tanah (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin dari Center of Potentiometer |
4 |
Register Select (RS) |
PB11 |
5 |
Baca / Tulis (RW) |
Tanah (G) |
6 |
Aktifkan (EN) |
PB10 |
7 |
Data Bit 0 (DB0) |
Tidak Ada Koneksi (NC) |
8 |
Data Bit 1 (DB1) |
Tidak Ada Koneksi (NC) |
9 |
Data Bit 2 (DB2) |
Tidak Ada Koneksi (NC) |
10 |
Data Bit 3 (DB3) |
Tidak Ada Koneksi (NC) |
11 |
Data Bit 4 (DB4) |
PB0 |
12 |
Data Bit 5 (DB5) |
PB1 |
13 |
Data Bit 6 (DB6) |
PC13 |
14 |
Data Bit 7 (DB7) |
PC14 |
15 |
LED Positif |
5V |
16 |
LED Negatif |
Tanah (G) |
Sambungan dibuat sesuai dengan tabel yang diberikan di atas. Ada dua Potensiometer yang ada di rangkaian, yang pertama digunakan untuk pembagi tegangan yang dapat digunakan untuk memvariasikan tegangan dan memberikan input analog ke STM32. Pin kiri potensiometer ini mendapat tegangan input positif dari STM32 (3.3V) dan pin kanan dihubungkan ke ground, pin tengah potensiometer dihubungkan ke pin input analog (PA7) STM32. Potensiometer lain digunakan untuk memvariasikan kontras layar LCD. Sumber daya untuk STM32 disediakan melalui catu daya USB dari PC atau Laptop.
Pemrograman STM32 untuk membaca nilai ADC
Dalam tutorial kami sebelumnya, kami belajar tentang Pemrograman Papan STM32F103C8T6 menggunakan Port USB. Jadi kami tidak membutuhkan programmer FTDI sekarang. Cukup hubungkan ke PC melalui port USB STM32 dan mulai pemrograman dengan ARDUINO IDE. Pemrograman STM32 Anda dalam ARDUINO IDE untuk membaca tegangan analog sangat sederhana. Itu sama seperti papan arduino. Tidak perlu mengubah pin jumper STM32.
Dalam program ini akan membaca nilai analog dan menghitung tegangan dengan nilai tersebut dan kemudian menampilkan keduanya, nilai analog dan digital, pada layar LCD.
Pertama tentukan pin LCD. Ini menentukan pin STM32 mana yang menghubungkan pin LCD. Anda dapat memodifikasi sesuai kebutuhan Anda.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // sebutkan nama pin dengan LCD yang terhubung
Selanjutnya, kami menyertakan file header untuk tampilan LCD. Ini memanggil perpustakaan yang berisi kode bagaimana STM32 harus berkomunikasi dengan LCD. Pastikan juga fungsi Liquid Crystal dipanggil dengan nama pin yang baru saja kita tentukan di atas.
#include
Di dalam fungsi setup () , kami hanya akan memberikan pesan intro untuk ditampilkan di layar LCD. Anda dapat mempelajari tentang antarmuka LCD dengan STM32.
lcd.begin (16, 2); // Kami menggunakan LCD lcd.clear () 16 * 2 ; // Kosongkan layar lcd.setCursor (0, 0); // Pada baris pertama kolom pertama lcd.prin t ("CIRCUITDIGEST"); // Cetak lcd.setCursor ini (0, 1); // Pada baris kedua kolom pertama n lcd.print ("STM32F103C8"); // Cetak thi s delay (2000); // tunggu dua detik lcd.clear (); // Kosongkan layar lcd.setCursor (0, 0); // Pada baris pertama kolom pertama lcd.print ("USING ADC IN"); // Cetak lcd.setCursor ini (0,1); // Pada baris kedua kolom pertama lcd.print ("STM32F103C8"); // Cetak penundaan ini (2000); // tunggu dua detik lcd.clear (); // Bersihkan layar
Akhirnya, di dalam fungsi infinite loop () kami, kami mulai membaca tegangan analog yang disuplai ke pin PA7 dari potensiometer. Seperti yang telah kita bahas, mikrokontroler adalah perangkat digital dan tidak dapat membaca level tegangan secara langsung. Dengan menggunakan teknik SAR level tegangan dipetakan dari 0 hingga 4096. Nilai-nilai ini disebut nilai ADC, untuk mendapatkan nilai ADC ini cukup gunakan baris berikut
int val = analogRead (A7); // baca nilai ADC dari pin PA 7
Disini fungsi analogRead () digunakan untuk membaca nilai analog dari pin. Akhirnya kami menyimpan nilai ini dalam variabel yang disebut " val ". Jenis variabel ini adalah integer karena kita hanya akan mendapatkan nilai mulai dari 0 hingga 4096 untuk disimpan di variabel ini.
Langkah selanjutnya adalah menghitung nilai tegangan dari nilai ADC. Untuk melakukan ini, kami memiliki rumus berikut
Tegangan = (Nilai ADC / Resolusi ADC) * Voltase Referensi e
Dalam kasus kami, kami sudah tahu bahwa resolusi ADC mikrokontroler kami adalah 4096. Nilai ADC juga ditemukan di baris sebelumnya dan menyimpan variabel yang disebut val. The tegangan referensi adalah sama dengan tegangan di mana mikrokontroler beroperasi. Ketika papan STM32 diberi daya melalui kabel USB maka tegangan operasi adalah 3,3V. Anda juga dapat mengukur tegangan operasi dengan menggunakan multimeter di Vcc dan pin arde di papan. Jadi rumus di atas cocok dengan kasus kami seperti yang ditunjukkan di bawah ini
tegangan float = (float (val) / 4096) * 3,3; // rumus untuk mengubah nilai ADC menjadi voltag e
Anda mungkin bingung dengan garis float (val). Ini digunakan untuk mengubah variabel "val" dari tipe data int menjadi tipe data "float". Konversi ini diperlukan karena hanya jika kita mendapatkan hasil val / 4096 dalam float kita bisa mengalikannya 3,3. Jika nilai yang diterima dalam integer akan selalu 0 dan hasilnya juga akan nol. Setelah kita menghitung nilai ADC dan voltase, yang tersisa hanyalah menampilkan hasilnya pada layar LCD yang dapat dilakukan dengan menggunakan baris berikut
lcd.setCursor (0, 0); // setel kursor ke kolom 0, baris 0 lcd.print ("ADC Val:"); lcd.print (val); // Menampilkan nilai ADC lcd.setCursor (0, 1); // setel kursor ke kolom 0, baris 1 lcd.print ("Voltage:"); lcd.print (voltase); // Tegangan tampilan
Kode lengkap dan Video Demonstrasi diberikan di bawah ini.