مقدمه:
در این قسمت از آموزش در باره ی نحوه ی راه اندازی مبدل آنالوگ به دیجیتال (ADC) میکروکنترلر هایAVR بحث می کنیم. مبدل آنالوگ به دیجیتال برای اندازه گیری ولتاژ رو په پایه هایه پورت A میکروکنترلر به کار می رود. از مبدل آنالوگ به دیجیتال برای راه اندازی سنسور های مختلف مثل سنسور دما ، سنسور شتاب سنج ، سنسور مغناطیسی و غیره و کاربردهای دیگر مثل راه اندازی تاچ اسکرین و … مورد استفاده قرار می گیرد.
تبدیل آنالوگ به دبجیتال به روش تقریب متوالی:
ADC مخفف “Analog-Digital Converter” است. واحد ADC میکروکنترلر های AVR به روش تقریب متوالی (SAR) سیگنال های آنالوگ را به دیجیتال تبدیل می کند. در این روش تبدیل که به صورت یک شمارنده 10 بیتی که به ورودی یک مبدل دیجیتال به آنالوگ (DAC) متصل شده است. باعث می شود. که خروجی DAC متناسب با مقدار خروجی شمارنده دارای یک ولتاژ آنالوگ باشد. این ولتاژ توسط یک مقایسه کننده با ولتاژ آنالوگ ورودی مقایسه شده و در صورت تساوی پایه STOP شمارنده را فعال کرده تا شمارنده متوقف شود. حال مقدار دیجیتال خروجی شمارنده همان مقدار متناسب با ولتاژ آنالوگ ورودی خواهد بودبنابراین مقدار دیجیتال خروجی متناسب با ولتاژ آنالوگ ورودی را می توان به صورت فرمول زیر نشان داد.
ویژگی های مبدل آنالوگ به دیجیتال (ADC) میکروکنترلر های AVR:
میکروکنترلر مورد بحث ما در این مطلب میکروکنترلر ATmega32 است. و دارای ویژگی های زیر است:
- دقت 10 بیت
- زمان تبدیل 65us تا 125us
- 8 کانال وروردی مولتی پلکس شده
- 7 کانال وروردی دیفرانسیلی
- 2 کانال ورودی دیفرانسیلی با بهره ی قابل انتخاب 10x و 200x
- محدوده ی ولتاژ وروردی ADC از 0 تا Vcc
- ولتاژ مرجع 2.56 قابل انتخاب برای ADC
- امکان تریگر شدن خودکار شروع تبدیل ADC با منبع وقفه ی مختلف
- ایجاد وقفه در پایان تبدیل ADC
- مد sleep برای کاهش نویز ADC
نکاتی در مورد راه اندازی مبدل آنالوگ به دیجیتال (ADC) میکروکنترلر هایAVR:
- در میکروکنترلر ATmega32 مبدل آنالوگ به دیجیتال به یک مولتی پلکس کننده ی آنالوگ با 8 کانال متصل شده که امکاناتصال 8 پایه ی پورت A به آن را فراهم می کند.
- ADC یک پایه ی تغذیه ی مجذا دارد (AVCC) پایه ی AVCC نباید بیشتر از 0.3 ولت با VCC اختلاف داشته باشد.
- ولتاژ مرجع می تواند به صورت داخلی با مقدار 2.56v و یا با ولتاژ پایه ی AVCC و یا با به صورت خارجی و متصل به پایه ی AREF همراه با یک خازن برای کاهش نویز انتخاب شود.
- کانال های ورودی آنالوگ تک پایه و یا با بهره ی دیفرانسیلی با تنظیم بیت های MUX در ریجیستر ADMUX انتخاب می شوند.
- ADC با نوشتن یک در بیت ADEN از رجیستر ADCSRA فعال می شود. زمانی که ADEN صفر شود بخش ADC توانی را مصرف نمی کند.
- ADC یک عدد 10 بیتی تولید می کند که در ریجیستر های ADCL و ADCH ذخیره می شود.
- برای شروع یک تبدیل آنالوگ به دیجیتال باید مقدار یک در بیت ADSC نوشته شود. این بیت تا زمانی که عمل تبدیل در حال انجام است یک باقی می ماند و با اتمام تبدیل توسط سخت افزار پاک می شود.
- عمل تبدیل می تواند از طریق منباع مختلفی به صورت خودکار تریگر گردد برای فعال کردن این قابلیت باید بیت ADATE در ریجیستر ADCSRA را یک کنید دراین صورت منبع تریگر نیز با تنظیم بیت های ADTS واقع در ریجیستر SFIOR مشخص می گردد.
- در صورتی که از پرچم وقفه ی ADC به عنوان منبع تریگر استفاده شود ADC به محض اتمام تبدیل تیدیل دیگری را آغاز می کند. در این حالت ADC در مد Free Running کار می کند.
- روش تبدبل هآنالوگ به دیجیتال به صورت تقریب هی متوالی به صورت پیش فرض برای رسیدن به حداکثر دقت به فرکانس کلاکی بین 50KHz تا 200KHz نایز دارد.
- واحد ADC برای تولید کلاک از یک تقسیم کننده ی فرکانسی استفاده می کند. این تقسیم کننده توسط بیت های ADPS از ریجیستر ADCSRA تنظیم می شود.
رجیستر های مربوط به مبدل آنالوگ به دیجیتال (ADC) میکروکنترلر های AVR:
رجیستر ADMUX:
ADC Multiplexer Selection Register
بیت های 6:7 REFS1:0:
این بیت ها مطابق جدول یک ولتاژ مرجع را برای ADC انتخاب می کنند.
بیت 5 – ADLAR
با یک کردن این بیت نتیجه در ADC از سمت چپ منظم می شود و با صفر شدن از سمت راست منظم خواهد شد.
بیت 0:4 – MUX4:0:
این بیت ها ترکیب اتصال ورودی های آنالوگ متصل به ADC را مشخص می کند و بهره ی کانال های دیفرانسیلی را هم تعیین می کند.
رجیستر ADCSCR:
بیت 7 – ADEN:
با یک کردن این بیت ADC فعال می شود و صفر کردن آن ADC را خاموش می کند.
بیت 6- ADSC:
در حالت single convention برای شروع هر تبدیل باید این بیت یک شود ولی در حالت free running تنها برای شروع اولین تبدیل باید این بیت یک شود.
بیت 5 – ADATE:
با نوشتن یک در این بیت ADC در حالت تریگر خودکار فعال می شود . منبع تریگر به کمک تنظیم بیت های ADTS در ریجیستر SFIOR انتخاب می شود.
بیت 4 – ADIF:
این بیت زمانی یک می شود که تبدیل آنالوگ به دیجیتال کامل شده و محتوای ریجیستر داده ی ADC بازتویسی شده باشد. در این صورت اگر قبلا وقفه ی ADC فعال شده باشد روتین وقفه اجرا می شود.
بیت 3 – ADIE:
زمانی که این بیت و بیت I در رجیستر SERG یک گردندو وقفه ی مربوط به اتمام تبدیل ADC فعال می شود.
بیت های 0:2 – ADPS2:0:
این بیت ها فرکانس کلاک ورودی به ADC را تنظیم می کنند. طبق جدول زیر
رجیستر های ADCH , ADCL:
زمانی که تبدیل آنالوگ به دیجیتال کامل می شود نتیجه در این دو رجستر قرار می گیرد.
رجیستر SFIOR:
اگر بیت ADATE در ریجیستر ADCSRA یک شود مقادیر این یبت ها منبع تریگر تبدیل آنالوگ به دیجیتال را مشخص می کند. طبق جدول زیر:
برنامه لازم برای راه اندازی ADC
برنامه لازم برای راه اندازی ADC که بخش لازم برای تنظیم ADC توسط کدویزارد تولید شده است.
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
/******************************************************* This program was created by the CodeWizardAVR V3.12 Advanced Automatic Program Generator © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 8/20/2014 Author : Ali Ezzati Company : electrolab.ir Comments: Chip type : ATmega32 Program type : Application AVR Core Clock frequency: 11.059200 MHz Memory model : Small External RAM size : 0 Data Stack size : 512 *******************************************************/ #include <mega32.h> #include <delay.h> #include <stdio.h> // Voltage Reference: AVCC pin #define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR)) unsigned int read_adc (unsigned char adc_input); void io_init (void); void main(void){ unsigned int x; io_init(); while (1) { x=read_adc(0); printf("\r x= %d",x); delay_ms(300); } } void io_init(void){ // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=(0<<RXC) | (0<<TXC) | (0<<UDRE) | (0<<FE) | (0<<DOR) | (0<<UPE) | (0<<U2X) | (0<<MPCM); UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (1<<RXEN) | (1<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8); UCSRC=(1<<URSEL) | (0<<UMSEL) | (0<<UPM1) | (0<<UPM0) | (0<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (0<<UCPOL); UBRRH=0x00; UBRRL=0x47; // ADC initialization // ADC Clock frequency: 86.400 kHz // ADC Voltage Reference: AVCC pin // ADC Auto Trigger Source: ADC Stopped ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); } unsigned int read_adc(unsigned char adc_input){ ADMUX=adc_input | ADC_VREF_TYPE; // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=(1<<ADSC); // Wait for the AD conversion to complete while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCW; } |
در این برنامه ولتاژ موجود بر روی پایه ی 0 پورت A اندازه گیری شده و توسط پورت سزیال ارسال می شود.
سلام ، ممنون از مطلب مفیدتون
اگر من بخوام خروجی adc v رو به صورت آنالوگ از میکرو بگیرم(فقط هم از یک پین بگیرم) یعنی ورودی یه چیزی بوده حالا من میخوام بر اساس ورودی، خروجی مثلا 0.2 ولت داشته باشم و اینکه خروجی رو حتما میخوام از یک پین بگیرم. چیکار باید بکنم؟
سلام وخسته نباشید در مورد تبدیل آنالوگ به دیجیتال در avr سوالی داشتم برای استفاده از کیفیت و دامنه تبدیل بالاتر باید ولتاژ مرجع کوچک تر انتخاب بشه حداقل مقدار ولتاژ مرجع چقدر می تونه باشه؟
حقیقا نمی دونم باید از دیتاشیت چک کنم بگم
ممنون می شم اگه از دیتا شیت بتونی استخراجش کنی