Inhoudsopgave:

STM32CubeMX-knop debounce met onderbreking - Ajarnpa
STM32CubeMX-knop debounce met onderbreking - Ajarnpa

Video: STM32CubeMX-knop debounce met onderbreking - Ajarnpa

Video: STM32CubeMX-knop debounce met onderbreking - Ajarnpa
Video: Test of Debouncing Circuit for Wiper Driver 2024, Juli-
Anonim
STM32CubeMX-knop debounce met onderbreking
STM32CubeMX-knop debounce met onderbreking

Hallo, in deze tutorial zal ik proberen mijn eenvoudige oplossing te geven om het stuiteren van de knop te voorkomen, wat een zeer serieus probleem is. Op internet zijn er veel video's die een oplossing voor dit probleem bieden, maar geen enkele voor externe onderbreking. In al deze video's wordt het indrukken van de knop gecontroleerd door middel van een pollingmethode die inefficiënt is. Dus laten we beginnen!

Stap 1: Hardware- en softwarevereisten

Hardwarevereisten:

  • STM32 ARM-ontwikkelbord
  • Een computer

Softwarevereisten:

  • STM32CubeMX
  • Keil uVision5

Stap 2: Het probleem begrijpen

Het probleem begrijpen
Het probleem begrijpen

Dus we proberen een oplossing te vinden voor het stuiterprobleem van de knop. Daarom moeten we het probleem begrijpen. Dus als we op een knop drukken, zou deze een staat moeten krijgen die tegengesteld is aan de vorige staat. Als het bijvoorbeeld HOOG was, moet het LAAG zijn en als het LAAG was, moet het HOOG zijn. Dit is echter de ideale toestand (in PROTEUS:)) In werkelijkheid, wanneer we op een knop drukken, begint deze te schommelen tussen HOOG en LAAG voordat hij in de rusttoestand komt. Dus doet alsof er meerdere keren op is gedrukt, wat problemen veroorzaakt. Dus, wat moeten we doen?

Hier wil ik opmerken dat we in dit voorbeeld externe interrupt zullen gebruiken om het indrukken van een knop te detecteren. Dus nadat we het indrukken van een knop hebben gedetecteerd, moeten we een tijdje wachten, zoals 50 mS om de inactieve status te bereiken en opnieuw te controleren of de knop inactief is of niet. Als het in rusttoestand is, kunnen we doorgaan met onze taak. Dus laten we de code zien:)

Stap 3: STM32CubeMX-configuratie

STM32CubeMX-configuratie
STM32CubeMX-configuratie

We moeten dus eerst externe interrupt inschakelen voor onze drukknop (ik neem hier aan dat je het STM32F407VG-ontdekkingsbord gebruikt):

  • Klik in het tabblad "Pinout & Configuratie" op pin PA0 die is verbonden met de drukknop en kies GPIO_EXTI0 die externe onderbreking op die pin mogelijk maakt.
  • Verander het "gebruikerslabel" van de pin in "Push_Button" of wat je maar wilt.

Vervolgens moeten we de timer configureren om een vertraging van 50 mS te creëren:

  • Ga naar het gedeelte "Timers"
  • Klik op TIM1
  • Kies "Interne klok" als klokbron
  • In configuratie (Als u deze sectie wilt begrijpen, raadpleeg dan deze tutorial, sterk aanbevolen "Servo Motor Control With STM32F4 ARM MCU"):

    • Stel prescaler in op 32000
    • En tegenperiode tot 50
  • Schakel op het tabblad "NVIC-instellingen" alle onderbrekingen in

LED inschakelen als uitgang:

Klik op PD12 en stel in als "GPIO_Output"

Configureer vervolgens de klok zoals in de afbeelding hierboven en genereer de code.

Stap 4: Keil-softwareontwikkeling

Ten eerste definiëren we de statusvariabele die ervoor zorgt dat we de timer niet starten binnen een externe interrupt wanneer het stuiteren plaatsvond:

/* GEBRUIKERSCODE BEGIN PFP */bool state = true; /* GEBRUIKERSCODE EINDE PFP */

Vervolgens schrijven we ISR voor externe interrupt:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == Push_Button_Pin && state == true){ HAL_TIM_Base_Start_IT(&htim1); staat = onwaar; } anders{ _NOP(); } }

Wanneer de knop wordt ingedrukt, controleren we of het onze gedefinieerde drukknop was en of de status waar is. In het begin zal de status waar zijn om het if-statement in te voeren. Na het invoeren starten we de timer en maken de status onwaar om ervoor te zorgen dat het bouncen de timer niet opnieuw start.

Vervolgens schrijven we ISR voor timer-interrupt:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ /* Voorkom ongebruikte argument(en) compilatiewaarschuwing */ UNUSED(htim);

/* OPMERKING: Deze functie mag niet worden gewijzigd wanneer terugbellen nodig is, de HAL_TIM_PeriodElapsedCallback kan worden geïmplementeerd in het gebruikersbestand */ if(HAL_GPIO_ReadPin(Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET){ HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); staat = waar; HAL_TIM_Base_Stop_IT(&htim1); } }

/* GEBRUIKERSCODE EINDE 4 */

Na 50 mS controleren we of de knop nog in de reset-status staat of is losgelaten, zo ja, dan weten we dat die knop in de rusttoestand is. Dan schakelen we de led in, maken de status waar om een andere druk op de knop te kunnen detecteren en stoppen de timer om hem opnieuw te kunnen starten.

Dit proces zorgt er dus voor dat we stuiterende problemen voorkomen.

Stap 5: Conclusie

Dit was de code voor de debounce van de knop. Ik wil opmerken dat deze code door mij is ontwikkeld en dat ik geen ervaren programmeur ben. Er kunnen dus zeker fouten in zitten. Als je een betere oplossing hebt, noteer het dan. Niet vergeten, als je een probleem tegenkomt, schrijf me dan en ik zal proberen te helpen.

Aanbevolen: