Table des matières:

Anti-rebond du bouton STM32CubeMX avec interruption : 5 étapes
Anti-rebond du bouton STM32CubeMX avec interruption : 5 étapes

Vidéo: Anti-rebond du bouton STM32CubeMX avec interruption : 5 étapes

Vidéo: Anti-rebond du bouton STM32CubeMX avec interruption : 5 étapes
Vidéo: interruptions en micropython pour les boutons poussoirs pour ESP32 ou raspberry pi pco 2024, Novembre
Anonim
Anti-rebond du bouton STM32CubeMX avec interruption
Anti-rebond du bouton STM32CubeMX avec interruption

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

Comprendre le problème
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

Configuration STM32CubeMX
Configuration 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é: