- מנוע סרוו
- שליטה על מנוע סרוו באמצעות LPC2148 PWM & ADC
- סיכות PWM ו- ADC ב- ARM7-LPC2148
- רכיבים נדרשים
- תרשים מעגלים וחיבורים
- תכנות ARM7-LPC2148 לבקרת מנוע סרוו
במדריך הקודם שלנו, ממשקנו מנוע צעד עם ARM7-LPC2148. במדריך זה אנו נשלוט על מנוע סרוו באמצעות ARM7-LPC2148. למנוע סרוו יתרון בצריכת חשמל נמוכה על פני מנוע צעד. מנוע סרוו מפסיק את צריכת החשמל שלו כאשר מגיעים למצב הרצוי אך מנוע הצעד רציף לצרוך כוח לנעילת הפיר במצב הרצוי. מנועי סרוו משמשים בעיקר בפרויקטים של רובוטיקה בגלל הדיוק והטיפול הקל בהם.
במדריך זה נלמד על סרוו מנוע וכיצד ניתן לממשק סרוו עם ARM7-LPC2148. פוטנציומטר מממשק גם כדי לשנות את מיקום הפיר של מנוע הסרוו, ו- LCD כדי להציג את ערך הזווית.
מנוע סרוו
מנוע סרוו הוא שילוב של מנוע DC, מערכת בקרת מיקום והילוכים. סיבוב מנוע הסרוו נשלט על ידי החלת אות PWM אליו, רוחב אות ה- PWM קובע את זווית הסיבוב וכיוון המנוע. כאן נשתמש ב- SG90 Servo Motor בהדרכה זו, היא אחת הפופולריות והזולות ביותר. SG90 הוא סרוו של 180 מעלות. אז עם סרוו זה אנו יכולים למקם את הציר בין 0-180 מעלות:
- מתח הפעלה: + 5 וולט
- סוג ציוד: פלסטיק
- זווית סיבוב: 0 עד 180 מעלות
- משקל: 9 גרם
- מומנט: 2.5 ק"ג / ס"מ
לפני שנוכל להתחיל לתכנת עבור מנוע סרוו עלינו לדעת איזה סוג של אות נשלח לשליטה במנוע סרוו. עלינו לתכנת את ה- MCU לשליחת אותות PWM לחוט האות של מנוע הסרוו. בתוך מנוע הסרוו יש מעגל בקרה הקורא את מחזור החובה של אות ה- PWM ומציב את פיר מנועי הסרוו במקום המתאים, כפי שמוצג בתמונה למטה.
על כל 20 אלפיות השנייה מנוע סרוו בודק את הדופק. לכן, התאם את רוחב הדופק של האות לסיבוב פיר המנוע.
- רוחב דופק של 1 אלפיות שנייה (אלפית השנייה) לסיבוב סרוו ל 0 מעלות
- רוחב דופק של 1.5ms לסיבוב עד 90 מעלות (מיקום נייטרלי)
- רוחב דופק של 2 ms לסיבוב סרוו ל -180 מעלות.
לפני שתחבר סרוו ל- ARM7-LPC2148, תוכל לבדוק את הסרוו שלך בעזרת מעגל בודק מנועי סרוו זה. בדוק גם כיצד ניתן להתממשק מנוע סרוו למיקרו-בקרים אחרים:
- בקרת מנוע סרוו באמצעות Arduino
- ממשק מנועי סרוו עם מיקרו-בקר 8051
- בקרת מנוע סרוו באמצעות MATLAB
- בקרת מנוע סרוו עם פטל פי
- מנוע סרוו ממשק עם MSP430G2
- מנוע סרוו ממשק עם STM32F103C8
שליטה על מנוע סרוו באמצעות LPC2148 PWM & ADC
ניתן לשלוט על מנוע סרוו באמצעות LPC2148 באמצעות PWM. על ידי מתן אות PWM לסיכת PWM של SERVO עם תקופה של 20ms ותדירות של 50Hz אנו יכולים למקם את פיר המנוע הסרובי סביב 180 מעלות (-90 עד +90).
פוטנציומטר משמש לשינוי מחזור החובה של אות ה- PWM וסיבוב פיר המנוע הסרוו, שיטה זו מיושמת באמצעות מודול ADC ב- LPC2148. לכן אנו זקוקים למושגים של PWM ו- ADC כדי להיות מיושמים במדריך זה. אז עיין בחביבות בהדרכות הקודמות שלנו כדי ללמוד PWM ו- ADC ב- ARM7-LPC2148.
- כיצד להשתמש ב- PWM ב- ARM7-LPC2148
- כיצד להשתמש ב- ADC ב- ARM-LPLC2148
סיכות PWM ו- ADC ב- ARM7-LPC2148
התמונה למטה מציגה את סיכות PWM ו- ADC ב- LPC2148. תיבות צהובות מציינות את (6) סיכות PWM ותיבה שחורה מציינת את (14) סיכות ADC.
רכיבים נדרשים
חוּמרָה
- ARM7-LPC2148
- מודול תצוגה LCD (16x2)
- מנוע סרוו (SG-90)
- וסת מתח 3.3V
- פוטנציומטר 10k (2 Nos)
- קרש לחם
- חוטי חיבור
תוֹכנָה
- Keil uVision5
- כלי פלאש קסם
תרשים מעגלים וחיבורים
הטבלה שלהלן מציגה את הקשר בין מנוע סרוו ל- ARM7-LPC2148:
סיכות SERVO |
ARM7-LPC2148 |
אדום (+ 5 וולט) |
+ 5 וולט |
חום (GND) |
GND |
כתום (PWM) |
P0.1 |
הסיכה P0.1 היא פלט ה- PWM של LPC2148.
הטבלה שלהלן מציגה את חיבורי המעגל בין LCD ו- ARM7-LPC2148.
ARM7-LPC2148 |
LCD (16x2) |
P0.4 |
RS (בחר הרשמה) |
P0.6 |
E (אפשר) |
P0.12 |
D4 (סיכת נתונים 4) |
P0.13 |
D5 (סיכת נתונים 5) |
P0.14 |
D6 (סיכת נתונים 6) |
P0.15 |
D7 (סיכת נתונים 7) |
GND |
VSS, R / W, K |
+ 5 וולט |
VDD, A. |
הטבלה שלהלן מציגה את החיבורים בין ARM7 LPC2148 לפוטנציומטר עם וסת מתח 3.3V.
ויסות מתח 3.3V IC |
פונקציית סיכה |
ARM-7 LPC2148 פין |
1. סיכה שמאלית |
- Ve מ- GND |
סיכה של GND |
2. מרכז סיכה |
תפוקה מוסדרת + 3.3 וולט |
לפוטנציומטר קלט ופלט פוטנציומטר ל- P0.28 של LPC2148 |
3. סיכה ימנית |
+ Ve מ 5V קֶלֶט |
+ 5 וולט |
נקודות שיש לציין
1. נעשה שימוש בווסת מתח של 3.3 וולט בכדי לספק ערך כניסה אנלוגי לסיכה ADC (P0.28) של LPC2148. כאשר אנו משתמשים בהספק של 5 וולט עלינו לווסת מתח עם וסת מתח של 3.3 וולט.
2. פוטנציומטר משמש לשינוי מתח בין (0 וולט ל -3.3 וולט) כדי לספק קלט אנלוגי (ADC) לסיכה LPC2148 P0.28
3. הסיכה P0.1 של LPC2148 מספקת פלט PWM למנוע הסרוו כדי לשלוט על מיקום המנוע.
4. על פי ערך הקלט האנלוגי (ADC) המיקום של מנוע הסרו משתנה מ (0 ל 180 מעלות) דרך סיכת פלט PWM ב P0.1 של LPC2148.
תכנות ARM7-LPC2148 לבקרת מנוע סרוו
כדי לתכנת ARM7-LPC2148 אנו זקוקים לכלי uVision & Flash Magic. אנו משתמשים בכבל USB לתכנות ARM7 Stick באמצעות יציאת מיקרו USB. אנו כותבים קוד באמצעות Keil ויוצרים קובץ hex ואז קובץ HEX מהבהב למקל ARM7 באמצעות Flash Magic. למידע נוסף אודות התקנת keil uVision ו- Flash Magic וכיצד להשתמש בהן עקבו אחר הקישור תחילת העבודה עם ARM7 LPC2148 Microcontroller ותכנתו באמצעות Keil uVision.
צעדים המעורבים בתצורת LPC2148 עבור PWM ו- ADC לשליטה במנוע הסרוו
שלב 1: - כלול את קבצי הכותרת הדרושים לקידוד LPC2148
#לִכלוֹל
שלב 2: הדבר הבא הוא להגדיר את ה- PLL ליצירת שעונים מכיוון שהוא מגדיר את שעון המערכת ואת השעון ההיקפי של LPC2148 לפי הצורך של מתכנתים. תדר השעון המרבי עבור LPC2148 הוא 60Mhz. השורות הבאות משמשות להגדרת תצורת שעון PLL.
void initilizePLL (void) // פונקציה לשימוש ב- PLL ליצירת שעון { PLL0CON = 0x01; PLL0CFG = 0x24; PLL0FEED = 0xAA; PLL0FEED = 0x55; בעוד (! (PLL0STAT & 0x00000400)); PLL0CON = 0x03; PLL0FEED = 0xAA; PLL0FEED = 0x55; VPBDIV = 0x01; }
שלב 3: - הדבר הבא שיש לעשות הוא לבחור את סיכות PWM ופונקציית PWM של LPC2148 באמצעות רישום PINSEL. אנו משתמשים ב- PINSEL0 כאשר אנו משתמשים ב- P0.1 עבור פלט PWM של LPC2148.
PINSEL0 - = 0x00000008; // הגדרת סיכה P0.1 של LPC2148 כ- PWM3
שלב 4: - הבא, עלינו לאפס את הטיימרים באמצעות PWMTCR (Timer Control Register).
PWMTCR = 0x02; // אפס והשבית דלפק עבור PWM
ואז הגדר הבא את ערך הגודל המוגדר מראש שמחליט שהרזולוציה של PWM מוגדרת.
PWMPR = 0x1D; // ערך רישום מראש
שלב 5: - הבא, הגדר את PWMMCR (PWM register control control) כשהוא מגדיר פעולה כמו איפוס, הפרעות ל- PWMMR0 ו- PWMMR3.
PWMMCR = 0x00000203; // איפוס והפרעה במשחק MR0, הפרעה במשחק MR3
שלב 6: - התקופה המקסימלית של ערוץ PWM מוגדרת באמצעות PWMMR0 והטון של מחזור החובה של PWM מוגדר בתחילה ל- 0.65msec
PWMMR0 = 20000; // פרק זמן של גל PWM, 20ms PWMMR3 = 650; // טון גל PWM 0.65 אלפיות השנייה
שלב 7: - לאחר מכן, עלינו להגדיר את ה- Latch Enable לרישומי ההתאמה המתאימים באמצעות PWMLER
PWMLER = 0x09; // הפעלת תפס עבור PWM3 ו- PWM0
(אנו משתמשים ב- PWMMR0 & PWMMR3) אז אפשר את הסיבית המתאימה על ידי הגדרת 1 ב- PWMLER
שלב 8: - כדי לאפשר את פלט ה- PWM לסיכה עלינו להשתמש ב- PWMTCR להפעלת דלפקי PWM טיימר ומצבי PWM.
PWMPCR = 0x0800; // אפשר PWM3 ו- PWM 0, PWM PWMTCR = 0x09; // אפשר PWM ומונה
שלב 9: - כעת עלינו לקבל את ערכי הפוטנציומטר לקביעת מחזור חובה של PWM מסיכת ADC P0.28. לכן, אנו משתמשים במודול ADC ב- LPC2148 להמרת קלט אנלוגי פוטנציומטר (0 עד 3.3 וולט) לערכי ADC (0 עד 1023).
שלב 10: - עבור בחירת ADC P0.28 סיכה LPC2148, אנו משתמשים
PINSEL1 = 0x01000000; // הגדרת P0.28 כ- ADC INPUT AD0CR = (((14) << 8) - (1 << 21)); // הגדרת שעון ו- PDN להמרת A / D
השורות הבאות לוכדות את הקלט האנלוגי (0 עד 3.3 וולט) וממירות אותו לערך דיגיטלי (0 עד 1023). ואז הערכים הדיגיטליים האלה מחולקים ב -4 כדי להמיר אותם ל (0 עד 255) ולבסוף מוזנים כפלט PWM בפין P0.1 של LPC2148. כאן אנו ממירים את הערכים בין 0-1023 ל- 0-255 על ידי חלוקתו עם 4 שכן ל- PWM של LPC2148 יש רזולוציה של 8 סיביות (28).
AD0CR - = (1 << 1); // בחר ערוץ AD0.1 בזמן השהיית הרישום של ADC (10); AD0CR - = (1 << 24); // התחל את המרת A / D בעוד ((AD0DR1 & (1 << 31)) == 0); // בדוק את הסיבית DONE ב ADC Data register adcvalue = (AD0DR1 >> 6) & 0x3ff; // קבל את התוצאה ממאגר הנתונים של ADC dutycycle = adcvalue / 4; // נוסחה לקבלת ערכי מחזור מ- (0 עד 255) PWMMR1 = dutycycle; // הגדר ערך מחזור חובה לרישום התאמות PWM PWMLER - = (1 << 1); // אפשר פלט PWM עם ערך מחזור
שלב 11: - הבא, אנו מציגים את הערכים הללו במודול התצוגה LCD (16X2). לכן אנו מוסיפים את השורות הבאות לאתחול מודול תצוגת LCD
בטל LCD_INITILIZE (בטל) // פונקציה להכנת LCD { IO0DIR = 0x0000FFF0; // מגדיר סיכה P0.12, P0.13, P0.14, P0.15, P0.4, P0.6 כזמן עיכוב OUTPUT (20); LCD_SEND (0x02); // אתחל את lcd במצב פעולה של 4 סיביות LCD_SEND (0x28); // 2 שורות ( 16X2 ) LCD_SEND (0x0C); // הצג על הסמן כבוי LCD_SEND (0x06); // סמן תוספת אוטומטי LCD_SEND (0x01); // הצג LCD_SEND ברור (0x80); // מיקום ראשון בשורה הראשונה }
כאשר חיברנו את LCD במצב 4 סיביות עם LPC2148 עלינו לשלוח ערכים שיוצגו כנשנוש על ידי הכישוש (Nibble Upper & Nibble Lower). אז משתמשים בשורות הבאות.
בטל LCD_DISPLAY (char * msg) // פונקציה להדפסת התווים שנשלחו בזה אחר זה { uint8_t i = 0; בעוד (msg! = 0) { IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0xF0) << 8)); // שולח את הנשנוש העליון IO0SET = 0x00000050; // RS HIGH & ENABLE HIGH להדפסת נתונים IO0CLR = 0x00000020; // זמן עיכוב במצב כתיבה RW LOW (2); IO0CLR = 0x00000040; // EN = 0, RS ו- RW ללא שינוי (כלומר RS = 1, RW = 0) זמן עיכוב (5); IO0PIN = ((IO0PIN & 0xFFFF00FF) - ((msg & 0x0F) << 12)); // שולח כריש תחתון IO0SET = 0x00000050; // RS & EN HIGH IO0CLR = 0x00000020; עיכוב (2); IO0CLR = 0x00000040; עיכוב (5); i ++; } }
כדי להציג את ערכי ADC ו- PWM אנו משתמשים בשורות הבאות בפונקציה int main () .
LCD_SEND (0x80); sprintf (displayadc, "adcvalue =% f", dutycycle); LCD_DISPLAY (displayadc); // הצג ערך ADC (0 עד 1023) זווית = (adcvalue / 5.7); // נוסחה להמרת ערך ADC לזווית (o עד 180 מעלות) LCD_SEND (0xC0); sprintf (זווית ערך, "ANGLE =%. 2f deg", זווית); LCD_DISPLAY (זווית ערך);
הקוד המלא ותיאור הווידיאו של המדריך מופיעים להלן