راه اندازی مبدل آنالوگ به دیجیتال ADC
مبدل آنالوگ به دیجیتال یک دیگر از خصوصیات میکروکنترلرهای AVR است. این مبدل با روش تقریب ها مداوم مقدار ولتاژ آنالوگ ورودی را به دیجیتال تبدیل می کند. از جمله مدها و خصوصیات این مبدل در زیر بیان شده است.
:: وضوح تبدیل = 10 بیت
:: ولتاژ ورودی = 0 تا Vcc
:: رجیستر پرچم وقفه = ADC
:: زمان تبدیل = 65 الی 260us
:: میزان خطای تبدیل = 2LSB ±
:: فرکانس کلاک مورد نیاز = 50 الی 200KHz
اکثر سری های میکرو دارای چند کانال ADC هستند. در حالی که در تمامی این میکرو کنترلرها تنها یک پک ADC موجود است. در این میکروها برای افزایش تعداد کانال ها از روش مالتی پلکس استفاده شده است.
نکته : منبع تغذیه مبدل آنالوگ به دیجیتال جدا از منبع میکرو بوده اما می توان آن را به تغذیه میکرو متصل نمود. این دو پایه AVCC پایه مثبت و AGND پایه زمین مبدل است.
ولتاژ مرجع
برای میکرو کنترلرهای avr دو حالت برای دسترسی به ولتاژ مرجع تعبیه شده که برای دسترسی پایه ای به نام AREF وجود دارد که می توان تا ولتاژ VCC را به این پایه به عنوان ولتاژ مرجع متصل نمود و یکی ولتاژ مرجع داخلی که به میزان 2.56v بوده و باید در زمان استفاده یک خازن به پایه AREF متصل شود.
البته برای جلوگیری از نویزهای احتمالی که CPU بر مبدل القا می کند. می توان از مدار زیر استفاده کرد که در اکثر مواقع استفاده نمی شود و تنها در پروژه های حساس از این روش استفاده می شود.
پیکر بندی مبدل آنالوگ به دیجیتال ADC در زبان بیسیک BASIC
1 |
Config Adc = Single|Free , Prescaler = Auto , Reference = State |
Single : این مد زمانی استفاده می شود که عمل تبدیل تنها زمان فراخوانی با دستور Getadc انجام می شود و این مد تنها برای کانال 0 (Adc0) قابل اجراست.
Free : این مد به حالت دائم عمل تبدیل را انجام می دهد و مقدار تبدیل را در رجیستر Adcd قرار می دهد. این مد تنها برای کانال 0 (adco) قابل اجراست.
Prescaler : با قرار دادن گزینه Auto میکرو به صورت هوشمند بهترین کلاک برای Adc تعیین می کند.
State : حالت های ولتاژ مرجع را مشخص می کند و گزینه های Off برای خاموش کردن ولتاژ مرجع داخلی و اتصال ولتاژ مرجع به پایه Aref, گزینه Avcc برای استفاده از پایه Avcc به عنوان ولتاژ مرجع و گزینه Internal برای استفاده از ولتاژ مرجع 2.56v داخلی می باشد.
فعال سازی عمل نمونه برداری ADC در زبان بیسیک BASIC
1 2 3 |
Start adc Enable adc |
برای فعال سازیو شروع به کار مبدل از این دستور استفاده می شود. در صورت نیاز می توان از دستور stop adc برای غیر فعال کردن adc استفاده کرد.
نکته: همان طور که می دانید در زمان استفاده از adc هنگام برنامه نویسی دیگر نمی توان پورت مبدل را به عنوان 1/0 استفاده کرد.
فرخوانی مبدل آنالوگ به دیجیتال ADC در زبان بیسیک BASIC
1 |
Var = getadc (n) |
این دستور از کانال n مبدل آنالوگ به دیجیتال مقدار آنالوگ را دریافت کرده و پس از تبدیل به مقدار دیجیتال 10 بیتی آن را در متغیر var قرار می دهد.
نکته : متغیر var از نوع word است.
وقفه مبدل آنالوگ به دیجیتال ADC در زبان برنامه نویسی BASIC
1 |
On adc lable |
رجیستر وقفه مبدل آنالوگ به دیجیتال به نام adc بوده و می توان با این دستور پایان عمل تبدیل به زیر برنامه وقفه پرش کرد.
نکته : دستورات Enable Interrupts و Enable Adc فراموش نشود.
:: تبدیل مقادیر دیجیتال به مقادیر واقعی (نرمالیزه کردن)
فرض کنید ولتاژ مرجع 5v به میکرو وصل است. در نتیجه بعد از فراخوانی adc مقدار گرفته در متغیر مربوطه بین 0 تا 1023 خواهد شد (10 بیت) در صورتی که بخواهید مقدار متغیر را به مقدار واقعی خود یعنی بین 0 تا 5 برسانید به روش زیر عمل کنید:
1 2 3 4 5 6 7 8 9 |
Dim a as word Dim b as single Dim m as string * 10 Dim * a single A= getadc (o) B= a/204.6 M= fusung ( d,"#.####") X= var (m) |
مقدار خوانده شده توسط دستور Getadc را در متغیر از نوع word با نام a ریخته شده و بعد مقدار متغیر را بر عدد 204.6 تقسیم کنید. ( 1023/5 = 204.6 ) و در متغیر b از نوع single قرار دهید. در آخر برای روند کردن مقدار تا 4 رقم اعشار از دستور fusing استفاده کرده و در متغیر از نوع string ریخته می شود. می توانید با دستور var نوع متغیر را از رشته به عدد تبدیل کنید. با این روش مقدار واقعی ورودی در متغیر قرار می گیرد.
نکته : در صورت استفاده از ولتاژ مرجع داخلی 2.56v مقدار متغیری که عدد تبدیل شده در آن ریخته شده را بر 399.6 تقسیم کنید. ( 1023/2.56 = 399.6 )
پروژه راه اندازی مبدل آنالوگ به دیجیتال ADC با میکروکنترلر ATmega32
برنامه میکروکنترلر در نرم افزار BASCOM-AVR به زبان بیسیک BASIC
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
$regfile = “m32def.dat” $crystal = 8000000 Config Lcdpin = Pin , Db4 = Pinb.4 , Db5 = Pinb.5 , Db6 = Pinb.6 , Db7 = Pinb.7 , Rs = Pinb.2 , E = Pinb.3 Config lcd = 16*4 Config adc = single , prescaler = auto , reference = off Start adc Enable interrupts Enable adc Dim w as word , channel as byte , d as single Dim m as string * 6 Channel = 1 Do W = Getadc(channel) Locate channel , 1 Lcd “channel:” ; Channel Incr Channel Locate channel , 1 D = w / 204.6 M = Fusing(d , “#.####” ) Lcd “value:” ; M Waitms 100 Incr channel If channel > 4 then Channel = 1 Cls End If Loop End |