- מהו אות PWM?
- תכנות PIC ליצירת PWM על סיכות GPIO
- תרשים מעגל
- סימולציה
- הגדרת חומרה לשליטה על מנוע סרוו באמצעות מיקרו-בקר PIC
ייצור אותות PWM הוא כלי חיוני בכל ארסנל מהנדסים משובצים, הם מאוד שימושיים עבור יישומים רבים כמו שליטה במיקום סרוו, החלפת מעט ICs אלקטרוניים חשמליים בממירים / מהפכים ואפילו לבקרת בהירות LED פשוטה. במיקרו-בקרים של PIC ניתן ליצור אותות PWM באמצעות המודולים השוואה, לכידה ו- PWM (CCP) על ידי הגדרת הרישומים הנדרשים, כבר למדנו כיצד לעשות זאת במדריך PIC PWM. אבל יש חסרון אחד משמעותי בשיטה זו.
ה- PIC16F877A יכול ליצור אותות PWM רק על הפינים RC1 ו- RC2, אם אנו משתמשים במודולי CCP. אך אנו עשויים להיתקל במצבים שבהם אנו זקוקים לסיכות נוספות כדי שיהיו לנו פונקציונליות של PWM. למשל במקרה שלי, אני רוצה לשלוט על 6 מנועי סרוו RC לפרויקט הזרוע הרובוטית שלי שמודול ה- CCP חסר תקווה. בתרחישים אלה אנו יכולים לתכנת את סיכות GPIO להפקת אותות PWM באמצעות מודולי טיימר. בדרך זו אנו יכולים ליצור כמה שיותר אותות PWM עם כל סיכה נדרשת. ישנם גם פריצות חומרה אחרות כמו שימוש במולטי-ריב IC, אך מדוע להשקיע בחומרה כאשר ניתן להשיג זאת באמצעות תכנות. אז במדריך זה נלמד כיצד להמיר סיכה של PIC GPIO לסיכה של PWM ולבדוק אותה נדמה אותה על פרוטאוס עם אוסצילוסקופ דיגיטלי וגםלשלוט במיקום מנוע סרוו באמצעות אות ה- PWM ולהגדיר את מחזור החובה שלו על ידי שינוי פוטנציומטר.
מהו אות PWM?
לפני שניכנס לפרטים, בואו נברר מעט מה הם אותות PWM. אפנון רוחב הדופק (PWM) הוא אות דיגיטלי הנפוץ ביותר במעגלי בקרה. אות זה מוגדר גבוה (5V) ונמוך (0V) בזמן ומהירות מוגדרים מראש. הזמן בו האות נשאר גבוה נקרא "בזמן" והזמן בו האות נשאר נמוך נקרא "זמן ההפעלה". ישנם שני פרמטרים חשובים עבור PWM כמפורט להלן:
מחזור חובה של ה- PWM
אחוז הזמן בו אות ה- PWM נשאר HIGH (בזמן) נקרא כמחזור חובה. אם האות תמיד פועל הוא במחזור חובה של 100% ואם הוא תמיד כבוי הוא מחזור חובה של 0%.
מחזור עבודה = הפעל זמן / (הפעל זמן + כיבוי זמן)
שם משתנה |
מתייחס ל |
PWM_Frequency |
תדירות אות ה- PWM |
T_TOTAL |
הזמן הכולל שנדרש למחזור שלם של PWM |
טוֹן |
בזמן האות PWM |
T_OFF |
זמן הפסקה של אות ה- PWM |
Duty_cycle |
מחזור חובה של אות ה- PWM |
אז עכשיו, בואו נעשה מתמטיקה.
זו הנוסחאות הסטנדרטיות שבהן התדר הוא פשוט הדדי הזמן. על ערך התדירות להחליט ולהגדיר על ידי המשתמש בהתבסס על דרישת היישום שלו.
T_TOTAL = (1 / PWM_Frequency)
כאשר המשתמש משנה את ערך מחזור החובה, על התוכנית שלנו להתאים באופן אוטומטי את זמן T_ON וזמן T_OFF בהתאם לכך. כך שניתן להשתמש בנוסחאות הנ"ל לחישוב T_ON בהתבסס על הערך של Duty_Cycle ו- T_TOTAL.
T_ON = (Duty_Cycle * T_TOTAL) / 100
מכיוון שהזמן הכולל של אות ה- PWM למחזור מלא אחד יהיה סכום הזמן בזמן וההפסקה. אנו יכולים לחשב את זמן ההפסקה T_OFF כפי שמוצג לעיל.
T_OFF = T_TOTAL - T_ON
בהתחשב בנוסחאות אלה אנו יכולים להתחיל בתכנות את מיקרו-בקר PIC. התוכנית כוללת את מודול טיימר PIC ומודול PIC ADC ליצירת אות PWM המבוסס על מחזור Duty משתנה בהתאם לערך ADC מה POT. אם אתה חדש להשתמש במודולים אלה, מומלץ מאוד לקרוא את המדריך המתאים על ידי לחיצה על ההיפר-קישורים.
תכנות PIC ליצירת PWM על סיכות GPIO
את התוכנית המלאה להדרכה זו תוכלו למצוא בתחתית האתר כמו תמיד. בחלק זה בואו נבין כיצד התוכנית נכתבת בפועל. כמו כל התוכניות, אנו מתחילים בקביעת סיביות התצורה. השתמשתי באפשרות תצוגות הזיכרון כדי להגדיר אותה עבורי.
// CONFIG # תצורת פרגמה FOSC = HS // סיביות בחירת מתנד (מתנד HS) # תצורת פרגמה WDTE = OFF // טיימר כלב שמירה הפעלת סיבית (WDT מושבת) # pragma config PWRTE = OFF // טיימר הפעלה טיימר אפשר סיבית מושבת) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR מופעל) # pragma config LVP = OFF // מתח נמוך (אספקה אחת) תכנות סידורי במעגל אפשר bit (RB3 הוא קלט / פלט דיגיטלי, יש להשתמש ב- HV ב- MCLR לתכנות) # config config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code code off) # pragma config WRT = OFF // Flash Flash Memory Memory Write Enable bits (כתיבת הגנה כבויה; כל זיכרון התוכנית עשוי להיכתב על ידי בקרת EECON) # pragma config CP = OFF // Bit Bit Memory Code Code Protection (Code code off) // הצהרות תצורה של pragma צריך להיות לפני שקובץ הפרויקט כולל. // השתמש באנומי פרויקטים במקום ב- #define עבור ON ו- OFF. #לִכלוֹל
ואז אנו מזכירים את תדר השעון המשמש בחומרה, כאן החומרה שלי משתמשת בקריסטל 20MHz, אתה יכול להזין את הערך המבוסס על החומרה שלך. אחריו מופיע ערך התדר של אות ה- PWM. מכיוון שהמטרה שלי כאן היא לשלוט על מנוע סרוו RC תחביב הדורש תדר PWM של 50Hz, הגדרתי 0.05KHz כערך התדר, אתה יכול גם לשנות את זה בהתאם לדרישות היישום שלך.
#define _XTAL_FREQ 20000000 #define PWM_Frequency 0.05 // in KHz (50Hz)
כעת, כאשר יש לנו את הערך של Frequency נוכל לחשב את T_TOTAL באמצעות הנוסחאות שנדונו לעיל. התוצאה צוללת ב -10 כדי לקבל את ערך הזמן במילי שניות. במקרה שלי הערך של T_TOTAL יהיה 2 מילי שניות.
int T_TOTAL = (1 / PWM_Frequency) / 10; // לחשב את הזמן הכולל מהתדירות (במילי שניות)) // 2msec
לאחר מכן, אנו מאתחלים את מודולי ה- ADC לקריאת המיקום של הפוטנציומטר כפי שנדון במדריך ADC PIC שלנו. בשלב הבא יש לנו את שגרת השירות להפסיק שתיקרא בכל פעם, הטיימר עולה על גדותנו נחזור לזה בהמשך, בינתיים בואו נבדוק את הפונקציה הראשית.
בתוך הפונקציה הראשית אנו מגדירים את מודול הטיימר. כאן הגדרתי את מודול הטיימר לעלות על כל 0.1ms. ניתן לחשב את הערך לזמן באמצעות הנוסחאות להלן
RegValue = 256 - ((Delay * Fosc) / (Prescalar * 4)) עיכוב בשניות ו- Fosc ב- hz
במקרה שלי לעיכוב של 0.0001 שניות (0.1ms) עם prescalar של 64 ו- Fosc של 20MHz ערך הרישום שלי (TMR0) צריך להיות 248. אז התצורה נראית ככה
/ ***** תצורת יציאה לטיימר ****** / OPTION_REG = 0b00000101; // Timer0 עם freq חיצוני ו- 64 כ prescalar // מאפשר גם PULL UPs TMR0 = 248; // טען את ערך הזמן עבור 0.0001 שניות; delayValue יכול להיות בין 0-256 בלבד TMR0IE = 1; // אפשר סיבית הפסקת טיימר ברישום PIE1 GIE = 1; // אפשר הפרעה גלובלית PEIE = 1; // אפשר את ההפרעה ההיקפית / *********** ______ *********** /
ואז עלינו להגדיר את תצורת הקלט והפלט. כאן אנו משתמשים בסיכת AN0 לקריאת ערך ADC וסיכות PORTD להפקת אותות PWM. אז יזם אותם כסיכות פלט והפוך אותם לנמוכים באמצעות שורות הקוד שלהלן.
/ ***** תצורת יציאה עבור I / O ****** / TRISD = 0x00; // הורה ל- MCU שכל הפינים ב- PORT D יופלטו PORTD = 0x00; // אתחל את כל הסיכות ל- 0 / *********** ______ *********** /
בתוך הלולאה בזמן האינסופי, עלינו לחשב את ערך הזמן (T_ON) ממחזור החובה. על זמן ועל חובת המחזור משתנה בהתאם לתפקיד הסיר כך אנחנו עושים את זה שוב ושוב בתוך בעוד הלולאה כמוצגת להלן. 0.0976 הוא הערך שיש להכפיל עם 1024 כדי לקבל 100 ולחשב T_ON הכפלנו אותו עם 10 כדי לקבל ערך במילי שניות.
בעוד (1) { POT_val = (ADC_Read (0)); // קרא את הערך של POT באמצעות ADC Duty_cycle = (POT_val * 0.0976); // מפה 0 עד 1024 עד 0 עד 100 T_ON = ((Duty_cycle * T_TOTAL) * 10/100); // חשב את הזמן באמצעות יחידת הנוסחאות במילי שניות __השהיה_מס (100); }
מכיוון שהטיימר מוגדר לזרימת יתר עבור כל 0.1ms, זמן ה- ISR לשגרה להפסקת הטיימר ייקרא לכל 0.1ms. בתוך שגרת השירות אנו משתמשים במשתנה הנקרא ספירה ומגדילים אותו לכל 0.1ms. בדרך זו אנו יכולים לעקוב אחר זמן f. למידע נוסף על הפרעות במיקרו-בקר PIC, עקוב אחר הקישורים
אם (TMR0IF == 1) // דגל הטיימר הופעל עקב הצפת טיימר -> מוגדר לגלישה לכל 0.1ms { TMR0 = 248; // טען את הטיימר ערך TMR0IF = 0; // נקה טיימר להפסיק ספירת דגלים ++; // ספירת תוספות לכל 0.1ms -> ספירה / 10 תתן ערך ספירה ב- ms }
לבסוף הגיע הזמן להחליף את סיכת ה- GPIO בהתבסס על הערך T_ON ו- T_OFF. יש לנו את משתנה הספירה העוקב אחר הזמן במילי שניות. לכן אנו משתמשים במשתנה זה כדי לבדוק אם הזמן הוא פחות מאשר בזמן , אם כן, אנו שומרים שהסיכה של GPIO מופעלת אחרת אנו מכבים אותו ושומרים עליו כבוי עד שמתחיל המחזור החדש. ניתן לעשות זאת על ידי השוואתו לזמן הכולל של מחזור PWM אחד. הקוד לעשות את אותו הדבר מוצג להלן
if (count <= (T_ON)) // If time less than at time RD1 = 1; // הפעל את GPIO אחר RD1 = 0; // אל תשבית את GPIO אם (ספירה> = (T_TOTAL * 10)) // שמור עליו כבוי עד שמחזור חדש מתחיל לספור = 0;
תרשים מעגל
תרשים המעגל ליצירת PWM עם פין GPIO של מיקרו-בקר PIC הוא ממש פשוט, פשוט הפעילו את ה- PIC עם מתנד וחברו את הפוטנציומטר לסיכה AN0 ומנוע סרוו כדי להצמיד את RD1, אנו יכולים להשתמש בפין GPIO כדי לקבל את אות ה- PWM, בחרתי RD1 פשוט מתוך אקראי. גם הפוטנציומטר וגם מנוע הסרוו מופעלים על ידי 5V המווסתים מ- 7805 כמוצג להלן בתרשים המעגל.
סימולציה
כדי לדמות את הפרויקט השתמשתי בתוכנת הפרוטאוס שלי. בנה את המעגל המוצג למטה וקשר את הקוד לסימולציה שלך והפעל אותו. אתה אמור לקבל אות PWM על סיכת ה- RD1 GPIO בהתאם לתוכנית שלנו ומחזור החובה של ה- PWM אמור להיות נשלט בהתבסס על מיקום הפוטנציומטר. ה- GIF שלהלן מראה כיצד אות ה- PWM ומנוע הסרוו מגיבים כאשר ערך ה- ADC משתנה באמצעות הפוטנציומטר.
הגדרת חומרה לשליטה על מנוע סרוו באמצעות מיקרו-בקר PIC
מערך החומרה השלם שלי מוצג להלן, עבור אנשים שעוקבים אחר ההדרכות שלי לוח זה אמור להראות מוכר, זהו אותו לוח בו השתמשתי בכל הדרכות שלי עד כה. אתה יכול להפנות את מדריך ה- LED מהבהב אם אתה מעוניין לדעת כיצד אני בונה אותו. אחרת פשוט עקוב אחר דיאגרמת המעגל לעיל והכל אמור לעבוד בסדר.
העלה את התוכנית וגוון את הפוטנציומטר וכדאי שתראה את הסרוו משנה את המיקום על סמך המיקום של הפוטנציומטר. העבודה המלאה של הפרויקט מוצגת הסרטון הרלוונטי בסוף הדף זה. מקווה שהבנתם את הפרויקט ונהניתם לבנות, אם יש לכם שאלות, אתם מוזמנים לפרסם אותם בפורום ואשתדל כמיטב יכולתי לענות.
אני מתכנן לקחת את הפרויקט הזה קדימה על ידי הוספת אפשרויות לשלוט במנועי סרוו מרובים וכך לבנות ממנו זרוע רובוטית, בדומה לזרוע הרובוטית Arduino שכבר בנינו. אז עד אז לראות אותך !!