ADC چیست؟ توضیح ADC در Arduino

مقدمه

میکروکنترلرها فقط دیجیتال میفهمن. یعنی فقط صفر و یک میدونن چیه. یک کلید فشار داده شده یا نه. این  نمونه ای از سیگنال دیجیتاله. موقعی یه میکروکنترلر با 5 ولت کار میکنه اون میفهمه که 0 ولت یعنی منطق 0 و 5 ولت یعنی منطق 1. ولی واقعیت اینه در عمل همه چی به این سادگی ها نیست و دنیا یه دنیای خاکستری هست. مثلا 2.72 ولت یعنی چی؟صفره یا یک؟ توی دنیای آنالوگ ما اغلب نیاز داریم که ولتاژ های مختلفی رو اندازه گیری کنیم. یه سنسور آنالوگ که با 5 ولت کار میکنه خروجیش میتونه از 0.01 تا 4.99 تغییر کنه. خوشبختانه اکثر میکروکنترلرها یه واحد داخلی توی خودشون دارم که میتونن ولتاژ آنالوگ رو به یه عدد دیجیتال تبدیل کنن. اسم اون واحد هست ADC . قبل از خوندن ادامه این بحث پیشنهاد میکنم حتما مطالب زیر که توی سایت منتشر شده رو بخونید:

ولتاژ، جریان، مقاومت و قانون اهم

مولتی متر دیجیتال

ADC چیست؟

ADC مخفف عبارت  Analog to Digital Converter هست که به معنی مبدل آنالوگ به دیجیتال هست. حالا این چیکار میکنه؟ میاد ولتاژهای ورودی آنالوگ که روی یه پایه میفته رو تبدیل میکنه به اعداد دیجیتال. با تبدیل اعداد آنالوگ به اعداد دیجیتال ما میتونیم ارتباط با دنیای آنالوگ اطرفمون رو شروع کنیم. بدون این که هیچ دغدغه ای داشته باشیم. در عکس زیر پایه های ADC برد آردوینو رو آوردیم:

ADC آردوینو

توی یه میکروکنترلر همه ی پایه ها این خاصیت رو ندارن تا ولتاژ آنالوگ رو به دیجیتال تبدیل کنن. توی بردهای آردوینو فقط پایه هایی میتونن این کار رو انجام بدن که جلوی شماره ای که دارن از حرف “A” استفاده بشه. مثلا A0 یا A2 .
برد آردوینو 6 تا پایه مبدل آنالوگ به دیجیتال داره که با نام های A0 تا A5 شماره گذاری شدن.

توی میکروکنترلرها و بردهای مختلف ADC های مختلفی وجود داره. ADC که در برد آردوینو استفاده میشه 10 بیتی هست یعنی میتونه یه ولتاژ آنالوگی که داره رو با دقت 210 (1024) بخونه. منظور از این جمله اینه که هر ولتاژ آنالوگ که روی پایه اش میفته بهش یه عدد از 0 تا 1023 نسبت میده و هر چی این ولتاژ بالاتر باشه عدده هم بالاتره. مثلا اگه ولتاژ صفر بیاد عدد 0 رو میخونه و اگه ولتاژ 5 بیاد عدد 1023 رو میخونه. و بقیه ولتاژ ها هم به همین ترتیب. حالا هر چه این دقت بالاتر باشه طبیعی هست که ولتاژ رو دقیق تر میتونه تبدیل کنه. مثلا اگه دقت 16 بیتی باشه به ولتاژها عددی بین 0 تا 65534 نسبت میده. خوب اگه با اون ADC که دقتش 10 بیتی هست مقایسه کنیم میبینیم که این ADC داره ولتاژ ها رو بهتر به عددهای دیجیتال تبدیل میکنه.

این که ADC چجوری این کار رو انجام میده نسبتا پیچیده هست. چندین راه مختلف برای این کار وجود داره( از ویکیپدیا بخونید)  اما یکی از راه های معمولی که خیلی استفاده میشه اینه که اون ولتاژ آنالوگ ورودی یه خازن داخلی رو شارژ میکنه بعد مدت زمانی که طول میکشه تا این خازن در یک مقاومت داخلی تخلیه بشه رو اندازه گیری میکنن. میکروکنترلر تعداد سیکل ساعتی که سپری میشه قبل از این که خازن به طور کامل تخلیه بشه رو نشون میده.

نحوه تبدیل ولتاژآنالوگ به عدد دیجیتال توسط ADC :

ADC یه نسبت تبدیل داره. این به معنی هست که ADC مقدار 5 ولت آنالوگ رو برابر 1023 قرار میده و هر چی که کمتراز 5 ولت باشه یه مقداری از 0 تا 1023 بهش نسبت میشه. فرمول ADC طبق رابطه زیر هست:

فرمول ADC

مثالی که الان میخوایم بزنیم مربوط به آردوینو هست. توی آردوینو دقت مبدل آنالوگ به دیجیتال 10 بیتی هست بنابراین رزولوشن اندازه گیری میشه از 0 تا 1023  هست. پس به جای Resolution of the ADC میذاریم 1023 . ولتاژ آردوینو یا به عبارت دیگه  ولتاژ سیستم که در رابطه بالا تحت عنوان System voltage اومده مقدارش برابر 5 ولت هست. خوب تا اینجا رابطه ی بالا به شکل زیر در میاد:

ADC در آردوینو

حالا فرض کنید ولتاژ آنالوگ ورودی شما 2.12 ولت هست. اون عددی که ADC به ما تحویل میده طبق رابطه ی بالا برابر میشه با :

مثال ADC در آردوینو

که با یه طرفین وسطین ساده بدست میاریم:

مثال ADC آردوینو

مثال adc آردوینو

مساله: اگر ولتاژ سیستم شما 3.3 ولت بود و ADC شما دقت 9 بیتی داشت. مقداری که مبدل آنالوگ به دیجیتال برای ولتاژ ورودی 2.12 ولت نشون میداد چقدر بود؟

مثال ADC برای برد آردوینو:

کدنویسی ADC در آردوینو

در ابتدا باید یکی از پایه های آنالوگ رو به صورت ورودی تعریف کنیم. برای این که پایه مون با شکل بالا تطبیق داشته باشه از پایه A3 استفاده میکنیم:

pinMode(A3, INPUT)


سپس با دستور ()analogRead مقدار آنالوگ خودمون رو به دیجیتال تبدیل میکنیم و در متغیر عدد صحیحی مثل x میریزیم:

 

int x = analogRead(A3); //Reads the analog value on pin A3 into x


در رابطه بالا عددی که توی متغیر x ریخته میشه یه عدد بین 0 تا 1023 هست. چون دقت ADC برد آردوینو 10 بیتی هست.

نکته: ما این مقدار رو در یه متغیر عدد صحیح میریزیم چون متغیر از نوع Byte فقط تا 8 بیت میتونه داده رو توی خودش نگهداری کنه.پس حتما حواستون باشه که نوع متغیری که تعریف میکنید int باشه.

Serial.print(“Analog value: “)

; Serial.println(x)

اگه ما مقدار ولتاژ آنالوگ خودمون رو تغییر بدیم باید مقدار عددی x هم تغییر کنه. مثلا اگه x برابر 334 شد و آردوینو ما 5 ولتی بود در این صورت مقدار ولتاژ آنالوگ ما چقدره؟ مولتی متر بذارید رو نقطه ی مورد نظر مدار. باید چیزی حدود 1.63 ولت رو اندازه گیری کنه.

تذکر
حالا فرض کنید توی دستور analogRead به جای A3 که یه پایه دیجیتال هست بذاریم مثلا 8 . یه پایه ی عادی دیجیتال. حالا چه اتفاقی میفته؟ اتفاق خاصی نمیفته فقط شما نمیتونید مقدار درست ولتاژ رو توی متغیر x خودتون بریزید. اون کدی هم که نوشتیم کامپایل میشه ولی مقدار عددی x غلط هست.( البته تمیز تر بود که نرم افزار آردوینو جوری میبود که خودش میفهمید و کد رو کامپایل نمیکرد) حال فرض کنید یه سنسور دیجیتال رو وصل کنم به پایه آنالوگ. چه اتفاقی میفته؟ بازم هم اتفاق خاصی پیش نمیاد و قطعه ای هم نمیسوزه. فقط مقداری که میخونید درست نیست. مثلا عددی که میخونید یا خیلی نزدیک به 1023 هست یا خیلی نزدیک به 0 .

مثل همیشه اگه دوست دارید از ما مطلع بشید و مطالب جدید رو بدونید کی منتشر میشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید:

اگه هم که خیلی عاشق ما هستید که سایت ما رو به دوستانتون معرفی کنید. ممنون از همکاریتون. 😉 

 

 

 

شاید دوست داشته باشید مطالب زیر را نیز بخوانید:

نوشتن نظر

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

اضافه کردن تصویر ( فقط فرمت jpg)