
ساعت دقیق با میکروکنترلر AVR به صورت غیر همزمان با کریستال خارجی RTC 32.768KHz
11 بهمن, 1389آموزش نرم افزار قدرتمند LabView به زبان ساده (مقدمه)
15 بهمن, 1389بازدیدها: 33
در این مطلب می خواهیم کار با مبدل آنالوگ به دیجیتال میکروکنترلر AVR را به زبان C و با کمک کامپایلر Code Vision توضیح دهیم. هدف ما از این مطلب این است که به چه صورتی از کانال ها مقدار آنالوگ را بخوانیم و بعد از تبدیل به دیجیتال، با این مقدار دیجیتال کار انجام دهیم.
از پرداختن مسائل ریز مربوط به ADC صرف نظر می کنیم تا باعث گمراهی افراد تازه کار نشود. در اینجا ما به بحث در مورد رجیستر ها و نحوی انتخاب ولتاژ مرجع و شرایط و چگونگی انتخاب فرکانس نمونه برداری و 8 یا 10 بیتی ADC و یک مثال کامل خواهیم پرداخت.
رجیستر کنترلی ADMUX
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| MUX0 | MUX1 | MUX2 | MUX3 | MUX4 | ADLAR | REFS0 | REFS1 |
REFS0,1 از این دو بیت برای انتخاب ولتاژ مرجع ADC استفاده می کنیم که دارای چهار حالت می باشد:
- REFS0=0 و REFS1=0 در این حالت ولتاژی که روی پایه AREF است به عنوان ولتاژ مرجع انتخاب می شود.
- REFS0=1 و REFS1=0 در این حالت ولتاژ پایه AVCC به عنوان ولتاژ مرجع انتخاب می شود.
- REFS0=0 و REFS1=1 بدون استفاده
- REFS0=1 و REFS1=1 در این حالت ولتاژ مرجع داخلی 2.56 ولت انتخاب می شود.
نکته: دقیق بودن ولتاژ مرجع در تبدیل کردن آنالوگ به دیجیتال نقش بسیار مهمی دارد. دقیق ترین ولتاژ مرجع همان 2.56 داخلی می باشد البته می توان با استفاده از تثبیت کننده های ولتاژ آن ولتاژ مرجع مورد نظر را ساخت و به پایه AREF داد.
ADLAR از این بیت برای 8 یا 16 بیتی بودن مقدار خروجی ADC استفاده می شود. ADCH,ADCL
MUX0-4 از بیت ها برای انتخاب کانال ورودی و نیز انتخاب بهره تفاضلی استفاده شده است.
رجیستر ADCSRA
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| ADPS0 | ADPS1 | ADPS2 | ADIE | ADIF | ADATE | ADSC | ADEN |
ADEN با یک کردن این بیت ADC فعال می شود.
ADSC در مد عملکرد Single با نوشتن یک در این بیت، تبدیل شروع شده و پس از پایان تبدیل به صورت خودکار صفر می شود. در مد Free، یک کردن این بیت برای شروع تبدیل الزامی است.
ADATE با یک کردن این بیت ADC می تواند به صورت اتوماتیک با لبه بالا رونده منبع تحریک کننده شروع به تبدیل کند. منیع تحریک توسط بیت های ADTS از رجیستر SFIOR انتخاب می شود.
ADIF بعد از اتمام تبدیل یا تغییر در رجستر داده ADC یک می شود. (از یک شدن این بیت ما متوجه می شویم که عمل تبدیل تمام شده و حالا می توانیم مقدار دیجیتال تبدیل شده را بخوانیم)
ADIE با یک کردن این بیت هرگاه عمل تبدیل به اتمام رسید یه وقفه ای صادر می شود که توسط آن زیر روال وقفه می توان مقدار داده ADC را خواند.
ADPS0-3 از بیت ها برای تعیین پالس ساعت ADC مطابق جدول زیر استفاده می کنیم:
| تقسیم بر | ADPS0 | ADPS1 | ADPS2 |
| 2 | 0 | 0 | 0 |
| 2 | 1 | 0 | 0 |
| 4 | 0 | 1 | 0 |
| 8 | 1 | 1 | 0 |
| 16 | 0 | 0 | 1 |
| 32 | 1 | 0 | 1 |
| 64 | 0 | 1 | 1 |
| 128 | 1 | 1 | 1 |
رجیستر داده (ADCH,ADCL) ADC
در این دو رجیستر اطلاعات خروجی ADC قرار دارند که در ADCL مقدرا سبک و در ADCH مقدار سنگین قرار دارد همچنین با استفاده از ADCW می توانیم محتوای هر دو متغییر را به صورت 16 بیتی بخوانیم.
رجیستر SFIOR
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| PSR1 | PSR2 | PUD | ACME | – | ADTS0 | ADTS1 | ADTS2 |
از طریق بیت های ADTS0-2 می توان منبع تحریک برای شروع تبدیل را مطابق جدول زیر انتخاب کرد:
| منبع تحریک ADC | ADTS0 | ADTS1 | ADTS2 |
| مد عملکرد آزاد | 0 | 0 | 0 |
| تحریک از طریق مقایسه کننده آنالوگ | 1 | 0 | 0 |
| تحریک از طریق وقفه خارجی صفر | 0 | 1 | 0 |
| تحریک از طریق تایمر (شمارنده) صفر (در صورتی که نتیجه مقایسه برابر شود) | 1 | 1 | 0 |
| تحریک از طریق تایمر (شمارنده) صفر (در صورت سریز شدن) | 0 | 0 | 1 |
| تحریک از طریق تایمر (شمارنده) یک (در صورتی که نتیجه مقایسه B برابر شود) | 1 | 0 | 1 |
| تحریک از طریق تایمر (شمارنده) یک (در صورت سریز شدن) | 0 | 1 | 1 |
| تحریک از طریق حالت تسخیر تایمر (شمارنده) یک | 1 | 1 | 1 |
پس باید توجه داشت که با توجه به فرکانس نوسان ساز میکرو ضریب تقسیمی از جدول ADPS0-2 انتخاب کنیم که فرکانس واحد ADC در محدوده گفته شده قرار گیرد.
در این مثال ما می خواهیم با استفاده از دو عدد سنسور LM35 دمای دو نقطه را اندازه گیری کنیم و روی LCD نمایش دهیم. در فایلی که به این مطلب پیوست شده برنامه و سایر فایل های شبیه ساز موجود می باشد
1 ADC Enabled
Volt Ref: Int
Clock: 125KHz
Auto trigger: None
با استفاده از Code Wizard به صورت بالا ADC را تنظیم می کنیم.
#define ADC_VREF_TYPE 0xC0 //H1 SFIOR=0x00; //H2 ADMUX=ADC_VREF_TYPE & 0xff; //H3 ADCSRA=0x86; //H4
H1: با نسبت دادن ADC_VREF_TYPE 0xC0 ولتاژ مرجع داخلی انتخاب می شود که بعدا در زیر برنامه read_adc با AND و OR کردن آن با کانال انتخاب شده مقدار رجیستر ADMU ایجاد می گردد.
H2: مد عملکر آزاد انتخاب شده
H3: با AND کردن آن با FF به صورت پیش فرض کانال صفر انتخاب شده و همچنین ADLAR هم صفر می باشد بنابراین خروجی به صورت ADCW شانزده بیتی خواهد بود.
H4: در اینجا ADC فعال شده و همجنین ضریب تقسیم 64 انتخاب می شود بنابراین فرکانس پالس ساعت ADC برابر 125KHZ می شود که در محدود مجاز می باشد.
در زیرروال read_adc دستوراتی نوشته شده که بجزء یک خط آن بقیه را خود Code Wizard ایجاد می کند.
float t;//H1 ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);//H2 delay_us(10);//H3 ADCSRA|=0x40;//H4 while ((ADCSRA & 0x10)==0);//H5 ADCSRA|=0x10;//H6 t=((ADCW*2.56)/1023)*100;//H7 return t;//H8
H1: ایجاد یک متغییر از نوع اعشاری و بزرگ
H2: اگر C0 را با FF ما ADN کنیم نتیجه همان C0 خواهد شده حالا فرض کنید در هنگام فراخوانی این تابع ما 1 را به عنوان ورودی تابع داده ایم اگر C0 را با 1 OR کنیم آنگاه ADMUX= C1 خواهد شده و درنتیجه کانال 1 به همراه ولتاژ مرجع داخلی انتخاب می شود.
H3: مقدار 10 میلی ثانیه تاخیر برای پایدار شده ولتاژ ورودی ADC
H4: معادل باینری ADCSRA=0x86 برابر با 10000110 می باشد و همچنین معادل باینری 0X40 برابر با 01000000 می باشد. با OR کردن 86OR40 مقدار 11000110 را خواهیم داشت می بینیم که بیت شماره 6 به 1 تغییر یافت و این بیت همان ADSC می باشد که توضیح دادیم.
H5: با استفاده از یک حلقه بی نهایت شرطی بیت 4 یعنی ADIF یا همان پرچم اتمام تبدیل را تحت نظر می گیرم تا موقعی که تبدیل تمام و این بیت 1 شود و شرط حلقه باطل می شود که منجر به خروج از این حلقه بی نهایت می شود.
H6: خوب حالا باید بیت ADIF که یک شده را دوباره صفر کنیم که این کار را با OR کردن بیتی با عدد 10 انجام می دهیم.
H7: خوب الان عمل تبدیل تمام شده و مقدار دیجیتال آن در ADCW قرار دارد چون ولتاژ مرجع را 2.56 انتخاب کردیم اینجا مقدار ADCW را در 2.56 ضرب می کنیم و بعد حاصل را بر 1023 تقسیم کرده و در نهایت در 100 ضرب می کنم تا دما برحسب درجه سانتیگراد بدست اید. عدد 1023 از فرمول زیر حساب می شود که n=10 بوده یعنی تفکیک پذیری 10بیتی
H8: مقدار دما که در متغییر t قرار دارد برگشت داده می شود.
با تشکر فراوان سید محسن قاسمیان
ورژن نرم افزار ها: CodeVisionAVR V2.04.4a و Proteus 7.7 sp2 Professional
