זוהי ההדרכה העשירית שלנו בנושא למידת PIC מיקרו-בקרים באמצעות MPLAB ו- XC8. עד כה, סקרנו הדרכות בסיסיות רבות כמו LED מהבהב עם PIC, טיימרים ב- PIC, ממשק LCD, ממשק 7 קטעים, ADC באמצעות PIC וכו '. אם אתה מתחיל מוחלט, אנא בקר ברשימה המלאה של מדריכי PIC כאן ו תתחיל ללמוד.
במדריך זה נלמד כיצד ליצור אותות PWM באמצעות PIC PIC16F877A. ל- PIC MCU שלנו יש מודול מיוחד שנקרא Compare Capture module (CCP) בו ניתן להשתמש כדי להפיק אותות PWM. כאן ניצור PWM של 5 קילוהרץ עם מחזור חובה משתנה בין 0% ל -100%. כדי לשנות את מחזור החובה שבו אנו משתמשים בפוטנציומטר, לכן מומלץ ללמוד הדרכה של ADC לפני שמתחילים ב- PWM. מודול PWM משתמש גם בטיימרים כדי לקבוע את התדירות שלו, ולכן למד כיצד להשתמש בטיימרים מראש כאן. יתר על כן, במדריך זה נשתמש במעגל RC ובנור LED כדי להמיר את ערכי ה- PWM למתח אנלוגי ולהשתמש בו לצורך עמעום של נורת ה- LED.
מהו אות PWM?
אפנון רוחב הדופק (PWM) הוא אות דיגיטלי הנפוץ ביותר במעגלי בקרה. אות זה מוגדר גבוה (5V) ונמוך (0V) בזמן ומהירות מוגדרים מראש. הזמן בו האות נשאר גבוה נקרא "בזמן" והזמן בו האות נשאר נמוך נקרא "זמן ההפעלה". ישנם שני פרמטרים חשובים עבור PWM כמפורט להלן:
מחזור חובה של ה- PWM:
אחוז הזמן בו אות ה- PWM נשאר HIGH (בזמן) נקרא כמחזור חובה. אם האות תמיד פועל הוא במחזור חובה של 100% ואם הוא תמיד כבוי הוא מחזור חובה של 0%.
מחזור עבודה = הפעל זמן / (הפעל זמן + כיבוי זמן)
תדירות PWM:
התדירות של אות PWM קובעת כמה מהר PWM משלים תקופה אחת. תקופה אחת הושלמה להפעלה וכיבוי של אות PWM כפי שמוצג באיור לעיל. במדריך שלנו נקבע תדר של 5KHz.
PWM באמצעות PIC16F877A:
ניתן ליצור אותות PWM במיקרו-בקר PIC שלנו באמצעות מודול CCP (השווה לכידה PWM). הרזולוציה של אות ה- PWM שלנו היא 10 סיביות, כלומר לערך 0 יהיה מחזור חובה של 0% ועבור ערך של 1024 (2 ^ 10) יהיה מחזור חובה של 100%. ישנם שני מודולי CCP ב- PIC MCU שלנו (CCP1 ו- CCP2), זה אומר שנוכל ליצור שני אותות PWM על שני סיכות שונות (סיכה 17 ו -16) בו זמנית, במדריך שלנו אנו משתמשים ב- CCP1 כדי ליצור אותות PWM על סיכה 17.
הרשמים הבאים משמשים להפקת אותות PWM באמצעות ה- PIC MCU שלנו:
- CCP1CON (CCP1 control register)
- T2CON (רישום בקרת טיימר 2)
- PR2 (טיימר 2 מודולים רישום תקופה)
- CCPR1L (רישום המק"ס 1 נמוך)
תכנות PIC ליצירת אותות PWM:
בתוכנית שלנו נקרא מתח אנלוגי של 0-5v מפוטנציומטר ונמפה אותו ל- 0-1024 באמצעות מודול ה- ADC שלנו. לאחר מכן אנו מייצרים אות PWM בתדר 5000Hz ומשנים את מחזור החובה שלו בהתבסס על מתח הכניסה האנלוגי. כלומר 0-1024 יומר למחזור עבודה 0% -100%. הדרכה זו מניחה שכבר למדתם להשתמש ב- ADC ב- PIC אם לא, קראו אותה מכאן מכיוון שנדלג על פרטים אודותיה במדריך זה.
לכן, ברגע שמוגדרים סיביות התצורה והתוכנית נכתבת לקריאת ערך אנלוגי, נוכל להמשיך עם PWM.
יש לנקוט בצעדים הבאים בעת קביעת התצורה של מודול CCP להפעלת PWM:
- הגדר את תקופת ה- PWM על ידי כתיבה למרשם PR2.
- הגדר את מחזור החובה של PWM על ידי כתיבה לרשומות CCPR1L ולסיביות CCP1CON <5: 4>.
- הפוך את סיכת ה- CCP1 לפלט על ידי ניקוי ביט ה- TRISC <2>.
- הגדר את ערך הגודל המוקדם של TMR2 והפעל את Timer2 על ידי כתיבה ל- T2CON.
- הגדר את מודול CCP1 להפעלת PWM.
ישנן שתי פונקציות חשובות בתוכנית זו להפקת אותות PWM. האחת היא פונקציית PWM_Initialize () שתאתחל את הרישומים הדרושים להגדרת מודול PWM ואז תגדיר את התדירות בה PWM אמור לפעול, והפונקציה השנייה היא פונקציית PWM_Duty () שתגדיר את מחזור החובה של אות PWM ב את המרשמים הנדרשים.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // הגדרת הנוסחאות PR2 באמצעות גליון נתונים // גורמת ל- PWM לעבוד ב- 5KHZ CCP1M3 = 1; CCP1M2 = 1; // הגדר את מודול CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // הגדר את מודול הטיימר TRISC2 = 0; // הפוך סיכת יציאה ל- C כפלט}
הפונקציה שלעיל היא פונקציית האתחול של PWM, בפונקציה זו מודול CCP1 מוגדר לשימוש ב- PWM על ידי הפיכת הביט CCP1M3 ו- CCP1M2 לגבוהים.
הקדם presaler של מודול הטיימר מוגדר על ידי הפיכת הסיבית T2CKPS0 לגבוהה ו- T2CKPS1 לנמוך, הסיבית TMR2ON מוגדרת להפעלת הטיימר.
כעת עלינו להגדיר את תדר אות ה- PWM. יש לכתוב את ערך התדר לרשם PR2. ניתן לקבוע את התדר הרצוי באמצעות הנוסחאות הבאות
תקופת PWM = * 4 * TOSC * (TMR2 Prescale Value)
סידור מחדש של הנוסחאות הללו כדי להשיג PR2 ייתן
PR2 = (תקופה / (4 * Tosc * TMR2 Prescale)) - 1
אנו יודעים כי תקופה = (1 / PWM_freq) ו- Tosc = (1 / _XTAL_FREQ). לָכֵן…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
לאחר הגדרת התדר אין צורך להתקשר לפונקציה זו אלא אלא עד שנצטרך לשנות את התדר שוב. במדריך שלנו הקצתי PWM_freq = 5000; כדי שנוכל לקבל תדר הפעלה של 5 קילוהרץ עבור אות ה- PWM שלנו.
עכשיו נקבע את מחזור החובה של ה- PWM באמצעות הפונקציה שלהלן
PWM_Duty (חובה int לא חתומה) {if (חובה <1023) {duty = ((float) duty / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // על הפחתה // חובה = (((צף) חובה / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = חובה & 1; // אחסן את הסיבית הראשונה CCP1Y = duty & 2; // אחסן את ה- 0 bit CCPR1L = חובה >> 2; // אחסן את ה- 8 bit הזכורה}}
לאות ה- PWM שלנו יש רזולוציה של 10 סיביות ולכן לא ניתן לאחסן ערך זה במרשם יחיד מכיוון ש- PIC שלנו כולל קווי נתונים של 8 סיביות בלבד. אז יש לנו להשתמש בשני סיביות אחרות של CCP1CON <5: 4> (CCP1X ו- CCP1Y) כדי לאחסן את שני ה- LSB האחרונים ואז לאחסן את 8 הסיביות הנותרות במרשם CCPR1L.
ניתן לחשב את זמן מחזור העבודה של PWM באמצעות הנוסחאות הבאות:
PWM Duty Cycle = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 Prescale Value)
סידור מחדש של נוסחאות אלה לקבלת ערך של CCPR1L ו- CCP1CON ייתן:
CCPRIL: CCP1Con <5: 4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)
הערך של ה- ADC שלנו יהיה 0-1024 אנחנו צריכים שיהיה ב 0% -100% מכאן, מחזור החובה של PWM = חובה / 1023. בהמשך להמרת מחזור חובה זה לפרק זמן עלינו להכפיל אותו עם התקופה (1 / PWM_freq)
אנו יודעים גם שטוסק = (1 / PWM_freq), ומכאן..
Duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
פתרון המשוואה לעיל ייתן לנו:
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
אתה יכול לבדוק את התוכנית המלאה בקטע הקוד למטה יחד עם הסרטון המפורט.
שרטוטים ובדיקות:
כרגיל הבה נוודא את הפלט באמצעות הדמיית פרוטאוס. תרשים המעגל מוצג למטה.
חבר פוטנציומטר כדי 7 th סיכה כדי להאכיל ב מתח של 0-5. מודול CCP1 הוא עם סיכה 17 (RC2), כאן ייווצר ה- PWM שניתן לאמת באמצעות האוסצילוסקופ הדיגיטלי. נוסף על מנת להמיר זאת למתח משתנה השתמשנו במסנן RC ובנורית LED לאימות הפלט ללא היקף.
מהו מסנן RC?
RC מסנן או מסנן מעביר נמוכים הוא מעגל פשוט עם שני אלמנטים פסיביים כלומר הנגד והקבל. שני רכיבים אלה משמשים לסינון תדירות אות ה- PWM שלנו ולהפיכתו למתח DC משתנה.
אם נבחן את המעגל, כאשר מוחל מתח משתנה על כניסת R, הקבל C יתחיל להיטען. כעת בהתבסס על ערך הקבל, לקבל ייקח זמן מה עד שהוא נטען במלואו, לאחר טעינה הוא יחסום את זרם ה- DC (זכרו את הקבלים חוסמים את DC אך מאפשר AC) ומכאן שמתח DC הכניסה יופיע על פני הפלט. תדר ה- PWM בתדירות גבוהה (אות AC) יוקרק דרך הקבל. כך מתקבל DC טהור על פני הקבל. ערך של 1000Ohm ו- 1uf נמצא מתאים לפרויקט זה. חישוב הערכים של R ו- C כרוך בניתוח מעגלים באמצעות פונקציית העברה, שאינה מתחום הדרכה זו.
ניתן לאמת את תפוקת התוכנית באמצעות האוסצילוסקופ הדיגיטלי כמוצג להלן, יש לשנות את הפוטנציומטר ומחזור החובה של ה- PWM אמור להשתנות. אנו יכולים גם להבחין במתח היציאה של מעגל RC באמצעות מד המתח. אם הכל עובד כצפוי נוכל להמשיך עם החומרה שלנו. המשך לבדוק את הסרטון בסוף לתהליך מלא.
עבודה על חומרה:
הגדרת החומרה של הפרויקט היא מאוד פשוטה, אנחנו רק הולכים לעשות שימוש חוזר בלוח PIC Perf שלנו שמוצג להלן.
נצטרך גם פוטנציומטר להזנת המתח האנלוגי, חיברתי כמה חוטי קצה נקביים לסיר שלי (מוצג להלן) כדי שנוכל לחבר אותם ישירות ללוח PIC Perf.
לבסוף כדי לאמת את הפלט אנו זקוקים למעגל RC ולנורית כדי לראות כיצד פועל האות PWM, פשוט השתמשתי בלוח פרפ קטן והלחמתי את מעגל ה- RC והנורית (כדי לשלוט על הבהירות) עליו כמוצג להלן.
אנו יכולים להשתמש בחוטי חיבור נקבה-נקבה פשוטים ולחבר אותם בהתאם לתרשימים המוצגים לעיל. לאחר סיום החיבור, העלה את התוכנית ל- PIC באמצעות ה- pickit3 שלנו, ותוכל לקבל מתח משתנה בהתבסס על קלט הפוטנציומטר שלך. הפלט המשתנה משמש לשליטה על בהירות ה- LED כאן.
השתמשתי במולטימטר שלי למדידת התפוקות המשתנות, אנו יכולים גם להבחין בבהירות ה- LED המשתנה לרמות מתח שונות.
זה זה שתכננו לקרוא את המתח האנלוגי מה- POT ולהמיר לאותות PWM אשר בתורם הומרו למתח משתנה באמצעות מסנן RC והתוצאה מאומתת באמצעות החומרה שלנו. אם יש לך ספק או נתקע איפשהו, השתמש בקטע ההערות למטה, נשמח לעזור לך. העבודה המלאה פועלת בסרטון.
בדוק גם את מדריכי PWM האחרים שלנו במיקרו-בקרים אחרים:
- מדריך PWM של פטל פי
- PWM עם Arduino Due
- דימר LED מבוסס Arduino באמצעות PWM
- דימר לד חשמל עם ATmega32 מיקרו-בקר