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

توسط | 12 دی, 1398 | AVR, میکروکنترلر, وبلاگ | 39 دیدگاه ها

adc-میکروکنترلر-avr

آموزش AVR یوبرد

شاهکار 8بیتی اتمل

آموزش های رایگان AVR

فیلم های آموزش AVR

آموزش خصوصی AVR

اخبار جدید یوبرد در اینستاگرام

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

راه اندازی ADC در AVR               (فیلم آموزش AVR مقدماتیفیلم آموزش ADC در میکروکنترلرهای AVR)

راه اندازی ADC در STM32         (فیلم آموزش ARM STM32 مقدماتیفیلم آموزش ADC در STM32)

راه اندازی ADC در آردوینو           (فیلم آموزش آردوینو مقدماتیفیلم آموزش ADC در آردوینو)

 

ویدئوی 1 – راه اندازی ADC در AVR

روش کلی تبدیل آنالوگ به دیجیتال

در تبدیل آنالوگ به دیجیتال یک ولتاژ مرجع (Reference) وجود دارد. این ولتاژ به تعداد حالات تشکیل شده از بیت های خروجی مبدل آنالوگ به دیجیتال تقسیم می شود (Vref/2n که n تعداد بیت های مبدل آنالوگ به دیجیتال است). به تعداد بیت های خروجی ADC، وضوح یا رزولوشن (Resolution) آن ADC می گویند. حال اگر مقدار ولتاژ آنالوگ ورودی بین صفر تا Vref/2n باشد، خروجی ADC مقدار صفر را نشان می دهد. اگر مقدار ولتاژ ورودی بین Vref/2n تا 2Vref/2n باشد، خروجی مقدار 1 را نشان می دهد. اگر مقدار ولتاژ ورودی بین 2Vref/2n و 3Vref/2n باشد، خروجی مقدار 2 را نشان می دهد و … . در تصویر زیر شکل کلی از یک ADC سه بیتی نمایش داده شده است. ولتاژ رفرنس با تقسیم مقاومتی به 23 = 8 تقسیم شده است. اگر ولتاژ ورودی بین صفر و Vref/8 باشد، خروجی صفر است. اگر ولتاژ ورودی بین Vref/8 و 2Vref/8 باشد، خروجی مقایسه کنندۀ اول یک می شود و برای بقیۀ مقایسه کننده ها نیز به همین شکل. خروجی مقایسه کننده ها به ورودی یک انکودر 8 به 3 متصل است و خروجی هر مقایسه کننده که یک شود، در خروجی encoder، به یک عدد سه بیتی کد می شوند.

یک-adc-3-بیتی-ساده

تصویر 1- یک ADC سه بیتی ساده

روش های تبدیل آنالوگ به دیجیتال

برای تبدیل سیگنال آنالوگ به دیجیتال روش های متفاوت با ویژگی های متفاوت وجود دارد. برخی از این روش ها عبارتند از:

  • روش آنی یا Flash یا همزمان؛
  • روش پله ای؛
  • روش Tracking یا ردیابی؛
  • روش تقریب متوالی؛
  • روش تک شیب؛
  • روش دو شیب؛

میکروکنترلرهای AVR از روش تقریب متوالی (Successive Approximation) استفاده می کنند.

رابطۀ خروجی ADC با ولتاژ ورودی

در میکروکنترلرهای AVR رابطۀ خروجی مبدل |آنالوگ به دیجیتال با ولتاژ ورودی آن به سادگی به دست می آید. در ADC یک ولتاژ مرجع (Reference Voltage یا Vref) داریم که مقدار آن بر تعداد حالات تشکیل شونده از رزولوشن تقسیم می شود. یعنی اگر ADC دارای رزولوشن n بیتی باشد (که همان تعدادِ بیت های خروجی آن است)، ولتاژ مرج بر عدد 2n – 1 تقسیم می شود. حاصل این عدد برابر Vref/(2n – 1) می باشد. برای مثال اگر رزولوشن برابر 8 بیت باشد ولتاژ مرجع بر 255 تقسیم می شود.

بلوک-سادۀ-adc

تصویر 2 – بلوک ADC به صورت ساده

مقدار ورودی آنالوگ با ضرایب صحیح مقادیر تقسیم شده ( یعنی صفر و 1Vref/(2n – 1) و 2Vref/(2n – 1) و 3Vref/(2n – 1) و 4Vref/(2n – 1) و … و (2n – 1)Vref)/(2n – 1))) مقایسه می شود. اگر ورودی آنالوگ بین صفر تا  باشد، خروجی دیجیتال صفر است. اگر ورودی آنالوگ بین 1Vref/(2n – 1) و 2Vref/(2n – 1) باشد، خروجی دیجیتال برابر 1 است. اگر ورودی آنالوگ بین 2Vref/(2n – 1) و 3Vref/(2n – 1) باشد، خروجی دیجیتال برابر 2 است. اگر ورودی آنالوگ بین 3Vref/(2n – 1) و 4Vref/(2n – 1) باشد، خروجی دیجیتال برابر 3 است و در نهایت اگر ورودی آنالوگ بین ((2n – 2)Vref)/(2n – 1) و Vref باشد، خروجی دیجیتال برابر 2n – 2 است و اگر ورودی آنالوگ برابر Vref باشد، خروجی دیجیتال برابر 2n – 1 می باشد.

با توجه به این توضیح می توان گفت اگر ورودی آنالوگ بین صفر تا Vref تغییر کند، خروجی دیجیتال بین صفر تا 2n – 1 تغییر می کند. بنابراین داریم:

رابطۀ-خروجی-با-ولتاژ-ورودی-ADC

تصویر 3 – رابطۀ خروجی ADC با ولتاژ ورودی

برای مثال در یک ADC با رزولوشن 10 بیت، اگر مقدار ولتاژ آنالوگ ورودی از صفر تا Vref تغییر کند، خروجی دیجیتال بین 0 تا 1023 تغییر می کند.

ADC در ATmega128

در میکروکنترلر ATmega128 یک مبدل آنالوگ به دیجیتال با رزولوشن 10 بیتی وجود دارد. از جمله ویژگی های دیگر آن می توان به موارد زیر اشاره کرد:

  • زمان تبدیل 13 الی 260 میکروثانیه؛
  • حداکثر نرخ نمونه برداری 9kSPS (نرخ نمونه برداری 15kSPS با حداکثر رزولوشن)؛
  • هشت کانال ورودی غیر دیفرانسیلی (تک ورودی – single ended) مالتی پلکس شده؛
  • هفت کانال ورودی تفاضلی؛
  • دو کانال ورودی تفاضلی با گین قابل انتخاب 10 و 200؛
  • قابلیت Left Adjusment یا Right Adjustment برای رجیستر نتیجۀ تبدیل؛
  • محدودۀ ولتاژ ورودی بین صفر تا VCC؛
  • ولتاژ مرجع داخلی 2.56V قابل انتخاب؛
  • دارای منابع تحریک freeو single؛
  • وقفۀ اتمام تبدیل.

روش کار ADC و امکانات جانبی آن

به طور کلی در مبدل آنالوگ به دیجیتال، یک ولتاژ آنالوگ ورودی بین مقدار صفر و Vref که روی یکی از پایه های ADC0 تا ADC7 قرار گرفته است، به مقدار دیجیتال بین صفر تا 3FF هگز تبدیل می شود و این عدد در رجیستر خروجی ADC ذخیره می شود. ولتاژ مرجع یا همان Vref (Reference Voltage) می تواند از منابع مختلفی تأمین شود که در ادامه گفته خواهد شد. در بلوک مبدل آنالوگ به دیجیتال یک مالتی پلکسر وجود دارد که تعیین می کند ولتاژ آنالوگ کدام یک از پایه های ورودی به مقدار دیجیتال تبدیل شود. مبدل آنالوگ به دیجیتال در ATmega128 با دو منبع مختلف تحریک می شود. یکی از این دو منبع تحریک free و دیگری تحریک single است. در تحریک free، مبدل آنالوگ به دیجیتال پیوسته مقادیر آنالوگ ورودی را به دیجیتال تبدیل می کند و در تحریک single، کاربر در کدهای برنامه مبدل آنالوگ به دیجیتال را به صورت دستی راه اندازی می کند.

بلوک ADC نیز مانند بلوک های دیگر نیازمند یک کلاک است که این کلاک با یک تقسیم فرکانسی از کلاک CPU به دست می آید. فرکانس این کلاک تعیین کنندۀ سرعت نمونه برداری مبدل آنالوگ به دیجیتال است. برای رسیدن به رزولوشن حداکثر یعنی 10 بیت، فرکانس کلاک ADC باید زیر 200 کیلوهرتز باشد. برای رزولوشن های پایین تر، فرکانس کلاک می تواند بیشتر از 200 کیلوهرتز باشد. فرکانس کاری مناسب در ATmega128 بین 50 کیلوهرتز تا 200 کیلوهرتز می باشد.

با توجه به این که مبدل آنالوگ به دیجیتال در ATmega128 دارای خروجی 10 بیتی است، 8 بیت از آن در یک رجیستر و دو بیت از آن در یک رجیستر ذخیره می شوند. این رجیسترها در مجموع یک رجیستر 16 بیتی را تشکیل می دهند (که 10 بیت آن استفاده می شود). ما به این رجیستر، رجیستر خروجی ADC می گوییم. برای ذخیره کردن دادۀ خروجی در این رجیستر دو آرایش وجود دارد. در یکی از آنها در بایت کم ارزش بیت های ADC0 تا ADC7 و در بایت پر ارزش بیت های ADC8 و ADC9 ذخیره می شود و در آرایش دیگر در بایت کم ارزش بیت های ADC0 و ADC1 و در بایت پر ارزش بیت های ADC2 تا ADC9 قرار می گیرند. دربارۀ این موضوع بحث خواهد شد.

درمیکروکنترلرهای AVR از جمله ATmega128 می توان از کانال های تفاضلی استفاده کرد. به این صورت که یکی از پایه های ADC0، ADC1 یا ADC2 به عنوان پایۀ ورودی منفی و یکی از پایه های ADC0 تا ADC7 به عنوان پایۀ ورودی مثبت انتخاب می شوند. برخی از این کانال های تفاضلی دارای تقویت کننده نیز هستند و تفاضل ولتاژهای  ورودی را ابتدا تقویت می کنند و سپس به ورودی مبدل آنالوگ به دیجیتال می دهند.

در مبدل آنالوگ به دیجیتال یک مدار sample and hold وجود دارد که مقدار ولتاژ ورودی را نمونه برداری و در خروجی تا مدت زمانی نگه می دارند. در تصویر زیر بلوک دیاگرام واحد ADC را مشاهده می کنید.

بلوک-دیاگرام-adc-atmega128

تصویر 4 – بلوک دیاگرام واحد ADC در ATmega128

رزولوشن ADC

به تعداد بیت های خروجی ADC، رزولوشن یا دقت ADC می گویند. در میکروکنترلر ATmega128 بلوک ADC در مدهای تک ورودی (Single Ended) دارای رزولوشن 10 بیتی است. به ازای ورودی صفر تا Vref در یکی از کانال های ورودی ADC، در خروجی مقدار صفر تا 1023 قرار می گیرد. در مد تک ورودی می توان از رزولوشن 8 بیتی نیز استفاده کرد. برای این منظور باید فقط یکی از رجیسترهای دادۀ خروجی (ADCH در صورتی که آرایش داده ها Left Adjust باشد) خوانده شود.

در صورت استفاده از مدهای تفاضلی به ازای تفاضل دو ورودی مثبت و منفی با گین یعنی (V+ – V) * Gain از صفر تا Vref، خروجی از صفر تا 2n – 1 تغییر می کند. در مدهای تفاضلی نیز در صورت استفاده از گین 10، رزولوشن 8 بیتی است و در صورت استفاده از گین 200، رزولوشن ADC برابر 7 بیت خواهد بود.

مدهای تک ورودی (single ended) یعنی ولتاژهای آنالوگ روی یک یا چند تا از پایه های ADC0 تا ADC7 باشد و این ولتاژها نسبت به زمین اندازه گیری شود. در مقابل این مد، مد تفاضلی است. در مدهای تفاضلی، ولتاژ روی یکی از پایه های ADC نسبت به ولتاژ پایه ای دیگر ADC اندازه گیری می شود.

خروجی ADC

اگر فرض کنیم که n رزولوشون ADC باشد، فرمول محاسبۀ خروجی ADC در مد تک ورودی (single ended) به صورت زیر به دست می آید:

f1-فرمول-adc

خروجی ADC در مدهای تفاضلی نیز به صورت زیر است:

f2-فرمول-adc

تقسیم فرکانسی

تبدیل آنالوگ به دیجیتال به روش تقریب متوالی برای دست یابی به حداکثر رزولوشن، نیازمند فرکانس کلاک 50 kHz تا 200 kHz می باشد. برای دست یابی به سرعت نمونه برداری بیشتر می توان از کلاک بالاتر از 200 kHz استفاده کرد در این صورت رزولوشن کمتر از 10 بیت خواهد بود.

فرکانس کلاک بلوک مبدل آنالوگ به دیجیتال از تقسیم فرکانس کاری CPU مطابق جدول زیر به دست می آید. بیت های ADPS[2:0] تعیین کنندۀ کلاک مبدل آنالوگ به دیجیتال می باشند. منظور از clkI/O همان کلاک CPU است.

فرکانس کلاک ADC ADPS[2:0]
clkI/O / 2 000
clkI/O / 2 001
clkI/O / 4 010
clkI/O / 8 011
clkI/O / 16 100
clkI/O / 32 101
clkI/O / 64 110
clkI/O / 128 111

جدول 1 – تقسیم فرکانسی بلوک ADC

منابع تحریک ADC و آغاز تبدیل

منظور از منبع تحریک ADC یک اتفاق است که باعث شروع تبدیل می شود. دو نوع تحریک ADC در میکروکنترلر ATmega128 داریم:

  • منبع تحریک single: در این تحریک، کاربر به صورت نرم افزاری بیت ADSC را یک می کند. با یک شدن این بیت، تبدیل آغاز می شود. این بیت تا پایان تبدیل یک باقی می ماند و پس از اتمام تبدیل دوباره توسط سخت افزار صفر می شود.
  • منبع تحریک free: با فعال شدن این تحریک، مبدل آنالوگ به دیجیتال به صورت مداوم شروع به تبدیل می کند و مقدار تبدیل شده را در رجیستر دادۀ خروجی قرار می دهد. با یک شدن بیت ADFR، این تحریک فعال می شود. برای آغاز تبدیل در این تحریک، باید یک بار در بیت ADSC مقدار یک نوشته شود. در این تحریک، مبدل آنالوگ به دیجیتال کار تبدیل را مستقل از این که پرچم وقفۀ ADC صفر یا یک باشد انجام می دهد.

پس از اتمام یک تبدیل، پرچم وقفۀ ADC بالا می رود. اگر وقفۀ ADC فعال باشد و پرچم کلی وقفه ها یک باشد، یک وقفه اتفاق می افتد. همچنین در هنگام عملیات تبدیل اگر کانال عوض شود، ابتدا عملیات تبدیل به پایان می رسد سپس برای کانال بعدی کار تبدیل انجام می شود.

زمان تبدیل ADC

در این بخش به زمانی که برای تبدیل نیاز است صحبت می کنیم. زمان بندی تبدیل در تحریک single با تحریک free متفاوت است.

  • در تحریک single:

در اولین تبدیل، مدار sample and hold (که دربارۀ آن توضیح داده خواهد شد) برای کار کردن به زمان 13.5 سیکل کلاک نیاز دارد. اولین تبدیل به معنای تبدیل نخست پس از روشن شدن مبدل آنالوگ به دیجیتال است. در مد تک ورودی پس از تبدیل اول، مدار sample and hold به 1.5 سیکل کلاک نیاز خواهد داشت. در مد تفاضلی پس از تبدیل اول، مدار sample and hold به 1.5 الی 2.5 سیکل کلاک نیاز دارد. عملیات تبدیل نیز خود به 11.5 سیکل کلاک نیاز دارد.

بنابراین زمان تبدیل در تحریک single به جدول زیر خلاصه می شود.

نوع تبدیل در تحریک single زمان مورد نیاز مدار sample and hold بر حسب سیکل کلاک ADC زمان مورد نیاز کل تبدیل بر حسب سیکل کلاک ADC
تبدیل اول بعد از روشن شدن ADC 13.5 25
تبدیل دوم به بعد در مد تک ورودی 1.5 13
تبدیل دوم به بعد در مد تفاضلی 1.5 الی 2.5 13 تا 14

جدول 2 – زمان بندی ADC در تحریک single

زمان-تبدیل-adc-تحریک-single

تصویر 5 – زمان بندی ADC در تحریک single

  • در تحریک free:

در اولین تبدیل، مدار sample and hold برای کار کردن به زمان 13.5 سیکل کلاک نیاز دارد. پس از تبدیل اول، مدار sample and hold به 1.5 سیکل کلاک نیاز دارد. در تحریک Free، پس از تبدیل اول، تبدیل بعدی بلافاصله آغاز می شود.

زمان-تبدیل-adc-تحریک-free

تصویر 6 – زمان بندی ADC در تحریک free

با توجه به ماکزیمم فرکانس کاری تأکید شده در دیتاشیت یعنی 200 کیلوهرتز (برای دست یابی به حداکثر رزولوشن)، زمان هر کلاک ADC برابر 5 میکروثانیه است. بنابراین زمان هر تبدیل نرمال در مد تک ورودی برابر 13 * 5 = 65 میکروثانیه است. با توجه به این مقدار، حداکثر فرکانس نمونه برداری برابرِ معکوسِ زمان به دست آمده یعنی 15.385kSPS (15385 نمونه در ثانیه) می باشد.

نکته ای که باید به آن توجه داشت این است که در مدهای تک ورودی زمان تبدیل بین 13 تا 260 میکروثانیه و در مدهای تفاضلی زمان تبدیل بین 65 تا 260 میکروثانیه متغیر است.

کانال های ورودی ADC

در مبدل آنالوگ به دیجیتال ATmega128 تعداد 8 کانال ورودی وجود دارد که مقدار آنالوگ آنها با یک مالتی پلکسر آنالوگ به ورودی ADC داده می شود. این کانال های ورودی می توانند به صورت دو به دو، مدهای تفاضلی را نیز تشکیل دهند. برخی از مدهای تفاضلی دارای گین هستند. در این مدها ابتدا ولتاژ روی پایه های تفاضلی با گین مورد نظر تقویت می شود سپس به ADC داده می شود. پهنای باند تقویت کننده در این مدها 4kHz (از صفر تا 4kHz) می باشد. فرکانس های بالاتر از این محدوده باعث تقویت غیر خطی سیگنال می شود. برای مدهای تفاضلی، گین های 1، 10 و 200 در نظر گرفته شده است. جدول زیر نشان دهندۀ کانال های ورودی ADC است. این که کدام کانال برای تبدیل انتخاب شود با بیت های MUX[4:0] تعیین می شود.

کانال-adc

تصویر 7 – کانال های ورودی ADC

کانال-adc

تصویر 8 – ادامۀ کانال های ورودی ADC

کانال-adc

تصویر 9 – ادامۀ کانال های ورودی ADC

در مدهای تفاضلی، از حالت هایی که هر دو ورودی مثبت و منفیِ ورودی تفاضلی ADC روی یک پایه هستند می توان برای کالیبره کردن ADC استفاده کرد. حالت های رزرو شده قابل استفاده نیستند. در حالت MUX[4:0] = 11110، ورودی ADC به VBG = 1.22 v وصل می شود. این ولتاژ یک ولتاژ داخلی است که کاربرد آن ساخت ولتاژ مرجع داخلی ADC است. در حالت MUX[4:0] = 11111 نیز ورودی ADC زمین آنالوگ است. حالت های Single Ended همان حالت های تک ورودی هستند که 8 حالت اول MUX[4:0] را به خود اختصاص داده اند. در حالت های تک ورودی تقویت کننده وجود ندارد. حالت های MUX[4:0] = 1000 تا MUX[4:0] = 11101 نیز حالت های تفاضلی (Differential) هستند که پایه های ورودی مثبت و منفی و گین تقویت کننده در آنها مشخص شده است. بعضی از این حالت ها رزرو شده اند.

پایه های مورد استفاده در ADC در ATmega128

در میکروکنترلرهای AVR علاوه بر پایه های کانال های ورودی بلوک ADC، پایه های تغذیه و زمین این بلوک به صورت جداگانه از پایه های VCC و GND دیجیتال، در کنار پایه های کانال های ورودی قرار گرفته اند. همچنین پایۀ مربوط به ولتاژ مرجع خارجی (پایۀ AREF در میکروکنترلر) نیز در کنار آنها قرار دارد. در میکروکنترلر ATmega128 پایه های ADC0 تا ADC7 روی PF0 تا PF7 قرار دارد و پایه های AVCC، AGND (یا GND) و AREF در کنار آنها قرار گرفته است. پایۀ AVCC، AGND و AREF به ترتیب پایه های VCC آنالوگ، GND آنالوگ و ولتاژ مرجع خارجی هستند. در اغلب موارد پایۀ GND که کنار AVCC باشد، GND آنالوگ است.

پایه-های-adc-در-atmega128

تصویر 10 – پایه های ADC در ATmega128

پایه های تغذیه و زمین ADC برای مصونیت از نویز در کنار پایه های دیگر ADC قرار دارند. مطابق دستورالعمل دیتاشیت برای مصونیت و عملکرد بهتر در شرایط نویزی، پایۀ AVCC با یک سلف 10µH به VCC (تغذیۀ دیجیتال) و با یک خازن 100nF به زمین وصل می شود. همچنین در صورت استفاده از ولتاژ مرجع داخلی، پایۀ AREF با یک خازن 100nF به زمین وصل می شود.

اتصال-صحیح-avcc

تصویر 11 – اتصال صحیح AVCC به تغذیه

در پروژه هایی که از مبدل آنالوگ به دیجیتال استفاده نمی شود بهتر است تغذیه و زمین آنالوگ و پایۀ AREF به همین صورت با سلف و خازن به VCC و GND وصل شوند.

محدودۀ ولتاژ AVCC بین VCC – 0.3v تا VCC + 0.3v می باشد.محدودۀ ولتاژ مرجع باید بین 2v تا AVCC باشد. همچنین محدودۀ ولتاژ هر کانال ورودی باید بین GND آنالوگ تا مقدار ولتاژ مرجع باشد. ولتاژ مرجع داخلی در ATmega128 بین 2.3v تا 2.7v تغییر می کند اما مقدار نوعی آن برابر 2.56v است. در مدهای تفاضلی، محدودۀ ولتاژ مرجع باید بین 2v تا AVCC – 0.5v باشد. همچنین ولتاژ تفاضلی ورودی (یعنی (V+ – V باید بین صفر تا Vref/Gain باشد.

ولتاژهای مرجع ADC

همان گونه که گفته شد، مبدل آنالوگ به دیجیتال برای کار کردن نیاز به یک ولتاژ مرجع دارد که بتواند ولتاژهای ورودی را با آن بسنجد. این ولتاژ مرجع را با Vref نمایش می دهند. در میکروکنترلر ATmega128 ولتاژ مرجع می تواند ولتاژ مرجع داخلی باشد یا از پایۀ AREF و یا از داخل میکروکنترلر از ولتاژ پایۀ AVCC تأمین شود. بیت های REFS[1:0] تعیین کنندۀ نوع تأمین ولتاژ مرجع می باشد. به جدول زیر توجه کنید.

منبع تأمین ولتاژ مرجع REFS[1:0]
ولتاژ مرجع از پایۀ AREF است و ولتاژ مرجع داخلی غیر فعال است. 00
ولتاژ مرجع در داخل میکروکنترلر از پایۀ AVCC است و یک خازن 100 nF باید از پایۀ AREF به زمین وصل شود. 01
این حالت رزرو شده است. 10
ولتاژ مرجع به صورت داخلی و برابر 2.56v است و یک خازن 100 nF باید از پایۀ AREF به زمین وصل شود. 11

جدول 3 – انتخاب ولتاژ مرجع ADC

آرایش داده ها در رجیستر خروجی ADC

ذخیره شدن داده های خروجی ADC در رجیستر خروجی آن می تواند با دو آرایش انجام شود:

  • آرایش Right Adjust: در این آرایش، بیت های ADC0 تا ADC7 در بیت های 0 تا 7 رجیستر ADCL و بیت های ADC8 و ADC9 در بیت های 0 و 1 رجیستر ADCH قرار می گیرند. برای تنظیم نوع ذخیره سازی در این آرایش باید بیت ADLAR برابر صفر باشد.
  • آرایش Left Adjust: در این آرایش، بیت های ADC2 تا ADC9 در بیت های 0 تا 7 رجیستر ADCH ذخیره می شوند و بیت های ADC0 و ADC1 در بیت های 6 و 7 رجیستر ADCL قرار می گیرند. برای تنظیم نوع ذخیره سازی در این آرایش باید بیت ADLAR برابر یک باشد.

نکته مهم این است که هر گاه ADCL خوانده شود، تا زمانی که ADCH خوانده نشود، مقدار جدید در این دو رجیستر قرار نمی گیرد. همچنین اگر تنها رزولوشن 8 بیتی نیاز باشد خواندن رجیستر ADCH در آرایش Left adjust کافی است (یعنی بیت های ADC2 تا ADC9). نتیجۀ تبدیل مبدل آنالوگ به دیجیتال را در نرم فزار کدویژن و اتمل استودیو می توان از رجیستر ADCW خواند. اگر در تنظیمات ADC در کدویژن (کدویزارد) وقفه ها را فعال کنیم این امکان به وجود می آید که بتوانیم چند کانال را بخوانیم. برای خواندن ADC در کدویژن (کدویزارد) وقتی از چند کانال استفاده می کنیم، یک نمونه کد تولید می شود. نمونه کد با استفاد از وقفۀ ADC مقادیر کانال های متفاوت را در یک آرایه قرار می دهد. در تمرین 3 این مورد را خواهیم دید.

مدار sample and hold (نمونه بردار و نگه دارنده)

این مدار وظیفۀ نمونه برداری و نگه داشتن ولتاژ را برای ورودی های ADC دارد. در زمانی که از چند کانال ADC استفاده می شود و ADC در حال تبدیل نمونه از یک کانال است، این مدار ولتاژ ورودی کانال ها را در خروجی خود تا زمان نمونه برداری کانال بعدی نگه می دارد.

مدار-sample-and-hold

تصویر 12 – مدار sample and hold

وقفۀ ADC

بعد از اتمام هر تبدیل، پرچم ADIF یک می شود. اگر وقفۀ ADC و پرچم کلی وقفه ها فعال باشند، وقفۀ ADC اتفاق می افتد. یکی از کاربردهای مهم وقفۀ مبدل آنالوگ به دیجیتال این است که با استفاده از آن می توان مقدار چند کانال ورودی را خواند. در تمرین 3 با این موضوع آشنا می شوید.

 

رجیسترهای ADC

در ATmega128، مبدل آنالوگ به دیجیتال دارای 4 رجیستر است. دو رجیستر کنترلی و وضعیت و دو رجیستر دادۀ خروجی ADC، مجموع رجیسترهای ADC در ATmega128 هستند که در ادامه به بررسی آنها خواهیم پرداخت.

رجیستر ADMUX

در این رجیستر بیت های مربوط به انتخاب کانال ADC، نوع آرایش دادۀ خروجی و انتخاب ولتاژ مرجع وجود دارد.

جدول 4 – رجیستر ADMUX

بیت های REFS[1:0] (Reference Selection): با این دو بیت نوع ولتاژ مرجع ADC انتخاب می شود.

بیت ADLAR (ADC Left Adjust Result): با یک شدن این بیت، آرایش Left Adjust برای ذخیره شدن داده های خروجی ADC در رجیسترهای دادۀ خروجی فعال می شود. و با صفر شدن این بیت، آرایش Right Adjust برای ذخیره شدن انتخاب می شود.

بیت های MUX[4:0] (Analog Channel Selection): این بیت ها کانال ورودی ADC را انتخاب می کند. این کانال ها می توانند تک ورودی یا تفاضلی باشند.

رجیستر ADCSRA

این رجیستر شامل بیت های تنظیم کلاک ADC، فعال کردن ADC و وقفۀ آن، پرچم وقفۀ ADC و همچنین بیت های تنظیم تحریک و آغاز تبدیل است.

جدول 5 – رجیستر ADCSRA

بیت ADEN (ADC Enable): با یک شدن این بیت، بلوک ADC فعال می شود. با صفر شدن آن، این بلوک غیر فعال می شود. اگر در هنگام تبدیل در این بیت صفر نوشته شود، تبدیل در حال اجرا از بین می رود.

بیت ADSC (ADC Start Conversion): با نوشتن یک در این بیت، تبدیل ADC آغاز می شود. در تحریک single، برای هر تبدیل باید این بیت یک شود و در تحریک free، فقط یک بار در این بیت مقدار یک نوشته می شود.

بیت ADFR (ADC Free Running Select): با یک شدن این بیت، تحریک free فعال می شود و با صفر شدن آن، این تحریک غیر فعال می شود. باید توجه داشت که اگر این تحریک فعال شود، باید برای شروع عملیات تبدیل یک بار در ADSC مقدار یک نوشته شود.

بیت ADIF (ADC Interrupt Flag): این بیت، پرچم وقفۀ ADC است. با تکمیل شدن یک تبدیل و آپدیت شدن مقدار رجیستر خروجی ADC، این پرچم یک می شود.

بیت ADIE (ADC Interrupt Enable): این بیت مربوط به وقفۀ بلوک ADC است. با نوشتن یک در این بیت، وقفۀ ADC فعال می شود. با صفر شدن این بیت، این وقفه غیر فعال می شود.

بیت های ADPS[2:0] (ADC Prescaler Select): این بیت ها مربوط به انتخاب فرکانس کاری بلوک ADC هستند.

رجیسترهای ADCH و ADCL

این رجیسترها، رجیسترهای دادۀ خروجی ADC هستند. با توجه به مقدار بیت ADLAR دو آرایش برای این رجیسترها وجود دارد که در زیر مشاهده می کنید:

وقتی بیت ADLAR برابر صفر باشد، آرایش داده ها به صورت Right Adjust است:

جدول 6 – رجیستر ADCH وقتی داده ها راست چین هستند

جدول 7 – رجیستر ADCL وقتی داده ها راست چین هستند

وقتی بیت ADLAR برابر یک باشد، آرایش داده ها به صورت Left Adjust است:

جدول 8 – رجیستر ADCH وقتی داده ها چپ چین هستند

جدول 9 – رجیستر ADCL وقتی داده ها چپ چین هستند

تمرین های ADC

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

تمرین 1: خواندن ولتاژ با ADC

با استفاده از یک پتانسیومتر ولتاژی بین صفر تا 5 ولت روی پایۀ ADC0 ایجاد نمایید. سپس نتیجۀ تبدیل (دادۀ خروجی) را به صورت یک عدد دسیمال روی LCD کاراکتری نمایش دهید. فرکانس کاری میکروکنترلر برابر 8 مگاهرتز و فرکانس بلوک ADC برابر 125 کیلوهرتز باشد. ولتاژ مرجع نیر به صورت خارجی و برابر 5 ولت باشد. از تحریک single استفاده نمایید. آرایش دادۀ خروجی نیز Right Adjust باشد. تحریک هر 10 میلی ثانیه باشد و همچنین کدهای مربوط به نمایش در LCD در روتین وقفۀ ADC نوشته شوند. LCD نیز روی پورت A باشد.

تمرین 2: نمایش مقدار ولتاژ آنالوگ

تمرین قبل را با تحریک free انجام دهید. همچنین به جای خروجی ADC، مقدار ولتاژ روی پایۀ ADC0 را نمایش دهید. (راهنمایی: در این تحریک کافی است یک بار بیت ADSC را یک کنید.)

تمرین 3: خواندن از چند کانال ADC

چهار ولتاژ بین صفر تا 2.5 ولت را با 4 پتانسیومتر به کانال های صفر تا چهار ADC وصل کنید و ولتاژ آنها را روی LCD کاراکتری نمایش دهید. فرکانس کاری میکروکنترلر 8 مگاهرتز و فرکانس کاری بلوک ADC برابر 125 کیلوهرتز باشد.

راهنمایی: چون حداکثر ولتاژ های ورودی 2.5 ولت است، برای دقت بیشتر از ولتاژ مرجع داخلی (2.56 ولت) با خازن 100nF روی پایۀ AREF استفاده می کنیم. وقفۀ ADC را فعال می کنیم و در آن علاوه بر محاسبات ولتاژ و نمایش روی LCD، کانال ADC را نیز برای تبدیل بعدی تغییر می دهیم.

تمرین 4: خواندن ولتاژ متغیر با ADC

مقدار یک ولتاژ سینوسی بین مقدار 2 ولت تا 2.5 ولت با فرکانس 10 میلی هرتز تغییر می کند. ولتاژ تفاضلی لحظه ای آن را نسبت به ولتاژ ثابت 2 ولت با کانال های تفاضلی ADC3 و ADC2 با گین 10 اندازه گیری کنید و روی LCD به صورت میلی ولت نمایش دهید. فرکانس کاری میکروکنترلر 8 مگاهرتز، فرکانس کاری بلوک ADC برابر 125 کیلوهرتز و همچنین ولتاژ مرجع از پایۀ AREF و برابر 5 ولت باشد. از تحریک single استفاده کنید. برنامه را در حلقۀ بی نهایت while بنویسید و از وقفه استفاده نکنید.

از آموزش ADC در AVR نتیجه می گیریم:

  1. در ADC یک ولتاژ مرجع وجود دارد که به تعداد حالات خروجی تقسیم می شود.
  2. روش ADC در میکروکنترلر ATmega128 تقریب متوالی است.
  3. مقدار خروجی دیجیتال ADC برابر است با (Vin/Vref)(2n – 1) که n رزولوشن ADC است.
  4. در ATmega128 تعداد 8 کانال ورودی ADC وجود دارد.
  5. رزولوشن ADC در ATmega128 برابر 10 بیت است.
  6. دو منبع برای تحریک ADC وجود دارد: 1- تحریک single؛ 2- تحریک free.
  7. فرکانس مناسب برای عملکرد 10 بیتی ADC بین 50 تا 200 کیلوهرتز است.
  8. ADC در AVR دارای کانال های تفاضلی است.
  9. یک مدار sample and hold در ADC وجود دارد که وظیفۀ آن نمونه برداری و نگه داشتن ولتاژ برای خواندن در ورودی ADC است.
  10. در مدهای تفاضلی با تقویت کننده، ابتدا ولتاژ ورودی تقویت می شود و سپس ولتاژ تقویت شده به دیجیتال تبدیل می شود.
  11. در استفاده از مدهای تفاضلی رزولوشن کم می شود. اگر گین مد تفاضلی 10 باشد، رزولوشن 8 بیتی است. اگر گین مد تفاضلی 200 باشد، رزولوشن برابر 7 است.
  12. برای راه اندازی تحریک free لازم است حداقل یک بار در بیت ADSC یک نوشته شود.


 

رضا اسدی

رضا اسدی

مدیر یوبرد، خالق و توسعه دهندۀ پلتفرم یوبرد، مجری پروژه های الکترونیکی، فعال در صنعت آسانسور، سابقه فعالیت در صنعت خودرو و همکاری در صنعت پزشکی و صنایع دیگر، آموزگار آموزش های یوبرد

جدیدترین تاپیک های AVR

برنامه-نویسی-میکروکنترلر-ویژوال-استودیو

برنامه نویسی میکروکنترلرها با ویژوال استودیو

نصب VisualGDB روی ویژوال استودیو، ساخت پروژه برای برنامه نویسی میکروکنترلرها با ویژوال استودیو، ساخت پروژه برای STM32 در ویژوال استودیو، کدنویسی STM32 در ویژوال استودیو، ساخت پروژه برای AVR در ویژوال استودیو، ساخت پروژه برای LPC در ویژوال استودیو، ساخت پروژۀ آردوینو در ویژوال استودیو

رله-relay

رله، سوییچ تحریک پذیر

تعریف رله، تاریخچه، طرز کار رلۀ الکترومکانیکی، اصطلاحات، انواع الکترومکانیکی، رلۀ حالت جامد، رلۀ هیبریدی، رلۀ حرارتی و انواع تحریک شونده با عوامل غیر الکتریکی، انواع موجود در صنعت برق و برق صنعتی، رلۀ ایمنی و برخی انواع حفاظتی، رلۀ دیجیتال، لزوم استفاده و راه اندازی رله، مشخصات الکتریکی

پروتکل-i2c-protocol

پروتکل I2C، ادغامی از USART و SPI توسط Philips

پروتکل I2C، تاریخچه I2C، ویژگی ها و کاربردهای I2C، عبارات و اصطلاحات I2C، باس، اتصالات و گسترش شبکه I2C، سیگنال های I2C، قالب داده و آدرس در I2C، انتقال داده در I2C، آدرس دهی 10 بیتی، قابلیت Multi-master، حکمیت، مشخصات الکتریکی و زمانی، مقدار مقاومت های پول آپ، Clock Stretching

سون-سگمنت-seven-segment

سون سگمنت، نمایشگر هفت قسمتی

سون سگمنت چیست؟ انواع 7-segment، تاریخچه 7-segment، ساختار 7-segment و نمایش در آن، تعداد ارقام و 7-segmentهای مالتی پلکس، کاربردها، انواع اندازه ها و رنگ ها و مدار راه اندازی 7-segment، بایاس 7-segment، مقدار مقاومت در راه اندازی 7-segment، درایور سون سگمنت، پایه های 7-segment

39 دیدگاه ها

  1. سلام.خسته نباشید.مطالب سایت شما مفید و جالب بود برام.ممنون از زحمات شما در جهت افزایش سطح علم جوانان.
    آیا فروشگاه شما فعال و به روز شده است؟
    لطفا سایت رو به روز کنید. تشکر.

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

       

      پاسخ
  2. با سلام و تشکر
    لطفا راهنمایی بفرمایید در یک کانال، برای میانگین گرفتن از چند تبدیل چه باید کرد(نوشتن کدهای سی)؟ زمان هر تبدیل را چقدر باید نظر گرفت و تاخیر داد؟ قدردانم

    پاسخ
    • سلام. خواهش میکنم. شما میتونید وقفۀ ADC رو فعال کنید و توی وقفۀ ADC با یک متغیر، تعیین کنید که چه تعداد تبدیل انجام شود. نتایج تبدیل هم توی یه آرایه ذخیر کنید و در انتها بعد از تبدیل آخر، که مقدار متغیر از تعداد تبدیل بیشتر میشه، یک شرط if قرار بدید و میانگین بگیرید. مثلا توی وقفۀ ADC به این صورت بنویسید: (مثلاً میانگین بین 10 نمونه)

      float final_result = 0.0;
      
      ...
      ISR(adc_vector)
      {
      static unsigned int counter = 0;
      unsigned int result[10];
      
      result [counter]= ADCW;
      counter++;
      if(counter > 10)
      {
       while((counter<=10) && (counter>0))
      {
       counter --;
       final_result += result [counter];
      }
      final_result = final_result  / 10;
      }
      }

       

      فرکانس واحد ADC هم طوری تنظیم کنید که فرکانس نمونه برداری توی محدوده ای دربیاد که رزولوشن ADC حداکثره. اینجوری بهترین دقت رو دارید. این هم که بین هر چند تا نمونه ای که ازش میانگین می گیرید چه تأخیری وجود داشته باشه، دست خودتونه. با توجه به منابع تحریک ADC میتونید اون رو روی حالت تحریک Single یا Free running قرار بدید.

       

      پاسخ
  3. سلام و تشکر ، بسیار سخاوتمندانه پاسخ دادید.

    پاسخ
    • سلام. خواهش میکنم. لطف دارید

      پاسخ
  4. با سلام اگر ممکن هست در مورد ISR(adc_vector) کمی توضیح دهید.
    بفرمایید اگر کانتر 11 باشد این حلقه while اجرا میشه؟ چرا که در حلقه کانتر بین 0 و 10 تعیین شده.
    if(counter > 10)
    {
    while((counter0))
    {
    counter –;
    final_result += result [counter];

    پاسخ
    • در جواب سوالتون عرض کنم که اون کد اشتباه بود. به جاش این کد رو به کار ببرید:

      float final_result = 0.0;
      ...
      ISR(adc_vector)
      {
          static unsigned int counter = 0;
          unsigned int result[10];
          
          result[counter]= ADCW;
          counter++;
          if(counter > 9)
          {
               while((counter<=10) && (counter>0))
               {
                   counter --;
                   final_result += result[counter];
               }
      		 counter = 0;
               final_result = final_result  / 10;
          }
      }

       

      توی کد قبلی حلقۀ while کلاً اجرا نمی شد

      پاسخ
  5. با سلام و خسته نباشین

    ببخشین ما اگر واسه یک مبدل فلش 3 بیتی از فرکانس کلاک 12.8 مگ استفاده کرده باشیم و الان اون رو به 4 بیت تغییر بدیم ، از لحاظ فرکانسی باید چه تغییری بدیم ؟

    ممنون میشم

    پاسخ
    • سلام. خیلی ممنون. متاسفانه از این موضوع اطلاعی ندارم. خواهش میکنم

      پاسخ
  6. سلام وقت بخیر شما کلاس آموزشی هم دارید؟

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

      پاسخ
  7. با سلام و تشکر بابت اموزش کاملتون
    من برای کنترل سرعت استپ موتور از ولوم استفاده کردم وبا درایور موتور که فرکانسش رو با ctc تایمر ۰ ساختم زمان کم و زیاد کردن ولوم به صورت کاملا پیوسته حرکت نمیکنه که احتمال میدم به خاطر ۱۰ بیتی بودن adc باشه ایا میتونم به صورت ۸ بیتی از adc استفاده کنم که با تایمر ۰ میکرو هماهنگ باشه ؟ ممنونم از پاسختون

    پاسخ
    • سلام ممنون از لطفتون.
      پروژۀ شما نیاز به بررسی داره. نمی توان پاسخ کلی داد.

      پاسخ
  8. سلام علائم خرابی مبدل آنالوگ به دیجیتال چگونه هست و چطور میشه تست کرد که سالم هست یا خیر

    پاسخ
  9. سلام من میخواهم خروجی یک سنسور فشار را بخوانم اما در هنگام خواندن و نمایش بر روی ال سی دی عدد نمایش داده شده خیلی کم و زیاد میشود باید چیکار کنم؟

    پاسخ
    • سلام.
      مورد اول اینکه باید یک دقت برای اون قرار بدید که عدد نمایشی شما بخاطر دقتی که شما به اون نیاز ندارید، کم و زیاد نشه.
      مورد دوم اینکه فاصلۀ زمانی قرائت و فاصله زمانی بین دو نمایش روی السیدی رو محدود کنید.
      مورد سوم اینکه میتونید یک فیلتر نرم افزاری بنویسید و دیتاهای پرت رو حذف کنید.
      چهارمین کار این هست که فقط زمانی که دیتای السیدی تغییر کرده، السیدی رو مجددا چیزی روی اون بنویسید.
      موفق باشید.

      پاسخ

یک دیدگاه بنویسید

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

آموزش های یوبرد

آموزش TFT LCD با TouchGFX و STM32 یوبرد

گرافیک کاربرپسند با میکروکنترلر ST

آموزش FreeRTOS یوبرد

زمان واقعی در میکروکنترلر و پردازنده های کوچک با FreeRTOS

آموزش طراحی PCB و نویز یوبرد

تجسم دنیای الکترونیک

آموزش زبان C و MISRA-C یوبرد

گام نخست دنیای میکروکنترلر

آموزش لحیم کاری و IPC-A-610 یوبرد

ساخت دنیای الکترونیک

آموزش آردوینو یوبرد

جادۀ آسفالت میکروکنترلر

آموزش ماژول های SIM800 یوبرد

تلفن همراه صنعت

آموزش زبان ++C و ++MISRA-C یوبرد

لمس شی گرایی در میکروکنترلرها

آموزش میکروکنترلرهای AVR یوبرد

شاهکار 8 بیتی Atmel

آموزش میکروکنترلرهای LPC یوبرد

یادگار فیلیپس

دانلود

لطفا برای دریافت لینک دانلود اطلاعات خواسته شده را وارد نمایید
ضبط پیام صوتی

زمان هر پیام صوتی 4 دقیقه است