Daftar Isi:

Tombol STM32CubeMX Debounce Dengan Interupsi: 5 Langkah
Tombol STM32CubeMX Debounce Dengan Interupsi: 5 Langkah

Video: Tombol STM32CubeMX Debounce Dengan Interupsi: 5 Langkah

Video: Tombol STM32CubeMX Debounce Dengan Interupsi: 5 Langkah
Video: STM32 Nucleo Tutorial 2- Interrupt, PUSH Button and LED code generation using STM32CubeMx 2024, November
Anonim
Tombol STM32CubeMX Debounce Dengan Interupsi
Tombol STM32CubeMX Debounce Dengan Interupsi

Hai, dalam tutorial ini saya akan mencoba memberikan solusi sederhana saya untuk mencegah tombol bouncing yang merupakan masalah yang sangat serius. Di internet ada banyak video yang menawarkan solusi untuk masalah ini, tetapi tidak ada video untuk interupsi eksternal. Dalam semua tekan tombol video ini diperiksa dengan metode polling yang tidak efisien. Jadi ayo mulai!

Langkah 1: Persyaratan Perangkat Keras dan Perangkat Lunak

Persyaratan perangkat keras:

  • Papan pengembangan ARM STM32
  • Komputer

Persyaratan perangkat lunak:

  • STM32CubeMX
  • Keil uVision5

Langkah 2: Memahami Masalah

Memahami Masalah
Memahami Masalah

Jadi, kami mencoba mencari solusi untuk masalah tombol yang memantul. Oleh karena itu, kita harus memahami masalah ini. Jadi, ketika kita menekan tombol, itu harus datang ke keadaan yang berlawanan dengan keadaan sebelumnya. Misalnya, jika TINGGI harus RENDAH dan jika RENDAH maka harus TINGGI. Namun, ini adalah keadaan ideal (dalam PROTEUS:)) Pada kenyataannya, ketika kita menekan sebuah tombol, tombol itu mulai memantul antara TINGGI dan RENDAH sebelum menjadi keadaan diam. Jadi, berpura-pura telah ditekan beberapa kali yang menyebabkan masalah. Jadi, apa yang harus kita lakukan?

Di sini saya ingin mencatat bahwa dalam contoh ini, kita akan menggunakan interupsi eksternal untuk mendeteksi penekanan tombol. Jadi, setelah kami mendeteksi penekanan tombol, kami perlu menunggu beberapa saat, seperti 50mS untuk mencapai status idle dan memeriksa kembali apakah tombol dalam status idle atau tidak. Jika dalam keadaan idle maka kita dapat melanjutkan tugas kita. Jadi, mari kita lihat kodenya:)

Langkah 3: Konfigurasi STM32CubeMX

Konfigurasi STM32CubeMX
Konfigurasi STM32CubeMX

Jadi, pertama-tama kita harus mengaktifkan interupsi eksternal untuk tombol tekan kita (saya berasumsi di sini bahwa Anda menggunakan papan penemuan STM32F407VG):

  • Pada tab "Pinout & Configuration" klik pada pin PA0 yang terhubung dengan tombol tekan dan pilih GPIO_EXTI0 yang memungkinkan interupsi eksternal pada pin tersebut.
  • Ubah "label pengguna" pin menjadi "Push_Button" atau apa pun yang Anda inginkan.

Kemudian, kita perlu mengkonfigurasi timer untuk membuat waktu tunda 50mS:

  • Masuk ke bagian "Pengatur Waktu"
  • Klik TIM1
  • Pilih "Jam Internal" sebagai sumber Jam
  • Dalam konfigurasi (Jika Anda ingin memahami bagian ini, silakan merujuk ke tutorial ini, sangat disarankan "Kontrol Motor Servo Dengan STM32F4 ARM MCU"):

    • Tetapkan prescaler sebagai 32000
    • Dan periode kontra ke 50
  • Di tab "NVIC Settings" aktifkan semua interupsi

Aktifkan LED sebagai output:

Klik pada PD12 dan tetapkan sebagai "GPIO_Output"

Kemudian, konfigurasikan jam seperti pada gambar yang diberikan di atas dan buat kodenya.

Langkah 4: Pengembangan Perangkat Lunak Keil

Pertama, kita mendefinisikan variabel status yang akan memastikan bahwa kita tidak memulai timer di dalam interupsi eksternal saat terjadi pantulan:

/* USER CODE MULAI PFP */bool state = true; /* KODE PENGGUNA AKHIR PFP */

Kemudian, kami menulis ISR untuk interupsi eksternal:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == Push_Button_Pin && state == true){ HAL_TIM_Base_Start_IT(&htim1); negara = salah; } lain{ _NOP(); } }

Saat tombol ditekan, kami memeriksa apakah itu tombol tekan yang kami tentukan dan apakah statusnya benar. Pada awalnya negara akan benar untuk memasukkan pernyataan if. Setelah masuk, kami memulai pengatur waktu dan membuat status salah untuk memastikan bahwa pemantulan tidak akan memulai ulang pengatur waktu.

Kemudian, kami menulis ISR untuk interupsi timer:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ /* Mencegah peringatan kompilasi argumen yang tidak digunakan */ UNUSED(htim);

/* CATATAN: Fungsi ini tidak boleh diubah, ketika panggilan balik diperlukan, HAL_TIM_PeriodElapsedCallback dapat diimplementasikan dalam file pengguna */ if(HAL_GPIO_ReadPin(Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET){ HAL_GPIO_TogglePin(GPIO, GPIO_PIN_12); keadaan = benar; HAL_TIM_Base_Stop_IT(&htim1); } }

/* KODE PENGGUNA AKHIR 4 */

Setelah 50mS kami memeriksa apakah tombol belum dalam keadaan reset atau dilepaskan, jika ya maka kami tahu tombol itu dalam keadaan idle. Kemudian kita nyalakan led, buat status true agar bisa mendeteksi tombol lain tekan dan stop timer agar bisa start lagi.

Jadi, proses ini akan memastikan bahwa kami mencegah masalah bouncing.

Langkah 5: Kesimpulan

Ini adalah kode untuk tombol debounce. Saya ingin mencatat bahwa kode ini dikembangkan oleh saya dan saya bukan programmer ahli. Jadi, pasti ada kesalahan. Jika Anda memiliki solusi yang lebih baik, harap dicatat. Jangan lupa, jika Anda mengalami masalah, silakan tulis saya dan saya akan mencoba membantu.

Direkomendasikan: