- מה זה ADC (אנלוגי להמרה דיגיטלית)
- ADC במיקרו-בקר AVR Atmega16
- רכיבים נדרשים
- תרשים מעגל
- הגדרת רישומי בקרת ADC ב- Atmega16
- תכנות Atmega16 עבור ADC
תכונה נפוצה אחת המשמשת כמעט בכל יישום משובץ היא מודול ה- ADC (ממיר אנלוגי לדיגיטלי). ממירים אנלוגיים לדיגיטליים אלה יכולים לקרוא מתח מחיישנים אנלוגיים כמו חיישן טמפרטורה, חיישן הטיה, חיישן זרם, חיישן Flex וכו '. במדריך זה נלמד מהו ADC וכיצד להשתמש ב- ADC ב- Atmega16. מדריך זה כולל חיבור פוטנציומטר קטן לסיכה ADC של Atmega16 ו- 8 נוריות LED משמשות להצגת המתח המשתנה של ערך פלט ADC ביחס לשינוי בערך קלט ADC.
בעבר הסברנו את ADC במיקרו-בקרים אחרים:
- כיצד להשתמש ב- ADC ב- ARM7 LPC2148 - מדידת מתח אנלוגי
- כיצד להשתמש ב- ADC ב- STM32F103C8 - מדידת מתח אנלוגי
- כיצד להשתמש ב- ADC ב- MSP430G2 - מדידת מתח אנלוגי
- כיצד להשתמש ב- ADC ב- Arduino Uno?
- שימוש במודול ADC של מיקרו-בקר PIC עם MPLAB ו- XC8
מה זה ADC (אנלוגי להמרה דיגיטלית)
ADC מייצג ממיר אנלוגי לדיגיטלי. באלקטרוניקה, ADC הוא מכשיר הממיר אות אנלוגי כמו זרם ומתח לקוד דיגיטלי (צורה בינארית). בעולם האמיתי רוב האותות הם אנלוגיים וכל מיקרו-בקר או מעבד מבין את השפה הבינארית או הדיגיטלית (0 או 1). לכן, על מנת לגרום למיקרו-בקרים להבין את האותות האנלוגיים, עלינו להמיר את האותות האנלוגיים הללו לצורה דיגיטלית. ADC בדיוק עושה זאת עבורנו. ישנם סוגים רבים של ADC הזמינים עבור יישומים שונים. מעטות ADC פופולריות הן פלאש, קירוב עוקב וסיגמה-דלתא.
הסוג הזול ביותר של ADC הוא קירוב רצוף ובמדריך זה ישמש ADC בקירוב רצוף. בסוג רציף-קירוב של ADC, נוצרת סדרה של קודים דיגיטליים, המתאימים כל אחד לרמה אנלוגית קבועה, ברצף. מונה פנימי משמש להשוואה עם האות האנלוגי הנמצא בהמרה. הדור נעצר כאשר הרמה האנלוגית הופכת להיות גדולה יותר מהאות האנלוגי. הקוד הדיגיטלי מתאים לרמה האנלוגית הוא הייצוג הדיגיטלי הרצוי של האות האנלוגי. זה מסיים את ההסבר הקטן שלנו על קירוב עוקב.
אם אתה רוצה לחקור את ה- ADC לעומק הרבה יותר, אתה יכול להפנות את המדריך הקודם שלנו בנושא ADC. מכשירי ADC זמינים בצורה של IC וגם מיקרו-בקרים מגיעים עם ADC מובנה בימינו. במדריך זה נשתמש ב- ADC מובנה של Atmega16. בואו נדון על ה- ADC המובנה של Atmega16.
ADC במיקרו-בקר AVR Atmega16
ל- Atmega16 ADC מובנה של 10 סיביות ו- 8 ערוצים. 10 סיביות תואמות את זה שאם מתח הכניסה הוא 0-5V אז הוא יחולק לערך 10 סיביות כלומר 1024 רמות של ערכים אנלוגיים נפרדים (2 10 = 1024). כעת 8 ערוצים תואמים את 8 סיכות ADC הייעודיות ב- Atmega16, כאשר כל סיכה יכולה לקרוא את המתח האנלוגי. PortA שלם (GPIO33-GPIO40) מוקדש להפעלת ADC. כברירת מחדל, סיכות PORTA הן סיכות IO כלליות, פירוש הדבר שסיכות היציאה מרובות. על מנת להשתמש בסיכות אלה כסיכות ADC נצטרך להגדיר רושמים מסוימים המוקדשים לבקרת ADC. זו הסיבה שהרושמים מכונים רושמי בקרת ADC. בואו נדון כיצד להגדיר את הרישומים האלה כדי להתחיל לתפקד את ה- ADC המובנה.
סיכות ADC באטמגה 16
רכיבים נדרשים
- מיקרו-בקרת Atmega16
- מתנד קריסטל 16Mhz
- שני קבלים 100nF
- שני קבלים 22pF
- לחץ על הכפתור
- חוטי מגשר
- קרש לחם
- USBASP v2.0
- Led (בכל צבע)
תרשים מעגל
הגדרת רישומי בקרת ADC ב- Atmega16
1. רישום ADMUX (רישום בחירת ריבוי ADC) :
ה- ADMUX Register מיועד לבחירת ערוץ ADC ולבחירת מתח ייחוס. התמונה למטה מציגה את סקירת הרישום של ADMUX. התיאור יוסבר להלן.
- ביט 0-4: ביטים לבחירת ערוצים.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
ערוץ ADC נבחר |
0 |
0 |
0 |
0 |
0 |
ADC0 |
0 |
0 |
0 |
0 |
1 |
ADC1 |
0 |
0 |
0 |
1 |
0 |
ADC2 |
0 |
0 |
0 |
1 |
1 |
ADC3 |
0 |
0 |
1 |
0 |
0 |
ADC4 |
0 |
0 |
1 |
0 |
1 |
ADC5 |
0 |
0 |
1 |
1 |
0 |
ADC6 |
0 |
0 |
1 |
1 |
1 |
ADC7 |
- ביט 5: הוא משמש להתאמת התוצאה לימין או לשמאל.
ADLAR |
תיאור |
0 |
נכון להתאים את התוצאה |
1 |
שמאל התאם את התוצאה |
- ביט 6-7: הם משמשים לבחירת מתח הייחוס ל- ADC.
REFS1 |
REFS0 |
בחירת הפניה למתח |
0 |
0 |
AREF, Vref פנימי כבוי |
0 |
1 |
AVcc עם קבלים חיצוניים בסיכת AREF |
1 |
0 |
שמורות |
1 |
1 |
הפניה פנימית של 2.56 מתח עם קבלים חיצוניים בפין AREF |
עכשיו התחל להגדיר את סיביות הרישום הללו בתוכנית כך שנקבל קריאה ופלט של ADC פנימי לכל סיכות ה- PORTC.
תכנות Atmega16 עבור ADC
התוכנית המלאה מובאת להלן. צרוב את התוכנית ב- Atmega16 באמצעות JTAG ו- Atmel studio וסובב את הפוטנציומטר כדי לשנות את ערך ה- ADC. כאן מוסבר הקוד שורה אחר שורה.
התחל עם הפיכת פונקציה אחת לקריאת ערך המרה ADC. ואז לעבור ערך ערוץ כמו "chnl" ב ADC_read פונקציה.
לא חתום int ADC_read (char chnl לא חתום)
ערכי הערוץ חייבים להיות בין 0 ל -7 מכיוון שיש לנו רק 8 ערוצי ADC.
chnl = chnl & 0b00000111;
על ידי כתיבת '40' כלומר '01000000' לרישום ADMUX בחרנו ב- PORTA0 כ- ADC0 שבו הקלט האנלוגי יחובר להמרה דיגיטלית.
ADMUX = 0x40;
כעת שלב זה כולל תהליך המרה של ADC, כאשר על ידי כתיבת ONE ל- ADSC Bit ברישום ADCSRA אנו מתחילים להמיר. לאחר מכן, המתן לסיבית ADIF להחזרת הערך לאחר סיום ההמרה. אנו מפסיקים את ההמרה על ידי כתיבת '1' ב- ADIF Bit במרשם ADCSRA. לאחר סיום ההמרה, החזר ערך ADC.
ADCSRA - = (1 <
כאן נבחר מתח הייחוס הפנימי של ADC על ידי הגדרת סיבית REFS0. לאחר מכן הפעל ADC ובחר prescaler כ- 128.
ADMUX = (1 <
כעת שמור ערך ADC ושלח אותו ל- PORTC. ב- PORTC מחוברים 8 נוריות שמציגות את הפלט הדיגיטלי בפורמט 8 סיביות. הדוגמה שהראינו משתנה את המתח בין 0V ל -5V באמצעות סיר 1K אחד.
i = ADC_read (0); PORTC = i;
מודד דיגיטלי משמש להצגת מתח כניסה אנלוגי בפין ADC ו- 8 נוריות משמשות להצגת ערך 8 סיביות מקביל של פלט ADC. פשוט סובב את הפוטנציומטר וראה את התוצאה המתאימה במולטימטר וכן בנורות נוריות זוהרות.
הקוד המלא וסרטון העבודה מופיע להלן.