Πίνακας περιεχομένων:
- Βήμα 1: Απαιτήσεις υλικού και λογισμικού
- Βήμα 2: Κατανόηση του προβλήματος
- Βήμα 3: Διαμόρφωση STM32CubeMX
- Βήμα 4: Ανάπτυξη λογισμικού Keil
- Βήμα 5: Συμπέρασμα
Βίντεο: Κουμπί STM32CubeMX Debounce With Interrupt: 5 Βήματα
2024 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2024-01-30 08:34
Γεια, σε αυτό το σεμινάριο θα προσπαθήσω να δώσω την απλή λύση μου για να αποτρέψω την αναπήδηση του κουμπιού που είναι πολύ σοβαρό ζήτημα. Στο διαδίκτυο υπάρχουν πολλά βίντεο που προσφέρουν λύση σε αυτό το ζήτημα, αλλά κανένα από αυτά για εξωτερική διακοπή. Σε όλα αυτά τα βίντεο, το πάτημα του κουμπιού ελέγχεται με μέθοδο ψηφοφορίας που είναι αναποτελεσματική. Λοιπόν, ας ξεκινήσουμε!
Βήμα 1: Απαιτήσεις υλικού και λογισμικού
Απαιτήσεις υλικού:
- Πίνακας ανάπτυξης STM32 ARM
- Ενας υπολογιστής
Απαιτήσεις λογισμικού:
- STM32CubeMX
- Keil uVision5
Βήμα 2: Κατανόηση του προβλήματος
Έτσι, προσπαθούμε να βρούμε τη λύση για το πρόβλημα της αναπήδησης κουμπιών. Επομένως, πρέπει να κατανοήσουμε το ζήτημα. Έτσι, όταν πατάμε ένα κουμπί θα πρέπει να έρθει μια κατάσταση που είναι αντίθετη με την προηγούμενη κατάστασή του. Για παράδειγμα, αν ήταν Υ HIGHΗΛΗ πρέπει να είναι ΧΑΜΗΛΗ και αν ήταν ΧΑΜΗΛΗ τότε πρέπει να είναι Υ HIGHΗΛΗ. Ωστόσο, αυτή είναι η ιδανική κατάσταση (στο PROTEUS:)) Στην πραγματικότητα, όταν πατάμε ένα κουμπί αρχίζει να αναπηδά μεταξύ Υ HIGHΗΛΟΥ και ΧΑΜΗΛΟΥ πριν έρθει σε κατάσταση αδράνειας. Έτσι, προσποιείται ότι έχει πατηθεί αρκετές φορές που προκαλεί προβλήματα. Λοιπόν, τι πρέπει να κάνουμε;
Εδώ θέλω να σημειώσω ότι σε αυτό το παράδειγμα, θα χρησιμοποιήσουμε εξωτερική διακοπή για να εντοπίσουμε το πάτημα του κουμπιού. Έτσι, αφού εντοπίσουμε το πάτημα του κουμπιού, πρέπει να περιμένουμε λίγο χρόνο, όπως 50mS για να φτάσουμε σε κατάσταση αδράνειας και να ελέγξουμε ξανά εάν το κουμπί είναι σε κατάσταση αδράνειας ή όχι. Εάν είναι σε κατάσταση αδράνειας, τότε μπορούμε να συνεχίσουμε το έργο μας. Ας δούμε λοιπόν τον κωδικό:)
Βήμα 3: Διαμόρφωση 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: Συμπέρασμα
Αυτός ήταν ο κώδικας για την κατάργηση του κουμπιού. Θέλω να σημειώσω ότι αυτός ο κώδικας αναπτύχθηκε από εμένα και δεν είμαι ειδικός προγραμματιστής. Έτσι, σίγουρα μπορεί να υπάρχουν λάθη. Εάν έχετε καλύτερη λύση, σημειώστε το. Μην ξεχνάτε, εάν αντιμετωπίσετε οποιοδήποτε πρόβλημα, γράψτε μου και θα προσπαθήσω να σας βοηθήσω.
Συνιστάται:
Κουμπί σίγασης ομάδων Microsoft: 4 βήματα
Κουμπί σίγασης των ομάδων Microsoft: Δημιουργήστε ένα κουμπί εύκολης πρόσβασης για σίγαση/σίγαση του εαυτού σας όταν καλείτε ομάδες της Microsoft! Επειδή το 2020. Αυτό το έργο χρησιμοποιεί ένα Adafruit Circuit Playground Express (CPX) και ένα μεγάλο κουμπί για να δημιουργήσει ένα κουμπί σίγασης για τις ομάδες της Microsoft μέσω του πλήκτρου πρόσβασης
Κουμπί αυτοματισμού σπιτιού 5 $: 4 βήματα
Κουμπί αυτοματισμού σπιτιού 5 $: Κουμπί αυτοματισμού σπιτιού 5 $ Μερικές φορές η πιο απλή λύση είναι ένα μόνο κουμπί. Θέλαμε έναν εύκολο τρόπο να ενεργοποιήσουμε μια ρουτίνα «πριν τον ύπνο» στον κόμβο αυτοματισμού του σπιτιού μας (το Hubitat Elevation), ο οποίος σβήνει τα περισσότερα φώτα, θέτει τα άλλα σε συγκεκριμένα επίπεδα και
Arduino Simple Debounce: 4 Βήματα
Arduino Simple Debounce: Αυτό το διδακτικό είναι για το πώς να κάνετε εύκολη αποσύνδεση με 2 κουμπιά. Το μόνο που χρειάζεστε είναι βασικές γνώσεις στον προγραμματισμό ηλεκτρονικών και arduino. Βίντεο: με στο mail μου: iwx
Μικροελεγκτής AVR. Εναλλαγή LED με χρήση διακόπτη με κουμπί. Κουμπί απωθήσεων: 4 βήματα
Μικροελεγκτής AVR. Εναλλαγή LED με χρήση διακόπτη με κουμπί. Πιέζοντας το πλήκτρο Debouncing .: Σε αυτήν την ενότητα, θα μάθουμε πώς να κάνουμε τον κωδικό προγράμματος C για το ATMega328PU για να αλλάξουμε την κατάσταση των τριών LED σύμφωνα με την είσοδο από έναν διακόπτη κουμπιού. Επίσης, έχουμε διερευνήσει λύσεις στο πρόβλημα του "Switch Bounce". Ως συνήθως, θα
ΗΠΑ Arduino Interrupt LED Brightness: 6 βήματα
USA Arduino Interrupt LED Brightness: Σε αυτό το έργο, θα δημιουργήσουμε μια κόκκινη, λευκή και μπλε οθόνη LED με ποτενσιόμετρο και κουμπί. Ακούγεται εύκολο, αλλά επίσης θα χρησιμοποιήσουμε διακοπές για αυτό. Έτσι, όταν πατηθεί το κουμπί, η τιμή από το ποτενσιόμετρο θα οριστεί