- Bahan yang Dibutuhkan
- ADC di STM8S103F3P6
- Diagram Sirkuit untuk Membaca Nilai ADC pada STM8S dan Tampilan pada LCD
- Perpustakaan ADC untuk STM8S103F3P6
- Program STM8S untuk Membaca Tegangan Analog dan Tampilan pada LCD
- Membaca Tegangan Analog dari Dua Potensiometer menggunakan STM8S
Jika Anda adalah pembaca biasa yang mengikuti Tutorial Mikrokontroler STM8S kami, Anda akan tahu bahwa dalam tutorial terakhir kami, kami mempelajari cara menghubungkan LCD 16x2 dengan STM8s. Sekarang, lanjutkan dengan tutorial ini, kita akan belajar bagaimana menggunakan fitur ADC pada Mikrokontroler STM8S103F3P6 kita. ADC adalah perangkat yang sangat berguna pada mikrokontroler yang sering digunakan oleh programmer tertanam untuk mengukur unit yang berada dalam perubahan konstan seperti tegangan, arus, suhu, kelembaban, dll.
Seperti yang kita ketahui “Kita hidup di dunia analog dengan perangkat digital”, artinya segala sesuatu di sekitar kita seperti kecepatan angin, intensitas cahaya, suhu, dan segala sesuatu yang kita hadapi seperti kecepatan, kecepatan, tekanan, dll. Bersifat analog. Tetapi mikrokontroler dan mikroprosesor kami adalah perangkat digital dan mereka tidak akan dapat mengukur parameter ini tanpa perangkat penting yang disebut Analog to Digital Converters (ADC). Jadi pada artikel kali ini, mari kita pelajari cara menggunakan ADC pada Mikrokontroler STM8S dengan compiler COMIC C.
Bahan yang Dibutuhkan
Pada artikel ini, kita akan membaca dua nilai tegangan analog dari dua potensiometer dan menampilkan nilai ADC-nya pada layar LCD 16x2. Untuk melakukan ini, kita membutuhkan komponen-komponen berikut.
- Papan pengembangan STM8S103F3P6
- Pemrogram ST-Link V2
- LCD 16x2
- Potensiometer
- Menghubungkan kabel
- Resistor 1k
ADC di STM8S103F3P6
Ada banyak jenis ADC dan setiap mikrokontroler memiliki spesifikasinya sendiri-sendiri. Pada STM8S103F3P6, kami memiliki ADC dengan 5 Channel dan resolusi 10-bit; dengan resolusi 10-bit, kita akan dapat mengukur nilai digital dari 0 hingga 1024 dan ADC 5 saluran menunjukkan bahwa kita memiliki 5 pin pada Mikrokontroler yang dapat mendukung ADC, 5 pin ini disorot pada gambar di bawah.
Seperti yang Anda lihat, kelima pin ini (AIN2, AIN3, AIN4, AIN5, dan AIN6) di-multipleks dengan periferal lain, artinya selain hanya berfungsi sebagai pin ADC, pin ini juga dapat digunakan untuk melakukan komunikasi lain seperti misalnya, pin 2 dan 3 (AIN5 dan AIN 6) tidak hanya dapat digunakan untuk ADC tetapi juga dapat digunakan untuk komunikasi serial dan fungsi GPIO. Perhatikan bahwa tidak mungkin menggunakan pin yang sama untuk ketiga tujuan tersebut, jadi jika kita menggunakan kedua pin ini untuk ADC, maka kita tidak akan dapat melakukan komunikasi serial. Karakteristik ADC penting lainnya untuk STM8S103P36 dapat ditemukan pada tabel di bawah ini yang diambil dari lembar data.
Dalam tabel di atas, Vdd mewakili tegangan operasi dan Vss mewakili ground. Jadi dalam kasus kami di papan pengembangan kami, kami memiliki mikrokontroler yang beroperasi pada 3.3V, Anda dapat memeriksa diagram sirkuit papan pengembangan dari memulai dengan tutorial STM8S. Dengan 3.3V sebagai tegangan operasi, frekuensi clock ADC kami dapat diatur antara 1 hingga 4MHz dan rentang tegangan konversi kami adalah antara 0V hingga 3.3V. Ini berarti ADC 10-bit kami akan membaca 0 ketika 0V (Vss) disediakan dan akan membaca maksimum 1024 ketika 3,3V (Vdd) disediakan. Kita dapat dengan mudah mengubah 0-5V ini dengan mengubah tegangan operasi MCU jika diperlukan.
Diagram Sirkuit untuk Membaca Nilai ADC pada STM8S dan Tampilan pada LCD
Diagram rangkaian lengkap yang digunakan dalam proyek ini diberikan di bawah ini, sangat mirip dengan tutorial LCD STM8S yang telah kita bahas sebelumnya.
Seperti yang Anda lihat, satu-satunya komponen tambahan selain LCD adalah dua potensiometer POT_1 dan POT_2 . Pot ini disambungkan ke port PC4 dan PD6 yang merupakan pin ANI2 dan ANI6 seperti yang dibahas pada gambar pinout sebelumnya.
Potensiometer dihubungkan sedemikian rupa sehingga ketika kita memvariasikannya, kita akan mendapatkan 0-5 V pada pin analog kita. Kami akan memprogram pengontrol kami untuk membaca tegangan analog ini dalam nilai digital (0 hingga 1024) dan menampilkannya di layar LCD. Kemudian kami juga akan menghitung nilai tegangan ekuivalen dan menampilkannya di LCD, ingatlah bahwa pengontrol kami didukung oleh 3.3V, jadi meskipun kami memberikan 5V ke pin ADC, itu hanya akan dapat membaca dari 0V ke 3.3V.
Setelah koneksi selesai, perangkat keras saya terlihat seperti ini seperti yang ditunjukkan di bawah ini. Anda dapat melihat dua potensiometer di kanan dan programmer ST-link di sebelah kiri.
Perpustakaan ADC untuk STM8S103F3P6
Untuk memprogram fungsi ADC di STM8S, kami akan menggunakan kompiler Cosmic C bersama dengan pustaka SPL. Tetapi untuk mempermudah proses, saya membuat file header lain yang dapat ditemukan di GitHub dengan tautan di bawah ini.
Perpustakaan ADC untuk STM8S103F3P6
Jika Anda tahu apa yang Anda lakukan, Anda dapat membuat file header menggunakan kode di atas dan menambahkannya ke direktori "sertakan file" pada halaman proyek Anda. Lain, ikuti memulai dengan tutorial STM8S untuk mengetahui bagaimana mengatur lingkungan pemrograman dan kompiler Anda. Setelah penyiapan Anda siap, IDE Anda harus memiliki file header berikut, setidaknya yang dilingkari merah.
File header di atas terdiri dari fungsi yang disebut ADC_Read () . Fungsi ini dapat dipanggil di program utama Anda untuk mendapatkan nilai ADC di pin mana pun. Misalnya, ADC_Read (AN2) akan mengembalikan nilai ADC pada pin AN2 sebagai hasilnya. Fungsinya ditunjukkan di bawah ini.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int result = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (AKTIFKAN); ADC1_StartConversion (); sementara (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); hasil = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Seperti yang Anda lihat, kita dapat meneruskan delapan parameter ke fungsi ini dan ini menentukan bagaimana ADC dikonfigurasi. Dalam kode perpustakaan kami di atas, kami telah mengatur mode konversi ke kontinu dan kemudian mendapatkan nomor saluran melewati parameter. Dan kemudian kita harus mengatur frekuensi CPU pengontrol kita, secara default (jika Anda belum menghubungkan kristal eksternal), STM8S Anda akan bekerja dengan osilator internal 16Mhz. Jadi kami telah menyebutkan " ADC1_PRESSEL_FCPU_D18 " sebagai nilai pra- skala . Di dalam fungsi ini, kami menggunakan metode lain yang ditentukan oleh file header SPL stm8s_adc1.h . Kita mulai dengan De-inisialisasi pin ADC dan kemudian ADC1_Init () untuk menginisialisasi perangkat ADC. Definisi fungsi ini dari panduan pengguna SPL ditampilkan di bawah ini.
Selanjutnya, kami mengatur pemicu eksternal menggunakan timer dan menonaktifkan pemicu eksternal karena kami tidak akan menggunakannya di sini. Dan kemudian kita memiliki penyelarasan yang diatur ke kanan dan dua parameter terakhir digunakan untuk mengatur pemicu Schmitt, tetapi kita akan menonaktifkannya untuk tutorial ini. Jadi, singkatnya, kami akan membuat ADC kami bekerja dalam mode konversi berkelanjutan pada pin ADC yang diperlukan dengan pemicu eksternal dan pemicu Schmitt dinonaktifkan. Anda dapat memeriksa lembar data jika Anda memerlukan informasi lebih lanjut tentang cara menggunakan pemicu eksternal atau opsi pemicu Schmitt, kami tidak akan membahasnya dalam tutorial ini.
Program STM8S untuk Membaca Tegangan Analog dan Tampilan pada LCD
Kode lengkap yang digunakan dalam file main.c dapat ditemukan di bagian bawah halaman ini. Setelah menambahkan file header dan file sumber yang diperlukan, Anda seharusnya bisa langsung mengkompilasi file utama. Penjelasan kode pada file utama adalah sebagai berikut. Saya tidak akan menjelaskan program LCD STM8S karena kita telah membahasnya di tutorial sebelumnya.
Tujuan dari kode ini adalah untuk membaca nilai ADC dari dua pin dan mengubahnya menjadi nilai tegangan. Kami juga akan menampilkan nilai ADC dan nilai Tegangan pada LCD. Jadi, saya telah menggunakan fungsi yang disebut LCD_Print Var yang mengambil variabel dalam format integer dan mengubahnya menjadi karakter untuk ditampilkan di LCD. Kami telah menggunakan modulus sederhana (%) dan operator membagi (/) untuk mendapatkan setiap digit dari variabel dan memasukkan variabel seperti d1, d2, d3, dan d4 seperti yang ditunjukkan di bawah ini. Kemudian kita dapat menggunakan fungsi LCD_Print_Char untuk menampilkan karakter ini pada LCD.
void LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
Selanjutnya di bawah fungsi utama, kami memiliki empat variabel yang dideklarasikan. Dua di antaranya digunakan untuk menyimpan nilai ADC (0 hingga 1024) dan dua lainnya digunakan untuk mendapatkan nilai tegangan aktual.
unsigned int ADC_value_1 = 0; unsigned int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Selanjutnya, kita harus menyiapkan konfigurasi pin GPIO dan jam untuk membaca tegangan analog. Di sini kita akan membaca tegangan analog dari pin AIN2 dan AIN6 yang masing-masing merupakan pin PC4 dan PD6. Kami harus mendefinisikan pin ini dalam keadaan mengambang seperti yang ditunjukkan di bawah ini. Kami juga akan mengaktifkan periferal jam untuk ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Aktifkan Jam Periferal untuk ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Sekarang pin sudah siap, kita harus masuk ke loop sementara tak terbatas untuk membaca tegangan analog. Karena kami memiliki file header kami, kami dapat dengan mudah membaca tegangan analog dari pin AIN2 dan AIN 6 menggunakan baris di bawah ini.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Langkah selanjutnya adalah mengubah pembacaan ADC ini (0 hingga 1023) menjadi tegangan analog. Dengan cara ini, kita dapat menampilkan nilai tegangan yang tepat yang diberikan pada pin AIN2 dan AIN6. Rumus untuk menghitung Tegangan Analog dapat diberikan oleh-
Tegangan Analog = Pembacaan ADC * (3300/1023)
Dalam kasus kami pada pengontrol STM8S103F3, kami memiliki ADC dengan resolusi 10-bit, jadi kami telah menggunakan 1023 (2 ^ 10) . Juga pada pengembangan kami mendukung pengontrol dengan 3.3V yaitu 3300, jadi kami membagi 3300 dengan 1023 dalam rumus di atas. Sekitar 3300/1023 akan memberi kita 3,226, jadi pada program kita, kita memiliki baris berikut untuk mengukur tegangan ADC yang sebenarnya menggunakan tegangan ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3,226) ubah nilai ADC 1 menjadi 0 menjadi 3300mV ADC_voltage_2 = ADC_value_2 * (3,226); // ubah nilai ADC 1 menjadi 0 hingga 3300mV
Bagian kode yang tersisa hanya digunakan untuk menampilkan keempat nilai ini di layar LCD. Kami juga memiliki penundaan 500ms sehingga LCD diperbarui untuk setiap 500mS. Anda dapat mengurangi ini lebih lanjut jika Anda membutuhkan pembaruan yang lebih cepat.
Membaca Tegangan Analog dari Dua Potensiometer menggunakan STM8S
Kompilasi kode dan unggah ke papan pengembangan Anda. Jika Anda mendapatkan kesalahan kompilasi, pastikan Anda telah menambahkan semua file header dan file sumber seperti yang dibahas sebelumnya. Setelah kode diunggah, Anda akan melihat pesan selamat datang kecil yang mengatakan "ADC di STM8S" dan kemudian Anda akan melihat layar di bawah ini.
Nilai D1 dan D2 menunjukkan nilai ADC dari pin Ain2 dan AIN6 masing-masing. Di sisi kanan, kami juga memiliki nilai tegangan ekuivalen yang ditampilkan. Nilai ini harus sama dengan tegangan yang muncul pada pin AIN2 dan AIN6 masing-masing. Kami dapat memeriksa hal yang sama menggunakan multimeter, kami juga dapat memvariasikan potensiometer untuk memeriksa apakah nilai tegangan juga berubah sesuai.
Pekerjaan lengkap juga dapat ditemukan di video di bawah ini. Semoga Anda menikmati tutorial ini dan mempelajari sesuatu yang bermanfaat, jika Anda memiliki pertanyaan, tinggalkan di bagian komentar di bawah. Anda juga dapat menggunakan forum kami untuk memulai diskusi atau memposting pertanyaan teknis lainnya.