Table des matières:
- Étape 1: Configuration matérielle et logicielle requise
- Étape 2: Comprendre le problème
- Étape 3: Configuration du STM32CubeMX
- Étape 4: Développement du logiciel Keil
- Étape 5: Conclusion
Vidéo: Anti-rebond du bouton STM32CubeMX avec interruption : 5 étapes
2024 Auteur: John Day | [email protected]. Dernière modifié: 2024-01-30 09:07
Salut, dans ce tutoriel, je vais essayer de donner ma solution simple pour empêcher le rebond des boutons, ce qui est un problème très grave. Sur Internet, il existe de nombreuses vidéos pour offrir une solution à ce problème, mais aucune pour les interruptions externes. Dans toutes ces vidéos, la pression sur le bouton est vérifiée par une méthode de sondage qui est inefficace. Alors, commençons !
Étape 1: Configuration matérielle et logicielle requise
Exigences matérielles:
- Carte de développement STM32 ARM
- Un ordinateur
Logiciels requis:
- STM32CubeMX
- Keil uVision5
Étape 2: Comprendre le problème
Nous essayons donc de trouver une solution au problème de rebond des boutons. Par conséquent, nous devons comprendre le problème. Ainsi, lorsque nous appuyons sur un bouton, il devrait arriver à un état opposé à son état précédent. Par exemple, s'il était ÉLEVÉ, il doit être FAIBLE et s'il était FAIBLE, il doit être ÉLEVÉ. Cependant, c'est l'état idéal (dans PROTEUS:)) En réalité, lorsque nous appuyons sur un bouton, il commence à rebondir entre HIGH et LOW avant de passer à l'état de repos. Donc, prétend qu'il a été pressé plusieurs fois, ce qui cause des problèmes. Alors, que devons-nous faire ?
Ici, je tiens à noter que dans cet exemple, nous utiliserons une interruption externe afin de détecter l'appui sur un bouton. Ainsi, après avoir détecté une pression sur le bouton, nous devons attendre un peu, comme 50 ms pour atteindre l'état de veille et vérifier à nouveau si le bouton est à l'état de veille ou non. S'il est au repos, nous pouvons continuer notre tâche. Alors, voyons le code:)
Étape 3: Configuration du STM32CubeMX
Nous devons donc d'abord activer l'interruption externe pour notre bouton-poussoir (je suppose ici que vous utilisez la carte de découverte STM32F407VG):
- Dans l'onglet "Pinout & Configuration", cliquez sur la broche PA0 qui est connectée au bouton poussoir et choisissez GPIO_EXTI0 qui active l'interruption externe sur cette broche.
- Changez le « label utilisateur » de la broche en « Push_Button » ou tout ce que vous voulez.
Ensuite, nous devons configurer la minuterie afin de créer un délai de 50 mS:
- Entrez dans la section "Minuteurs"
- Cliquez sur TIM1
- Choisissez "Horloge interne" comme source d'horloge
-
En configuration (Si vous voulez comprendre cette section, veuillez vous référer à ce tutoriel, hautement recommandé "Contrôle de servomoteurs avec STM32F4 ARM MCU"):
- Définir le prédimensionneur sur 32000
- Et contre période à 50
- Dans l'onglet "Paramètres NVIC", activez toutes les interruptions
Activer la LED comme sortie:
Cliquez sur PD12 et définissez-le comme "GPIO_Output"
Ensuite, configurez l'horloge comme dans l'image ci-dessus et générez le code.
Étape 4: Développement du logiciel Keil
Tout d'abord, nous définissons une variable d'état qui garantira que nous ne démarrons pas le minuteur à l'intérieur d'une interruption externe lorsque le rebond s'est produit:
/* USER CODE BEGIN PFP */bool state = true; /* CODE UTILISATEUR FIN PFP */
Ensuite, nous écrivons ISR pour l'interruption externe:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == Push_Button_Pin && state == true){ HAL_TIM_Base_Start_IT(&htim1); état = faux; } else{ _NOP(); } }
Lorsque le bouton est enfoncé, nous vérifions s'il s'agit de notre bouton-poussoir défini et si l'état est vrai. Au début, l'état sera vrai afin d'entrer l'instruction if. Après être entré, nous démarrons la minuterie et rendons l'état faux afin de s'assurer que le rebond ne redémarrera pas la minuterie.
Ensuite, nous écrivons ISR pour l'interruption du temporisateur:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ /* Empêcher l'avertissement de compilation des arguments inutilisés */ UNUSED(htim);
/* NOTE: Cette fonction ne doit pas être modifiée, lorsque le rappel est nécessaire, le HAL_TIM_PeriodElapsedCallback pourrait être implémenté dans le fichier utilisateur */ if(HAL_GPIO_ReadPin(Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET){ HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_12); état = vrai; HAL_TIM_Base_Stop_IT(&htim1); } }
/* CODE UTILISATEUR FIN 4 */
Après 50 ms, nous vérifions si le bouton est encore à l'état de réinitialisation ou relâché, si oui, nous savons que le bouton est à l'état inactif. Ensuite, nous basculons la led, rendons l'état vrai afin de pouvoir détecter un autre appui sur un bouton et arrêtons le chronomètre afin de pouvoir le redémarrer.
Ainsi, ce processus garantira que nous prévenons les problèmes de rebond.
Étape 5: Conclusion
C'était le code pour le bouton anti-rebond. Je tiens à noter que ce code a été développé par moi et que je ne suis pas un programmeur expert. Donc, il peut sûrement y avoir des erreurs. Si vous avez une meilleure solution, veuillez le noter. N'oubliez pas, si vous rencontrez un problème, écrivez-moi et j'essaierai de vous aider.
Conseillé:
Conception d'un contrôleur d'interruption programmable en VHDL : 4 étapes
Conception d'un contrôleur d'interruption programmable en VHDL : je suis submergé par le type de réponses que je reçois dans ce blog. Merci les gars de visiter mon blog et de me motiver à partager mes connaissances avec vous. Cette fois, je vais présenter la conception d'un autre module intéressant que nous voyons dans tous les SOC -- Interrupt C
Capteur de blocage de la lumière Arduino (module d'interruption photo) - Protégez vos cartes (prototype) : 4 étapes
Capteur de blocage de la lumière Arduino (module d'interruption photo) - Garder vos cartes en sécurité (Prototype): Ce projet est un prototype et dans ce projet, je discuterai de la façon dont vos cartes - telles que les cartes de crédit, les cartes de débit, les cartes-cadeaux - peuvent être conservées en sécurité. Jetez un œil aux images ci-dessus pour voir comment ce projet fonctionne. Laissez-moi vous donner un aperçu de
Arduino - Interruption périodique : 4 étapes
Arduino - Interruption périodique : ce Instructable concerne l'utilisation d'une interruption périodique pour la synchronisation dans les programmes Arduino. C'est une étape pour un programmeur Arduino en herbe qui sait que l'Arduino peut faire plus, mais ne sait pas vraiment comment y parvenir. S'il y a une performance pr
Alimentation sans interruption 12 V, 2 A : 6 étapes
Alimentation sans coupure 12 V, 2 A : INSCRIPTION AU CONCOURS D'ALIMENTATIONVeuillez voter pour moi si vous trouvez cet Instructable utileQu'est-ce qu'une alimentation sans coupure ?
Luminosité de la LED d'interruption Arduino des États-Unis : 6 étapes
USA Arduino Interrupt LED Brightness : Dans ce projet, nous allons créer un écran LED rouge, blanc et bleu avec un potentiomètre et un bouton-poussoir. Cela semble facile, mais nous utiliserons également des interruptions pour cela. Ainsi, lorsque le bouton poussoir est enfoncé, la valeur du potentiomètre se réglera