תוכן עניינים:

לחצן STM32CubeMX ניתוק עם הפסקה: 5 שלבים
לחצן STM32CubeMX ניתוק עם הפסקה: 5 שלבים

וִידֵאוֹ: לחצן STM32CubeMX ניתוק עם הפסקה: 5 שלבים

וִידֵאוֹ: לחצן STM32CubeMX ניתוק עם הפסקה: 5 שלבים
וִידֵאוֹ: Toggle relay using push-button on STM32 Nucleo 2024, נוֹבֶמבֶּר
Anonim
לחצן STM32CubeMX ניתוק עם הפרעה
לחצן STM32CubeMX ניתוק עם הפרעה

היי, במדריך זה אנסה לתת את הפתרון הפשוט שלי למניעת הקפצת כפתורים שהיא בעיה רצינית מאוד. באינטרנט ישנם סרטונים רבים להציע פתרון לבעיה זו, אך לא אחד מהם להפרעה חיצונית. בכל הסרטונים הללו לחיצת כפתור נבדקת בשיטת סקר שאינה יעילה. אז הבה נתחיל!

שלב 1: דרישות חומרה ותוכנה

דרישות חומרה:

  • לוח פיתוח ARM STM32
  • מחשב

דרישות תוכנה:

  • STM32CubeMX
  • Keil uVision5

שלב 2: הבנת הבעיה

הבנת הבעיה
הבנת הבעיה

לכן, אנו מנסים למצוא פתרון לבעיית הקפצת כפתורים. לכן עלינו להבין את הנושא. לכן, כאשר אנו לוחצים על כפתור זה אמור להגיע למצב שהוא הפוך למצב הקודם שלו. לדוגמה, אם זה היה גבוה זה חייב להיות נמוך ואם זה היה נמוך אז זה חייב להיות גבוה. עם זאת, זהו מצב אידיאלי (ב- PROTEUS:)) במציאות, כאשר אנו לוחצים על כפתור הוא מתחיל להקפיץ בין HIGH ל- LOW לפני שהוא מגיע למצב סרק. אז, מעמיד פנים שהוא נלחץ מספר פעמים מה שגורם לבעיות. אז מה עלינו לעשות?

כאן אני רוצה לציין שבדוגמה זו נשתמש בהפרעה חיצונית על מנת לזהות לחיצה על כפתורים. לכן, לאחר שזיהינו לחיצה על כפתורים עלינו להמתין מעט זמן, כמו 50mS כדי להגיע למצב סרק ולבדוק שוב אם הלחצן הוא מצב סרק או לא. אם הוא במצב סרק אז נוכל להמשיך במשימה שלנו. אז בואו נראה את הקוד:)

שלב 3: תצורת STM32CubeMX

תצורת STM32CubeMX
תצורת STM32CubeMX

אז עלינו לאפשר תחילה הפרעה חיצונית ללחצן הלחיצה שלנו (אני מניח שכאן אתה משתמש בלוח גילוי STM32F407VG):

  • בכרטיסייה "Pinout & Configuration" לחץ על PIN PA0 המחובר ללחצן הלחיצה ובחר GPIO_EXTI0 המאפשר הפרעה חיצונית בסיכה זו.
  • שנה את "תווית המשתמש" של הסיכה ל- "Push_Button" או כל דבר שתרצה.

לאחר מכן, עלינו להגדיר טיימר על מנת ליצור עיכוב זמן של 50ms:

  • היכנס לקטע "טיימרים"
  • לחץ על TIM1
  • בחר "שעון פנימי" כמקור שעון
  • בתצורה (אם אתה רוצה להבין את הסעיף הזה עיין במדריך זה, מומלץ מאוד "בקרת מנועי סרוו עם STM32F4 ARM MCU"):

    • הגדר מראש מכשיר כ 32000
    • ותקופה נגדית עד 50
  • בכרטיסייה "הגדרות NVIC" אפשר את כל ההפרעות

אפשר LED כפלט:

לחץ על PD12 והגדר כ- "GPIO_Output"

לאחר מכן, הגדר את השעון כמו בתמונה שניתנה למעלה וצור את הקוד.

שלב 4: פיתוח תוכנת Keil

ראשית, אנו מגדירים משתנה מצב שיבטיח שלא נפעיל טיימר בתוך הפרעה חיצונית כאשר קפצה קרתה:

/ * CODE USER BEGIN PFP */bool state = true; / * סיום קוד משתמש PFP */

לאחר מכן, אנו כותבים ISR להפרעה חיצונית:

void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin) {if (GPIO_Pin == Push_Button_Pin && state == true) {HAL_TIM_Base_Start_IT (& htim1); state = false; } אחר {_NOP (); }}

כאשר לחצו על כפתור אנו בודקים אם זה היה כפתור הלחיצה המוגדר שלנו והאם המצב נכון. בהתחלה המצב יהיה נכון על מנת להזין את המשפט if. לאחר הכניסה אנו מתחילים את הטיימר ועושים מצב לא נכון על מנת להבטיח שההקפצה לא תפעיל את הטיימר מחדש.

לאחר מכן, אנו כותבים ISR להפסקה של טיימר:

void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim) { / *מניעת אזהרת אוסף טיעונים שאינם בשימוש * / UNUSED (htim);

/* הערה: אין לשנות פונקציה זו, כאשר יש צורך בחיוג חוזר, ניתן ליישם את HAL_TIM_PeriodElapsedCallback בקובץ המשתמש */ if (HAL_GPIO_ReadPin (Push_Button_GPIO_Port, Push_Button_Pin) == GPIO_PIN_RESET) {HAL_GPIO_TogglePin (GPIOD, GPIO_PIN_); מצב = נכון; HAL_TIM_Base_Stop_IT (& htim1); }}

/ * סיום קוד משתמש 4 */

לאחר 50mS אנו בודקים אם הלחצן עדיין במצב איפוס או שוחרר, אם כן, אנו יודעים כי הכפתור במצב סרק. לאחר מכן אנו מחליפים את הלד, הופכים את המצב לאמיתי על מנת שנוכל לזהות לחיצה נוספת על כפתור ולעצור את הטיימר בכדי שנוכל להפעיל אותו מחדש.

לכן, תהליך זה יבטיח כי אנו מונעים בעיות קופצות.

שלב 5: מסקנה

זה היה קוד להפחתת כפתורים. אני רוצה לציין שהקוד הזה פותח על ידי ואני לא מתכנת מומחה. אז, בהחלט יכולות להיות טעויות. אם יש לך פתרון טוב יותר שים לב לזה. אל תשכח, אם אתה נתקל בבעיה כלשהי אנא כתוב לי ואנסה לעזור.

מוּמלָץ: