בפרויקט זה אנו מתכננים לעצב מעגל למדידת טמפרטורה. מעגל זה פותח באמצעות " LM35 ", חיישן מתח לינארי. הטמפרטורה נמדדת בדרך כלל ב- "צלזיוס" או "פרהייט". חיישן "LM35" מספק פלט על פי קנה מידה של צלזיוס.
LM35 הוא טרנזיסטור בעל שלושה פינים כמו מכשיר. יש לו VCC, GND ו- OUTPUT. חיישן זה מספק מתח משתנה ביציאה בהתבסס על טמפרטורה.
כפי שמוצג באיור לעיל, עבור כל עליית +1 מעלות צלזיוס תהיה תפוקה גבוהה יותר +10mV. אז אם הטמפרטורה היא 0◦ צלזיוס תפוקת החיישן תהיה 0V, אם הטמפרטורה היא 10◦ צלזיוס תפוקת החיישן תהיה +100mV, אם הטמפרטורה היא 25◦ צלזיוס תפוקת החיישן תהיה + 250mV.
אז בינתיים עם LM35 נקבל טמפרטורה בצורה של מתח משתנה. מתח תלוי טמפרטורה זה ניתן כקלט ל- ADC (ממיר אנלוגי לדיגיטלי) של ATMEGA32A. הערך הדיגיטלי לאחר ההמרה שהושג מוצג ב- LCD 16x2 כטמפרטורה.
רכיבים נדרשים
חומרה: ATMEGA32 מיקרו-בקר, ספק כוח (5 וולט), מתכנת AVR-ISP, JHD_162ALCD (16x2LCD), קבל 100uF (שני חלקים), קבל 100nF, חיישן טמפרטורה LM35.
תוכנה: Atmel studio 6.1, פרוגיספ או קסם פלאש.
תרשים מעגל והסבר
במעגל, PORTB של ATMEGA32 מחובר ליציאת נתונים של LCD. כאן צריך לזכור להשבית את תקשורת JTAG ב- PORTC ot ATMEGA על ידי שינוי בתים הנתיך, אם רוצים להשתמש ב- PORTC כיציאת תקשורת רגילה. ב LCD 16x2 יש 16 פינים בכל מקום אם יש תאורה אחורית, אם אין אור אחורי יהיו 14 פינים. אפשר להפעיל או להשאיר את סיכות התאורה האחורית. עכשיו ב -14 הפינים יש 8 פינים נתונים (7-14 או D0-D7), 2 פינים לאספקת חשמל (1 & 2 או VSS & VDD או GND & + 5V), סיכה שלישית 3 לבקרת ניגודיות (VEE שולט בכמה העבות הדמויות צריכות להיות מוצג), 3 סיכות בקרה (RS & RW & E).
במעגל, תוכלו לראות שלקחתי רק שתי סיכות בקרה מכיוון שהדבר נותן את הגמישות של הבנה טובה יותר. ביט הניגודיות ו- READ / WRITE לא משמשים לעתים קרובות, כך שניתן לקצר אותם לקרקע. זה מכניס את LCD למצב הניגודיות והקריאה הגבוה ביותר. אנחנו רק צריכים לשלוט בסיכות ENABLE ו- RS כדי לשלוח תווים ונתונים בהתאם.
החיבורים שבוצעו עבור LCD מובאים להלן:
PIN1 או VSS ------------------ קרקע
PIN2 או VDD או VCC ------------ + 5 וולט כוח
PIN3 או VEE --------------- קרקע (נותן ניגודיות מקסימאלית הטובה ביותר למתחילים)
PIN4 או RS (בחירת רישום) --------------- PD6 של uC
PIN5 או RW (קריאה / כתיבה) ----------------- קרקע (מכניס את LCD למצב קריאה מקל על התקשורת למשתמש)
PIN6 או E (אפשר) ------------------- PD5 של uC
PIN7 או D0 ----------------------------- PB0 של uC
PIN8 או D1 ----------------------------- PB1 של uC
PIN9 או D2 ----------------------------- PB2 של uC
PIN10 או D3 ----------------------------- PB3 של uC
PIN11 או D4 ---------------------------- PB4 של uC
PIN12 או D5 ----------------------------- PB5 של uC
PIN13 או D6 ----------------------------- PB6 של uC
PIN14 או D7 ----------------------------- PB7 של uC
במעגל אתה יכול לראות שהשתמשנו בתקשורת 8 ביט (D0-D7) אולם זה לא חובה, אנו יכולים להשתמש בתקשורת 4 ביט (D4-D7) אבל עם תוכנית תקשורת של 4 סיביות הופכת להיות קצת מורכבת אז בחרתי את 8 הביט תִקשׁוֹרֶת.
אז מהסתכלות בלבד מהטבלה לעיל אנו מחברים 10 פינים של LCD לבקר, בהם 8 פינים הם פינים של נתונים ו -2 פינים לבקרה. תפוקת המתח שמספק החיישן אינה ליניארית לחלוטין; זה יהיה רעשני. כדי לסנן את הרעש צריך להציב קבלים ביציאת החיישן כפי שמוצג באיור.
לפני שמתקדמים עלינו לדבר על ADC של ATMEGA32A. ב- ATMEGA32A, אנו יכולים לתת קלט אנלוגי לכל אחד משמונה הערוצים של PORTA, זה לא משנה איזה ערוץ נבחר שכן כולם זהים. אנחנו הולכים לבחור ערוץ 0 או PIN0 של PORTA. ב- ATMEGA32A, ה- ADC הוא ברזולוציית 10 סיביות, כך שהבקר יכול לזהות תחושה של שינוי מינימלי של Vref / 2 ^ 10, כך שאם מתח הייחוס הוא 5V נקבל תוספת יציאה דיגיטלית לכל 5/2 ^ 10 = 5mV. אז על כל תוספת של 5mV בכניסה תהיה לנו תוספת של אחת בפלט הדיגיטלי.
כעת עלינו להגדיר את רישום ה- ADC בהתבסס על התנאים הבאים:
1. קודם כל עלינו לאפשר את תכונת ה- ADC ב- ADC.
2. מכיוון שאנו מודדים טמפרטורת חדר, איננו באמת זקוקים לערכים מעבר למאה מעלות (תפוקת 1000mV של LM35). כדי שנוכל להגדיר ערך מקסימלי או הפניה של ADC ל- 2.5V.
3. לבקר יש תכונת המרת טריגר, כלומר המרת ADC מתבצעת רק לאחר טריגר חיצוני, מכיוון שאיננו רוצים שנצטרך להגדיר את הרישומים ש- ADC יפעל במצב ריצה חופשית רציפה.
4. עבור כל ADC, תדירות ההמרה (ערך אנלוגי לערך דיגיטלי) ודיוק הפלט הדיגיטלי הם פרופורציונאליים הפוכים. אז לדיוק טוב יותר של הפלט הדיגיטלי עלינו לבחור בתדר פחות. עבור שעון ADC פחות אנו מגדירים את מכירה מוקדמת של ADC לערך מקסימלי (128). מכיוון שאנו משתמשים בשעון הפנימי של 1MHZ, השעון של ADC יהיה (1000000/128).
אלה ארבעת הדברים היחידים שאנחנו צריכים לדעת כדי להתחיל לעבוד עם ADC. כל ארבעת התכונות שלעיל נקבעים על ידי שני רושמים.
אדום (ADEN): יש להגדיר סיבית זו להפעלת תכונת ה- ADC של ATMEGA.
כחול (REFS1, REFS0): שני ביטים אלה משמשים לקביעת מתח הייחוס (או מתח הקלט המרבי שאנחנו הולכים לתת). מכיוון שאנו רוצים שיהיה מתח התייחסות 2.56V, צריך להגדיר את שניהם REFS0 ו- REFS1, לפי הטבלה.
ירוק בהיר (ADATE): יש להגדיר סיבית זו כדי שה- ADC יפעל ברציפות (מצב ריצה חופשית).
PINK (MUX0-MUX4): חמשת הביטים הללו נועדו לספר את ערוץ הקלט. מכיוון שאנחנו הולכים להשתמש ב- ADC0 או PIN0, אנחנו לא צריכים להגדיר סיביות כמו על ידי הטבלה.
BROWN (ADPS0-ADPS2): שלוש סיביות אלה מיועדות לקביעת ה- prescalar עבור ADC. כי אנו משתמשים ב- prescalar של 128, עלינו להגדיר את כל שלוש הביטים.
ירוק כהה (ADSC): סיבית זו מוגדרת עבור ADC להתחיל בהמרה. ניתן להשבית ביט זה בתוכנית כשאנחנו צריכים לעצור את ההמרה.
להכנת פרויקט זה עם Arduino, עיין במדריך זה: מדחום דיגיטלי באמצעות Arduino
הסבר על תכנות
העבודה של מדידת טמפרטורה מוסברת בצורה הטובה ביותר שלב אחר שלב בקוד C המופיע להלן:
#include // כותרת כדי לאפשר בקרת זרימת נתונים על סיכות
#define F_CPU 1000000 // מציין תדר גביש לבקר
#לִכלוֹל
#define E 5 // מתן השם "לאפשר" כדי 5 th סיכה של PORTD, שכן הוא קשור LCD לאפשר סיכה
RS #define 6 // מתן השם "registerselection" כדי 6 th סיכה של PORTD, מאז מחוברת סיכה RS LCD
בטל send_a_command (פקודת char לא חתומה);
בטל send_a_character (דמות char לא חתומה);
בטל send_a_string (char * string_of_characters);
int main (בטל)
{
DDRB = 0xFF; // הצבת portB ו- portD כסיכות פלט
DDRD = 0xFF;
_ Delay_ms (50); // מתן עיכוב של 50ms
DDRA = 0; // לוקח את portA כקלט.
ADMUX - = (1 <
ADCSRA - = (1 <0)
{
send_a_character (* string_of_characters ++);
}
}