זוהי ההדרכה ה -9 שלנו בנושא למידת PIC מיקרו-בקרים באמצעות MPLAB ו- XC8. עד עכשיו סקרנו הדרכות בסיסיות רבות כמו התחלת עבודה עם MPLABX, LED מהבהב עם PIC, טיימרים ב- PIC, ממשק LCD, ממשק 7 קטעים וכו '. אם אתה מתחיל מוחלט, אנא בקר ברשימה המלאה של מדריכי PIC כאן ולהתחיל ללמוד.
במדריך זה נלמד כיצד להשתמש ב- ADC עם מיקרו-בקר PICF877A שלנו. רוב הפרויקטים של המיקרו-בקר יכללו בו ADC (ממיר אנלוגי לדיגיטלי) מכיוון שזו אחת הדרכים הנפוצות ביותר לקרוא נתונים מהעולם האמיתי. כמעט כל החיישנים כמו חיישן טמפרטורה, חיישן שטף, חיישן לחץ, חיישני זרם, חיישני מתח, גירוסקופים, מד תאוצה, חיישן מרחק וכמעט כל חיישן או מתמר ידועים מייצרים מתח אנלוגי של 0V עד 5V בהתבסס על קריאת החיישנים. חיישן טמפרטורה למשל עשוי להוציא 2.1V כאשר הטמפרטורה היא 25C ולעלות ל -4.7 כאשר הטמפרטורה היא 60C. על מנת לדעת את הטמפרטורה של העולם האמיתי, ה- MCU צריך פשוט לקרוא את מתח המוצא של חיישן הטמפרטורה הזה ולקשר אותו לטמפרטורת העולם האמיתי. מכאן ש- ADC הוא כלי עבודה חשוב לפרויקטים של MCU ומאפשר ללמוד כיצד אנו יכולים להשתמש בו ב- PIC16F877A שלנו.
בדוק גם את המאמרים הקודמים שלנו בנושא שימוש ב- ADC במיקרו-בקרים אחרים:
- כיצד להשתמש ב- ADC ב- Arduino Uno?
- מדריך ADC לפטל פטל
- ממשק ADC0808 עם מיקרו-בקר 8051
ADC במיקרו-בקר PIC16F877A:
ישנם סוגים רבים של ADC זמינים ולכל אחד מהירות ורזולוציה משלו. הסוגים הנפוצים ביותר של ADC הם פלאש, קירוב עוקב וסיגמה-דלתא. סוג ה- ADC המשמש ב- PIC16F877A נקרא כקירוב ADC או SAR בקיצור. אז בואו ללמוד קצת על SAR ADC לפני שנתחיל להשתמש בו.
קירוב רצוף ADC: ה- SAR ADC עובד בעזרת משווה וכמה שיחות לוגיות. סוג זה של ADC משתמש במתח ייחוס (שהוא משתנה) ומשווה את מתח הכניסה למתח הייחוס באמצעות משווה והפרש, שיהיה פלט דיגיטלי, נשמר מהסיבית המשמעותית ביותר (MSB). מהירות ההשוואה תלויה בתדר השעון (Fosc) עליו פועל ה- PIC.
כעת, כשאנו מכירים כמה יסודות ב- ADC, נוכל לפתוח את גליון הנתונים שלנו וללמוד כיצד להשתמש ב- ADC ב- MCU PIC16F877A שלנו. ל- PIC שבו אנו משתמשים יש ADC בעל 8 ערוצים של 10 סיביות. משמעות הדבר היא שערך הפלט של ה- ADC שלנו יהיה 0-1024 (2 ^ 10) ויש 8 פינים (ערוצים) ב- MCU שלנו שיכולים לקרוא מתח אנלוגי. הערך 1024 מתקבל על ידי 2 ^ 10 מכיוון שה- ADC שלנו הוא 10 ביט. שמונה הפינים שיכולים לקרוא את המתח האנלוגי מוזכרים בגיליון הנתונים. בואו נסתכל על התמונה למטה.
הערוצים האנלוגיים AN0 עד AN7 מודגשים עבורך. רק פינים אלה יוכלו לקרוא מתח אנלוגי. לכן לפני קריאת מתח כניסה עלינו לציין בקוד שלנו באיזה ערוץ יש להשתמש כדי לקרוא את מתח הכניסה. במדריך זה נשתמש בערוץ 4 עם פוטנציומטר לקריאת המתח האנלוגי בערוץ זה.
למודול ה- A / D יש ארבעה רושמים שיש להגדיר אותם לקריאת נתונים מסיכות הקלט. רושמים אלה הם:
• רישום גבוה של תוצאות A / D (ADRESH)
• רישום נמוך של תוצאות A / D (ADRESL)
• רישום בקרת A / D 0 (ADCON0)
• רישום בקרת A / D 1 (ADCON1)
תכנות ל- ADC:
תוכנית לשימוש ADC עם מיקרו PIC הוא מאוד פשוט, אנחנו פשוט צריכים להבין ארבעה אוגרים אלה ולאחר מכן לקרוא שום מתח אנלוגי יהיה פשוט. כרגיל אתחל את סיביות התצורה ובוא נתחיל עם ה- main ריק ().
בתוך הראשי הריק () עלינו לאתחל את ה- ADC שלנו באמצעות הרישום ADCON1 והרישום ADCON0. לרשם ADCON0 יש את הסיביות הבאות:
במרשם זה עלינו להפעיל את מודול ה- ADC על ידי הפיכת ADON = 1 ולהפעיל את שעון ההמרה A / D על ידי שימוש בסיביות ADCS1 ו- ADCS0, השאר לא יוגדר לעת עתה. בתוכנית שלנו נבחר שעון ההמרה של A / D כ- Fosc / 16, אתה יכול לנסות את התדרים שלך ולראות כיצד התוצאה משתנה. פרטים מלאים זמינים בעמוד 127 של גליון הנתונים. לפיכך יאותחל ADCON0 באופן הבא.
ADCON0 = 0b01000001;
כעת לרשם ADCON1 יש את הסיביות הבאות:
במרשם זה עלינו להפוך את פורמט התוצאה של A / D לבחור קצת גבוה על ידי ADFM = 1 ולהפוך את ADCS2 = 1 כדי לבחור שוב ב- Fosc / 16. החלקים האחרים נותרים אפסים כפי שתכננו להשתמש במתח הייחוס הפנימי. פרטים מלאים זמינים בגליון הנתונים בעמוד 128. מכאן ש- ADCON1 נגדיר כדלקמן.
ADCON1 = 0x11000000;
כעת לאחר אתחול מודול ה- ADC בתוך הפונקציה העיקרית שלנו, נוכל להיכנס לולאת הזמן ולהתחיל לקרוא את ערכי ה- ADC. כדי לקרוא ערך ADC יש לבצע את השלבים הבאים.
- אתחל את מודול ה- ADC
- בחר את הערוץ האנלוגי
- התחל את ADC על ידי הפיכת Go / Done למעט גבוה
- המתן עד שהסיבית GO / DONE תישאר נמוכה
- קבל את תוצאת ADC מהרישום של ADRESH ו- ADRESL
1. אתחל את מודול ה- ADC: כבר למדנו כיצד לאתחל את ה- ADC ולכן אנו קוראים לפונקציה למטה כדי לאתחל את ה- ADC
ADC_Initialize החלל () הפונקציה היא להיות כדלקמן.
בטל ADC_Initialize () {ADCON0 = 0b01000001; // ADC ON ו- Fosc / 16 נבחר ADCON1 = 0b11000000; // נבחר מתח ייחוס פנימי}
2. בחר את הערוץ האנלוגי: כעת עלינו לבחור באיזה ערוץ אנו נשתמש כדי לקרוא את ערך ה- ADC. מאפשר ליצור פונקציה בשביל זה, כך שזה יהיה קל לנו לעבור בין כל ערוץ בתוך בעוד הלולאה.
לא חתום int ADC_Read (ערוץ char לא חתום) {// **** בחירת הערוץ ** /// ADCON0 & = 0x11000101; // ניקוי ביטים לבחירת ערוצים ADCON0 - = ערוץ << 3; // הגדרת הביטים הנדרשים // ** בחירת הערוץ הושלמה *** ///}
ואז מתקבל הערוץ שיש לבחור בתוך הערוץ המשתנה. בשורה
ADCON0 & = 0x1100101;
בחירת הערוץ הקודמת (אם קיימת) מנוקה. זה נעשה על ידי שימוש במקצת הסיביות ובמפעיל "&". הביטים 3, 4 ו -5 נאלצים להיות 0 ואילו האחרים נותרים לערכים הקודמים שלהם.
ואז נבחר הערוץ הרצוי על ידי הזזת שמאל של מספר הערוץ שלוש פעמים והגדרת הסיביות באמצעות הסיבית או האופרטור "-".
ADCON0 - = ערוץ << 3; // הגדרת הביטים הנדרשים
3. הפעל את ADC על ידי הפיכת Go / Done לסיבוב גבוה: לאחר שנבחר הערוץ עלינו להתחיל את המרת ADC פשוט על ידי הפיכת ה- GO_nDONE לסיבוב גבוה:
GO_nDONE = 1; // מאתחל המרת A / D
4. המתן עד שהסיבית GO / DONE תישאר נמוכה: ה- GO / DONE bit יישאר גבוה עד שהמרת ADC הושלמה, ולכן עלינו לחכות עד שהסיבית הזו תחזור להיות נמוכה. ניתן לעשות זאת באמצעות לולאת זמן .
בעוד (GO_nDONE); // המתן לסיום המרת A / D
5. קבל את תוצאת ה- ADC מהרישום של ADRESH ו- ADRESL: כאשר הסיבית GO / DONE מתחלשת שוב המשמעות היא שהמרת ה- ADC הושלמה. התוצאה של ה- ADC תהיה ערך של 10 סיביות. מכיוון שה- MCU שלנו הוא MCU של 8 סיביות, התוצאה מחולקת ל 8-bit העליונים ול- 2-bits התחתונים. התוצאה העליונה של 8 סיביות נשמרת ברישום ADRESH והתחתית בת 2 סיביות נשמרת ברישום ADRESL. לפיכך עלינו להוסיף אותם לרשומות כדי לקבל את ערך ה- ADC של 10 סיביות. תוצאה זו מוחזרת על ידי הפונקציה כמוצג להלן:
החזרה ((ADRESH << 8) + ADRESL); // מחזירה את התוצאה
הפונקציה השלמה המשמשת לבחירת ערוץ ADC, הפעלת ADC והחזרת התוצאה מוצגת כאן.
לא חתום int ADC_Read (ערוץ char לא חתום) {ADCON0 & = 0x11000101; // ניקוי ביטים לבחירת ערוצים ADCON0 - = ערוץ << 3; // הגדרת הביטים הנדרשים __השהיית_מס (2); // זמן רכישה לטעינת קבלים להחזיק GO_nDONE = 1; // מאתחל המרת A / D תוך כדי (GO_nDONE); // המתן להמרת A / D להחזרה מלאה ((ADRESH << 8) + ADRESL); // מחזירה את התוצאה}
עכשיו יש לנו פונקציה שתיקח את בחירת הערוץ כקלט ויחזיר לנו את ערך ה- ADC. לפיכך אנו יכולים לקרוא ישירות לפונקציה זו בתוך לולאת בזמן שלנו, מכיוון שאנו קוראים את המתח האנלוגי מערוץ 4 במדריך זה, קריאת הפונקציה תהיה כדלקמן.
i = (ADC_Read (4)); // אחסן את התוצאה של adc ב- "i".
על מנת לדמיין את תפוקת ה- ADC שלנו נצטרך איזשהו מודול תצוגה כמו LCD או 7-קטע. במדריך זה אנו משתמשים בתצוגה בת 7 קטעים כדי לאמת את הפלט. אם אתה רוצה לדעת כיצד להשתמש ב 7 קטעים עם תמונה עקוב אחר ההדרכה כאן.
הקוד השלם הוא כדלקמן והתהליך גם מוסבר הווידאו בסוף.
התקנת ובדיקת חומרה:
כרגיל מדמים את הקוד באמצעות פרוטאוס לפני שממש הולכים עם החומרה שלנו, התרשימים של הפרויקט מוצגים להלן:
חיבורים של מודול תצוגת שבעה קטעים בן 4 ספרות עם מיקרו-בקר PIC זהים לפרויקט הקודם, הרגע הוספנו פוטנציומטר לסיכה 7 שהוא הערוץ האנלוגי 4. על ידי שינוי הסיר, מתח משתנה יישלח ל- MCU אשר יקרא על ידי מודול ה- ADC ויוצג על מודול התצוגה בעל 7 החלקים. עיין בהדרכה הקודמת למידע נוסף על תצוגה בת 4 ספרות בת 7 קטעים והתממשקותה עם PIC MCU.
כאן השתמשנו באותו לוח PIC מיקרו-בקר אשר יצרנו במדריך המהבהב של LED. לאחר הבטחת החיבור העלה את התוכנית ל- PIC ואתה אמור לראות פלט כזה
כאן קראנו את ערך ה- ADC מהסיר והסבנו אותו למתח בפועל על ידי מיפוי פלט 0-1024 כ- 0-5 וולט (כפי שמוצג בתוכנית). הערך מוצג אז בקטע השבע ומאומת באמצעות המולטימטר.
זה נכון, עכשיו אנחנו מוכנים להשתמש בכל החיישנים האנלוגיים הקיימים בשוק, קדימה ונסו זאת ואם יש לכם בעיות כרגיל השתמשו בסעיף ההערות, נשמח לעזור לכם.