Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-23 15:01
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
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
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:
Arduino Simple Debounce: 4 stappen
Arduino Simple Debounce: deze instructable gaat over hoe je gemakkelijk debounce kunt maken met 2 drukknoppen. Alles wat je nodig hebt is basiskennis in elektronica en Arduino-programmering. Video: https://youtu.be/Iw6rA0cduWgAls je vragen of problemen hebt, kun je contact opnemen met mij op mijn mail:iwx
Digitale klok met netwerktijd met behulp van de ESP8266: 4 stappen (met afbeeldingen)
Digitale netwerkklok met de ESP8266: we leren hoe we een schattige kleine digitale klok kunnen bouwen die communiceert met NTP-servers en de netwerk- of internettijd weergeeft. We gebruiken de WeMos D1 mini om verbinding te maken met een wifi-netwerk, de NTP-tijd te verkrijgen en deze weer te geven op een OLED-module. De video hierboven
STM32CubeMx-microfoon (STM32F407VG): 5 stappen
STM32CubeMx-microfoon (STM32F407VG): Hallo! In dit project zullen we proberen geluid te krijgen door een microfoon te gebruiken (externe niet ingebouwde microfoon) en dit via de luidspreker af te spelen. Deze tutorial zal erg kort zijn omdat ik uitleg zal geven over projectonderdelen aan de hand van enkele video's. Dus laten we springen
STM32F4 Discovery Board en Python USART-communicatie (STM32CubeMx): 5 stappen
STM32F4 Discovery Board en Python USART-communicatie (STM32CubeMx): Hallo! In deze tutorial zullen we proberen om USART-communicatie tot stand te brengen tussen STM32F4 ARM MCU en Python (deze kan worden vervangen door elke andere taal). Dus laten we beginnen:)
Arduino - Periodieke onderbreking: 4 stappen
Arduino - Periodic Interrupt: Deze Instructable gaat over het gebruik van een periodieke interrupt voor timing in Arduino-programma's. Dit is een stap voor een ontluikende Arduino-programmeur die weet dat de Arduino meer kan, maar niet helemaal weet hoe hij dat voor elkaar moet krijgen. Als er een uitvoeringspr