حذف نویز ADC در AVR – رجیستر و وقفه در ADC – جلسه 7
حذف نویز ADC در AVR
در جلسه ی مبدل آنالوگ به دیجیتال در avr از سری آموزش AVR پرداختیم به معرفی این واحد و در این جلسه به موارد پیشرفته تر مثل حذف نویز ADC و معرفی رجیسترهای این بخش و وقفه در ADC اختصاص میدیم.
رجیسترهای ADC در AVR
در ابتدا میریم سراغ رجیسترها و در ادامه حذف نویز ADC رو مورد بررسی قرار میدیم.
رجیستر ADCSRA :
بیت های 0 و 1 و 2 :
همونطور که در جلسه ی گذشته توضیح داده شد، باید کلاک واحد ADC در AVR رو تعیین کنیم.
بیت های 1 و 1 و 2 در رجیستر adcsra وظیفه ی تعیین کلاک میکرو رو داره و طبق جدول زیر میتونیم با تعیین بیت ها ، مقدار عددی که کلاک میکرو بر اون تقسیم میشه رو تعیین کنیم.
جدول تقسیم فرکانسی در رجیستر ADCSRA :
بیت 3 : ADIE
1 بودن این بیت به معنی این هستش که وقفه ADC فعال است.
0 بودنش هم حاکی از غیرفعال بودنه !(وقفه ADC رو آخر همین مطلب توضیح میدم).
بیت 4 : ADIF
این فلگ هم معروف به فلگ وقفه ADC هست و هر زمان بیت یک بشه وقفه میکروکنترلر فعال میشه.
بیت 5 : ADATE
با 1 شدن این بیت ، خاصیت تحریک اتوماتیک یا Auto trigger فعال خواهد شد. در اینصورت با هرلبه بالارونده پالس اعمال شده به CPU ، واحد ADC تحریک میشه.
بیت 6 : ADSC
قبل از اینکه هر عمل تبدیلی انجام بدید،اول مقدار این بیت رو 1 کنید این بیت بعد از فعال کردن ADC فرمان آغاز تبدیل آنالوگ به دیحیتال رو میده .
بعد از اینکه عمل تبدیل به پایان رسید مقدار این بیت 0 میشه.
بیت 7 :
وظیفه ی فعال/غیر فعال کردن واحد ADC رو داره.
1 = ADC فعال میشه.
0 = ADC غیرفعال میشه.
رجیستر ADMUX
بعد از رجیستر ADCSCR ، میریم سراغ ADMUX.
همونطور که در جلسه ی راه اندازی adc در کدویژن توضیح داده شد ، باید ولتاژ مرجع ADC رو تعیین کنیم که این رجیستری مربوط به تنظیم همین بخش از ADC هستش.
بیت های 6 و 7 REFS 1,0 :
طبق جدول زیر تعیین میشن :
مشخصه که در هر حالت از تعیین بیت ها مرجع های AREF ، AVCC رزرو شده و 2.56 رو میشه انتخاب کرد.
بیت 5 :
این بیت اگر یک باشه نتیجه ی نمونه برداری به صورت چپ از راست در رجیستر های ADCH و ADCL قرار بگیرند. و اگر صفر باشه بصورت راست به چپ.
بیت های 0 و 1 و 2 و 3 و 4 ( MUX 4,0 ) :
از این بیت ها برای پیکربندی کانال های ADC (PA0-PA7) میکرو استفاده میشه و برای تنظیم باید مطابق جدول زیر عمل کنیم.(از کدوم پین قراره استفاده کنیم؟)
بررسی رجیستر (ADC (ADCH,ADCL
رجیستر های ADCH ADCL که با نام ADCW هم شناخته میشه.
در رجیستری قبلی و در بیت 5 درباره ی این رجیستری ها یک توضیح کوتاه دادم و مشخص شد که اطلاعات ADC در این رجیستر ها ذخیره میشن. این رجیستری ها قابلیت تنظیم کردن ندارن و درواقع یکی هم هستن!
نمونه برداری در ADC همونطور که جلسه قبل گفته شد ، هم میتونه 8 بیتی و هم میتونه 10 بیتی باشه ، برای ذخیره سازی در حالت 10 بیتی باید 10بیت حافظه وجود داشته باشه به همین علت 2 رجیستر 8 بیتی برای این کار تعیین شده و در 10 بیت از اون این مقدار ریخته میشه.
در واقع 2 رجیستر هستند چون یک وظیفه واحد دارن با یک نام و با تفاوت پسوند فقط شناخته میشن.پسوند H و L مخفف High و Low هستش.
خودتون رو برای شناختن رجیستری ها و حفظ کردنشون به زحمت نندازین ، با کمی تجربه و کار روی پروژه های مختلف اونهارو به خاطر میسپارین! اما بقیه ی مطلب رو به هیچ عنوان از دست ندین!
حذف نویز ADC در AVR
در فرکانس های بالا (بالای 8مگاهرتز) احتمال ایجاد نویز داخلی و تاثیر نویز خارجی بر روی ADC بالا میره.
در کدویژن AVR میتونیم مطابق شکل زیر گزینه ی noise canceler رو فعال کنیم که تاثیر خوبی در حذف نویز داره.
البته راه های دیگه ای هم وجود داره ، مثل:
1- استفاده از فیلتر پایین گذر LC :
2- استفاده از خازن 100 نانو فاراد در نزدیکترین محل اتصال تغذیه IC.
3- برنامه نویسی مناسب!
4-کشیدن یک لایه مسی در اطراف مدار چاپی و نقاط خالی از خطوط و اتصال اون به gnd مدار.
وقفه در ADC
و حالا در نظر داریم با وقفه در ADC آشنا بشیم. وقفه در ADC میکروکنترلر AVR رو میشه با تیک اون در بخش کدویزارد یا تنظیم رجیستری ها فعال کرد.
اگر وقفه در ADC رو توسط کدویزارد فعال کنیم تابع وقفه ADC مطابق شکل زیر در کدها ایجاد میشه:
1 2 3 4 5 6 7 8 |
interrupt [ADC_INT] void adc_isr(void) { unsigned int adc_data; // Read the AD conversion result adc_data=ADCW; // Place your code here } |
که واقعا توضیح دیگه ای نداره اگر با وقفه ها در AVR آشنا باشید!
راه اندازی چند ADC همزمان
توضیحاتی که قرار بود بدم رو دادم ، اما یک توضیح کوتاه هم برای استفاده از چند ADC همزمان بدم.
در AVR ما یک واحد ADC داریم ، به این معنی که هر 8 پایه توسط یک واحد باید چک و نمونه برداری بشن، به همین اگر قرار باشه از چند ADC استفاده کنیم میکرو باید به شکل ترتیبی اونهارو جاروب و نمونه برداری کنه (مثل مالتی پلکسر).
ما میتونیم مطابق شکل زیر عمل نمونه برداری چند ADC همزمان رو فعال کنیم.
First پین اول و Last پین آخری هستش که قراره برای نمونه برداری به میکرو معرفی بشه.(یعنی نمونه برداری همزمان برای هر 4 پایه صورت میگیره).
بعد از تعیین این بخش و ساختن کد ، یک ارایه و همچنین تابع وقفه برای هر 4 پایه ی صفر تا 3 برای ما توسط کدویزارد ایجاد میشه.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1]; //araye abraye zakhire sazi etelaat nemoone bardari shode // ADC interrupt service routine // with auto input scanning interrupt [ADC_INT] void adc_isr(void) { static unsigned char input_index=0; // Read the AD conversion result adc_data[input_index]=ADCW; // Select next ADC input if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT)) input_index=0; ADMUX=(FIRST_ADC_INPUT | ADC_VREF_TYPE)+input_index; // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=(1<<ADSC); } |
در این جلسه حذف نویز ADC ، معرفی رجیسترها و همچنین وقفه در ADC موضوعات هدف و مهم تر بودن و بقیه مباحث جنس پیشرفته داشتن.
امیدوارم کاربردی باشه براتون.جلسه بعد میریم سراغ پروژه!
موفق باشید.