مبدل آنالوگ به دیجیتال (ADC) یک سیستم الکترونیکی است که یک سیگنال آنالوگ، مانند صدای دریافت شده توسط میکروفون یا نور وارد شده به دوربین دیجیتال را به سیگنال دیجیتال تبدیل می کند. ما معمولاً از یک ADC برای اندازه‌گیری/خواندن ولتاژ آنالوگ از منابع یا حسگرهای مختلف استفاده می‌کنیم.

ADC معمولاً داخل میکروکنترلرهای مختلف تعبیه می شود یا به عنوان یک آی سی جداگانه ارائه می گردد.

آردوینو UNO (میکروکنترلر atmega328p) در مجموع دارای 6 پایه ورودی آنالوگ است که به صورت داخلی به ADC متصل می شوند تا برای خواندن ورودی های ولتاژ آنالوگ استفاده شوند. این پایه ها معمولا با حرف A مشخص می شوند. به عنوان مثال در آردوینو UNO پایه های A0 تا A5 می توانند به عنوان ورودی آنالوگ ADC استفاده شوند. تعداد ADC در سایر بردهای آردوینو ممکن است تفاوت داشته باشد.

رزولوشن ADC آردوینو

رزولوشن ADC داخلی آردوینو 10 بیت است، به این معنی که محدوده خروجی آن بین  0 تا 1023 است.

ولتاژ مرجع آنالوگ برای آردوینو ADC به طور پیش فرض VREF = +5v است، به این معنی که می توانیم ولتاژ ورودی آنالوگ را از 0 تا 5 ولت اندازه گیری کنیم. در صورتی که ولتاژهای بالاتر از این حد به پایه ADC اعمال شود ، پین های ورودی ممکن است آسیب ببینند و خروجی ADC به هر حال در 1023 اشباع می شود. بنابراین باید مراقب باشید که در محدوده ولتاژ کاری بمانید.

پایه AREF (آنالوگ مرجع) را می توان برای ارائه ولتاژ مرجع خارجی برای تبدیل آنالوگ به دیجیتال ورودی ها به پایه های آنالوگ (A0-A5) استفاده کرد. ولتاژ مرجع اساساً حداکثر ولتاژ ورودی آنالوگ را مشخص می کند که پس از آن خروجی ADC در 1023 اشباع می شود.

با استفاده از پایه AREF می‌توانیم ولتاژ پیش‌فرض VREF را تغییر داده و آن را روی هر سطح ولتاژ دلخواه تنظیم کنیم که امکان تبدیل A/D دقیق‌تری را فراهم می‌کند. فرض کنید پین AREF را به منبع 2.5 ولت DC خارجی وصل می کنیم، اکنون در نهایت رزولوشن مرجع آنالوگ 5 ولت پیش فرض را دو برابر خواهیم کرد.

زیرا به جای تقسیم محدوده 0 تا 5 ولت به سطوح مجزای 1024 دیجیتال، اکنون محدوده 0 تا 2.5 ولت را به 1024 سطح دیجیتال مجزا تقسیم می کنیم، که دقیقا دو برابر وضوح پیش فرض است. اما باید مطمئن شوید که ولتاژ آنالوگ ورودی پس از تنظیم AREF روی 2.5 ولت از 2.5 ولت بیشتر نشود. در غیر این صورت، اگر ولتاژ ورودی آنالوگ از AREF جدید (2.5 ولت) بیشتر شود، ADC در 1023 اشباع می شود.

زمان نمونه برداری ADC آردوینو

ADC در آردوینو یا هر میکروکنترلر دیگری نمی‌تواند ولتاژ آنالوگ را به طور مداوم و پیوسته به دیجیتال تبدیل کند. بنابراین، باید یک نمونه از ولتاژ آنالوگ روی پین در یک لحظه خاص گرفته و آن ولتاژ را نگه دارد. این کار توسط مداری به نام sample and hold انجام می شود.

بنابراین، ADC یک نسخه پایدار از ولتاژ پایه ورودی آنالوگ خواهد داشت و می‌تواند بدون مشکل تبدیل را شروع کند.

 به مدت زمانی که این فرایند طول می کشد زمان نمونه برداری گفته می شود. هر ADC زمان نمونه برداری خاص خودش را دارد.

همانطور که در دیتاشیت Atmega328p بیان شد، زمان نمونه برداری ADC حدود 1.5 تا 2 کلاک ADC است. با توجه به اینکه سرعت کلاک پیش فرض ADC در آردوینو UNO 125 کیلوهرتز است، بنابراین، زمان نمونه برداری ADC  ، 16 میکرو ثانیه است.

زمان تبدیل ADC آردوینو

زمان تبدیل ADC معمولاً به زمانی اشاره دارد که ADC برای تکمیل یک عملیات تبدیل آنالوگ به دیجیتال صرف می کند. فرآیند نمونه‌گیری که در مورد آن صحبت کردیم نیز بخشی از فرآیند تبدیل ADC است.

زمان تبدیل طبق دیتاشیت 13 کلاک ADC طول می کشد. با توجه به اینکه سرعت کلاک پیش فرض ADC در آردوینو UNO 125 کیلوهرتز است، بنابراین، زمان تبدیل ADC ، 104 میکرو ثانیه است. این زمان پیش‌فرض تبدیل ADC برای Arduino UNO (atmega328p) است.

خواندن مقدار ورودی آنالوگ در آردوینو

برای اندازه گیری ولتاژ ورودی آنالوگ در محدوده معمولی (0 – 5 ولت)، سیگنال ولتاژ را مستقیماً به پایه ورودی آنالوگ آردوینو وصل می کنیم و می توانیم پین را با استفاده از تابع analogRead بخوانید.

برای مثال مدار زیر را در نظر بگیرید:

arduino adc

سر وسط یک پتانسیومتر 10 کیلواهم را به پایه A0 آردوینو وصل کرده ایم در حالی که یک سر آن به 5 ولت و سر دیگر آن به زمین متصل است. بنابراین با چرخاندن پتانسیومتر ولتاژ سر وسط بین 0 تا 5 ولت تغییر می کند.

این کد آردوینو ولتاژ را از پتانسیومتر متصل به پایه A0 برد می خواند و آن را روی مانیتور سریال چاپ می کند:

int reading;
float voltage;
void setup() {
  Serial.begin(115200);
}

void loop() {
  reading = analogRead(A0);
  voltage = reading * (5.0 / 1023.0);
  Serial.println(voltage);
  delay(1000);
}

در دو خط اول دو متغیر به نام های reading و voltage تعریف شده اند. reading یک متغیر عدد صحیح است و voltage یک متغیر اعشاری است. کلمه کلیدی int برای اعلام یک متغیر عدد صحیح و کلمه کلیدی float برای اعلام یک متغیر ممیز شناور استفاده می شود. از reading برای ذخیره مقدار خوانده شده از ADC و از voltage برای ذخیره ولتاژ محاسبه شده از مقدار reading استفاده می شود. مقدار reading می تواند بین عدد 0 تا 1023 باشد.

در تابع setup دستور Serial.begin ارتباط سریال بین برد آردوینو و کامپیوتر را با باود ریت 115200 بیت در ثانیه آغاز می کند.

در حلقه loop دستور analogRead(A0) ولتاژ را از پتانسیومتر متصل به پایه A0 می خواند و آن را در متغیر reading ذخیره می کند. سپس متغیر voltage با ضرب مقدار reading در (5/1023) محاسبه می شود که reading را به مقدار ولتاژ تبدیل می کند. در نهایت، دستور Serial.println(voltage) مقدار ولتاژ را در مانیتور سریال چاپ می‌کند و دستور delay(1000) قبل از تکرار فرآیند 1 ثانیه وقفه ایجاد می کند.