Obsah:

Tlačítko STM32CubeMX Debounce s přerušením: 5 kroků
Tlačítko STM32CubeMX Debounce s přerušením: 5 kroků

Video: Tlačítko STM32CubeMX Debounce s přerušením: 5 kroků

Video: Tlačítko STM32CubeMX Debounce s přerušením: 5 kroků
Video: Kurs ESP8266 & MicroPython #5: Przerwania zewnętrzne, timery i debouncing 2024, Listopad
Anonim
Tlačítko STM32CubeMX odskoku s přerušením
Tlačítko STM32CubeMX odskoku s přerušením

Ahoj, v tomto tutoriálu se pokusím poskytnout své jednoduché řešení, jak zabránit odrazu tlačítek, což je velmi závažný problém. Na internetu existuje mnoho videí, která nabízejí řešení tohoto problému, ale žádná z nich pro externí přerušení. U všech těchto videí je stisknutí tlačítka kontrolováno metodou hlasování, která je neúčinná. Začněme tedy!

Krok 1: Hardwarové a softwarové požadavky

Hardwarové požadavky:

  • Vývojová deska STM32 ARM
  • Počítač

Softwarové požadavky:

  • STM32CubeMX
  • Keil uVision5

Krok 2: Porozumění problému

Pochopení problému
Pochopení problému

Pokoušíme se tedy najít řešení problému s odskakováním tlačítek. Proto musíme tomuto problému porozumět. Když tedy stiskneme tlačítko, mělo by dojít ke stavu, který je opačný k předchozímu stavu. Pokud například bylo VYSOKÉ, musí být NÍZKÉ a pokud bylo NÍZKÉ, pak musí být VYSOKÉ. Toto je však ideální stav (v PROTEUS:)) Ve skutečnosti, když stiskneme tlačítko, začne poskakovat mezi VYSOKOU a NÍZKOU, než přejde do klidového stavu. Předstírá, že bylo několikrát stisknuto, což způsobuje problémy. Co bychom tedy měli udělat?

Zde chci poznamenat, že v tomto příkladu použijeme externí přerušení, abychom detekovali stisknutí tlačítka. Poté, co zjistíme stisknutí tlačítka, musíme chvíli počkat, například 50 mS, abychom dosáhli klidového stavu a znovu zkontrolovali, zda je tlačítko v klidovém stavu nebo ne. Pokud je v klidovém stavu, můžeme pokračovat ve svém úkolu. Pojďme se tedy podívat na kód:)

Krok 3: Konfigurace STM32CubeMX

Konfigurace STM32CubeMX
Konfigurace STM32CubeMX

Musíme tedy nejprve povolit externí přerušení pro naše tlačítko (předpokládám, že zde používáte desku zjišťování STM32F407VG):

  • Na kartě "Pinout a konfigurace" klikněte na pin PA0, který je připojen k tlačítku, a vyberte GPIO_EXTI0, který umožňuje externí přerušení na tomto pinu.
  • Změňte „štítek uživatele“na pinu na „Push_Button“nebo cokoli chcete.

Poté musíme nakonfigurovat časovač, abychom vytvořili časové zpoždění 50 mS:

  • Vstupte do sekce „Časovače“
  • Klikněte na TIM1
  • Jako zdroj hodin vyberte „Interní hodiny“
  • V konfiguraci (Pokud chcete porozumět této části, nahlédněte do tohoto tutoriálu, vysoce doporučeného „Řízení servomotoru s MCU STM32F4 ARM“):

    • Nastavit prescaler jako 32000
    • A počítat období do 50
  • Na kartě „Nastavení NVIC“povolte všechna přerušení

Povolit LED jako výstup:

Klikněte na PD12 a nastavte jako „GPIO_Output“

Poté nakonfigurujte hodiny jako na obrázku výše a vygenerujte kód.

Krok 4: Vývoj softwaru Keil

Nejprve definujeme stavovou proměnnou, která zajistí, že při odrazu nespustíme časovač uvnitř externího přerušení:

/ * USER CODE BEGIN PFP */bool state = true; / * KÓD UŽIVATELE KONEC PFP */

Potom napíšeme ISR pro externí přerušení:

neplatné HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); state = false; } else {_NOP (); }}

Po stisknutí tlačítka zkontrolujeme, zda to bylo naše definované tlačítko a zda je stav pravdivý. Na začátku bude stav pravdivý, aby bylo možné zadat příkaz if. Po zadání spustíme časovač a nastavíme stav na nepravdivý, abychom zajistili, že odrážení nerestartuje časovač.

Poté napíšeme ISR pro přerušení časovače:

neplatné HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Zabraňte nepoužitým varováním při kompilaci argumentů * / UNUSED (htim);

/* POZNÁMKA: Tato funkce by neměla být upravována, pokud je potřeba zpětné volání, HAL_TIM_PeriodElapsedCallback lze implementovat do uživatelského souboru */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_12); stav = true; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * KÓD UŽIVATELE KONEC 4 */

Po 50 mS zkontrolujeme, zda je tlačítko ještě ve stavu reset nebo uvolněno, pokud ano, víme, že je tlačítko v klidovém stavu. Poté přepneme LED, make state true, abychom mohli detekovat další stisknutí tlačítka a zastavit časovač, abychom jej mohli znovu spustit.

Tento proces tedy zajistí, že zabráníme problému s odskakováním.

Krok 5: Závěr

Toto byl kód pro odblokování tlačítka. Chci poznamenat, že tento kód jsem vytvořil já a nejsem odborný programátor. Určitě tedy může dojít k chybám. Pokud máte lepší řešení, poznamenejte si to. Nezapomeňte, pokud narazíte na nějaký problém, napište mi a já se pokusím pomoci.

Doporučuje: