המשימה הבסיסית והחשובה הבאה שנממש על המיקרו-בקר MSP430G252 של TI תהיה קריאה של מתח אנלוגי – גם ממקור חיצוני, וגם כדי לזהות את מתח ההפעלה שהמיקרו-בקר עצמו מקבל.
בדף הרשמי של משפחת MSP430 מופיע מסר שנשמע די מחייב: "Best analog in the microcontroller industry". ה-ADC הוא לא האלמנט האנלוגי היחיד, לא במיקרו-בקר הזה ולא במיקרו-בקרים בכלל, אבל הוא בהחלט מרכזי וחשוב מאוד, ושום "ארגז כלי עבודה" לאמבדד לא יהיה שלם בלעדיו. מודול ה-ADC של ה-MSP430 למיניהם מורכב יחסית ויש בו הרבה אפשרויות. אנחנו נתמקד כאן רק במשימה הנפוצה של קריאה יחידה של מתח חיצוני מפין קלט, ונוסיף זיהוי של מתח ההפעלה, כי בסוגי יישומים מסוימים הוא יכול להיות חשוב מאוד.
כשהתחלתי ליצור פרויקט חדש ב-CCS בשביל הפוסט הזה, קרה משהו מוזר: דגם המיקרו-בקר לא הופיע ברשימת האפשרויות. אחרי כמה ניסיונות ובירורים (כי לא מצאתי תשובה באינטרנט), הבנתי שמשהו השתנה בגרסה האחרונה של CCS, שהתקנתי זמן קצר אחרי הפוסט הקודם בסדרה. ככל הנראה, התמיכה בלוחות MSP430G2 Launchpad מהדגם הישן שיש לי הוסרה, וכדי להמשיך לעבוד איתם צריך להישאר עם גרסה קודמת של סביבת הפיתוח (מספר 11.1.00011 ומטה). מן הסתם אפשר להמשיך לכתוב קוד למיקרו-בקר עצמו, אבל צריך יהיה לצרוב אותו עם הצורב הייעודי של TI, שהוא יקר מאוד.
במיקרו-בקר שלנו יש מודול ADC יחיד, בן 10 ביטים, שנקרא כמובן ADC10, והוא מסוגל לגשת לשמונת פיני ה-IO של פורט 1 כדי לקרוא מתחים אנלוגיים חיצוניים. אנחנו נקרא מפין 1.4, שאינו "תפוס" על ידי חומרה כלשהי בלוח. בטרמינולוגיה של ה-ADC, הפין הזה מכונה A4, ו-4 הוא גם הקוד שלו ברביעיית הביטים INCH של הרגיסטר ADC10CTL1. ברירת המחדל של כל שאר הביטים ברגיסטר הזה מתאימה לנו בינתיים – היא מאפשרת לנו דגימה חד פעמית לפי דרישה, בלי שום המרות מיוחדות והתאמות שעונים. נצטרך גם להצהיר במפורש שהפין הזה מיועד עכשיו לקלט אנלוגי – זה לא מובן מאליו – על ידי כתיבת הערך 1 בביט הרביעי (כשמתחילים לספור מאפס) ברגיסטר ADC10AE0.
התוצאה של המרת ה-ADC תופיע לנו ברגיסטר ADC10MEM. למעשה, יש למודול ADC10 יכולות דמויות-DMA, לכתיבה "אוטומטית" של מספר תוצאות מדידה ישירות לרצף כתובות בזיכרון, אבל לא נסתבך עם זה עכשיו. פשוט נדליק את המודול בעזרת ביט ADC10ON ברגיסטר ADC10CTL0, נתחיל כל המרה על ידי כתיבת 1 לביטים ENC ו-ADC10SC באותו רגיסטר, ונחכה שהביט ADC10IFG יהפוך ל-0, מה שיגיד לנו שההמרה הסתיימה ושאפשר לקרוא את הערך. כמו בכל מיקרו-בקר נורמלי, אפשר כמובן לוותר על ההמתנה המפורשת הזו ולכתוב במקומה פונקציית פסיקה, שתתעורר אוטומטית בסיום ההמרה.
הקוד הזה שכתבתי נעזר בשני הלדים המובנים שעל הלוח: הלד האדום נדלק כשתוצאת ההמרה היא פחות מ-256 (ברירת המחדל של ה-ADC היא להשתמש במתחי המערכת 0-3.3V כרפרנסים, אז זה יוצא בסביבות 0.823V), ואילו הירוק נדלק כשהתוצאה גבוהה מ-768 (שווה ערך ל-2.48V). חיברתי פוטנציומטר לאדמה, ל-Vcc ולפין 1.4, מדדתי עם מולטימטר את המתחים שהפעילו את הלדים, וזה יצא נכון, לפחות בגבולות הדיוק של צורת בדיקה גסה שכזו.
השלב הבא: בואו נראה איך מודדים את מתח ההפעלה של המיקרו-בקר עצמו. לשם כך נדרש תמיד איזשהו רפרנס קבוע, שאינו משתנה ביחד עם מתח ההפעלה. הביט REFON של ADC10CTL0 יפעיל את הרפרנס הפנימי של המיקרו-בקר, והביט REF2_5V יקבע אם הרפרנס הזה יהיה 1.5V (ברירת המחדל) או 2.5V. סתם שתדעו, לפי ה-Datasheet של דגם המיקרו-בקר הספציפי, הדיוק של הרפרנס הפנימי הוא פלוס-מינוס 6% תחת מתח "ראשי" של 3V. אנחנו גם צריכים להגיד למודול לבדוק את הערך הנמדד ביחס לרפרנס הזה. לשם כך נכתוב 1 בשלישיית הביטים SREF באותו רגיסטר. פה צריך להיזהר – הקבוע SREF1 שמופיע בקובץ ההגדרות המוכן msp430g2553.h הוא לא הערך 1, אלא ערך עבור ביט מס' 1 ב-SREF, שהוא הביט האמצעי מתוך שלושה. אם נבחר להשתמש בקבועים כאלה, אנחנו צריכים את SREF0.
כמובן, אין טעם להשוות את מתח ההפעלה ישירות לרפרנס, כי הרפרנס יותר נמוך ולכן נקבל תמיד את התוצאה המקסימלית 1023. אבל כמו שבחרנו את פין 1.4, אנחנו יכולים לבחור ערוץ פנימי אחר למדידה: ערוץ 11 אמור לתת לנו חצי ממתח ההפעלה, וזה יהיה בהכרח נמוך מ-2.5V (אל תשכחו שהמיקרו-בקר עצמו מיועד לעבוד ב-3.6V לכל היותר). לפי החישוב, תחת מתח הפעלה של 3.3V ומול רפרנס 2.5V, אנחנו אמורים לקבל ערך 675. כדי לבדוק את זה, העליתי את הקוד הזה ללוח, ואז ניתקתי אותו מהמחשב וחיברתי לספק כוח שולחני כדי לשלוט במתח ההפעלה. האור הירוק נדלק כשהמתח (לדברי הספק) היה 3.33V ומעלה, והאדום נדלק כשלא.
כמו שהזכרתי קודם, שתי התוכניות האלה מציגות שימוש בסיסי וגולמי מאוד ב-ADC. לא דיברנו על פיצ'רים של חיסכון בחשמל, מצבי שינה, קצב ומשך דגימה, וכל שאר הדברים שנותנים לנו מדידות מדויקות תוך התחשבות בשאר הדרישות של מערכת אמבדד טיפוסית.