الکترونیک، رباتیک و مکانیک

آموزش به زبان بسیار ساده و روان (از صفر تا بینهایت)

الکترونیک، رباتیک و مکانیک

آموزش به زبان بسیار ساده و روان (از صفر تا بینهایت)

الکترونیک، رباتیک و مکانیک

با سلام و عرض ادب خدمت هموطنان عزیز
در این سایت قصد داریم موضوعاتی که در حیطه الکترونیک ،مکانیک و برنامه نویسی ربات ها دارای جذابیت خاصی می باشد رو آموزش بدیم. امیدواریم که با نظرات شما عزیزان شاهد آموزشهای جامعی در این زمینه باشیم.
با تشکر

نویسندگان
پیوندهای روزانه
طبقه بندی موضوعی
آخرین نظرات

چهارشنبه, ۲۵ آذر ۱۳۹۴، ۰۳:۴۹ ب.ظ

۲

 

 

در این بخش به توضیح "مبدل آنالوگ به دیجیتال" در میکروکنترلرهای AVR میپردازیم.

 

با ما در ادامه مطلب همراه باشید ...

 

اول از همه عذرخواهی میکنم به خاطر اینکه یکم در روند آموزش وقفه افتاد.

چیکار کنیم دیگه.این استادا ما رو ول نمیکنند بریم دنبال زندگیمون laugh.

 

اما بریم سراغ اصل مطلب؛

 

این دفعه میریم سراغ واحدی از میکروکنترلر AVR که وظیفه اش تبدیل سیگنال آنالوگ به دیجیتاله.

اما طبق معمول با زبانی ساده و خودمونی و همراه با مثال های واضح مسائل رو شرح خواهم کرد.

 

یه واحدی هست به نام ADC ، مخفف Analog Digital Conversion .

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

 

اما اصلا به چه دردی میخوره این مبدل ؟

ببینید ! اگه ما بخوایم دنیای خارج میکرو رو به دنیای داخل میکرو ربط بدیم مجبوریم که یه تبدیلی انجام بدیم.

در دنیای واقعی تمامی مقادیر و سیگنال و کمیت ها پیوسته هستند.اما در دنیای دیجیتال کمیت ها و سیگنالها شکل گسسته به خود میگیرند.که این مطلب بنیادی ترین مبحث در تحلیل سیستم های دیجیتاله.

اگر دانشجو برق باشید یا بوده باشید حتما دروسی مثل "تجزیه و تحلیل سیگنال ها و سیستم ها" و "مخابرات" و ... رو پاس کردید یا میکنید !

تو این درسای عجیب غریب و (سه نقطه ...) قطعا این سیگنالها رو خواهید شناخت.

 

بگذریم ...

 

به اینجا رسیدیم که باید سیگنال آنالوگ به دیجیتال تبدیل بشه ولی بهتره که به مثال زیر هم یه نگاهی بندازید :

یه مثال ملموس میزنم که اکثرتون درگیرش شده باشید.

 

حتما ضبط صوت های دیجیتال رو دیدید.(منظورم از این انواع جدید سی دی خوره !).

اگر دقت کرده باشید ولومشون اول و آخر نداره ! یعنی هر چی به سمت راست بچرخونید میچرخه و هر چی هم به سمت چپ بچرخونید همینطور !

اما در انواع قدیمیش ولوم تا یه حدی به چپ و راست میچرخید !

 

وقتی ضبط صوت دیجیتال میشه،سیستمش هم دیجیتال میشه ! ولی ولوم دستگاه یه ابزار مکانیکیه که در محیط خارج قرار داره و باید با چرخوندنش صدا کم و زیاد بشه.

یکم رو این قضیه فکر کنید...

ما میایم و دست مبارک رو میزاریم روی ولوم مبارک دستگاه و اون رو میپیچونیم و اون هم مجبوره که بچرخه ! cool

اما انصافا چجوری میشه که با دست ولوم رو میچرخونیم و مقدار یه متغیر داخل میکرو عوض میشه ؟؟؟؟ (عجایب خلقته !!!)

من که نمیدونم شما میدونید ؟!  (ههههههههه !!!)

 

مثال بالا اگرچه که بهش میخوره سرکاری باشه ولی تهش یه چیزایی رو میخواد برسونه !

فعلا از حال خماری درتون نمیارم و بعدا میگم این مثال چه ربطی داشت.

 

فکر میکنم که تا اینجا تونستم کلیت موضوع رو برسونم،پس میریم سراغ ادامه مبحث ...

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

 

1.روش موازی یا همزمان

2.روش دو شیب

3.روش پله ای

4.روش تبدیل ولتاژ به فرکانس

5.روش تبدیل ولتاژ به زمان

6.روش تقریب متوالی

 

 

حالا میکروکنترلر AVR از کدوم یک از این روش ها استفاده میکنه ؟

روش تقریب متوالی یا Successive Approximation.

 

اینکه این روش چجوریه و به چه دردی میخوره رو کاری باهاش نداریم.یه سری فرمول جات هم داره که نیاز بشه در ادامه میگم !

 

معمولا در یک میکرو AVR چندین کانال ADC وجود داره؛مثلا در مدل ATmega 32 تعداد 8 عدد کانال ADC وجود داره !

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

یعنی اگر میبینید 8 تا کانال ADC در میکرو ATmega32 داریم،معناش این نیست که 8 تا مبدل داریم بلکه این 8 کانال با یکدیگر مالتی پلکس شدند و در نهایت اون که مورد نیازه به مبدل وصل میشه . افتادددددد ؟!

 

حالا با همدیگه میخوایم ببینیم برای تبدیل چه فرایندی طی میشه :

فرض کنید؛

در حوزه آنالوگ یه ولتاژِ بین 0 تا 5 ولت به کانال ADC داده میشه (حواستون رو جمع کنید که از 5 ولت بیشتر نشه !).

این ولتاژی که داده میشه پیوسته است و میتونه هرمقداری داشته باشه.مثلا : 1.13 یا 4.69 و ...

 

اما این ولتاژ چجوری برای میکرو قابل فهم میشه ؟!

 

در روش تقریب متوالی یه فرمولی وجود داره بدین صورت :

 

 

که مقدار مورد نیاز ما همون عبارت Digital هست و به عبارتی دیگر میشه فرمول رو اینجوری هم نوشت :

 

پس سه تا مجهول داریم :

 

Vin : همون ولتاژی هست که کانال میگیره و قراره تبدیل به سیگنال دیجیتال بشه.

Vref : ولتاژ مرجع

n : دقت یا درجه تفکیک


دیگه فکر کنم Vin رو کاملا متوجه شده باشید؛چیز خاصی نیست !

در مورد n هم میتونم بگم که میکروکنترلرهای AVR دقت 10 بیتی دارند.یعنی مقدار سیگنال تبدیل شده با دقت 10 بیت ذخیره میشود.(البته لازم بذکره که میشه با دقت 8 بیت نیز ازشون استفاده کرد).

 

ببینید دوستان،بنده گفتم درجه دقت 10 بیتی این یعنی چه ؟

 

ما وقتی به یکی از کانال های ADC میکرو ولتاژی بین 0 تا 5 ولت میدیم و انتظار داریم که میکرو هم برامون نسبت بگیره و اونو تبدیل به سیگنال دیجیتال کنه،روش کار بدین صورته که در دقت 10 بیت،میکرو بازه بین 0 تا 5 ولت رو به 210 = (1024) واحد تقسیم میکنه :

 

 

تصویر بالا کاملا گویاست !

در حالت گفته شده 0 ولت برابر عدد 0 دیجیتال و 5 ولت برابر عدد 1023 دیجیتال میباشد.و هر ولتاژی بین 0 تا 5 ولت با همون نسبتی که گفتم خدمتتون به مقدار دیجیتالش تبدیل میشه.برای مثال ولتاژ 2.5 ولت معادل دیجیتالش در این حالت برابر با عدد 512 میباشد.

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

 

اما برای Vref حالا حالا ها بحث داریم...

در مورد ولتاژ مرجع؛

واحد ADC برای اینکه عملیات تبدیل رو انجام بده نیاز به یه ولتاژ مرجع داره تا ولتاژ وارد شده رو با اون مقایسه کنه.

در واقع اگر ولتاژ مرجع رو مثلا 3 ولت انتخاب کردیم،بازه 0 تا 3 ولت به 1024 قسمت تبدیل میشه و همون ماجرای بالا ...

ادامه توضیحات بمونه برای بعد از معرفی رجیستر ADMUX.

 

بررسی رجیستر کنترلی ADMUX :

 

ADC Multiplexer Selection Register

 

بیت های 6 و 7؛ REFS1:0 – Reference Selection Bits :

طبق جدول زیر میتونیم ولتاژ مرجعمون رو انتخاب کنیم :

 

 

- حالت اول : ولتاژ روی پایه AREF به عنوان مرجع انتخاب میشود.

- حالت دوم : ولتاژ روی پایه AVCC به عنوان مرجع انتخاب میشود.

- حالت سوم : ------ (رزرو شده)

- حالت چهارم : ولتاژ مرجع داخلی 2.56 ولت تثبیت شده به عنوان مرجع انتخاب میشود.

 

عزیزم هول نشیا !!! (توضیح میدم الان !)

 

اگه یادتون باشه تو همون بخشهای اول آموزش یکی از میکروکنترلرهای AVR رو برای نمونه بررسی کردیم.یادته ؟!

میکروکنترلر ATmega32.

یادتون باشه 40 تا پایه داشت که دوتا پایه هم داشت با نام های AREF و AVCC !

 

این پایه ها رو اتمل برای قشنگی نذاشته ها ! laugh

اگه حالت اول انتخاب بشه،ما هر ولتاژی که به پین AREF وصل کنیم به عنوان مرجع در نظر گرفته میشه.

در حالت دوم هم هر ولتاژی که به پین AVCC بدیم به عنوان ولتاژ مرجع در نظر گرفته میشه.

در حالت چهارم میکرو میاد و خودش یه ولتاژ 2.56 ولتی تثبیت شده و درجه یک ! رو میسازه و اون رو به عنوان ولتاژ مرجع انتخاب میکنه.

 

بیت های 0 و 1 و 2 و 3 و 4 ؛ MUX4:0 – Analog Channel and Gain Selection Bits :

از این بیت ها برای پیکربندی کانال های ADC میکروکنترلر AVR استفاده میشه.

برای اینکه مشخص کنیم که میخوایم از کدوم کانال (PA0-PA7) استفاده کنیم،طبق جدول زیر مقادیر رو انتخاب میکنیم :

 

 

که ما فعلا در روند آموزش،8 سطر اول جدول مورد نیازمونه و بقیه حالات مربوط میشه به کانالهای دارای بهره تفاضلی که یه مقدار آموزش رو پیچیده میکنه و از توضیح و استفاده اونا صرفنظر میکنیم !

 

بیت 5 ؛ ADLAR – ADC Left Adjust Result :

وقتی دارم رجیستر ADCH,ADCL رو توضیح میدم یادم بندازید که براتون بگم (خخخخخخهه ! )

 

بررسی رجیستر ADCSRA :

ADC Control and Status Register A

 

 

بیت 7 ؛ ADEN – ADC Enable :

همونطور که از اسمش پیداست،وظیفه ی فعال/غیر فعال کردن واحد ADC رو داره.

 

بیت 6 ؛ ADSC – ADC Start Conversion :

قبل از اینکه هر عمل تبدیلی انجام بدید،اول مقدار این بیت رو 1 کنید.

بعد از اینکه عمل تبدیل به پایان رسید مقدار این بیت 0 میشه.

 

در اینجا لازمه برای اینکه مبحث ناقص نباشه بصورت حاشیه وار یه مطلبی رو توضیح بدم :

ADC میکروکنترلر AVR دو مد (Mode) تبدیل داره به نام های Single و  Free.

در مد Single بعد از هر عمل تبدیل،ADC منتظر میمونه تا دوباره تحریک بشه.که این تحریک شدن توسط برنامه ای که براش مینویسیم مشخص میشه !

منتها در مد Free واحد ADC شروع میکنه به همینجوری نمونه برداری کردن و بدون توجه به برنامه ای که برنامه نویس براش نوشته،دائم ADC رو میخونه و تبدیلاتش رو انجام میده و تو رجیستر ADCH,ADCL اطلاعات رو ذخیره میکنه.

حالا اگه مد تبدیل Single مدنظر باشه،کافیه یه 1 بنویسیم تو این بیت و بعد از اینکه عملیات تبدیل انجام شد خودش اتوماتیک صفر میشه.

ولی اگه مد تبدیل Free رو خواستیم،باید برای شروع حتما این بیت رو 1 کنیم !

که من اینجا گفتم قبل از تبدیل 1 کنید که مدتون Free باشه. پس ... پس چی ؟... پس حواستون باشه ...cheeky

برای انتخاب مد هم باید از طریق بیت های ADTS0:2 رجیستر SFIOR اقدام کرد.

 

بیت 5 ؛ ADATE – ADC Auto Trigger Enable :

با 1 شدن این فلگ،خاصیت تحریک اتوماتیک فعال میشه.

در اینصورت با هرلبه بالارونده پالس اعمال شده به CPU،واحد ADC تحریک میشه.

 

بیت 4 ؛ ADIF – ADC Interrupt Flag :

این فلگ هم معروف به فلگ وقفه ADC هست و هر وقت که عملیات تبدیل ADC تمام شد این بیت بصورت اتوماتیک 1 میشه و ما رو مطلع میکنه که آیا عملیات تبدیل انجام شده یا نه ؟!

 

بیت 3 ؛ ADIE – ADC Interrupt Enable :

1 بودن این بیت به این معنیه که وقفه ADC فعاله و 0 بودنش هم حاکی از غیرفعال بودنشه !

 

بیت های 0 و 1 و 2 ؛ ADPS2:0 – ADC Prescaler Select Bits :

این بیت ها هم برای انتخاب ضریب تقسیم فرکانس واحد ADC هستند.سر این موضوع بحث دارم؛پس خوب گوش بدید :

 

همونطور که میدونید(شاید هم نمیدونید !) میکروکنترلرهای AVR (منظورم فعلا ATmega32) با فرکانس های مختلفی میتونند کار کنند.

که قابلیت تنظیمش بصورت نرم افزاری وجود داره.

فرض کنید که فرکانس کاریمون رو روی 16 مگاهرتز تنظیم کردیم.این 16 مگاهرتز،فرکانس کاری کلی میکرو هست.

بخش ADC هم برای فعالیت نیاز به یه فرکانسی داره که فرکانس خودش رو هم از همین 16 مگاهرتز تامین میکنه !

برای اینکه میزان تفکیک پذیری و دقت بالابره،سازنده میکروکنترلر AVR اومده و یه ناحیه فرکانس برای فعالیت واحد ADC مشخص کرده که طبق اعلام خودش باید یه مقداری بین 50 کیلوهرتز تا 200 کیلوهرتز باشه.

16 مگاهرتز کجا و 200 کیلوهرتز کجا !!!

چاره چیه ؟ راهی که خود اتمل پیش پای ما گذاشته اینه که بیا و اون فرکانس کلی رو که ما 16 مگاهرتز فرضش کردیم به یه عددی تقسیم کن که یُخده (یه خورده !) این عدده کوچیک بشه.

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

 

حالا این جدول زیر رو هم نگاه کنید که برای شما نوشتنش ! :

 

 

مثلا با فرکانس کاری 16 مگاهرتز و ضریب تقسیم 128 داریم :

 

F_ADC = 16M/128 = 125kHz

 

پس اینجا ضریب تقسیم 128،مقدار مناسبیه،چون عدد حاصل تو اون رنجی که گفتم قرار داره !

پس میتونیم مقدار بیتهای این بخش رو بصورت 111 در نظر بگیریم.

 

فقط از کارهای حاشیه ای دست بردارید.نگید خب دیگه همیشه عدد رو 128 در نظر میگیریم !

آخه برادر من ممکنه فرکانس شما 8 مگاهرتز باشه ممکنه 10 مگاهرتز باشه ممکنه ...

 

واااااااااااااای خسته شدم !

برا سلامتیم صلوات ! laughcool

 

 

بررسی رجیستر ADC (ADCH,ADCL) 0:

ADC Data Registers

 

 

 

در این دو رجیستر اطلاعات خروجی ADC قرار میگیرند.

یعنی وقتی تبدیل انجام شد،مقدار حاصل با دقت مورد نظر میاد و تو این رجیستر میشینه !

 

اگه یادتون باشه گفتم که دقت واحد ADC در میکروکنترلرهای AVR به 10 بیت میرسه !

این یعنی چه ؟ یعنی اینکه طول داده ها 10 بیتیه !

اما مگه نگفتیم که طول هر رجیستر 8 بیته ؟ حالا چجوری 10 بیت رو تو 8 بیت جا بدیم ؟؟؟

چاره اش رو اتمل پیدا کرده ! enlightened

میگه میایم 2 تا رجیستر 8 بیتی به اینکار اختصاص میدیم میشه 8+8 = 16 cheeky

بعد ما 10 تاشو لازم داریم دیگه ؟! اون 6 تا که اضافیه رو هم بهشون محل نمیذاریم !

 

لذا داستان اینجوری میشه که این رجیستر 2 تیکه است ! و در واقع 2 تا رجیستر هستند اما با یک نام و یک وظیفه که بهم چسبیدند !

فقط برای اینکه با هم قاطی نشند اومدند و یه پسوند H و L بهشون دادند.(مخفف High و Low )

 

حالا چرا 2 شکل کشیدیم از این رجیسترها ؟

 اون بیت ADLAR بود توی رجیستر ADMUX،یادتونه که ایشالا ؟!

اون مال همینه.اگه ADLAR=1 باشه نتیجه تبدیل بصورت تنظیم از چپ و اگر ADLAR=0 باشه بصورت تنظیم از راست اطلاعات درون رجیسترها قرار میگیره !

 

شکل بالایی تنظیم از راست و شکل پایینی تنظیم از چپه !

 

بررسی رجیستر SFIOR :

Special Function I/O Register

قبلا هم یادی کردیم از این رجیستر،نمیدونم یادتون هست یا نه ؟!

 

در کل ما زیاد کاری به این رجیستر در مبحث ADC نداریم.ولی اگه بیت ADATE از رجیستر ADSRA رو 1 کردید،تبدیل هامون با یک لبه صعودی تحریک کننده اتفاق میوفته !

(میدونم چیزی متوجه نشدید ولی عیبی نداره !!!)

 

بیت های 5 و 6 و 7 ؛ ADTS0:2 - ADC Auto Trigger Source :

از طریق این سه بیت و با توجه به جدول زیر مشخص میکنیم که واحد ADC چجوری تحریک بشه !

گاهی وقتها لازمه که براساس یه رخداد خاصی،ADC بکار بیوفته ! مثلا : هرگاه وقفه خارجی اتفاق افتاد،ADC تبدیل رو شروع کنه(مثلا !).

 

 

استفاده های خاص خودشو داره و چون بیشتر مواردش مربوط به مبحث تایمر/کانترها میشه،فعلا از توضیح صرفنظر میکنم و اگه لازم شد تو بحث تایمر/کانترها ازش یادی خواهم کرد.

 

خب دوستان.این بخش هم مطالب اصلیش گفته شد.

 

لازمه همینجا بگم این مطلبو که بنده وظیفه ام نشون دادن راه به شماست و زحمت پیمودن مسیر با خودتونه !

پس مطالبی که اینجا میگم به هیچ عنوان بصورت 100 درصد و کامل نیست و بنده بالاجبار بعضی از موارد رو مجبور میشم نگم !!!

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

دلیل دومش هم اینه که بنده اینجا قرار نیست کتاب بنویسم که جامع و کامل باشه.

بغل دستمون دیتاشیت های میکرو هست و داخلش کامل توضیح داده گرچه با زبان اصلی و واژه های مصطلح در علم الکترونیک !

پس خودتون هم اگر احساس میکنید که به موارد بیشتری احتیاج دارید ، دست بکار بشید.

 

در مورد برنامه نویسی ADC هم در پستی جداگانه توابع رو مورد بررسی قرار خواهیم داد.

 

پس فعلا ...

 منبع : www.noise.blog.ir

نظرات  (۲)

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

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی