- Bahan yang Diperlukan
- ADC pada STM8S103F3P6
- Litar Diagram untuk Membaca Nilai ADC pada STM8S dan Paparan pada LCD
- Perpustakaan ADC untuk STM8S103F3P6
- Program STM8S untuk Membaca Voltan Analog dan Paparan pada LCD
- Membaca Voltan Analog dari Dua Potensiometer menggunakan STM8S
Sekiranya anda seorang pembaca biasa yang mengikuti Tutorial Mikrokontroler STM8S kami, anda akan mengetahui bahawa dalam tutorial terakhir kami, kami belajar bagaimana untuk mengaitkan LCD 16x2 dengan STM8. Sekarang, lanjutkan dengan tutorial ini, kita akan belajar bagaimana menggunakan ciri ADC pada Mikrokontroler STM8S103F3P6 kami. ADC adalah periferal yang sangat berguna pada mikrokontroler yang sering digunakan oleh pengaturcara tertanam untuk mengukur unit yang sentiasa berubah seperti voltan, arus, suhu, kelembapan, dan lain-lain yang berbeza-beza.
Seperti yang kita ketahui "Kita hidup di dunia analog dengan peranti digital", yang bermaksud segala yang ada di sekitar kita seperti kelajuan angin, intensiti cahaya, suhu, dan semua yang kita hadapi seperti kelajuan, halaju, tekanan, dan lain-lain bersifat analog. Tetapi mikrokontroler dan mikropemproses kami adalah peranti digital dan mereka tidak akan dapat mengukur parameter ini tanpa periferal penting yang disebut Analog to Digital Converter (ADC). Oleh itu, dalam artikel ini, mari belajar bagaimana menggunakan ADC pada Mikrokontroler STM8S dengan penyusun COMIC C.
Bahan yang Diperlukan
Dalam artikel ini, kita akan membaca dua nilai voltan analog dari dua potensiometer dan memaparkan nilai ADCnya pada paparan LCD 16x2. Untuk melakukan ini, kita memerlukan komponen berikut.
- Papan pengembangan STM8S103F3P6
- Pengaturcara ST-Link V2
- LCD 16x2
- Potensiometer
- Menyambung wayar
- Perintang 1k
ADC pada STM8S103F3P6
Terdapat banyak jenis ADC dan setiap mikrokontroler mempunyai spesifikasi tersendiri. Pada STM8S103F3P6, kami mempunyai ADC dengan resolusi 5 Saluran dan 10-bit; dengan resolusi 10-bit, kita akan dapat mengukur nilai digital dari 0 hingga 1024 dan ADC 5 saluran menunjukkan bahawa kita mempunyai 5 pin pada Mikrokontroler yang dapat menyokong ADC, 5 pin ini diserlahkan dalam gambar di bawah.
Seperti yang anda lihat, kelima-lima pin ini (AIN2, AIN3, AIN4, AIN5, dan AIN6) dilipatgandakan dengan periferal lain, yang bermaksud selain hanya bertindak sebagai pin ADC, pin ini juga dapat digunakan untuk melakukan komunikasi lain seperti, pin 2 dan 3 (AIN5 dan AIN 6) tidak hanya dapat digunakan untuk ADC tetapi juga dapat digunakan untuk komunikasi bersiri dan fungsi GPIO. Perhatikan bahawa tidak mungkin menggunakan pin yang sama untuk ketiga-tiga tujuan, jadi jika kita menggunakan dua pin ini untuk ADC, maka kita tidak akan dapat melakukan komunikasi bersiri. Ciri ADC penting lain untuk STM8S103P36 boleh didapati dalam jadual di bawah yang diambil dari lembaran data.
Dalam jadual di atas, Vdd mewakili voltan operasi dan Vss mewakili tanah. Oleh itu, dalam papan pengembangan kami, kami mempunyai mikrokontroler yang beroperasi pada 3.3V, anda boleh menyemak rajah litar papan pengembangan dari awal dengan tutorial STM8S. Dengan voltan operasi 3.3V, frekuensi jam ADC kami dapat diatur antara 1 hingga 4MHz dan julat voltan penukaran kami antara 0V hingga 3.3V. Ini bermaksud bahawa ADC 10-bit kami akan membaca 0 apabila 0V (Vss) disediakan dan akan membaca maksimum 1024 apabila 3.3V (Vdd) disediakan. Kita boleh menukar 0-5V ini dengan mudah dengan menukar voltan operasi MCU jika diperlukan.
Litar Diagram untuk Membaca Nilai ADC pada STM8S dan Paparan pada LCD
Gambarajah litar lengkap yang digunakan dalam projek ini diberikan di bawah, ia sangat serupa dengan tutorial LCD STM8S yang telah kita bincangkan sebelumnya.
Seperti yang anda lihat, satu-satunya komponen tambahan selain dari 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 dibincangkan pada gambar pinout sebelumnya.
Potensiometer disambungkan sedemikian rupa sehingga apabila kita mengubahnya, kita akan mendapat 0-5 V pada pin analog kita. Kami akan memprogram pengawal kami untuk membaca voltan analog ini dalam nilai digital (0 hingga 1024) dan memaparkannya pada skrin LCD. Kemudian kami juga akan mengira nilai voltan yang setara dan memaparkannya pada LCD, ingat bahawa pengawal kami dikuasakan oleh 3.3V, jadi walaupun kami menyediakan 5V ke pin ADC, ia hanya dapat membaca dari 0V hingga 3.3V.
Setelah sambungan selesai, perkakasan saya kelihatan seperti ini di bawah. Anda dapat melihat dua potensiometer di sebelah kanan dan programmer ST-link di sebelah kiri.
Perpustakaan ADC untuk STM8S103F3P6
Untuk memprogram fungsi ADC pada STM8S, kami akan menggunakan penyusun Cosmic C bersama dengan perpustakaan SPL. Tetapi untuk mempermudah prosesnya, saya membuat fail header lain yang boleh didapati di GitHub dengan pautan di bawah.
Perpustakaan ADC untuk STM8S103F3P6
Sekiranya anda tahu apa yang anda lakukan, anda dapat membuat fail tajuk menggunakan kod di atas dan menambahkannya ke direktori "sertakan fail" di halaman projek anda. Jika tidak, mulailah dengan tutorial STM8S untuk mengetahui cara mengatur persekitaran dan penyusun program anda. Setelah persediaan anda siap, IDE anda harus mempunyai fail tajuk berikut, sekurang-kurangnya yang dikelilingi dengan warna merah.
Fail tajuk di atas terdiri daripada fungsi yang disebut ADC_Read () . Fungsi ini boleh dipanggil dalam program utama anda untuk mendapatkan nilai ADC pada pin apa pun. Sebagai contoh, ADC_Read (AN2) akan mengembalikan nilai ADC pada pin AN2 sebagai hasilnya. Fungsi ditunjukkan di bawah.
int tidak bertanda ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {hasil int yang tidak ditandatangani = 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 (DIAMBIL); ADC1_StartConversion (); sementara (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == SALAH); hasil = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Seperti yang anda lihat, kita dapat meneruskan lapan parameter ke fungsi ini dan ini menentukan bagaimana ADC dikonfigurasi. Dalam kod perpustakaan kami di atas, kami telah menetapkan mod penukaran menjadi berterusan dan kemudian mendapatkan nombor saluran yang dilalui parameter. Dan kemudian kita harus menetapkan frekuensi CPU pengawal kami, secara lalai (jika anda belum menghubungkan kristal luaran), STM8S anda akan berfungsi dengan pengayun dalaman 16Mhz. Oleh itu, kami telah menyebut " ADC1_PRESSEL_FCPU_D18 " sebagai nilai pre-scaler. Di dalam fungsi ini, kami menggunakan kaedah lain yang ditentukan oleh fail tajuk SPL stm8s_adc1.h . Kami mulakan dengan De-inisialisasi pin ADC dan kemudian ADC1_Init () untuk memulakan periferal ADC. Definisi fungsi ini dari manual pengguna SPL ditunjukkan di bawah.
Seterusnya, kami menetapkan pemicu luaran menggunakan pemasa dan mematikan pencetus luaran kerana kami tidak akan menggunakannya di sini. Dan kemudian kita menetapkan penjajaran ke kanan dan dua parameter terakhir digunakan untuk menetapkan pencetus Schmitt, tetapi kita akan mematikannya untuk tutorial ini. Oleh itu, secara ringkas, ADC kami akan berfungsi dalam mod penukaran berterusan pada pin ADC yang diperlukan dengan pencetus luaran dan pencetus Schmitt dinonaktifkan. Anda boleh memeriksa lembar data jika anda memerlukan lebih banyak maklumat mengenai cara menggunakan pencetus luaran atau pilihan pencetus Schmitt, kami tidak akan membincangkannya dalam tutorial ini.
Program STM8S untuk Membaca Voltan Analog dan Paparan pada LCD
Kod lengkap yang digunakan dalam fail main.c terdapat di bahagian bawah halaman ini. Setelah menambahkan fail header dan fail sumber yang diperlukan, anda seharusnya dapat menyusun fail utama secara langsung. Penjelasan kod dalam fail utama adalah seperti berikut. Saya tidak akan menerangkan program LCD STM8S kerana kita telah membincangkannya dalam tutorial sebelumnya.
Tujuan kod ini adalah untuk membaca nilai ADC dari dua pin dan menukarnya menjadi nilai voltan. Kami juga akan memaparkan nilai ADC dan nilai Voltan pada LCD. Oleh itu, saya telah menggunakan fungsi yang disebut LCD_Print Var yang mengambil pemboleh ubah dalam format bilangan bulat dan mengubahnya menjadi watak sehingga dapat memaparkannya pada LCD. Kami telah menggunakan operator modulus sederhana (%) dan membahagi (/) untuk mendapatkan setiap digit dari pemboleh ubah dan memasukkan pemboleh ubah seperti d1, d2, d3, dan d4 seperti yang ditunjukkan di bawah. Kemudian kita boleh menggunakan fungsi LCD_Print_Char untuk memaparkan watak-watak ini pada LCD.
batal 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, kita mempunyai empat pemboleh ubah yang dinyatakan. Dua daripadanya digunakan untuk menyimpan nilai ADC (0 hingga 1024) dan dua lagi digunakan untuk mendapatkan nilai voltan sebenar.
int tidak bertanda ADC_value_1 = 0; int tidak bertanda ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
Seterusnya, kita harus menyiapkan pin GPIO dan konfigurasi jam untuk membaca voltan analog. Di sini kita akan membaca voltan analog dari pin AIN2 dan AIN6 yang masing-masing adalah pin PC4 dan PD6. Kita harus menentukan pin ini dalam keadaan terapung seperti yang ditunjukkan di bawah. Kami juga akan mengaktifkan periferal jam untuk ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Dayakan 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 memasuki gelung sementara tanpa had untuk membaca voltan analog. Oleh kerana kami mempunyai fail tajuk kami, kami dapat membaca voltan analog dari pin AIN2 dan AIN 6 dengan mudah menggunakan baris di bawah.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Langkah seterusnya adalah menukar bacaan ADC ini (0 hingga 1023) ke voltan analog. Dengan cara ini, kita dapat memaparkan nilai voltan tepat yang diberikan pada pin AIN2 dan AIN6. Rumus untuk mengira Voltan Analog dapat diberikan oleh-
Voltan Analog = Bacaan ADC * (3300/1023)
Dalam kes kami pada pengawal STM8S103F3, kami mempunyai ADC dengan resolusi 10-bit, jadi kami telah menggunakan 1023 (2 ^ 10) . Juga pada pengembangan kami memberi kuasa kepada pengawal dengan 3.3V iaitu 3300, jadi kami membahagikan 3300 dengan 1023 dalam formula di atas. Kira-kira 3300/1023 akan memberi kita 3.226, jadi pada program kami, kami mempunyai garis berikut untuk mengukur voltan ADC sebenar menggunakan voltan ADC.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) tukar nilai ADC 1 hingga 0 menjadi 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // tukar nilai ADC 1 hingga 0 hingga 3300mV
Bahagian kod yang tinggal hanya digunakan untuk menampilkan keempat-empat nilai ini pada layar LCD. Kami juga mempunyai kelewatan 500ms sehingga LCD dikemas kini untuk setiap 500mS. Anda dapat mengurangkannya lebih jauh sekiranya memerlukan kemas kini yang lebih pantas.
Membaca Voltan Analog dari Dua Potensiometer menggunakan STM8S
Susun kod dan muat naik ke papan pengembangan anda. Sekiranya anda mendapat ralat penyusunan, pastikan anda telah menambahkan semua fail tajuk dan fail sumber seperti yang dibincangkan sebelumnya. Setelah kod diunggah, anda akan melihat pesan selamat datang yang bertuliskan "ADC on STM8S" dan kemudian anda akan melihat skrin di bawah.
Nilai D1 dan D2 menunjukkan nilai ADC dari pin Ain2 dan AIN6 masing-masing. Di sebelah kanan, kami juga menunjukkan nilai voltan setara. Nilai ini harus sama dengan voltan yang muncul pada pin AIN2 dan AIN6 masing-masing. Kita boleh memeriksa yang sama dengan menggunakan multimeter, kita juga boleh mengubah potensiometer untuk memeriksa sama ada nilai voltan juga berubah dengan sewajarnya.
Kerja yang lengkap juga boleh didapati dalam video di bawah ini. Semoga anda menikmati tutorial dan mempelajari sesuatu yang berguna, jika anda mempunyai sebarang pertanyaan, tinggalkan di bahagian komen di bawah. Anda juga boleh menggunakan forum kami untuk memulakan perbincangan atau menghantar soalan teknikal lain.