ADC چیست؟ توضیح ADC در Arduino
مقدمه
میکروکنترلرها فقط دیجیتال میفهمن. یعنی فقط صفر و یک میدونن چیه. یک کلید فشار داده شده یا نه. این نمونه ای از سیگنال دیجیتاله. موقعی یه میکروکنترلر با 5 ولت کار میکنه اون میفهمه که 0 ولت یعنی منطق 0 و 5 ولت یعنی منطق 1. ولی واقعیت اینه در عمل همه چی به این سادگی ها نیست و دنیا یه دنیای خاکستری هست. مثلا 2.72 ولت یعنی چی؟صفره یا یک؟ توی دنیای آنالوگ ما اغلب نیاز داریم که ولتاژ های مختلفی رو اندازه گیری کنیم. یه سنسور آنالوگ که با 5 ولت کار میکنه خروجیش میتونه از 0.01 تا 4.99 تغییر کنه. خوشبختانه اکثر میکروکنترلرها یه واحد داخلی توی خودشون دارم که میتونن ولتاژ آنالوگ رو به یه عدد دیجیتال تبدیل کنن. اسم اون واحد هست ADC . قبل از خوندن ادامه این بحث پیشنهاد میکنم حتما مطالب زیر که توی سایت منتشر شده رو بخونید:
ولتاژ، جریان، مقاومت و قانون اهم
ADC چیست؟
ADC مخفف عبارت Analog to Digital Converter هست که به معنی مبدل آنالوگ به دیجیتال هست. حالا این چیکار میکنه؟ میاد ولتاژهای ورودی آنالوگ که روی یه پایه میفته رو تبدیل میکنه به اعداد دیجیتال. با تبدیل اعداد آنالوگ به اعداد دیجیتال ما میتونیم ارتباط با دنیای آنالوگ اطرفمون رو شروع کنیم. بدون این که هیچ دغدغه ای داشته باشیم. در عکس زیر پایه های 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 طبق رابطه زیر هست:
مثالی که الان میخوایم بزنیم مربوط به آردوینو هست. توی آردوینو دقت مبدل آنالوگ به دیجیتال 10 بیتی هست بنابراین رزولوشن اندازه گیری میشه از 0 تا 1023 هست. پس به جای Resolution of the ADC میذاریم 1023 . ولتاژ آردوینو یا به عبارت دیگه ولتاژ سیستم که در رابطه بالا تحت عنوان System voltage اومده مقدارش برابر 5 ولت هست. خوب تا اینجا رابطه ی بالا به شکل زیر در میاد:
حالا فرض کنید ولتاژ آنالوگ ورودی شما 2.12 ولت هست. اون عددی که ADC به ما تحویل میده طبق رابطه ی بالا برابر میشه با :
که با یه طرفین وسطین ساده بدست میاریم:
مساله: اگر ولتاژ سیستم شما 3.3 ولت بود و ADC شما دقت 9 بیتی داشت. مقداری که مبدل آنالوگ به دیجیتال برای ولتاژ ورودی 2.12 ولت نشون میداد چقدر بود؟
مثال 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 .
مثل همیشه اگه دوست دارید از ما مطلع بشید و مطالب جدید رو بدونید کی منتشر میشه میتونید ما رو در تلگرام و یا اینستاگرام دنبال کنید:
اگه هم که خیلی عاشق ما هستید که سایت ما رو به دوستانتون معرفی کنید. ممنون از همکاریتون. 😉
2 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
با سلام وخسته نباشید.
مطالبتون خیلی به پروژه پایان نامه کارشناسیم کمک کرد.
خیلی ممنون از سایت عالیتون…!
سپاس از لطف شما.