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

בקרת מנועי סרוו עם STM32F4 ARM MCU: 4 שלבים
בקרת מנועי סרוו עם STM32F4 ARM MCU: 4 שלבים

וִידֵאוֹ: בקרת מנועי סרוו עם STM32F4 ARM MCU: 4 שלבים

וִידֵאוֹ: בקרת מנועי סרוו עם STM32F4 ARM MCU: 4 שלבים
וִידֵאוֹ: Lesson 86: Control position of a servo motor using potentiometer 2024, יולי
Anonim
בקרת מנועי סרוו עם MCU ARM STM32F4
בקרת מנועי סרוו עם MCU ARM STM32F4
בקרת מנועי סרוו עם MCU ARM STM32F4
בקרת מנועי סרוו עם MCU ARM STM32F4

שלום שוב חברים:) לכן, בפרויקט זה נשלוט על מנוע סרוו עם STM32F4 ARM MCU. במקרה שלי, אשתמש בלוח גילוי, אך אם אתה מבין את עיקר הבעיה, תוכל ליישם אותו עבור כל MCU. לכן. בואו נתחיל:)

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

מבחינת חומרה נצטרך:

  • MCU שהוא במקרה שלי STM32f4 לוח גילוי
  • מנוע סרוו נפוץ, כמו SG90 או כל אחד אחר

מבחינת תוכנה נצטרך:

  • STM32CubeMX
  • Keil uVision

אם יש לך את כל אלה, קפץ לשלב הבא:)

שלב 2: תצורת STM32CubeMX

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

  • תקופת PWM חייבת להיות 20 mS
  • הזמן חייב להיות בין 0.5 mS ל 2.5 mS. כאשר הזמן הוא 0.5 mS, הסרוו יפנה 0 מעלות, 1.5 mS ל- 90 מעלות ו- 2.5 mS ל- 180 מעלות.

לכן, עלינו להגדיר את PWM ולשם כך נשתמש ב- Timer1.

  • ראשית, בחר TIM1 מהקטע טיימרים. השלב הזה
  • לאחר מכן, מקטע 'מצב'

    1. בחר שעון פנימי שלב זה
    2. PWM Generation CH1 שלב זה
  • לאחר מכן, מקטע התצורה

    1. הגדר Prescaler ל 160 שלב זה
    2. הגדר את תקופת המונה לשנת 2000 שלב זה
    3. הגדר את הדופק ל- 50 שלב זה
  • בנוסף, מתצורת השעון הגדר את שעוני טיימר APB1 ל -16 מגה -הרץ. השלב הזה

עכשיו, בואו נדבר קצת על השלב הזה:

תדירות שעון טיימר APB1 שלנו היא 16MHz. אז זה אומר שצריך 16, 000, 000 קרציות כדי לקבל שנייה אחת. עם זאת, הגדרנו את מכשיר ההרשמה שלנו ל -160. המשמעות היא שאנו מחלקים את התדירות במספר זה והפחתנו את מספר הקרציות ל -100,000. לכן, לשנייה אחת אנו זקוקים ל -100,000 קרציות. עם זאת, אנו זקוקים ל 20 מס של תקופת PWM כפי שצייננו קודם. אז, בהתבסס על מתמטיקה פשוטה, אנחנו צריכים 2000 קרציות עבור 20mS. לכן, על ידי הגדרת תקופת הנגד לשנת 2000 אנו קובעים את תקופת האות PWM שהיא 20mS. כעת עלינו לקבוע את מספר הסימון לקבלת זמנים מופעלים מ- 0.5mS עד 2.5mS. אנו יכולים לקבל את המשוואה הזו ממתמטיקה פשוטה והיא:

ב-_Time = (Tick_Number / 100). זכור כי זוהי שעה_המשנה את זווית מנוע הסרוו. אז, מתחת לתמונה אני מסכם את השלב הזה. אם יש לך שאלה כתוב בתגובות ואני אענה בהקדם האפשרי.

תמונת חישובים

לאחר ביצוע כל אלה יוצרים קוד:)

שלב 3: קידוד UVision Keil

אז בואו נקבע קודם כל מה אנחנו רוצים לעשות? אנחנו רוצים לכתוב פונקציה שמקבלת תואר ולכתוב אותה לסרוו. אם כן, כיצד נעשה זאת? כפי שאמרנו בעבר, על מנת לשנות זווית עלינו לשנות את הזמן. הזוויות שלנו משתנות בין [0, 180] לבין מספר הקרציות שלנו הקובע את שינויי הזמן בין [50, 250]. לכן, אנו זקוקים לפונקציית מיפוי הממפה זווית נתונה לטווח מספר הקרציות. לדוגמה, עבור 0 קרציות 50 מעלות, עבור 180 מעלות 250 קרציות וכן הלאה … אז בואו נכתוב את פונקציית המיפוי שלנו:

int map (int st1, int fn1, int st2, int fn2, int value) {return (1.0*(value-st1))/((fn1-st1)*1.0)*(fn2-st2)+st2; }

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

כעת, בואו נכתוב פונקציה המקבלת זווית וממפה אותה לטווח הקרציות:

servo_write חלל (זווית int) {htim1. Instance-> CCR1 = מפה (0, 180, 50, 250, זווית); }

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

עם זאת, על מנת שכל אלה יעבדו אנו מתחילים תחילה את ה- pwm שניתן לבצע על ידי שורת קוד בלבד:

HAL_TIM_PWM_Start (& htim1, TIM_CHANNEL_1);

אז, יש לנו פונקציה שמקבלת זווית וכותבת אותה לסרוו. בואו נבדוק את זה ונכתוב את פונקציית הטאטא שלנו שהיא קלה מאוד:

void servo_sweep (void) {for (int i = 0; i <= 180; i ++) {servo_write (i); HAL_Dayay (10); } עבור (int i = 180; i> = 0; i--) {servo_write (i); HAL_Delay (10); }}

אז, זה רק לספור עד 180 ואז להוריד עד 0 ולכתוב את הערכים האלה לסרוו:) אז, בואו נראה את התוצאה!

שלב רביעי: התוצאה:)

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

מוּמלָץ: