Πίνακας περιεχομένων:

Κουμπί STM32CubeMX Debounce With Interrupt: 5 Βήματα
Κουμπί STM32CubeMX Debounce With Interrupt: 5 Βήματα

Βίντεο: Κουμπί STM32CubeMX Debounce With Interrupt: 5 Βήματα

Βίντεο: Κουμπί STM32CubeMX Debounce With Interrupt: 5 Βήματα
Βίντεο: Προγραμματισμός του STM32 Blue Pill με LDmicro PLC Ladder Logic 2024, Νοέμβριος
Anonim
Κουμπί STM32CubeMX Debounce With Interrupt
Κουμπί STM32CubeMX Debounce With Interrupt

Γεια, σε αυτό το σεμινάριο θα προσπαθήσω να δώσω την απλή λύση μου για να αποτρέψω την αναπήδηση του κουμπιού που είναι πολύ σοβαρό ζήτημα. Στο διαδίκτυο υπάρχουν πολλά βίντεο που προσφέρουν λύση σε αυτό το ζήτημα, αλλά κανένα από αυτά για εξωτερική διακοπή. Σε όλα αυτά τα βίντεο, το πάτημα του κουμπιού ελέγχεται με μέθοδο ψηφοφορίας που είναι αναποτελεσματική. Λοιπόν, ας ξεκινήσουμε!

Βήμα 1: Απαιτήσεις υλικού και λογισμικού

Απαιτήσεις υλικού:

  • Πίνακας ανάπτυξης STM32 ARM
  • Ενας υπολογιστής

Απαιτήσεις λογισμικού:

  • STM32CubeMX
  • Keil uVision5

Βήμα 2: Κατανόηση του προβλήματος

Κατανόηση του προβλήματος
Κατανόηση του προβλήματος

Έτσι, προσπαθούμε να βρούμε τη λύση για το πρόβλημα της αναπήδησης κουμπιών. Επομένως, πρέπει να κατανοήσουμε το ζήτημα. Έτσι, όταν πατάμε ένα κουμπί θα πρέπει να έρθει μια κατάσταση που είναι αντίθετη με την προηγούμενη κατάστασή του. Για παράδειγμα, αν ήταν Υ HIGHΗΛΗ πρέπει να είναι ΧΑΜΗΛΗ και αν ήταν ΧΑΜΗΛΗ τότε πρέπει να είναι Υ HIGHΗΛΗ. Ωστόσο, αυτή είναι η ιδανική κατάσταση (στο PROTEUS:)) Στην πραγματικότητα, όταν πατάμε ένα κουμπί αρχίζει να αναπηδά μεταξύ Υ HIGHΗΛΟΥ και ΧΑΜΗΛΟΥ πριν έρθει σε κατάσταση αδράνειας. Έτσι, προσποιείται ότι έχει πατηθεί αρκετές φορές που προκαλεί προβλήματα. Λοιπόν, τι πρέπει να κάνουμε;

Εδώ θέλω να σημειώσω ότι σε αυτό το παράδειγμα, θα χρησιμοποιήσουμε εξωτερική διακοπή για να εντοπίσουμε το πάτημα του κουμπιού. Έτσι, αφού εντοπίσουμε το πάτημα του κουμπιού, πρέπει να περιμένουμε λίγο χρόνο, όπως 50mS για να φτάσουμε σε κατάσταση αδράνειας και να ελέγξουμε ξανά εάν το κουμπί είναι σε κατάσταση αδράνειας ή όχι. Εάν είναι σε κατάσταση αδράνειας, τότε μπορούμε να συνεχίσουμε το έργο μας. Ας δούμε λοιπόν τον κωδικό:)

Βήμα 3: Διαμόρφωση STM32CubeMX

Διαμόρφωση STM32CubeMX
Διαμόρφωση STM32CubeMX

Έτσι, πρέπει πρώτα να ενεργοποιήσουμε την εξωτερική διακοπή για το κουμπί μας (υποθέτω εδώ ότι χρησιμοποιείτε τον πίνακα ανακάλυψης STM32F407VG):

  • Στην καρτέλα "Pinout & Configuration" κάντε κλικ στο pin PA0 που είναι συνδεδεμένο με το κουμπί και επιλέξτε GPIO_EXTI0 που επιτρέπει εξωτερική διακοπή σε αυτόν τον πείρο.
  • Αλλάξτε την "ετικέτα χρήστη" της καρφίτσας σε "Push_Button" ή οτιδήποτε θέλετε.

Στη συνέχεια, πρέπει να διαμορφώσουμε το χρονόμετρο για να δημιουργήσουμε χρονική καθυστέρηση 50mS:

  • Εισαγάγετε την ενότητα "Χρονοδιακόπτες"
  • Κάντε κλικ στο TIM1
  • Επιλέξτε "Εσωτερικό ρολόι" ως πηγή ρολογιού
  • Σε διαμόρφωση (Αν θέλετε να κατανοήσετε αυτήν την ενότητα, ανατρέξτε σε αυτό το σεμινάριο, που συνιστάται ιδιαίτερα "Servo Motor Control With STM32F4 ARM MCU"):

    • Ορίστε τον προκαταρκτικό εκτυπωτή ως 32000
    • Και αντίθετη περίοδος στο 50
  • Στην καρτέλα "Ρυθμίσεις NVIC" ενεργοποιήστε όλες τις διακοπές

Ενεργοποίηση LED ως έξοδο:

Κάντε κλικ στο PD12 και ορίστε το ως "GPIO_Output"

Στη συνέχεια, διαμορφώστε το ρολόι όπως στην παραπάνω εικόνα και δημιουργήστε τον κώδικα.

Βήμα 4: Ανάπτυξη λογισμικού Keil

Πρώτον, ορίζουμε μεταβλητή κατάστασης η οποία θα διασφαλίσει ότι δεν ξεκινάμε το χρονόμετρο μέσα σε εξωτερική διακοπή όταν συνέβη η αναπήδηση:

/ * ΚΩΔΙΚΟΣ ΧΡΗΣΤΗ ΞΕΚΙΝΗΣΕ PFP */bool state = true; / * ΚΩΔΙΚΟΣ ΧΡΗΣΤΗ ΤΕΛΟΣ PFP */

Στη συνέχεια, γράφουμε ISR για εξωτερική διακοπή:

άκυρο HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); κατάσταση = false; } else {_NOP (); }}

Όταν πατάμε το κουμπί ελέγχουμε αν ήταν το καθορισμένο κουμπί μας και αν η κατάσταση είναι αληθής. Στην αρχή η κατάσταση θα είναι αληθής για να εισαγάγετε τη δήλωση if. Μετά την είσοδο ξεκινάμε το χρονόμετρο και κάνουμε κατάσταση ψευδής για να διασφαλίσουμε ότι το bouncing δεν θα επανεκκινήσει το χρονόμετρο.

Στη συνέχεια, γράφουμε ISR για διακοπή χρονοδιακόπτη:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *Αποτροπή αχρησιμοποίητων επιχειρημάτων (ων) προειδοποίηση μεταγλώττισης * / ΧΡΗΣΙΜΟΠΟΙΗΜΕΝΟ (htim);

/* ΣΗΜΕΙΩΣΗ: Αυτή η λειτουργία δεν πρέπει να τροποποιηθεί, όταν απαιτείται επανάκληση, το HAL_TIM_PeriodElapsedCallback θα μπορούσε να εφαρμοστεί στο αρχείο χρήστη */ εάν (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPI12) κατάσταση = αλήθεια. HAL_TIM_Base_Stop_IT (& htim1); }}

/ * ΚΩΔΙΚΟΣ ΧΡΗΣΤΗ ΤΕΛΟΣ 4 */

Μετά από 50mS ελέγχουμε αν το κουμπί είναι ακόμα σε κατάσταση επαναφοράς ή έχει απελευθερωθεί, αν ναι τότε γνωρίζουμε ότι το κουμπί είναι σε κατάσταση αδράνειας. Στη συνέχεια, αλλάζουμε το led, κάνουμε κατάσταση αληθινό για να μπορούμε να εντοπίσουμε ένα άλλο κουμπί και πατάμε το χρονόμετρο για να μπορούμε να το ξαναρχίσουμε.

Έτσι, αυτή η διαδικασία θα διασφαλίσει ότι θα αποτρέψουμε το πρόβλημα αναπήδησης.

Βήμα 5: Συμπέρασμα

Αυτός ήταν ο κώδικας για την κατάργηση του κουμπιού. Θέλω να σημειώσω ότι αυτός ο κώδικας αναπτύχθηκε από εμένα και δεν είμαι ειδικός προγραμματιστής. Έτσι, σίγουρα μπορεί να υπάρχουν λάθη. Εάν έχετε καλύτερη λύση, σημειώστε το. Μην ξεχνάτε, εάν αντιμετωπίσετε οποιοδήποτε πρόβλημα, γράψτε μου και θα προσπαθήσω να σας βοηθήσω.

Συνιστάται: