Indholdsfortegnelse:

STM32CubeMX -knappen afbrydes med afbrydelse: 5 trin
STM32CubeMX -knappen afbrydes med afbrydelse: 5 trin

Video: STM32CubeMX -knappen afbrydes med afbrydelse: 5 trin

Video: STM32CubeMX -knappen afbrydes med afbrydelse: 5 trin
Video: Surveillance du régime d'un ventilateur à trois fils 12V Arduino potentiomètre contrôle de vitesse 2024, November
Anonim
STM32CubeMX -knap afbrydes med afbrydelse
STM32CubeMX -knap afbrydes med afbrydelse

Hej, i denne vejledning vil jeg prøve at give min enkle løsning for at forhindre knapstød, hvilket er et meget alvorligt problem. På internettet er der mange videoer til løsning af dette problem, men ikke dem til ekstern afbrydelse. I alle disse videoer kontrolleres knappetryk ved afstemningsmetode, som er ineffektiv. Så lad os starte!

Trin 1: Krav til hardware og software

Hardware krav:

  • STM32 ARM udviklingstavle
  • En computer

Softwarekrav:

  • STM32CubeMX
  • Keil uVision5

Trin 2: Forståelse af problemet

Forståelse af problemet
Forståelse af problemet

Så vi forsøger at finde en løsning på problem med knapstoppning. Derfor er vi nødt til at forstå spørgsmålet. Så når vi trykker på en knap, skal den komme i en tilstand, der er modsat dens tidligere tilstand. For eksempel, hvis det var HIGH, skal det være LOW, og hvis det var LOW, skal det være HIGH. Dette er imidlertid en ideel tilstand (i PROTEUS:)) I virkeligheden, når vi trykker på en knap, begynder den at hoppe mellem HIGH og LOW, før den kommer til inaktiv tilstand. Så foregiver, at det er blevet trykket flere gange, hvilket forårsager problemer. Så hvad skal vi gøre?

Her vil jeg bemærke, at vi i dette eksempel vil bruge ekstern afbrydelse for at opdage knaptryk. Så efter at vi har opdaget et tryk på knappen, skal vi vente lidt tid, f.eks. 50 ms for at nå inaktiv tilstand og kontrollere igen, om knappen er inaktiv eller ej. Hvis den er i inaktiv tilstand, kan vi fortsætte med vores opgave. Så lad os se koden:)

Trin 3: STM32CubeMX -konfiguration

STM32CubeMX -konfiguration
STM32CubeMX -konfiguration

Så vi skal først aktivere ekstern afbrydelse for vores trykknap (jeg formoder her, at du bruger STM32F407VG discovery board):

  • I fanen "Pinout & Configuration" klikker du på pin PA0, der er forbundet til trykknappen, og vælger GPIO_EXTI0, som muliggør ekstern afbrydelse på den pin.
  • Skift "brugermærket" på stiften til "Push_Button" eller noget, du ønsker.

Derefter skal vi konfigurere timeren for at oprette en forsinkelse på 50 ms:

  • Gå ind i afsnittet "Timere"
  • Klik på TIM1
  • Vælg "Intern ur" som urkilde
  • I konfiguration (Hvis du vil forstå dette afsnit, henvises til denne vejledning, stærkt anbefalet "Servomotorstyring med STM32F4 ARM MCU"):

    • Indstil prescaler til 32000
    • Og kontra periode til 50
  • Aktiver alle afbrydelser under fanen "NVIC -indstillinger"

Aktiver LED som output:

Klik på PD12 og indstil som "GPIO_Output"

Konfigurer derefter uret som på billedet ovenfor, og generer koden.

Trin 4: Keil softwareudvikling

Først definerer vi tilstandsvariabel, som sikrer, at vi ikke starter timeren inde i ekstern afbrydelse, når studsningen skete:

/ * BRUGERKODE BEGYNDER PFP */bool -tilstand = sand; / * BRUGERKODE END PFP */

Derefter skriver vi ISR for ekstern afbrydelse:

ugyldig HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); tilstand = falsk; } andet {_NOP (); }}

Når der blev trykket på knappen, kontrollerer vi, om det var vores definerede trykknap, og om tilstanden er sand. I begyndelsen vil staten være sand for at indtaste if -sætningen. Efter indtastning starter vi timeren og gør tilstanden falsk for at sikre, at afvisning ikke genstarter timeren.

Derefter skriver vi ISR for timerafbrydelse:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Forhindrer ubrugte argument (er) om kompilationsadvarsel * / UBRUGT (htim);

/* BEMÆRK: Denne funktion bør ikke ændres, når der er behov for tilbagekald, HAL_TIM_PeriodElapsedCallback kunne implementeres i brugerfilen */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_); tilstand = sand; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * BRUGERKODE SLUT 4 */

Efter 50 ms kontrollerer vi, om knappen endnu er i nulstillingstilstand eller frigivet, hvis ja, ved vi, at knappen er i inaktiv tilstand. Derefter skifter vi LED'en, gør tilstanden sand for at kunne registrere endnu et tryk på knappen og stoppe timeren for at kunne starte den igen.

Så denne proces vil sikre, at vi forhindrer problemer med at hoppe.

Trin 5: Konklusion

Dette var kode for knapdebounce. Jeg vil bemærke, at denne kode blev udviklet af mig, og jeg er ikke en ekspert programmerer. Så der kan helt sikkert være fejl. Hvis du har en bedre løsning, bemærk det. Glem ikke, hvis du støder på et problem, så skriv til mig, og jeg vil prøve at hjælpe.

Anbefalede: