İçindekiler:
- Adım 1: Donanım ve Yazılım Gereksinimleri
- Adım 2: Sorunu Anlamak
- Adım 3: STM32CubeMX Yapılandırması
- Adım 4: Keil Yazılım Geliştirme
- Adım 5: Sonuç
Video: STM32CubeMX Düğmesi Kesintili Geri Dönme: 5 Adım
2024 Yazar: John Day | [email protected]. Son düzenleme: 2024-01-30 13:19
Merhaba, bu derste çok ciddi bir sorun olan düğme sıçramasını önlemek için basit bir çözüm sunmaya çalışacağım. İnternette bu soruna çözüm önerecek çok video var ama hiçbiri harici kesme için değil. Bu videoların tamamında butona basılması verimsiz olan yoklama yöntemi ile kontrol edilmektedir. Haydi başlayalım!
Adım 1: Donanım ve Yazılım Gereksinimleri
Donanım Gereksinimleri:
- STM32 ARM geliştirme kurulu
- Bir bilgisayar
Yazılım gereksinimleri:
- STM32CubeMX
- Keil uVision5
Adım 2: Sorunu Anlamak
Bu yüzden buton zıplama sorununa çözüm bulmaya çalışıyoruz. Bu nedenle, sorunu anlamalıyız. Yani bir butona bastığımızda önceki durumunun tam tersi bir duruma gelmelidir. Örneğin, YÜKSEK ise DÜŞÜK, DÜŞÜK ise YÜKSEK olmalıdır. Ancak bu ideal bir durumdur (PROTEUS'ta:)) Gerçekte, bir düğmeye bastığımızda, boş duruma gelmeden önce YÜKSEK ve DÜŞÜK arasında gidip gelmeye başlar. Yani, birkaç kez basıldığını iddia ediyor ve bu da sorunlara neden oluyor. Peki, ne yapmalıyız?
Burada belirtmek isterim ki bu örnekte butona basıldığını algılamak için harici kesme kullanacağız. Yani butona basıldığını tespit ettikten sonra, boş duruma gelmek için 50mS gibi bir süre beklememiz ve butonun boş durumda olup olmadığını tekrar kontrol etmemiz gerekiyor. Boştaysa, görevimize devam edebiliriz. O halde kodu görelim:)
Adım 3: STM32CubeMX Yapılandırması
Bu nedenle, önce basmalı düğmemiz için harici kesmeyi etkinleştirmemiz gerekiyor (burada STM32F407VG keşif kartını kullandığınızı varsayıyorum):
- "Pinout & Configuration" sekmesinde, butona bağlı olan PA0 pinine tıklayın ve bu pin üzerinde harici kesmeyi sağlayan GPIO_EXTI0'ı seçin.
- Pimin "kullanıcı etiketini" "Push_Button" veya istediğiniz herhangi bir şeyle değiştirin.
Ardından, 50mS zaman gecikmesi oluşturmak için zamanlayıcıyı yapılandırmamız gerekiyor:
- "Zamanlayıcılar" bölümüne girin
- TIM1'e tıklayın
- Saat kaynağı olarak "Dahili Saat"i seçin
-
Konfigürasyonda (Bu bölümü anlamak istiyorsanız lütfen bu öğreticiye bakın, şiddetle tavsiye edilen "STM32F4 ARM MCU ile Servo Motor Kontrolü"):
- Ön ölçekleyiciyi 32000 olarak ayarla
- Ve 50'ye karşı süre
- "NVIC Ayarları" sekmesinde tüm kesintileri etkinleştirin
LED'i çıkış olarak etkinleştirin:
PD12'ye tıklayın ve "GPIO_Output" olarak ayarlayın
Ardından, saati yukarıdaki resimdeki gibi yapılandırın ve kodu oluşturun.
Adım 4: Keil Yazılım Geliştirme
İlk olarak, sıçrama gerçekleştiğinde harici kesme içinde zamanlayıcıyı başlatmamamızı sağlayacak durum değişkenini tanımlıyoruz:
/* KULLANICI KODU BEGIN PFP */bool state = true; /* KULLANICI KODU SON PFP */
Ardından, harici kesme için ISR yazıyoruz:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == Push_Button_Pin && state == true){ HAL_TIM_Base_Start_IT(&htim1); durum = yanlış; } başka{ _NOP(); } }
Düğmeye basıldığında, tanımlı düğmemiz olup olmadığını ve durumun doğru olup olmadığını kontrol ederiz. Başlangıçta if ifadesini girmek için durum doğru olacaktır. Girdikten sonra zamanlayıcıyı başlatır ve sıçramanın zamanlayıcıyı yeniden başlatmamasını sağlamak için durumu yanlış yaparız.
Ardından, zamanlayıcı kesmesi için ISR yazıyoruz:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ /* Kullanılmayan argüman(lar) derlemesini engelle uyarı */ UNUSED(htim);
/* NOT: Geri arama gerektiğinde bu fonksiyon değiştirilmemelidir, HAL_TIM_PeriodElapsedCallback kullanıcı dosyasında uygulanabilir */ if(HAL_GPIO_ReadPin(Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET){ HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); durum = doğru; HAL_TIM_Base_Stop_IT(&htim1); } }
/* KULLANICI KODU SON 4 */
50mS'den sonra düğmenin henüz sıfırlama durumunda mı yoksa serbest mi kaldığını kontrol ediyoruz, evet ise o zaman düğmenin boşta olduğunu biliyoruz. Daha sonra ledi açarız, başka bir tuşa basmak için durumu doğru yaparız ve tekrar başlatabilmek için timer'ı durdururuz.
Dolayısıyla bu işlem sıçrama sorununun önüne geçmemizi sağlayacaktır.
Adım 5: Sonuç
Bu, düğmenin geri dönmesi için koddu. Bu kodun benim tarafımdan geliştirildiğini ve uzman bir programcı olmadığımı belirtmek isterim. Yani, kesinlikle hatalar olabilir. Daha iyi bir çözümünüz varsa lütfen not edin. Unutmayın, herhangi bir sorunla karşılaşırsanız lütfen bana yazın, yardımcı olmaya çalışırım.
Önerilen:
Arduino Araba Geri Geri Park Uyarı Sistemi - Adım Adım: 4 Adım
Arduino Araba Geri Geri Park Uyarı Sistemi | Adım Adım: Bu projede Arduino UNO ve HC-SR04 Ultrasonik Sensör kullanarak basit bir Arduino Araba Geri Park Sensörü Devresi tasarlayacağım. Bu Arduino tabanlı Araba Ters uyarı sistemi, Otonom Navigasyon, Robot Mesafesi ve diğer menzil r
Arduino Basit Geri Dönme: 4 Adım
Arduino Simple Debounce: Bu talimat, 2 basmalı düğme ile nasıl kolay geri dönüş yapılacağı hakkındadır. Tek ihtiyacınız olan elektronik ve arduino programlama hakkında temel bilgilerdir.Video:https://youtu.be/Iw6rA0cduWgHerhangi bir sorunuz veya sorununuz varsa, iletişime geçebilirsiniz. postamda ben: iwx
Arduino ile Geri Sayım Düğmesi: 4 Adım
Arduino Geri Sayım W/Dinlenme Düğmesi ile: Bu Talimat size bir düğme ile sıfırlanabilen 4 Haneli 7 Segment Ekran kullanarak bir geri sayım sayacının nasıl oluşturulacağını öğretecektir. Bunu yapma fikri aklıma geldi çünkü sınıfta 1 haneli 7 segmentli ekranı oluştururken bir şeyler yaratmak istedim
To-Go Cup Lantern - DIY Kesintili Devre Işığı: 11 Adım
To-Go Cup Lantern - DIY Kesintili Devre Işığı: Kesintili bir devre döngüsü yapacaksınız. Kapaktaki tırnağı kullanarak açılır ve kapanır. Bu proje son derece özelleştirilebilir, pilin LED'e bağlanması için devrenizin tamamlandığından emin olun ve ardından kendiniz yapın
Düşük Güç Kesintili Cihazın Ortalama Akım Tüketiminin Belirlenmesi: 4 Adım
Düşük Güçte Aralıklı Aygıtın Ortalama Akım Tüketimini Belirleyin: Giriş Merak ettiğimden uzak sıcaklık sensörümde pillerin ne kadar dayanabileceğini bilmek istedim. Seri olarak iki AA pili alır, ancak güç tüketildiği için bir ampermetreyi sıraya yerleştirmek ve ekranı izlemek pek yardımcı olmaz