- PWM (אפנון רוחב דופק)
- סיכות PWM ב- ARM7-LPC2148
- PWM נרשם ב- ARM7-LPC2148
- רכיבים נדרשים
- תרשים מעגלים וחיבורים
- תכנות ARM7-LPC2148 עבור PWM
- צעדים המעורבים בתכנות LPC2148 עבור PWM ו- ADC
כידוע מיקרו-בקרים לוקחים קלט אנלוגי מחיישנים אנלוגיים ומשתמשים ב- ADC (ממיר אנלוגי לדיגיטלי) כדי לעבד את האותות הללו. אבל מה אם מיקרו-בקר רוצה לייצר אות אנלוגי כדי לשלוט במכשירים אנלוגיים המופעלים כמו מנוע סרוו, מנוע DC וכו '? מיקרו-בקרים אינם מייצרים מתח יציאה כמו 1V, 5V במקום זאת הם משתמשים בטכניקה הנקראת PWM להפעלת מכשירים אנלוגיים. דוגמא ל- PWM הוא מאוורר הקירור של המחשב הנייד שלנו (מנוע DC) אשר צריך להיות נשלט במהירות על פי הטמפרטורה, וזה מיושם באמצעות טכניקת Pulse Width Modulation (PWM) בלוחות האם.
במדריך זה נשלוט על בהירות ה- LED באמצעות ה- PWM במיקרו-בקר ARM7-LPC2148.
PWM (אפנון רוחב דופק)
PWM היא דרך טובה לשלוט במכשירים האנלוגיים המשתמשים בערך דיגיטלי כמו בקרת מהירות המנוע, בהירות של נורית וכו '. אמנם PWM אינו מספק פלט אנלוגי טהור, אך הוא מייצר פעימות אנלוגיות הגונות לשליטה בהתקנים האנלוגיים. PWM למעשה מווסת את רוחבו של גל דופק מלבני על מנת לקבל וריאציה בערך הממוצע של הגל שנוצר.
מחזור חובה של ה- PWM
אחוז הזמן בו אות ה- PWM נשאר HIGH (בזמן) נקרא כמחזור חובה. אם האות תמיד פועל הוא במחזור חובה של 100% ואם הוא תמיד כבוי הוא מחזור חובה של 0%.
מחזור עבודה = הפעל זמן / (הפעל זמן + כיבוי זמן)
סיכות PWM ב- ARM7-LPC2148
התמונה למטה מציינת את סיכות הפלט של PWM של ARM7-LPC2148. ישנם סך הכל שש סיכות עבור PWM.
ערוץ PWM |
סיכות יציאה LPC2148 |
PWM1 |
P0.0 |
PWM2 |
P0.7 |
PWM3 |
P0.1 |
PWM4 |
P0.8 |
PWM5 |
P0.21 |
PWM6 |
P0.9 |
PWM נרשם ב- ARM7-LPC2148
לפני שנכנס לפרויקט שלנו עלינו לדעת על רושמי ה- PWM ב- LPC2148.
להלן רשימת הרשמים המשמשים ב- LPC2148 עבור PWM
1. PWMPR: PWM Prescale Register
שימוש: זהו רישום של 32 סיביות. הוא מכיל את מספר הפעמים (מינוס 1) ש- PCLK חייב לעבור במחזור לפני הגדלת מונה הטיימר של PWM (למעשה הוא מחזיק בערך מרבי של מונה הגודל המוקדם).
2. PWMPC: מונה PWM Prescaler
שימוש: זה רישום של 32 סיביות . הוא מכיל את ערך הנגד המתגבר. כאשר ערך זה שווה לערך יחסי הציבור פלוס 1, מונה הטיימר PWM (TC) מצטבר.
3. PWMTCR: PWM Timer Control Register
שימוש: הוא מכיל את הפעלת Counter Enable, Counter Reset ואת PWM Enable bit bits. זהו רישום של 8 סיביות.
7: 4 |
3 |
2 |
1 |
0 |
שמורות |
הפעלת PWM |
שמורות |
איפוס מונה |
מונה מאפשר |
- הפעלת PWM: (Bit-3)
0- PWM מושבת
1- PWM מופעל
- הפעלת דלפק: (ביט -0)
0- השבת דלפקים
1- אפשר דלפק
- איפוס מונה: (Bit-1)
0- אל תעשה כלום.
1- מאפס את PWMTC ו- PWMPC בקצה החיובי של PCLK.
4. PWMTC: מונה טיימר PWM
שימוש: זהו רישום של 32 סיביות. הוא מכיל את הערך הנוכחי של טיימר ה- PWM המצטבר. כאשר מונה Prescaler (PC) מגיע לערך Register Prescaler (PR) בתוספת 1, מונה זה מצטבר.
5. PWMIR: PWM Interrupt Register
שימוש: זהו רישום של 16 סיביות. הוא מכיל את דגלי ההפרעה לערוצי ההתאמה של PWM 0-6. דגל הפרעה מוגדר כאשר מתרחשת הפרעה לאותו ערוץ (MRx Interrupt) כאשר X הוא מספר הערוץ (0 עד 6).
6. PWMMR0-PWMMR6: PWM Register Match
שימוש: זהו רישום של 32 סיביות . למעשה קבוצת ערוץ ההתאמה מאפשרת הגדרה של 6 יציאות PWM מבוקרות בקצה אחד או 3 כפולות בקצה. אתה יכול לשנות את שבעת ערוצי ההתאמה כדי להגדיר את יציאות ה- PWM הללו כך שיתאימו לדרישותיך ב- PWMPCR.
7. PWMMCR: PWM Match Control Register
שימוש: זהו רישום של 32 סיביות. הוא מכיל את הביטים Interrupt, Reset and Stop השולטים בערוץ ההתאמה שנבחר. התאמה מתרחשת בין רושמי ההתאמה של PWM לבין מוני טיימר PWM.
31:21 |
20 |
19 |
18 |
.. |
5 |
4 |
3 |
2 |
1 |
0 |
שמורות |
PWMMR6S |
PWMMR6R |
PWMMR6I |
.. |
PWMMR1S |
PWMMR1R |
PWMMR11 |
PWMMR0S |
PWMMR0R |
PWMMR01 |
כאן x הוא מ- 0 עד 6
- PWMMRxI (Bit-0)
הפסקת PWM מופעלת או מושבתת
0 - השבת את הפרעות ההתאמה של PWM.
1- אפשר הפסקת התאמת PWM.
- PWMMRxR: (Bit-1)
RESET PWMTC - ערך מונה טיימר בכל פעם שהוא תואם PWMRx
0- אל תעשה כלום.
1- מאפס את ה- PWMTC.
- PWMMRxS: (ביט 2)
STOP PWMTC & PWMPC כאשר PWMTC מגיע לערך רישום ההתאמה
0 - השבת את תכונת העצירה של PWM.
1 - הפעל את התכונה עצור PWM.
8. PWMPCR: PWM Control Register
שימוש: זהו רישום של 16 סיביות. הוא מכיל את הסיביות שמאפשרות יציאות PWM 0-6 ובוחרות שליטה בקצה יחיד או כפול קצה לכל פלט.
31:15 |
14: 9 |
8: 7 |
6: 2 |
1: 0 |
לא בשימוש |
PWMENA6-PWMENA1 |
לא בשימוש |
PWMSEL6-PWMSEL2 |
לא בשימוש |
- PWMSELx (x: 2 עד 6)
- מצב Edge יחיד עבור PWMx
- 1- מצב קצה כפול ל- PWMx.
- PWMENAx (x: 1 עד 6)
- PWMx השבת.
- 1 - PWMx מופעל.
9. PWMLER: PWM Latch Enable Register
שימוש: זהו רישום של 8 ביט. הוא מכיל את התאמת x סיביות התפס לכל ערוץ התאמה.
31: 7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
לא בשימוש |
LEN6 |
LEN5 |
LEN4 |
LEN3 |
LEN2 |
LEN1 |
LEN0 |
LENx (x: 0 עד 6):
0 - השבת טעינת ערכי התאמה חדשים
1 - טען את ערכי ההתאמה החדשים מ (PWMMRx) PWMMatch רישום כאשר האיפוס של הטיימר.
כעת נתחיל בבניית מערך החומרה כדי להדגים את אפנון רוחב הדופק במיקרו-בקר ARM.
רכיבים נדרשים
חוּמרָה
- מיקרו-בקר ARM7-LPC2148
- ויסות מתח 3.3V IC
- פוטנציומטר 10k
- LED (בכל צבע)
- מודול תצוגה LCD (16x2)
- קרש לחם
- חוטי חיבור
תוֹכנָה
- Keil uVision5
- כלי פלאש קסם
תרשים מעגלים וחיבורים
חיבורים בין 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. |
חיבור בין LED ל- ARM7-LPC2148
ה- ANODE של ה- LED מחובר לפלט PWM (P0.0) של LPC2148, בעוד שסיכת ה- CATHODE של ה- LED מחוברת לסיכה GND של LPC2148.
חיבור בין 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
תכנות ARM7-LPC2148 עבור PWM
כדי לתכנת ARM7-LPC2148 אנו זקוקים לכלי uVision & Flash Magic. אנו משתמשים בכבל USB לתכנות ARM7 Stick באמצעות יציאת מיקרו USB. אנו כותבים קוד באמצעות Keil ויוצרים קובץ hex ואז קובץ HEX מהבהב למקל ARM7 באמצעות Flash Magic. למידע נוסף אודות התקנת keil uVision ו- Flash Magic וכיצד להשתמש בהן עקבו אחר הקישור תחילת העבודה עם ARM7 LPC2148 Microcontroller ותכנתו באמצעות Keil uVision.
במדריך זה נשתמש בטכניקת ADC ו- PWM כדי לשלוט על בהירות ה- LED. כאן ניתן ל- LPC2148 קלט אנלוגי (0 עד 3.3 וולט) באמצעות סיכת כניסה ADC P0.28, ואז קלט אנלוגי זה מומר לערך דיגיטלי (0 עד 1023). ואז ערך זה מומר שוב לערך דיגיטלי (0 - 255) מכיוון שלפלט PWM של LPC2148 יש רזולוציה של 8 סיביות בלבד (2 8). נורית ה- LED מחוברת לסיכת PWM P0.0 וניתן לשלוט על בהירות ה- LED באמצעות הפוטנציומטר. למידע נוסף על ADC ב- ARM7-LPC2148 לחץ על הקישור.
צעדים המעורבים בתכנות LPC2148 עבור PWM ו- ADC
שלב 1: הדבר הראשון הוא להגדיר את ה- 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; }
שלב 2: הדבר הבא הוא לבחור את סיכות PWM ופונקציית PWM של LPC2148 באמצעות רישום PINSEL. אנו משתמשים ב- PINSEL0 כאשר אנו משתמשים ב- P0.0 עבור פלט PWM של LPC2148.
PINSEL0 = 0x00000002; // הגדרת סיכה P0.0 ליציאת PWM
שלב 3: - הבא עלינו לאפס את הטיימרים באמצעות PWMTCR (Timer Control Register).
PWMTCR = (1 << 1); // הגדרת בקרת טיימר PWM הרשמה כאיפוס נגד
ואז, הגדר את הערך המוקדם הקובע את הרזולוציה של PWM. אני מגדיר את זה לאפס
PWMPR = 0X00; // הגדרת ערך לפני הגודל של PWM
שלב 4: - הבא עלינו להגדיר את PWMMCR (PWM register control control) כאשר הוא מגדיר פעולה כמו איפוס, מפריע ל- PWMMR0.
PWMMCR = (1 << 0) - (1 << 1); // הגדרת רישום בקרת התאמת PWM
שלב 5: - התקופה המקסימלית של ערוץ PWM נקבעת באמצעות PWMMR.
PWMMR0 = PWMvalue; // מתן ערך PWM ערך מקסימלי
במקרה שלנו הערך המקסימלי הוא 255 (לקבלת בהירות מקסימאלית)
שלב 6: - הבא עלינו להגדיר את ה- Latch Enable לרישומי ההתאמה המתאימים באמצעות PWMLER
PWMLER = (1 << 0); // תפס PWM של Enalbe
(אנו משתמשים ב- PWMMR0) אז אפשר את הסיבית המתאימה על ידי הגדרת 1 ב- PWMLER
שלב 7: - כדי לאפשר את פלט ה- PWM לסיכה עלינו להשתמש ב- PWMTCR להפעלת דלפקי PWM טיימר ומצבי PWM.
PWMTCR = (1 << 0) - (1 << 3); // הפעלת מונה PWM ו- PWM
שלב 8: - כעת עלינו לקבל את ערכי הפוטנציומטר לקביעת מחזור חובה של PWM מסיכת ADC P0.28. לכן אנו משתמשים במודול ADC ב- LPC2148 להמרת קלט אנלוגי פוטנציומטרים (0 עד 3.3 וולט) לערכי ADC (0 עד 1023).
כאן אנו ממירים את הערכים בין 0-1023 ל- 0-255 על ידי חלוקתו עם 4 שכן ל- PWM של LPC2148 יש רזולוציה של 8 סיביות (2 8).
שלב 9: - עבור בחירת 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.0 של LPC2148 שעליו מחובר הנורית.
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 עם ערך מחזור
שלב 10: - הבא אנו מציגים את הערכים במודול התצוגה 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 התחתון). אז משתמשים בשורות הבאות.
בטל 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", adcvalue); LCD_DISPLAY (displayadc); // הצג ערך ADC (0 עד 1023) LCD_SEND (0xC0); sprintf (פלט led, "PWM OP =%. 2f", בהירות); LCD_DISPLAY (פלט led); // הצגת ערכי אופני חובה מ (0 עד 255)
הקוד המלא ותיאור הווידיאו של המדריך מופיעים להלן.