אפנון רוחב הדופק (PWM) הוא טכניקה חזקה בה רוחב הדופק משתנה על ידי שמירה על תדירות קבועה. הטכניקה משמשת כיום במערכות בקרה רבות. היישום של PWM אינו מוגבל והוא משמש במגוון רחב של יישומים כגון בקרת מהירות מנוע, מדידה, בקרת הספק ותקשורת וכו '. בטכניקת PWM ניתן ליצור בקלות אות פלט אנלוגי באמצעות אותות דיגיטליים. מדריך זה יעזור לך להבין את PWM, את המינוחים שלה וכיצד אנו יכולים ליישם אותה באמצעות מיקרו-בקר. במדריך זה נדגים PWM עם AVR Atmega16 מיקרו-בקר על ידי שינוי עוצמת הנורית.
להבנת יסודות ה- PWM בפירוט, עברו למדריכות הקודמות שלנו בנושא PWM עם מיקרו-בקרים שונים:
- ARM7-LPC2148 מדריך PWM: בקרת בהירות LED
- אפנון רוחב הדופק (PWM) באמצעות MSP430G2: בקרת בהירות LED
- יצירת PWM באמצעות מיקרו-בקר PIC עם MPLAB ו- XC8
- אפנון רוחב הדופק (PWM) ב- STM32F103C8: מהירות הבקרה של מאוורר DC
- יצירת אותות PWM על סיכות GPIO של מיקרו-בקר PIC
- מדריך PWM של פטל פי
סיכות PWM במיקרו-בקר AVR Atmega16
ל- Atmega16 ארבעה סיכות ייעודיות ל- PWM. סיכות אלה הן PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
כמו כן, ל- Atmega16 שני טיימרים של 8 סיביות וטיימר אחד של 16 סיביות. Timer0 ו- Timer2 הם טיימרים של 8 סיביות ואילו Timer1 הוא טיימר של 16 סיביות. כדי ליצור PWM עלינו לקבל סקירה כללית של טיימרים שכן משתמשים בטיימרים ליצירת PWM. כידוע התדר הוא מספר מחזורים לשנייה שעליהם פועל הטיימר. אז התדר הגבוה יותר ייתן לנו טיימר מהיר יותר. בייצור PWM, תדר PWM מהיר יותר ייתן שליטה עדינה יותר על הפלט מכיוון שהוא יכול להגיב מהר יותר למחזורי חובה חדשים של PWM.
במדריך זה של Atmega16 PWM נשתמש ב- Timer2. אתה יכול לבחור בכל מחזור חובה. אם אינך יודע מהו מחזור חובה ב- PWM, בוא נדון בקצרה.
מהו אות PWM?
אפנון רוחב הדופק (PWM) הוא אות דיגיטלי הנפוץ ביותר במעגלי בקרה. הזמן שבמהלך האות נשאר גבוה נקרא "בזמן" והזמן בו האות נשאר נמוך נקרא "זמן כיבוי". ישנם שני פרמטרים חשובים עבור PWM כמפורט להלן:
מחזור חובה של ה- PWM
אחוז הזמן בו אות ה- PWM נשאר HIGH (בזמן) נקרא כמחזור חובה.
כמו באות דופק של 100ms, אם האות הוא HIGH למשך 50ms ו- LOW למשך 50ms, זה אומר שהדופק היה חצי זמן HIGH וחצי זמן LOW. אז אפשר לומר שמחזור החובה הוא 50%. באופן דומה אם הדופק נמצא במצב 25ms HIGH ו- 75ms במצב LOW מתוך 100ms, אז מחזור החובה יהיה 25%. שימו לב שאנחנו מחשבים רק את משך זמן ה- HIGH. אתה יכול לקחת הפניה לתמונה למטה להבנה חזותית. הנוסחה למחזור חובה היא אז,
מחזור עבודה (%) = זמן זמן / (זמן זמן + זמן כבוי)
לכן, על ידי שינוי מחזור החובה אנו יכולים לשנות את רוחב ה- PWM ובכך לגרום לשינוי בהירות LED. יהיה לנו הדגמה של שימוש במחזור חובה שונה בשליטה על בהירות LED. בדוק את סרטון ההדגמה בסוף הדרכה זו.
לאחר בחירת מחזור החובה, השלב הבא יהיה בחירת מצב PWM. מצב PWM מציין כי כיצד ברצונך ש- PWM יעבוד. ישנם בעיקר 3 סוגים של מצבי PWM. אלה הם כדלקמן:
- PWM מהיר
- שלב נכון PWM
- שלב ותדר PWM נכון
נעשה שימוש ב- PWM מהיר כאשר לא משנה שינוי השלב. על ידי שימוש ב- PWM מהיר, אנו יכולים להפיק את ערכי ה- PWM במהירות. לא ניתן להשתמש ב- PWM מהיר כאשר שינוי פאזה משפיע על הפעולה כגון בקרת מנוע, ולכן ביישום כזה משתמשים במצבים אחרים של PWM. מכיוון שנשלוט על בהירות ה- LED כאשר שינוי פאזה לא ישפיע הרבה, אז נשתמש במצב PWM מהיר.
עכשיו כדי ליצור PWM נשלוט על הטיימר הפנימי לספירה למעלה ואז נחזיר לאפס בספירה מסוימת, אז הטיימר יספור למעלה ואז נחזיר לאפס שוב ושוב. זה קובע את התקופה. כעת יש לנו אפשרות לשלוט בדופק, להפעיל דופק בספירה ספציפית בטיימר בזמן שהוא עולה. כאשר הדלפק חוזר ל -0, כבה את הדופק. יש בכך הרבה גמישות מכיוון שתמיד תוכלו לגשת לספירת הטיימר ולספק פולסים שונים עם טיימר יחיד. זה נהדר כאשר אתה רוצה לשלוט במספר נוריות LED בו זמנית. עכשיו נתחיל להתממשק נורית אחת עם Atmega16 עבור PWM.
בדוק את כל הפרויקטים הקשורים ל- PWM כאן.
רכיבים נדרשים
- מיקרו-בקרת Atmega16 AVR
- מתנד קריסטל 16Mhz
- שני קבלים 100nF
- שני קבלים 22pF
- לחץ על הכפתור
- חוטי מגשר
- קרש לחם
- USBASP v2.0
- 2 Led (בכל צבע)
תרשים מעגל
אנו משתמשים ב- OC2 עבור PWM כלומר Pin21 (PD7). אז חבר נורית LED אחת בסיכת PD7 של Atmega16.
תכנות Atmega16 עבור PWM
התוכנית המלאה מובאת להלן. צרוב את התוכנית ב- Atmega16 באמצעות JTAG ו- Atmel studio וראה את אפקט PWM על נורית הנורית. בהירותו תגדל ותפחת לאט בגלל מחזור חובה משתנה של PWM. בדקו את הסרטון שניתן בסוף.
התחל לתכנת Atmega16 עם הגדרת Timer2 Register. סיביות הרישום של Timer2 הן כדלקמן ואנחנו יכולים להגדיר או לאפס סיביות בהתאם.
כעת נדון בכל החלקים של Timer2 כדי שנוכל להשיג PWM רצוי באמצעות תוכנית כתובה.
ישנם בעיקר ארבעה חלקים במרשם Timer2:
FOC2 (השוואת פלט כוח לטיימר 2): ביט ה- FOC2 מוגדר כאשר סיביות ה- WGM מציינות מצב שאינו PWM.
WGM2 (מצב ייצור גל לטיימר 2): סיביות אלה שולטות ברצף הספירה של המונה, במקור לערך המונה המרבי (TOP) ובאיזה סוג של ייצור צורות גל שיש להשתמש בו.
COM2 (השווה בין מצב פלט לטיימר 2): סיביות אלה שולטות בהתנהגות הפלט. תיאור הסיביות המלא מוסבר להלן.
TCCR2 - = (1 <
הגדר סיביות WGM20 ו- WGM21 כ- HIGH להפעלת מצב PWM מהיר. ה- WGM עומד במצב יצירת צורות גל. סיביות הבחירה הן להלן.
WGM00 |
WGM01 |
הפעלת מצב טיימר 2 |
0 |
0 |
מצב נורמלי |
0 |
1 |
CTC (נקה טיימר בהשוואה התאמה) |
1 |
0 |
PWM, שלב נכון |
1 |
1 |
מצב PWM מהיר |
לפרטים נוספים על מצב יצירת צורת הגל, ניתן לעיין בגיליון הנתונים הרשמי של Atmega16.
TCCR2 - = (1 <
כמו כן לא השתמשנו בשום קנה מידה מוקדם ולכן הגדרנו את רישום המקור לשעון כ- '001'.
סיביות הבחירה בשעון הן כדלקמן:
CS22 |
CS21 |
CS20 |
תיאור |
0 |
0 |
0 |
אין מקור שעון (טיימר / מונה נעצר) |
0 |
0 |
1 |
clk T2S / (ללא הגדרה מוקדמת) |
0 |
1 |
0 |
Clk T2S / 8 (מ Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (מ Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (מאת Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (מאת Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (מ Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (מ Prescaler) |
כמו כן OC2 מנוקה בהתאמת השוואה על ידי הגדרת סיבית COM21 כ- '1' ו- COM20 כ- '0'.
אפשרויות הבחירה של מצב פלט השווה (COM) עבור מצב PWM מהיר מפורטות להלן:
COM21 |
COM21 |
תיאור |
0 |
0 |
פעולת יציאה רגילה, OC2 מנותק. |
0 |
1 |
שמורות |
1 |
0 |
נקה OC2 בהשוואת התאמה, הגדר OC2 כ TOP |
1 |
1 |
הגדר את OC2 להשוואה בהתאמה, נקה את OC2 בראש |
הגדל את מחזור החובה מ -0% ל -100% כך שהבהירות תגדל עם הזמן. קח ערך בין 0-255 ושלח אותו לסיכת OCR2.
עבור (חובה = 0; חובה <255; חובה ++) // 0 עד מחזור חובה מקסימלי { OCR2 = חובה; // להגדיל לאט את בהירות ה- LED _ Delay_ms (10); }
באופן דומה הפחת את מחזור החובה מ- 100% ל -0% כדי להפחית בהירות את בהירות ה- LED.
עבור (חובה = 0; חובה> 255; חובה--) // מקסימום עד 0 מחזור חובה { OCR2 = חובה; // הפחיתו אט אט את בהירות ה- LED _ Delay_ms (10); }
זה מסיים את ההדרכה שלנו לשימוש ב- PWM ב- Atmega16 / 32.