
ADC مخفف "Analog-Digital Converter" و به معناي مبدل آنالوگ به ديجيتال است.
اگر بخواهيم اين قابليت را به صورت ساده توصيف كنيم، يك ولت متر ديجيتال است كه بر روي پايههاي ميكروكنترلر نصب شده است و به وسيلهي آن ميتوان ولتاژ پايههاي ورودي را با دقت مناسبي اندازهگيري كرد. همانطور كه ميدانيد ما تا به حال در هيچ آي سي نميتوانستيم شدت ولتاژ ورودي را به دقت اندازه گيري كنيم و فقط ميتوانستيم بدانيم آيا ولتاژ ورودي بالاي 2.5 ولت است يا زير 2.5 ولت، و وروديهايمان را به صورت 0 و 1 برسي ميكرديم.(آي سي ها وروديهاي خود را منطقي ميكنند)
اما به كمك اين قابليتِ ميكروكنترلرهايِ خانوادهي AVR، ما ميتوانيم با دقت مناسبي ولتاژ ورودي خود را بررسي كنيم.
يكي از كاربردهاي مهم ADC ميتواند در رباتها براي تشخيص رنگ باشد. همانطور كه ميدانيد هر رنگ، ميزان مشخصي از نور را بازتاب ميدهد و بقيه را جذب ميكند، ما با اندازهگيري مقدار نور بازتاب شده، ميتوانيم رنگ را تشخيص دهيم. در اينجا ما براي اندازهگيري ميزان شدت نور بازتاب شده، بايد از ADC ميكروكنترلر استفاده كنيم تا بتوانيم ولتاژ خروجي سنسور نوري خود را به دقت اندازهگيري كنيم.
ADC يكي از مهمترين و پر كاربردترين قابليتهاي ميكروكنترلرهاي خانوادهي AVR است كه به تدريج با كاربردهاي فراوان آن در بخشهاي مختلف آشنا خواهيد شد.
هم اكنون نحوهي انجام تنظيمات اوليهي CodeWizard براي راهاندازي ADC را آموزش ميدهيم.
ابتدا CodeWizard را باز كرده و در آن، لبهي ADC را انتخاب ميكنيم، و در لبهي ADC، گزينهي "ADC Enabled" را تيك ميزنيم و سپس مانند شكل زير تنظيمات را انجام ميدهيد (براي بزرگتر ديدن تصوير روي آن كليك كنيد) :
همانطور كه ميبينيد، دومين قسمتي كه تيك زده شده "Use 8 bits" است.در ادامه در مورد دليل اين كار توضيح داده شده است.
همانطور كه گفته شد، وظيفهي ADC، اندازه گيري ولتاژي است كه بر روي پايهي ورودي قرار گرفته است. اما ADC عددي را كه مولتي متر به ما نشان ميدهد گزارش نميكند، بلكه متناسب با ولتاژ پايهي ورودي، عددي را در بازهي 0 تا 255 به ما گزارش ميكند. يعني عدد 0 را به ولتاژ 0ولت اختصاص ميدهد، و 255 را به 5 ولت؛ و هر ولتاژي بين 0 تا 5 ولت را، متناسباً، با عددي بين 0 تا 255 گزارش ميكند. در حقيقت براي سهولت در محاسبه، مي توانيد فرض كنيد اندازهي ولتاژ ورودي بر حسب ولت، ضربدر 51، برابرست با عددي كه ADC براي آن ولتاژ مشخص، به ما گزارش ميكند.
به عنوان مثالي ديگر، اگر خروجي مدار يك سنسور نوري را به پايهي ورودي ADC متصل كرده باشيد، و خروجي مدار سنسور 2 ولت باشد،ADC عدد 102 را به ما گزارش ميكند.
اگر تيكِ گزينهي "Use 8 bits" را برداريم، بازهي ما به 0 تا 1024، گشترش پيدا خواهد كرد و در حقيقت دقت اندازهگيري ما 4 برابر خواهد شد. يعني 5 ولت ما، به جاي 255، با عدد 1024 گزارش خواهد شد، و ولتاژهاي بين 0 و 5 ولت نيز متناسباً با عددي بين 0 تا 1024 گزارش خواهند شد. اما در كارهاي ما نيازي به اين دقت بالا نيست و معمولاً "Use 8 bits" را تيك ميزنيم تا بازهي ما بين 0 تا 255 باشد.
فورمول كلي ADC به شكل زير استفاده ميشه:
خروجی دیجیتالی =ولتاژ مرجع/ (ولتاژ ورودی * 1024)
Digital output =(Vin * 1024)/Vref
دربارهي تنظيمات ADC مطالب زيادي وجود دارد كه ما از مطرح كردن تمام آنها در اين بخش ميپرهيزيم، دوستاني كه علاقهمند هستند، ميتوانند از طريق كتابهاي مرجع و ديگر مراجع موجود، مطلب را پي بگيرند، اما در همين حدي كه مطالب در اينجا مطرح ميشوند، براي كار ما تقريباً كافيست و الزامي در مطالعهي منابع جانبي نيست.
نحوه ی استفاده از ADC در برنامه :
در میکرو کنترلر ATMEGA16، 8 پایه ی به ADC اختصاص داده شده، یعنی شما می توانید به صورت همزمان، خروجیِ 8 سنسور یا مدار جانبی را به میکروکنترلر خود وصل کنید و اطلاعات آن ها را به وسیله ی ADC دریافت کنید.
اما این 8 پایه کدام پایه ها هستند؟
این 8 پایه، پایه مربوط به پورت A هستند که با فعال کردن ADC در CodeWizard، این پایه ها در اختیار ADC قرار می گیرند. دقت کنید که برای استفده از ADC حتماً باید قبلاً تنظیمات را در CodeWizard انجام داده باشید.
این 8 پایه طبق شکل زیر از ADC0 تا ADC7 نام گذاری شده اند.

چگونه از ADC در برنامه استفاده کنیم؟
هنگامیکه شما تنظیمات اولیه را برای فعال سازی ADC در CodeWizard انجام می دهید، به شما این امکان داده می شود که در هر قسمت از برنامه، مقدار هر یک از 8 ADC را بخوانید و از آن استفاده کنید. عبارت" (شماره ي ADC )read_adc " در هر قسمت از برنامه، حاوي مقدار ADC مورد نظر شماست. مثلاً اگر بخواهيم مقدار ADC0 را بررسي كنيم كه آيا از 100 بزرگتر است يا خير، به شكل زير عمل ميكنيم:
يا مثلاً اگر بخواهيم مقدار ADC1 را در داخل يك متغير نگه داري كنيم، به شكل زير عمل مي كنيم:
int a;
a= read_adc(1);
يا مثلا اگر بخواهيم بر حسب ولتاژ اعداد ورودي را داشته باشيم، بايد به صورت زير عمل كنيم (البته اگر تيك Use 8 bit زده نشده باشه)
a= read_adc(3);
a= (a/1024)*5;
در اينجا متغير a مقدار دقيق ولتاژ را براي يك ولتاژ مرجع 5 ولت نشان مي دهد.
مبدل آنالوگ به ديجيتال، يكي از مهمترين قابليتهايست كه اكثر ميكروكنترلرهاي خانوادهي AVR آن را دارند. در ميكروكنترلرهاي قديميتر، براي اين كار، بايد يك آي سي به صورت جداگانه بر روي مدار تعبيه ميشد.
سوال؟!
Vref یا ولتاژ مرجع چیست ؟
میکرو برای تبدیل باید یک مرجع داشته باشد تا بتواند ولتاژهای ورودی را با آن مقایسه کند . در میکرو یك پورت با نام Aref وجود دارد که هر ولتاژی که به آن بدهيد به عنوان مرجع انتخاب میکند . مثلا یك 5 ولت ثابت به آن می دهيد تا Vref همیشه 5 باشد .
يا مثلا اگر رفرنس داخلی 2.56 ولت را فعال کنید و به ورودی ADC ولتاژ 1.28 ولت اعمال کنین عدد گرفته شده برابر 511 خواهد شد . (با توجه به فورمول گقته شده در بالا براي محاسبه)
وقفه adc برای چیست و کی فعال می شود ؟
وقفه برای این است که کلاک میکرو روي ADC تاثیر نگذارد !