ADC در آردوینو – آموزش آردوینو جلسه ششم

خیلی از سیگنال ها توی دنیای واقعی پیوسته و آنالوگ هستند اما ما از قطعات دیجیتال استفاده میکنیم و به طبع دوسداریم سیگنال های پیوسته رو به دیجیتال تبدیل کنیم !برای تبدیل این سیگنال ها از مبدل های انالوگ به دیجیتال یا ADC استفاده میکنیم.ADC آی سی هم داره ، ولی توی میکروکنترلر ها این واحد وجود داره و درنتیجه ADC در آردوینو هم وجود داره و لازم به استفاده از آی سی دیگه ای نداریم.

کاربرد ADC در آردوینو – مبدل آنالوگ به دیجیتال

بعنوان مثال یک سری از سنسور های دما مثل سری LM و به طور خاص LM35 که خیلی پر مصرفه توی پروژه ها ، خروجی ای با ولتاژ آنالوگ دارن و با تغییر دما ، ولتاژ پایه های خروجیشون تغییر میکنه و ما نیاز داریم برای خوندنشون خروجی رو تبدیل به دیجیتال کنیم.

استفاده و راه اندازی واحد ADC در آردوینو یا مبدل آنالوگ به دیجیتال

توی مبدل های آنالوگ به دیجیتال 2 مشخصه داریم که خیلی مهم

  1. دقت
  2. سرعت

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

و سرعت که به فرکانس نمونه برداری مربوط میشه و هرچقدر فاصله زمانی بین نمونه برداری کمتر باشه(همون دوره تناوب) سرعت هم بیشتر میشه.مقدار داده ی دیجیتالی خروجی هم با فرمول زیر حساب میشه:

conversionFormula - ADC در آردوینو

 

VIN: ولتاژ ورودیمونه که قراره تبدیل بشه.

VREF : ولتاز رفرنسه که جلوتر توضیح میدم . ولی درحالت دیفالت و معمول 5 ولته.

طبق قانون نایکوئیست فرکانس نمونه برداری باید حداقل 2 برابر بیشترین فرکانس موجود سیگنال باشه. باید حواسمون باشه به اینکه بالا بودن فرکانس نمونه برداری باعث بالارفتن توان مصرفی میشه و این برای سیستم هایی که قراره با باتری کار کنن خیلی مهمه. مثلا وقتی داریم از یک سنسور دما یا رطوبت استفاده میکنیم زیاد سرعت نمونه برداری ی بالا مهم نیست چون دما و رطوبت توی زمان پایین تغییر وضعیت نمیدن.(برای هر سنسوری میشه زمان بین تغییرات خروجیش رو توی دیتاشیت نگاه کرد)

میکورکنترلر های avr حداکثر 10 بیت دقت دارن و بازه ی نمونه برداری از 0 تا ولتاژ مرجع (فرض میکنیم 5ولت) رو به 1024 قسمت تقسیم می کنند.بنابراین با اضافه شدن حدود 5 میلی ولت به سیگنال آنالوگ یک بیت به مقدار دیجیتال اضافه میشه!(توی فرمول بالا خودتون حساب کنید به این نتیجه میرسین)

ADC در آردوینو UNO و بقیه ی آردوینو ها هم 10 بیتی ای هست چون هسته avr دارن ، در سری هایی که هسته ARM دارن هم ای مقدار 12 بیته.

فک کنم بهتره بقیه توضیح رو با یک مثال ادامه بدم :

مثلا میخوایم با یک LM35 کار کنیم که یک سنسور دماست، توی دیتاشیت این آی سی که نگاه میکنیم میبینیم که گفته 10 میلی ولت به ازای هر درجه سانتی گراد به خروجیش اضافه میشه.دقت آی سی هم تغریبا 0.5 درجه هست ، یعنی توانایی اندازه گیری 0.5 درجه سانتیگراد رو با دقت خوبی داره، پس به ازای هر 0.5 درجه 5 میلی ولت در خروجی افزایش داریم که برابر افزایش یک بیت در مقدار دیجیتال هست.بنابراین ، مبدل کاملا سیگنال آنالوگ رو ردیابی میکنه و دقت خوبی داره.البته اگه قرار باشه دما رو بدون اعشار نشون بدیم دقت حتی بیش از نیاز ما هم هست

برای انتخاب ولتاژ مرجع هم باید اینو بدونیم که ولتاژ مرجع به دامنه سیگنال آنالوگ ورودی وابسته هستش، آردوینو ، 2 ولتاژ مرجع 5 ولت و داخلی رو بدون نیاز به قطعه خارجی فراهم کرده(دمش گرم 😀 )

برای استفاده از ولتاژ های مرجع باید از تابع زیر استفاده کنیم:

تابع ()analogReference

که ورودی اون شامل متغیرهای زیره:

DEFAULT: ولتاژ 5  (3.3)

INTERNAL: ولتاژ 1.1 ولت در تراشه های ATMEGA168 & ATMEGA328

INTERNAL1V1: ولتاژ 1.1 ولت تنها در بردهای مگا

INTERNAL3V56: ولتاژ 2.56 ولت تنها در بردهای مگا

EXTERNAL: ولتاژ مرجع دلخواه بین صفر تا 5 ولت در پایهAREF

 

تابع analogRead()

برای تبدیل و خوندن داده، تابع analogRead رو استفاده میکنیم ومتغیر ورودی تابع ، شماره پایه ی ورودی هستش و خروجی تابع یک عدد ده بیتی صفر تا 1023 هستش که مقدار دیجیتال و متناظر سیگنال آنالوگ در لحظه نمونه برداری هست.

(یک نکته هم اینکه هر تبدیل در مبدل آنالوگ به دیجیتال به جز تبدیل اول ، سیزده پالس ساعت طول میکشه)

تابع analogReadResolution()

(مخصوص برد های DUE و ZERO (M0 PRO))

یک تابع هم مخصوص برد های DUE و ZERO (M0 PRO)وجود داره ، اول مطلب گفتم که میکروهای AVR دقت 10 بیتی دارن ، اما این برد ها چون هسته ARM دارن دارای دقت بالاتری و 12 بیتی هستند وخروجی بین 0 تا 4095 دارن.البته با این کد میشه دقتی 16 بیتی هم داشت و درکل وظیفه این تابع اینه که دقت خوندن ورودی آنالوگ رو تنظیم میکنه.

اینم یک مثال برای این تابع:

توضیح بسه دیگه !بریم سراغ چند تا مثال! سوال داشیتن اول توی گوگل بگردین (اینطوری بهتر یاد میگیرین)و اگر به جواب نرسیدین بپرسین ، حتما سعی میکنم کمک کنم 🙂
یک برنامه بنویسید که از پایه ی A0 سیگنال آنالوگ رو بخونه و مقدار اون رو به شکل سریال بفرسته : (ارتباط سریال در آردوینو – آموزش برنامه نویسی آردوینو – جلسه چهارم رو اگر یادتون رفته میتونید نگاه بندازین)

برنامه ای بنویسید که یک led رو با توجه با مقدار خوانده شده از حسگری که به پایه ی صفر آنالوگ وصل شده روشن و خاموش کنه.

با این مشخصات که اگر مقدار خوانده شده از پایه ی انالوگ کمتر از 800 بود پایه روشن بشه و اگر نبود خاموش بشه. (مقدار 800 معادل 3.9 ولت میشه)

 

 

حمیدرضا مودت

یک مهندس الکترونیک ، علاقه مند به یاد دادن و یاد گرفتن پیرامون دانش برق و الکترونیک

شما ممکن است این را هم بپسندید

3 پاسخ‌ها

  1. Master گفت:

    تابع adcReference()
    هست نه adcRefrence()

پاسخ دهید

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