مبدل آنالوگ به دیجیتال در AVR
- 2.55k بازدید
- نوشته شده توسط منشورسیمین
- آموزش های مهندسی الکترونیکی
مفهوم آنالوگ و دیجیتال چیست؟
دنیایی که پیرامون ما وجود دارد یک دنیای پیوسته یا آنالوگ است. به دما، فشار، حرارت، سرعت و خیلی از کمیت های فیزیکی قابل اندازه گیری اطراف خود دقت کنید. (دقت کردید؟! ) متوجه می شوید که تغییرات این کمیت های به صورت کاملا پیوسته اتفاق می افتد.خب در چنین شرایطی اگر بخواهیم دست به اندازه گیری بزنیم باید سیستم های ما تمام مقادیر را به طور پیوسته اندازه گیری کرده و روی آن ها پردازش انجام دهد، اما چون چنین امکانی وجود ندارد و سیستم های ما دیجیتال است نمی توانیم چنین کاری کنیم. به عبارت دیگر نمی توانیم یک کمیت پیوسته یا آنالوگ را مستقیما به یک سیستم پردازشی دیجیتال اعمال کنیم. به نظر شما راه حل چیست؟( ابتدا کمی فکر کنید!)
درست حدس زدید. باید کمیت آنالوگ را به دیجیتال تبدیل کنیم و سپس دست به پردازش بزنیم. اینجا همان نقطه ای بود که مبدل های آنالوگ به دیجیتال وارد بازی شدند تا بتوانند بین دنیای آنالوگ و دنیای دیجیتال پلی بزنند. برای روشن شدن موضوع اجازه بدهید تا یک مثال بزنم. شما به بازار می روید و یک سنسور LM35 خریداری می کنید. با این سنسور شما می توانید دمای محیط را اندازه گیری کنید.( اما به چه شکل؟) خروجی این سنسور ولتاژ است و به ازای هر درجه تغییر دما ۱۰ میلی ولت تغییر می کند. میخواهید با یک میکروکنترلر AVR این تغییرات دما را اندازه گیری کرده و ثبت کنید. اما توجه کنید که برای AVR با فرض اینکه از منبع تغذیه ۵ ولتی برای آن استفاده کرده باشید، فقط دو ولتاژ ۰ و ۵ ولت در پین های خروجی آن معنا دارد. پس چگونه می توان ولتاژ خروجی LM35 را به AVR فهماند(؟!). برای پیدا کردن پاسخ این سوال نیاز به یک سری مقدمات درباره ی مبدل آنالوگ به دیجیتال و روش کار آن در AVR دارید. پس تا آخر این پست با ما همراه باشید تا روش کار را یاد بگیرید.
مفاهیم اولیه (ADC (analog to digital convertor
در هر مبدل آنالوگ به دیجیتال یک سری مفاهیم مشترک وجود دارد که ابتدا باید آن ها را بدانید تا بتوانید با آن ها کار کنید.
اندازه گام:
هر ADC یک دقت دارد، به عبارتی از یک مقدار کمتر را نمی تواند انداز گیری کند. اندازه گام کوچکترین تغییری هست که یک مبدل آنالوگ به دیجیتال می تواند اندازه بگیرد. مثلا اگر اندازه گام برای یک ADC برابر با ۲۰ میلی ولت باشد. معنایش این است که تغییرات ۵ میلی ولتی را متوجه نمی شود و هرگاه ولتاژ نسبت به مقدار قبلی ۲۰ میلی ولت بیشتر یا کمتر شود می تواند تغییرات را تشخیص دهد.
زمان تبدیل:
برای اینکه ورودی آنالوگ به خروجی دیجیتال تبدیل شود نیاز به زمان معینی است. این زمان به منبع کلاک متصل به ADC (چون ADC یک مدار دیجیتال است نیاز به کلاک دارد.)، روشی که برای تبدیل استفاده می شود و تکنولوژی ساخت مبدل آنالوگ به دیجیتال بستگی دارد.
رزولوشن:
رزولوشن یا وضوح یا درجه تفکیک نام های مختلفی است که برای تعداد بیت استفاده شده در ADC به کار می رود. شاید شنیده باشید که ADC در AVR ده بیتی است. این بدین معناست که خروجی دیجیتال در قالب ۱۰ بیت ارائه خواهد شد. هرچه رزولوشن بیشتر باشد، اندازه گام کمتر خواهد بود.( برای درک جمله ی آخر کمی صبور باشید.)
ولتاژ مرجع:
یک ولتاژ ورودی است که به عنوان مرجع استفاده شده و به همراه رزولوشن اندازه گام را معلوم می کند. دقت کنید که ولتاژ ورودی ADC می تواند بین صفر تا ولتاژ مرجع تغییرات کند. فرض کنید که از ADC هشت بیتی استفاده می کنید. اندازه گام به صورت روبه رو محاسبه می شود: (۲ به توان ۸/ولتاژ مرجع)
خروجی داده دیجیتال:
وقتی مقدار آنالوگ به دیجیتال تبدیل شد، باید در قالب یک رشته از بیت ها ارائه شود. به این رشته بیت خروجی داده دیجیتال گفته می شود.برای مثال در یک ADC هشت بیتی، ۸ بیت خروجی دیجیتال از D0 تا D7 داریم که با استفاده از رابطه زیر بدست می آید:
(اندازه گام/ولتاژ ورودی)
مفاهیم اولیه گفته شد. توصیه میکنم یک بار دیگر مفاهیم را با خودتان مرور کنید تا بهتر در ذهنتان جا بگیرید. حال که مفاهیم را مرور کردید. با بیان یک مثال بحث را بیشتر باز خواهیم کرد.
مثال
فرض کنید در یک ADC با رزولوشن ۸ بیت، ولتاژ مرجع را ۵ ولت انتخاب کرده ایم. در این صورت تغییر ولتاژ ورودی بین صفر تا ولتاژ مرجع باعث تغییر دیتای خروجی ADC بین ۰ تا ۰xFF خواهد شد. به عبارتی تغییرات به ۲۵۶ گام یا پله تقسیم می شوند. اگر ولتاژ ورودی روی صفر ولت باش خروجی ۰x00 و اگر ولتاژ ورودی روی ۵ ولت باشد خروجی ۰xFF خواهد بود. اگر ولتاژ ورودی روی ۲ ولت باشد. می خواهیم خروجی دیجیتال را به دست آوریم.
برای این کار باید اندازه گام را به دست آوریم. به عبارت دیگر باید بدانیم هر تغییر قابل اندازه گیری در ADC چند ولت است. پس ولتاژ مرجع را بر ۲۵۶ (۲ به توان تعداد بیت که اینجا ۸ است) تقسیم می کنیم که ۱۹ میلی ولت به دست می آید. حال باید محاسبه کنیم که ۲ ولت از چند پله (چند تا ۱۹ میلی ولت) تشکیل شده است. پس ۲ را بر ۱۹ میلی ولت تقسیم می کنیم که ۱۰۵/۲ می شود. خب این عدد در مبنای ده است باید به مبنای دو برده شود که به صورت ۰۱۱۰۱۰۰۱ می شود. این رشته باینری همان چیزی است که در خروجی ADC قرار می گیرد.
توصیه میکنم برای همین مثال خروجی دیجیتال را برای ولتاژ ۴/۵ ولت و ۱/۷ ولت به دست آورید.
معرفی انواع روش های تبدیل آنالوگ به دیجیتال
۶ روش برای تبدیل مقدار آنالوگ به دیجیتال وجود دارد که در زیر به صورت لیست بیان می شوند، اما فقط روش تقریب متوالی توضیح داده خواهد شد.
- روش موازی یا همزمان
- روش پله ای
- روش تقریب متوالی (Successive Approximation)
- روش تبدیل ولتاژ به زمان( تک شیب)
- روش دو شیب
- روش تبدیل ولتاژ به فرکانس
روش تقریب متوالی
این روش برای اجرا نیاز به چهار بخش اساسی دارد. همانطور که در شکل زیر هم مشخص شده این بخش ها عبارتند از:
- رجیستر تقریب متوالی
- مقایسه کننده
- واحد کنترل
- مبدل دیجیتال به آنالوگ
طرز کار این مدار بدین شکل است که رجیستر تقریب متوالی با یک مقدار اولیه که دیجیتال است شروع می کند. این مقدار به واحد دیجیتال به آنالوگ داده می شود و خروجی آنالوگ تولید می شود. همان طور که در شکل مشاهده می کنید این خروجی به یک مقایسه کنند داده می شود تا با ولتاژ آنالوگ ورودی مقایسه شود. در صورتی که تساوی برقرار باشد مقدار موجود در رجیستر تقریب متوالی به عنوان مقدار دیجیتال صحیح به دست می آید. اما در غیر این صورت فرمان تغییر داده می شود تا رجیستر تقریب متوالی تغییر کند. این روال تا جایی ادامی پیدا می کند که تساوی بین ولتاژ آنالوگ ورودی و ولتاژ خروجی مدار مبدل دیجیتال به آنالوگ حاصل شود.
برای روش شدن بهتر بحث صحبت هایمان را با یک مثال ادامه می دهیم:
مثال
فرض کنید یک ADC با اندازه گام ۱۰ میلی ولت در اختیار داریم. جهت تشخیص ولتاژ یک ولت در ورودی مراحل زیر انجام می شود:
با ۱۰۰۰۰۰۰ شروع می کنیم که برابر با ۱۲۸ است. اگر آن را در انداز گام ضرب کنیم ولتاژ ورودی را می دهد.(فرمولی که در بالا توضیح داده شد.) پس ۱۲۸*۱۰mv برابر با ۱/۲۸ ولت می شود. این مقدار بزرگتر از یک ولت است پس باید کم شود. در نتیجه بیت ۷ پاک می شود.
- با ۰۱۰۰۰۰۰۰ ادامه می دهیم. در نتیجه به مقدار ۶۴ ولت می رسیم که کمتر از یک ولت است پس بیت ۶ باید حفظ شود.
- ۰۱۱۰۰۰۰۰ مقدار جدید است. خواهیم داشت ۹۶ ولت که بازهم کمتر از یک ولت است و باید حفظ شود پس بیت ۵ را نگه می داریم.
- با ۰۱۱۱۰۰۰۰ ادامه می دهیم. چون ۱/۱۲ ولت را تولید می کند پس بیت ۴ ام باید حذف شود.
- خواهیم داشت ۰۱۱۰۱۰۰۰ پس مقدار ۱/۰۸ را می دهد در نتیجه بیت سوم هم باید حذف شود.
- ۰۱۱۰۰۱۰۰ باعث تولید یک می شود که دقیقا برابر است. پس بیت دو نگه داشته می شود.
انجام دو مرحله دیگر برای بیت های ۱ و ۰ هم ضروری است اما چون باعث تولید مقدار بیشتر از یک می شوند آن دو بیت هم حذف خواهند شد. توجه کنید که روش تقریب متوالی تمام مراحل را کامل انجام می دهد حتی اگر در مراحل اولیه به جواب صحیح دست پیدا کند. در این حالت زمان تبدیل ثابت خواهد بود.
معرفی واحد ADC در Atmega32
از آن جایی که میکروکنترلر Atmega32 در بین سایر اعضای خانواده ی AVR تقریبا تمام امکانات را در خود جای داده است، برای هدف آموزش خیلی خیلی مناسب به نظر می رسد. شما با یادگیری یکی از امکانات AVR در این شماره می توانید آن را تعمیم داده و در سایر اعضای خانواده AVR هم مورد استفاده قرار دهید. از این رو آن چه که از این به بعد برای ADC گفته می شود برای Atmega32 است.
مهم ترین ویژگی های ADC در Atmega32
- دقت ده بیت
- زمان تبدیل بین ۶۵ تا ۲۶۰ میکروثانیه
- هشت کانال ورودی تک خروجی مولتی پلکس شده
- هفت کانال ورودی دیفرانسیلی
- دو کانال ورودی دیفرانسیلی با بهره ی ۱۰ و ۲۰۰
- محدوده ی ولتاژ ورودی به ADC از صفر تا VCC
- قابل انتخاب بودن ولتاژ مرجع داخلی ۲/۵۶ ولت برای ADC
- امکان اتوماتیک نمودن آغاز تبدیل
- امکان درخواست وقفه در پایان تبدیل
- امکان استفاده از مد sleep برای کاهش نویز
پین های ADC
برای اینکه با ADC آشنا شویم بهتر است ابتدا از سخت افزار قابل مشاهده ی آن شروع کنیم. یعنی پین ها. در Atmega32 پورت A عملکرد دیگری هم دارد که تبدیل آنالوگ به دیجیتال است. یعنی در صورت فعال کردن ADC تمام ۸ پین آن می توانند به عنوان کانال های ورودی آنالوگ استفاده شوند. البته غیر از این ۸ پین یک پین مربوط به تغذیه بخش آنالوگ یعنی AVCC و یک پین مربوط به ولتاژ مرجع یعنی AREF است که در شکل زیر می توان مشاهده کرد.
کانال های ورودی را می توان به صورت جداگانه استفاده کرد، بدین صورت که ولتاژ آنالوگ روی هر کانال (هر کدام از پین ها) به صورت مجزا خوانده شود. و یا این که کانال ها به صورت تفاضلی یا دیفرانسیلی باشند. بدین شکل که تفاضل ولتاژ آنالوگ موجود روی دو پین به عنوان ولتاژ آنالوگی که باید به دیجیتال تبدیل شود در نظر گرفته شود.
دقت کنید که تمام ورودی ها به صورت multiplex هستند یعنی یک واحد مبدل آنالوگ به دیجیتال وجود دارد که باید تک تک کانال ها را بررسی کند. پس در ورودی هر پین یک مدار به نام sample & hold (نمونه برداری و نگه داشتن) وجود دارد. کاری که این مدار انجام می دهد نمونه برداری از ولتاژ لحظه ای ورودی و ثابت نگه داشتن آن تا نمونه برداری بعدی است. حال اگر قرار باشد تمام ۸ کانال ورودی به طور هم زمان خوانده شوند چنین مداری به کار می رود تا ولتاژ تمام کانال ها را تا زمان خوانده شدن ثابت نگه دارد.
عملکرد ADC
بعد از معرفی پارامترهای کلی بهتر است وارد جزئیات شویم. ابتدا حالت های عملکرد به صورت فهرست وار بیان شده و سپس رجیسترها و جزئیات بررسی می شوند.در نهایت با ارائه چند مثال کاربردی زوایای پنهان بحث را برای شما باز خواهیم کرد.
مدار مبدل آنالوگ به دیجیتال در Atmega32 می تواند در دو حالت کار کند.
single یا تنها: در این حالت بعد از هر تبدیل، ADC منتظر می ماند تا دوباره تحریک شود (برنامه تحریک توسط کاربر نوشته می شود)
free یا آزاد: در این حالت عمل نمونه برداری و تبدیل به طور پیوسته از ورودی انجام می شود.(بدون دخالت برنامه)
رجیسترهای ADC
برای فعال سازی و کارکردن با ADC با ۴ رجیستر اختصاصی و یک رجیستر که بین چند واحد مشترک است سر و کار خواهیم داشت.
رجیستر ADMUX
نام این رجیستر از ADC Multiplexer Selection گرفته شده است. به کمک این رجیستر می توان انتخاب کانال ورودی + انتخاب ولتاژ مرجع + نحوه قرار گرفتن داده دیجیتال در رجیسترهای خروجی را معین کرد.
بیت های MUX0 تا MUX4 برای انتخاب کانال ورودی استفاده می شوند که در جدول زیر مشخص شده است.
این جدول نشان می دهد که ولتاژ مرجع را چگونه می توان انتخاب کرد برای مثال در ردیف یک می توان ولتاژ موجود روی پین AREF را به عنوان ولتاژ مرجع انتخاب کرد.
تذکر: تغییر این دو بیت فقط زمانی موثر است که ADC در حال انجام عملیات تبدیل نباشد. در غیر این صورت پس از اتمام تبدیل، تغییر بیت ها اعمال خواهد شد.
بیت ADLAR پس از توضیح رجیسترهای ADCH و ADCL توضیح داده خواهد شد.
رجیستر ADCSRA
نام این رجیستر از ADC Control and Status Register A گرفته شده است. در زیر عملکرد بیت های آن بیان شده است.
بیت (ADEN(ADC Enable
با یک کردن این بیت واحد مبدل آنالوگ به دیجیتال فعال شده و با صفر کردن آن غیر فعال می شود. دقت کنید که اگر ADC در حال انجام تبدیل باشد و این بیت را صفر کنیم، عملیات نیمه کاره رها شده و ADC غیرفعال می گردد.
بیت (ADSC(ADC start conversion
در مد single یک کردن این بیت برای انجام هر تبدیل ضروری است. برای مد free فقط باید بار اول این بیت را برای شروع تبدیل یک کرد.
بیت (ADATE(ADC Auto Trigger Enable
یک کردن این بیت ADC را در مد تحریک خودکار قرار می دهد. هر بار که یک لبه ی مثبت (بالا رونده) از منبع تحریک تشخیص داده شود، ADC عملیات تبدیل را شروع خواهد کرد. منابع تحریک توسط رجیستر SFIOR تعیین می شوند که در ادامه توضیح داده خواهد شد.
بیت (ADIF(ADC Interrupt Flag
هربار که عملیات تبدیل به پایان می رسد این بیت یک خواهد شد. حال اگر بیت های ADIE و بیت فعال ساز وقفه عمومی فعال باشند با یک شدن این بیت وقفه کامل شدن تبدیل ADC اجرا شده و بیت ADIF به صورت سخت افزاری پاک می شود.
بیت (ADIE(ADC Interrupt Enable
با فعال کردن این بیت و بیت فعال ساز وقفه عمومی در رجیستر حالت(SREG) اجازه وقوع وقفه کامل شدن تبدیل ADC داده می شود.
بیت های ADPS0 تا ADPS2
چون مدار ADC یک مدار دیجیتال است، نیاز به پالس ساعت دارد. به کمک این سه بیت می توان تقسیم فرکانسی انجام داده (فرکانس کریستال متصل به میکروکنترلر) و پالس ساعت وارد شده به مدار ADC را تعیین کرد. دقت شود که برای داشتن رزولوشن ۱۰ بیت باید فرکانس پالس ساعت ADC بین ۵۰KHz تا ۲۰۰KHz انتخاب شود. در صورتی که فرکانس بیشتر از ۲۰۰KHz شود، رزولوشن کمتر از ۱۰ بیت خواهد شد. به جدل زیر دقت کنید.
رجیسترهای ADCL و ADCH
این رجیسترها حاوی اطلاعات خروجی ADC هستند. یعنی پس از این که تبدیل کامل شد، خروجی دیجیتال در این رجیسترها قرار داده می شود. اما چون در AVR از ADC با رزولوشن ۱۰ بیت استفاده می شود؛ طبیعی است که ۶ بیت بدون استفاده باقی خواهد ماند. اکنون لازم است کاربرد بیت ADLAR را توضیح دهیم. به کمک این بیت می توان نحوه قرار گرفتن داده خروجی در این دو رجیستر را تعیین کرد. اگر این بیت یک باشد خروجی به صورت شکل زیر است:
و اگر صفر باشد به صورت تصویر زیر خواهد بود.
در مواردی که نیاز به دقت بالاتر از ۸ بیت نداریم می توانیم، می توانیم این بیت را یک کرده و فقط ADCH را بخوانیم.
رجیستر SFIOR
نام این رجیستر از Special Function IO Register گرفته شده است.
به کمک بیت های ADTS0 تا ADTS2 می توان منبع تحریک را زمانی که بیت ADATE یک شده باشد تعیین کرد.
جدول زیر منابع تحریک را نشان می دهد.
فعال کردن ADC در مد single
همان طور که قبلا هم توضیح داده شد در این حالت برای انجام هر تبدیل باید بیت ADSC یک شود چرا که با پایان تبدیل قبلی این بیت به صورت خودکار صفر می شود. حال به ترتیب زیر باید رجیسترها را مقدار دهی کنیم تا این مد فعال شود:
- ابتدا در رجیستر ADMUX کانال مورد استفاده مشخص می شود. سپس ولتاژ مرجع و نحوه قرار گرفتن اطلاعات دیجیتال در رجیستر های خروجی داده معلوم می شود.
- در رجیستر ADCSRA ابتدا ADC فعال شده و تقسیم کننده ی فرکانس مشخص می شود. هم چنین در صورت نیاز بیت فعال ساز وقفه یک می شود.
- حال برای شروع تبدیل کافی است بیت ADSC یک شود. دقت شود که این بیت بعد از انجام تبدیل به صورت اتوماتیک صفر شده و برای انجام تبدیل بعدی باید دوباره فعال شود.
فعال کردن ADC در مد free
مراحل این مد هم شبیه مرحله قبلی است با این تفاوت که:
- در رجیستر ADCSRA بیت تحریک خودکار یک می شود.
- رجیستر SFIOR برای منبع تحریک تنظیم شود. که باید حالت اول یعنی free انتخاب شود.
- حال برای شروع تبدیل فقط کافی است که برای بار اول بیت ADSC را فعال کنیم. برای تبدیل های بعدی نیاز به فعال سازی مجدد وجود ندارد و همیشه یک خواهد ماند.
در مد free از پرچم وقفه به عنوان منبع تحریک استفاده می شود، در نتیجه پس از اتمام تبدیل، تبدیل جدید شروع خواهد شد. این روال تا زمانی که بیت ADSC یک است ادامه خواهد داشت.
نکات سخت افزاری
دو پین مهم به نام AREF و AVCC وجود دارند که تا حدودی در مورد آن ها صحبت کردیم اما در پروژه های کاربردی باید به موارد زیر دقت کنید:
- برای اینکه نوسان VCC به ADC منتقل نشود، برای بخش ADC تغذیه جداگانه به نام AVCC در نظر گرفته شده است که حتما باید وصل شود.
- تغذیه ی AVCC حساس است و نباید اختلاف آن با VCC بیشتر از + یا – ۰/۳V شود.
- برای جلوگیری از انتقال نویز VCC به AVCC بهتر است از مدار زیر استفاده کنید:
توجه کنید که در صورت انتخاب VREF در یکی از حالات ۲/۵۶ داخلی یا AVCC، این ولتاژ روی پایه ی AREF نیز ظاهر می شود. لذا برای حذف نویز بهتر است که روی این پین یک خازن ۱۰۰nF قرار داده شود. اگر در چنین حالتی روی پین AREF ولتاژی قرار گیرد، امکان سوختن ADC وجود دارد.
توجه شود که در مورد کانال های دیفرانسیلی به دلیل طولانی شدن بحث در این جلسه صحبتی نشد. در پروژه های AVR حتما این حالت راهم مورد بررسی قرار خواهیم داد.
بحث ADC در AVR تقریبا کامل شد. توصیه می شود حتما از data sheet میکروکنترلر مورد نظر خود برای اطلاعات بیشتر استفاده کنید. اکنون وقت آن رسیده که با انجام چند تمرین و برنامه نویسی بحث امروز را بهتر متوجه شویم. پس مثال های زیر را بررسی می کنیم.
مثال
مثال یک: درAtmega32 یک پتانسیومتر ۱کیلواهم به پین صفر از پورت A وصل کرده و از کریستال داخلی ۱MHz استفاده کنید. حال واحد ADC را با رزولوشن ۱۰ بیت، ضریب تقسیم ۸،مد single و بدون وقفه تنظیم کرده سپس ولتاژ مرجع را روی AVCC تنظیم کرده و نتیجه خروجی را روی پورت های D و C نمایش دهید. پتانسیومتر را تغییر داده و خروجی را با محاسبات خودتان مقایسه کنید.
مثال دو: شرایط مثال یک را در نظر گرفته ولی این بار از وقفه استفاده کنید.
مثال سه: شرایط مثال یک را در نظر گرفته ولی این بار از مد free و وقفه تکمیل محاسبه ADC استفاده کنید.
مثال چهار: با تنظیم دلخواه خودتان به جای پتانسیومتر یک سنسور LM35 استفاده کرده و دمای خروجی را روی LCD کاراکتری متصل به پورت B نمایش دهید. چون سنسور LM35 بسیار معروف است و در اینترنت به راحتی می توانید در مورد آن اطلاعات کسب کنید از توضیح آن صرف نظر شده است.
تمام مثال های این بحث با زبان C در نرم افزار کدویژن ۳/۱۲ کامپایل شده و درپروتئوس ۸/۴ شبیه سازی شده است.
مثال 1
مثال 2
مثال 3
سعی کردیم اون چیزی را که بلدیم به زبون ساده براتون بگیم. امیدواریم برای شما هم همینطور بوده باشه.
بخش بعدی: پروتکل I2C در AVR
موفق باشید!!