Sommario:
- Passaggio 1: requisiti hardware e software
- Passaggio 2: comprensione del problema
- Passaggio 3: configurazione STM32CubeMX
- Passaggio 4: sviluppo del software Keil
- Passaggio 5: conclusione
Video: Pulsante STM32CubeMX Antirimbalzo con interruzione: 5 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:02
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
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
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:
Interruzione dell'alimentazione CA, luce di percorso a LED con batteria tampone: 8 passaggi
Interruzione dell'alimentazione CA, luce di percorso a LED alimentata da batteria: durante una recente interruzione di corrente, nelle profondità più buie del mio seminterrato… una luce sarebbe stata davvero molto utile. Sfortunatamente la mia torcia era a poche stanze buie di distanza. Frugai un po', trovai la luce e mi diressi verso la camera familiare. Il mio wi
Come realizzare un circuito di interruzione automatica: 9 passaggi
Come realizzare un circuito di interruzione automatica: Ciao amico, oggi realizzerò un circuito di interruzione automatica utilizzando il transistor 2N2222A. Questo circuito è molto semplice. Cominciamo
Microcontrollore AVR. Attiva/disattiva i LED utilizzando un interruttore a pulsante. Pulsante antirimbalzo: 4 passaggi
Microcontrollore AVR. Attiva/disattiva i LED utilizzando un interruttore a pulsante. Push Button Debouncing.: In questa sezione, impareremo come creare un codice C del programma per ATMega328PU per alternare lo stato dei tre LED in base all'input da un interruttore a pulsante. Inoltre, abbiamo esplorato una soluzione al problema di "Switch Bounce". Come di consueto, vi
Arduino - Interruzione periodica: 4 passaggi
Arduino - Interrupt periodico: questo Instructable riguarda l'utilizzo di un interrupt periodico per la temporizzazione nei programmi Arduino. Questo è un passo per un programmatore Arduino in erba che sa che Arduino può fare di più, ma non sa come farlo accadere. Se c'è una performance pr
Allarme interruzione di corrente per il congelatore: 6 passaggi (con immagini)
Allarme interruzione di corrente per il congelatore: con un congelatore nel seminterrato e il rischio di carne marcia a causa di un fusibile bruciato mentre siamo via, ho progettato questo semplice circuito di allarme in modo che i nostri vicini vengano avvisati di riparare il fusibile. Come si può vedere nella foto il campanello della porta suona dal