مبدل آنالوگ به دیجیتال(ADC)


 

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

[ads1]

مبدل ADC آنالوگ رو به دیجیتال تبدیل میکنه و خروجی رو توی متغیری(رجیستر  دیگه ایی)ذخیره میکنه که بسته به نوع میکرو دقت عدد ذخیره شده فرق داره،مثلا خروجی به صورت 8 بیتی ذخیره میشه و یا 10 بیتی.

حالا فعلا دقت رقم ذخیره شده رو 10 بیت در نظر بگیرین که همونطور که میدونین،10 بیت میتونه 1024 حالت در خودش ذخیره کنه.وقتی به واحد ADC یه ولتاژ مرجعی اعمال میکنیم،این ولتاژ رو برابر حداکثر مقدار (1023)میگیره و اگه ولتاژ دیگه ایی از طریق کانال های ورودی ADC وارد بشه،به اون ولتاژ عددی بین 0تا 1023 نسبت میده که عدد نسبت داده شده از کسر زیر حساب میشه:

مثلا به پایه ی AREF ،ولتاژ 3.8 ولت میدیم،ADC بازه ی 0تا 3.8 رو به 1024 قسمت مساوی تقسیم میکنه و ولتاژی که به کانال های ورودی (یکی ازپایه های پورت A در Atmega32)اعمال میشه رو نسبت گرفته و عدد بدست آمده رو تو رجیستری ذخیره میکنه.

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

  1. روش موازی یا همزمان
  2. روش دو شیب
  3. روش پله ای
  4. روش تبدیل ولتاژ به فرکانس
  5. روش تبدیل ولتاژ به زمان
  6. روش تقریب متوالی

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

[ads1]

طبق مطالب گفته شده طرز کار واحد ADC به اینصورته ولتاژ مرجعی رو انتخاب میکنیم(مثلا ولتاژ مرجع رو پایه AREF انتخاب میکنیم).اگه دقت ADC ،10 بیت باشه،این ولتاژ مرجع به 1024 قسمت تقسیم میشه که مقدار به دست آمده رو اندازه واحد در نظر میگیریم.

مثلا اگر ولتاژ مرجع 5 ولت و دقت ADC،10 بیت باشه،اندازه ی واحد 4.9میلی ولت میشه.

روش تقریب متوالی هم به این  صورته که از پرارزش ترین بیت (بیت دهم)شروع میکنیم به  این  صورت که با یک کردن تک تک بیت ها،مقدار بدست آمده رو در اندازه واحد ضرب میکنیم و مقدار نهایی رو با ولتاژیی که به ورودی ADC دادیم مقایسه میشه،در صورت بیشتر بودن،آن بیت رو صفر میکنه و بیت کم ارزش تر از اون  رو یک میکنه باز در صورت بیشتر بودن،آن بیت صفر شده و بیت کم ارزش تر از اون یک میشه ولی در صورت کمتر بودن،مقدار آن بیت حفظ شده و بیت کم ارزشتر یک میشه،این کار تا زمانی ادامه پیدا میکنه تا مقدار ولتاژ آنالوگ با مقدار ولتاژی که رجیستر تقریب متوالی توسط مبدل دیجیتال به آنالوگ میده برابر باشه که در اون صورت مقدار رجیستر تقریب متوالی به خروجی  منتقل میشه.

مثلا ولتاژ مرجع رو 5 ولت و ولتاژ  ورودی که به یکی  از کانال های ورودی وصله،3.6 ولت در نظر میگیرم(این مقدارو قراره واحد ADC به  ما بده،در واقع ما میخواییم این مقدار رو اندازه گیری کنیم).روند کار به این صورته که مقدار رجیستر تقریب متوالی (که ده بیتیه)،1000000000میشه،این عدد توسط مبدل دیجیتال به آنالوگ در اندازه واحد (4.9میلی ولت)ضرب میشه و مقدار بدست آمده به آپ امپ رفته و با ولتاژ آنالوگ ورودی (3.6)مقایسه میشه،که درصورت بیشتر بودن،بیت دهم صفر میشه و بیت نهم یک میشه،در اینجا هم چون عدد بدست آمده،از ولتاژ آنالوگ ورودی کمتره،پس بیت دهم حفظ و بیت نهم رو یک میکنیم:

[ads1]

ADC تمامی مراحل رو بصورت کامل انجام میده یعنی در این مثال که من تا 736 حساب کردم و به مقدار برابری رسیدم و بقیه مراحل رو انجام ندادم ولی ADC همچین کار نمیکنه و تا بیت اول حساب میکنه گرچه مقدار تساوی رو در بیت های ابتدایی پیدا کنه،برای همین زمان هر تبدیل،یکسان هستش.

[ads1]

 

رجیستر ADMUX:

ADC Multiplexer Selection

بیت های REFS1  و REFS0:

این بیت ها برای انتخاب ولتاژ مرجع هستش که چهارحالت ان بیت بصورت زیره:

بیت های MUX0:4:

Multiplexer Selection

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

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

کانال های ورودی رو میتوان بصورت جداگانه استفاده کنیم به این صورت که ولتاژ آنالوگ روی هر کانال بصورت مجزا توسط مبدل به دیجیتال تبدیل میشه که تنظیمات انتخاب کانال ورودی از طریق بیت های MUX0 و MUX1 و MUX2  انجام میشه (این بیت ها درواقع سلکت های انتخابی مالتی پلکسر هستند) و یا اینکه میتونیم ازکانال ها بصورت تفاضلی استفاده کنیم به این صورت که دو ولتاژ به دو پایه از کانال های ورودی وصل میکنیم که مبدل،تفاضل این دو ولتاژ رو به دیجیتال تبدیل میکنه.

بیت ADLAR:

ADC Left Adjust Result

در صورت یک بودن این بیت،اطلاعات بصورت چپ سو در رجیستر ADCH,L قرار میگیره و در صورت صفر بودن،اطلاعات راست سو در این رجیستر ذخیره میشن.

[ads1]

 

رجیستر ADCSRA:

بیت ADEN:

ADC Enable

با یک شدن این بیت،ADC فعال و با صفر شدن این بیت ADC  غیرفعال میشه..

بیت  ADSC:

ADC Start Conversion

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

واحد ADC میکروکنترلر های  AVR به دو صورت Single و Free کار میکنه.

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

Free:در این مد،ADC بدون توجه به برنامه ی نوشته شده توسط برنامه نویس،دائما در حال انجام عمل تبدیله.

همان طوری که گفته شد،برای انجام عمل تبدیل چه Single و چه Free،ابتدا باید این بیت رو یک کنیم که بعد از انجام عمل تبدیل،این بیت در هر دو مد گفته شده صفر میشه با این تفاوت که در مد Single این بیت رو خودمون یک کنیم ولی تو مد Free این بیت بصورت اتومات یک میشه.

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

بیت ADATE:

ADC Auto Trigger Enable

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

[ads1]

بیت ADIF:

ADC Interrupt Flag

هر وقت عملیات تبدیل ADC تمام شد،این بیت اتوماتیک یک میشه  و در صورت فعال بودن وقفه(بیت ADIE)،روال سرویس وقفه رو اجرا میکنه.

صفر بودن این بیت،نشان دهنده ی اینه که عمل تبدیلی صورت نگرفته و یک بودن هم انجام گرفتن تبدیل رو نشون میده که به کمک این پرچم میتونیم در مورد انجام یافتن یا نیافتن تبدیل مطلع بشیم.

بیت ADIE:

ADC Interrupt Enable

در صورت یک بودن این بیت،وقفه ی مربوط به ADC فعال میشه که هر وقت پرچم وقفه(بیت ADIF)یک شد،روتین سرویس وقفه رو اجرا میکنه.

در کل برای اجرای برنامه ایی تحت وقفه(سرویس روتین وقفه)،دو شرط لازمه.شرط اول یک بودن بیت ADIE هستش و شرط دوم برای اجرا وقفه،یک بودن بیت ADLF هستش.هنگامی که بیت ADIE یک باشه،برنامه منتظر انجام عمل تبدیل و یک بودن بیت ADIF میشه که به محض یک شدن،روتین سرویس وقفه رو انجام میده.

بیت های ADPS0 و ADPS1 و ADPS2:

ADC Prescaler Select

نقش این بیت ها،تعیین مقسم فرکانسی هستش.همونطورکه میدونین میکروکنترلرهای AVR میتونن با فرکانس کاری مختلفی بین 1 مگ تا 16 مگ و حتی بالاتر کار کنن در حالیکه واحد ADC برای حفظ حداکثر دقت در هنگام تبدیل،به فرکانسی در رنج 50 کیلوهرتز تا200 کیلوهرتز نیاز داره که این فرکانس باید از فرکانس میکرو بدست بیاد که با تقسیم کردن فرکانس میکرو به ارقام 128 ،64 ،32 ،16 ،8 ،4 و 2 ، فرکانسی بین 50 تا 200 کیلو هرتز میرسیم.

مثلا اگه فرکانس کاری میکرو روی 8 مگ تنظیم شده باشه،برای اینکه فرکانس واحد ADC بین 50 تا 200کیلو هرتز باشه از مقسم های 64 و یا 128 استفاده میکنیم.

8000000/128=62500 Hz

8000000/64=125000 Hz

[ads1]

 

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

همونطوری که در مطالب قبلی گفته شد،حداکثر دقت واحد ADCدر میکرو کنترلرهای AVR،10بیت هستش که این 10 بیت باید تو رجیستری ذخیره شوند ولی همونطورییم که میدونین،رجیسترها تو AVR،هشت بیتی بوده که اگه ده بیت رو تو این بیت ذخیره کنیم،دو بیت اضافه میمونه که برای حل این مشکل اومدن یه رجیستر دیگه ایی اضافه کردن که با این کار 16 بیت برای ذخیره سازی اختصاص دادن  و برای اینکه این دو رجیستر قاطی نشن،پسوند High و Low بهشون دادن.البته این نکته هم باید گفته بشه که چون به 10 بیت دقت نیاز داریم از 6 بیت اون استفاده نکردن.

بطور خلاصه بگم که رجیستری که برای ذخیره سازی اطلاعات به کار رفته،دو تیکه رجیستر بوده با یک نام و یک وظیفه ولی به دو شکل متفاوت:راست سو و چپ سو.

راست سو

[ads1]

چپ سو

[ads1]

فرق چپ سو و راست سو:

اگه در حالت چپ سو مقدار رجیستر ADCL رو نخونیم،از 10 بیت موجود،دو بیت کم ارزش رو از دست میدیم که هشت بیت پرارزش باقی مانده،دقت هشت بیتی رو به ما نشون میده به عبارتی اگه بخواییم عمل تبدیل،هشت بیت دقت داشته باشه،باید از ده بیت دقتمون،دو بیت کم ارزش رو حذف کنیم که این کار هم زمانیه که مقدار رجیستر ADCL رو در حالت چپ سو نخونیم.

[ads1]

 

رجیستر SFIOR:

Special Function IO Register

بیت های ADTS0 و ADTS1 و ADTS2:

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

 

در هنگام استفاده از  ADC به نکات زیر توجه کنین:

  1. برای اینکه نوسان VCC به ADC منتقل نشه، برای بخش ADC تغذیه جداگانه به نام AVCC در نظر میگیریم که حتما باید وصل شود.
  2. تغذیه AVCC نباید با تغذیه VCC اختلاف ولتاژیی به اندازه 3 ولت داشته باشد.
  3. برای جلوگیری از انتقال نویز VCC به AVCC بهتره از مدار زیر استفاده کنیم:

همانطوری که گفته شد،هنگامی که بخواییم از ولتاژ 2.65ولت داخلی  و یا ولتاژ AVCC بعنوان ولتاژ مرجع استفاده کنیم،این ولتاژها روی پایه ی AREF میفتند که برای حذف نویز این قسمت،از  یک خازن 100 نانوفاراد استفاده میکنیم.


دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.