$ $ $
توجه:
این یک مقاله ی غیررایگان وب سایت آکسفورد پلاس می باشد. طبق تصمیم مدیریت وب سایت، برخی از مقاله های وب سایت که حاوی مطالب آموزشی بوده و در قالب یک دوره ی فشرده ی مهارت آموزی هستند، بنا به دلایل زیر بصورت غیررایگان ارائه خواهند شد:
1- تاکید بر ارزشمند بودن مطلب ارائه شده و یادآوری زحمت و وقتی که برای تهیه ی آن صرف شده است.
2- بنابر توصیه ی محققان، یادگیری و ماندگاری مطلب در دوره های آموزشی که برای آنها پول صرف شده است، بیشتر از دوره های رایگان می باشد.
3- بخشیدن یک تم خاص و سبک کاری به وب سایت. مبلغی که برای استفاده از هر مقاله و دوره ی آموزشی تعیین خواهد شد بسیار ناچیز خواهد بود و هدف کسب درآمد نخواهد بود بلکه بیشتر دو هدف ذکر شده در بندهای 1 و 2 مدنظر هستند و اینکه چنانچه گفته شد، هدف دیگر این است که کاربران، یک سبک کاری و تم ویژه را با وب سایت آکسفورد پلاس تجربه کنند.
هرچند که ما هنوز امکانات عضویت، لاگین و خرید را برای وب سایت اضافه نکرده ایم، اما روش استفاده از این مقالات در زمانیکه امکانات وب سایت تکمیل شد، به این صورت خواهد بود که هر کاربر خواهد توانست پس از عضویت و لاگین کردن، هر تعداد از مقالات غیر رایگان را از طریق فروشگاه وب سایت خریداری کرده و به اکانت خود بیافزاید. پس از آن وی خواهد توانست در هر بار لاگین کردن، این مقالات را نیز مطالعه کند. البته چنانچه اشاره شد، مقالات قیمت بسیار بسیار پایینی خواهند داشت بطوریکه موجب تعجب شما خواهد شد. درواقع این خریدها بیشتر جنبه ی نمادین خواهند داشت. پس منتظر این امکانات جدید وب سایت آکسفورد پلاس باشید و همواره با ما همراه باشید ;)
$ $ $
پیش نیازهای این دوره
1- داشتن اطلاعات در زمینه ی اعداد باینری و تبدیل مبناهای عددی به یکدیگر
2- آشنایی با ساختار داخلی میکروکنترلر و مبحث رجیسترها
3- مطالعه ی مقاله ی "اولین تجربۀ کار با میکروکنترلر (ATmega32)" (این مقاله را در چند روز آینده ی منتشر خواهیم کرد)
مقدمه - منظور از ADC چیست و چه جایگاهی در میکروکنترلر ها دارد؟
عبارت ADC درواقع مخفف Analog to Digital Converter یا همان تبدیل آنالوگ به دیجیتال می باشد. میکروکنترلر های AVR مانند ATmega 16, ATmega 8 و ATmega 32 ، دارای امکانات ADC هستند به این معنی که ما می توانیم با استفاده از این امکانات این نوع از میکروکنترلرها، ولتاژهای آنالوگ جهان بیرون، مانند خروجی یک سنسور دما را به سیگنالهای دیجیتال قابل فهم در میکروکنترلر تبدیل کنیم. اغلب سنسورهای الکترونیکی مانند سنسورهای سنجش دما، شدت نور، فاصله، موقعیت، نیرو و غیره، دارای خروجی آنالوگ هستند و با ویژگی درونی ADC در میکروکنترلر، ما خواهیم توانست هر کدام از این سنسورها را که مایل باشیم به میکروکنترلر وصل کرده و استفاده کنیم [1].
وجود بخش ADC درونی در میکروکنترلرهای AVR (شکل 1) به شما اجازه می دهد که با حداقل یا حتی بدون نیاز به هیچ قطعه ی الکترونیکی اضافی دیگری، ولتاژهای آنالوگ ورودی را به علایم دیجیتالی صفر و یک تبدیل کنید. میکروکنترلرهای AVR سری ATmega معمولا دارای یک بخش ADC می باشند که می تواند عمل تبدیل آنالوگ به دیجیتال را با دقت 10 بیت انجام دهد [2].

شکل 1. میکروکنترلر های AVR در درون خود یک بخش ADC دارند
پایه های میکروکنترلر AVR که در فرآیند تبدیل ولتاژ درگیر هستند، کدام ها هستند؟
این میکروکنترلرها می توانند ولتاژ آنالوگ ورودی را از طریق 7 پایه ی پورت C در میکروکنترلر های ATmega 8 یا هفت پایه ی پورت A در میکروکنترلر های ATmega 16 و ATmega 32 دریافت نمایند (شکل های 2 و 3). در این میکروکنترلرها، بخش ADC دارای یک پایه ی تغذیه ی مجزا مخصوص به خود به نام پایه ی ... (مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...

شکل 2. پایه های میکروکنترلر ATmega 8 (پایه هایی که در فرآیند سنجش ولتاژ آنالوگ درگیر هستند با رنگ متفاوت مشخص شده اند)

شکل 3. پایه های میکروکنترلر ATmega 16 و ATmega 32 (پایه هایی که در فرآیند سنجش ولتاژ آنالوگ درگیر هستند با رنگ متفاوت مشخص شده اند)
روش های های مختلف تبدیل ولتاژ کدام ها هستند؟
بهتر است بدانیم که، می توانیم میکروکنترلر را طوری تنظیم کنیم که عمل تبدیل را به دو صورت "پیوسته" یا "تک_تبدیل" انجام دهد. در حالت پیوسته، ولتاژ آنالوگ ورودی در داخل میکروکنترلر، بطور مداوم و پیوسته تبدیل به ... (مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
منظور از ولتاژ مرجع یا Vref چیست؟
یک نکته ی مهمی که وجود دارد و باید بدانیم، این است که برای انجام تبدیل، میکروکنترلر نیاز به یک ولتاژ مرجع دارد که آن را با Vref نشان می دهند. درواقع میکروکنترلرها سطح ولتاژ آنالوگ ورودی را متوجه نمی شوند بلکه اختلاف سطح آن را با یک ... (مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
بخش ADC چگونه با یک عدد دیجیتالی به میکروکنترلر اعلام می کند که ولتاژ آنالوگ ورودی چقدر بوده است؟ همچنین اندازه ی گام (Step size) به چه معنی است؟
اگر ولتاژ ورودی (ورودی آنالوگ) 1.7 ولت بوده باشد و ما 5 ولت را بعنوان ولتاژ مرجع (Vref) تعیین کرده باشیم، ADC اعلام خواهد کرد که ولتاژ ورودی برابر با عدد باینری 0101011100 می باشد. اگر این عدد را به مبنای ده دهی ببریم برابر با عدد 348 خواهد شد! اما این عدد 348 از کجا حاصل می شود و به چه معنایی می باشد؟ البته زمانیکه ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
مسئله ی حساسیت و دقت سنجش ولتاژ ورودی و رابطه ی آن با ولتاژ مرجع (Vref) و اندازه ی گام
از گفته هایمان تا به این نقطه چنین نتیجه می گیریم که میکروکنترلر AVRی که ولتاژ مرجع اش 5 ولت تعیین شده باشد (Vref = 5V)، اندازه ی گامش برابر با 4.89 میلی ولت است و در نتیجه می تواند عمل سنجش ولتاژ ورودی را با دقت تقریبا 4.89 میلی ولت انجام دهد، یعنی ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
نهایتا یک شیرجه ی عمیق به درون میکروکنترلر و درک رجیسترهای چهارگانه ی ADC
تا به این نقطه متوجه شدیم که ADC میکروکنترلر را می توانیم تا حدود زیادی سفارشی سازی کنیم تا دقیقا هدف ما را از سنجش ولتاژ تامین کند. مثلا می توانیم به میکروکنترلر بگوییم که سنجش ولتاژ را با هر دستور صریح ما انجام دهد یا سنجش را بصورت پیوسته ادامه دهد یا می توانیم دقت و بازه ی تغییرات ولتاژ مورد سنجش را تعیین کنیم و سپس نتیجه را در شکل یک عدد باینری ده بیتی از بخش ADC تحویل بگیریم. حتی جلوتر خواهیم دید که می توانیم تعیین کنیم که ADC با چه سرعتی کار کند. این یعنی ما باید با یک زبان خاص با ADC حرف بزنیم و به آن بگوییم که چگونه کار کند و با همان زبان، نتیجه ی سنجش را از او بپرسیم. برای این منظور چهار عدد رجیستر هشت بیتی در داخل میکروکنترلر AVR تعبیه شده است و ما می توانیم با کدهای برنامه، صفر و یک های این رجیسترهای هشت بیتی را تغییر دهیم یا آنها را بخوانیم و این همان راه ارتباطی و زبان صحبت با ADC میکروکنترلر می باشد. چهار رجیستر ذکر شده عبارتند از:
ADCH
ADCL
ADMUX
ADCSRA
در ادامه توضیحات مفصل هر کدام خدمتتان ارائه می گردد ...
توضیح رجیسترهای ADCH و ADCL:
همانطور که در بالا اشاره شد، میکروکنترلر های خانواده ی AVR، نتیجه ی عمل تبدیل آنالوگ به دیجیتال را بصورت یک عدد باینری 10 بیتی نمایش می دهند. برای این منظور، به ده عدد بیت نیاز خواهد بود که صفر و یک های آن عدد باینری را در خود نگهداری کند تا برنامه ی ما بتواند آنرا بخواند و مورد استفاده قرار دهد. اما مسئله اینجاست که واحدهای نگهداری اطلاعات بصورت بایت و هشت بیتی هستند و طراحان میکروکنترلر مجبور شده اند دو عدد رجیستر هشت بیتی را ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...

شکل 4. بیت های Low و High خروجی ADC
توضیح رجیستر ADMUX:
کلمه ی ADMUX درواقع بجای عبارت ADC Multiplexer selection register استفاده شده است. هر بیت از رجیستر هشت بیتی ADMUX دارای یک نام است که در شکل 5 ملاحظه می فرمایید.

شکل 5. بیت های رجیستر ADMUX و اسامی آنها
بیت های REFS0 و REFS1 درواقع ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...

شکل 6. حالت های مختلف برای انتخاب ولتاژ مرجع
بیت ADLAR برای تعیین روش ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...

شکل 7. قرار گیری خروجی ADC در داخل رجیسترهای ADCH و ADCL بصورت چپ چین و راست چین
در شکل 7، D9 الی D0 درواقع ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
و نهایتا شماره ی پایه ای از میکروکنترلر که قرار است ولتاژ آنالوگ از آن پایه خوانده شود، بصورت یک عدد باینری در بیت های ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...

شکل 8. حالت های مقداردهی بیت های MUX4 الی MUX0
توضیح رجیستر ADCSRA:
هر بیت از رجیستر هشت بیتی ADCSRA نیز دارای یک نام است که در شکل 9 ملاحظه می فرمایید.

شکل 9. بیت های موجود در داخل رجیستر ADCSRA
به کمک بیت ADEN ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
بیت ADSC ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
بیت ADATE ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
اما کاربرد بیت ADIF ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
بیت ADIE ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
و نهایتا می رسیم به توضیح بیت های ADPS2 الی ADPS0 ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...

شکل 10. ضریب تقسیم فرکانس پالس ساعت برای بخش ADC میکروکنترلر
کدهای برنامه
دوستانی که با برنامه نویسی میکروکنترلر آشنایی دارند می دانند که در تمام برنامه های میکروکنترلر، در روال اصلی برنامه (در تابع int main(void))، یک حلقه ی تکرار بی نهایت وجود دارد و در داخل بدنه ی آن حلقه، کارهایی تکراری که برای میکروکنترلر تعریف شده اند، اجرا می شوند. اما قبل از اینکه کنترل برنامه به داخل این حلقه ی تکرار بیافتد، لازم است یک سری تنظیمات اولیه انجام گیرند. در مورد کاربردهایی که از ADC بهره می برند، این تنظیمات اولیه، مقداردهی های اولیه ی رجیسترهای ADMUX و ADCSRA و نیز تعیین پایه های پورت A بعنوان ورودی، می تواند باشد. در قطعه برنامه ی نشان داده شده در شکل 11، تنظیمات اولیه ی مذکور، داخل زیر روال ()void ADC_Init گنجانده شده اند و می توان این زیر روال را در داخل روال اصلی برنامه و قبل از ورود به حلقه ی تکرار بینهایت اصلی برنامه فراخوانی کرد.

شکل 11. زیر روال مقداردهی اولیه
در هر سه سطر موجود در زیر روال شکل 11، یک انتساب وجود دارد که طی آن، سه مقدار خاص به ترتیب در پورت A میکروکنترلر و رجیستر های ADCSRA و ADMUX نوشته می شوند. این مقادیر خاص درواقع سه تا عدد در مبنای هگزادسیمال هستند. در زبان برنامه نویسی C، یک عدد هگزادسیمال با پیشوند 0x یا 0X نشان داده می شود [3]، اعداد هگزا دسیمال در مبنای 16 هستند، پس بعنوان مثال، عدد ده دهی 100، در زبان C، در مبنای 16، یا همان هگزادسیمال، بصورت 0x64 نمایش داده می شود [3].
برای درک بهتر این موضوع، ماشین حساب ویندوز را در حالت Programmer قرار دهید و در حالیکه، مطابق شکل 12، در کادر سمت چپ، گزینه ی Dec به معنی دسیمال (اعداد مبنای ده دهی)، انتخاب شده است، عدد 100 را وارد کنید.

شکل 12. نوشتن عدد دسیمال 100 در ماشین حساب
سپس در همان کادر سمت چپ، گزینه ی Hex که به معنی اعداد از نوع هگزادسیمال می باشد را انتخاب می کنیم (شکل 13)، در این حالت، عدد دسیمال 100 بصورت 64 هگزادسیمال نشان داده خواهد شد.

شکل 13. نمایش معادل 16 تایی عدد نوشته شده
اما در برنامه نویسی برای میکروکنترلر، این نمایش باینری اعداد است که گویای فرآیندی است که قطعه کد مدنظر، در حال انجام آن است. بعنوان مثال در سطر وسطی زیر روال شکل 11، کدی بصورت ;ADCSRA = 0x87 را داریم. در این سطر، برنامه قصد دارد که عدد هگزادسیمال 87 را در رجیستر ADCSRA بنویسد، بنابراین ما هم از همان ماشین حساب ویندوز کمک می گیریم تا ببینیم در عمل، پس از اجرا شدن این سطر از برنامه، چه اتفاقی می افتد. برای این منظور، مجددا در حالت Programmer و درحالیکه گزینه ی Hex انتخاب شده است، عدد 87 را وارد ماشین حساب می کنیم، شکل 14.

شکل 14. نوشتن عدد 87 هگزادسیمال در ماشین حساب
حال گزینه ی Bin را از کادر سمت چپ انتخاب می کنیم تا معادل باینری عدد وارد شده مشاهده گردد، شکل 15. درواقع این هشت عدد صفر و یک (10000111) هستند که با اجرای این سطر از برنامه، در داخل رجیستر ADCSRA نوشته خواهند شد.

شکل 15. معادل باینری عدد نوشته شده
...
...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
...
شاد و پیروز باشید.
مدیریت وب سایت آکسفورد پلاس.
نوشته شده توسط: مهندس عبدالرضا قنبری
منابع:
[1] ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
[2] ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
[3] ...(مطالعه ی بیشتر در صورتی امکانپذیر است که در سایت لاگین کرده باشید - مقاله ی غیر رایگان) ...
تاریخ های بروز رسانی این صفحه
- 11 August 2019 - 1398/05/20
- 08 August 2019 - 1398/05/17
- 26 July 2019 - 1398/05/04
- 30 April 2019 - 1398/02/10
- 24 April 2019 - 1398/02/04
- 23 April 2019 - 1398/02/03
- 22 February 2019 - 1397/12/03
- 15 February 2019 - 1397/11/26
- 04 February 2019 - 1397/11/15
- 01 February 2019 - 1397/11/12