Sommario:

Pulsante STM32CubeMX Antirimbalzo con interruzione: 5 passaggi
Pulsante STM32CubeMX Antirimbalzo con interruzione: 5 passaggi

Video: Pulsante STM32CubeMX Antirimbalzo con interruzione: 5 passaggi

Video: Pulsante STM32CubeMX Antirimbalzo con interruzione: 5 passaggi
Video: Lezione 21 - Antirimbalzo per pulsante 2024, Dicembre
Anonim
Pulsante STM32CubeMX Antirimbalzo con interruzione
Pulsante STM32CubeMX Antirimbalzo con interruzione

Ciao, in questo tutorial cercherò di dare la mia semplice soluzione per prevenire il rimbalzo dei pulsanti che è un problema molto serio. Su Internet ci sono molti video per offrire una soluzione a questo problema, ma nessuno di questi per l'interruzione esterna. In tutti questi video la pressione dei pulsanti viene controllata dal metodo di polling che è inefficiente. Quindi iniziamo!

Passaggio 1: requisiti hardware e software

Requisiti hardware:

  • Scheda di sviluppo ARM STM32
  • Un computer

Requisiti software:

  • STM32CubeMX
  • Keil uVision5

Passaggio 2: comprensione del problema

Capire il problema
Capire il problema

Quindi, proviamo a trovare una soluzione per il problema del rimbalzo dei pulsanti. Pertanto, dobbiamo capire il problema. Quindi, quando premiamo un pulsante, dovrebbe arrivare uno stato opposto al suo stato precedente. Ad esempio, se era ALTO deve essere BASSO e se era BASSO allora deve essere ALTO. Tuttavia, questo è lo stato ideale (in PROTEUS:)) In realtà, quando premiamo un pulsante, questo inizia a rimbalzare tra HIGH e LOW prima che arrivi allo stato di riposo. Quindi, finge di essere stato premuto più volte, il che causa problemi. Allora, cosa dovremmo fare?

Qui voglio notare che in questo esempio, useremo l'interrupt esterno per rilevare la pressione del pulsante. Quindi, dopo aver rilevato la pressione del pulsante, è necessario attendere un po' di tempo, ad esempio 50 ms per raggiungere lo stato di inattività e controllare nuovamente se il pulsante è inattivo o meno. Se è in stato di inattività, possiamo continuare con il nostro compito. Quindi, vediamo il codice:)

Passaggio 3: configurazione STM32CubeMX

Configurazione STM32CubeMX
Configurazione STM32CubeMX

Quindi, dobbiamo prima abilitare l'interrupt esterno per il nostro pulsante (presumo che tu usi la scheda di scoperta STM32F407VG):

  • Nella scheda "Pinout e configurazione" fai clic sul pin PA0 che è collegato al pulsante e scegli GPIO_EXTI0 che abilita l'interrupt esterno su quel pin.
  • Cambia l'"etichetta utente" del pin in "Push_Button" o qualsiasi cosa tu voglia.

Quindi, dobbiamo configurare il timer per creare un ritardo di 50 ms:

  • Entra nella sezione "Timer"
  • Clicca su TIM1
  • Scegli "Orologio interno" come sorgente di clock
  • Nella configurazione (se si desidera comprendere questa sezione, fare riferimento a questo tutorial, altamente raccomandato "Controllo servomotore con MCU ARM STM32F4"):

    • Imposta il prescaler come 32000
    • E controperiodo a 50
  • Nella scheda "Impostazioni NVIC" abilita tutti gli interrupt

Abilita LED come uscita:

Fare clic su PD12 e impostare come "GPIO_Output"

Quindi, configura l'orologio come nell'immagine sopra e genera il codice.

Passaggio 4: sviluppo del software Keil

Innanzitutto, definiamo la variabile di stato che assicurerà di non avviare il timer all'interno dell'interrupt esterno quando si verifica il rimbalzo:

/* CODICE UTENTE BEGIN PFP */bool state = true; /* CODICE UTENTE FINE PFP */

Quindi, scriviamo ISR per l'interrupt esterno:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == Push_Button_Pin && state == true){ HAL_TIM_Base_Start_IT(&htim1); stato = falso; } else{ _NOP(); } }

Quando il pulsante viene premuto, controlliamo se era il nostro pulsante definito e se lo stato è vero. All'inizio lo stato sarà vero per poter inserire l'istruzione if. Dopo aver inserito, avviamo il timer e rendiamo lo stato falso per garantire che il rimbalzo non riavvii il timer.

Quindi, scriviamo ISR per l'interruzione del timer:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ /* Previeni l'avviso di compilazione degli argomenti non utilizzati */ UNUSED(htim);

/* NOTA: questa funzione non deve essere modificata, quando è necessaria la richiamata, l'HAL_TIM_PeriodElapsedCallback potrebbe essere implementato nel file utente */ if(HAL_GPIO_ReadPin(Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET){ HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); stato = vero; HAL_TIM_Base_Stop_IT(&htim1); } }

/* FINE CODICE UTENTE 4 */

Dopo 50 ms controlliamo se il pulsante è ancora in stato di ripristino o rilasciato, se sì, sappiamo che il pulsante è inattivo. Quindi attiviamo il led, rendiamo lo stato vero per poter rilevare un altro pulsante premuto e fermiamo il timer per poterlo riavviare.

Quindi, questo processo assicurerà di prevenire il problema del rimbalzo.

Passaggio 5: conclusione

Questo era il codice per il rimbalzo del pulsante. Voglio notare che questo codice è stato sviluppato da me e non sono un programmatore esperto. Quindi, ci possono sicuramente essere errori. Se hai una soluzione migliore, notalo. Non dimenticare, se riscontri problemi scrivimi e cercherò di aiutarti.

Consigliato: