در این پست از سایت اِمیک, یک پروژه ساده ولی بسیار کاربردی به نام پروژه راه اندازی ADC با ولتاژ مرجع داخلی 2.56 ولت در میکروکنترلر AVR قرار داده شده است. همانطور که از نام این پروژه مشخص است در این پست ما مبدل انالوگ به دیجیتال یا همان ADC میکروکنترلر AVR را در حالت ولتاژ مرجع داخلی راه اندازی خواهیم کرد. این پروژه را با استفاده از نرم افزار کدویژن انجام خواهیم داد.
به طور کلی ما ADC میکروکنترلر AVR را می توانیم در دو حالت ولتاژ مرجع خارجی و داخلی راه اندازی کنیم. قبلا نحوه راه اندازی ADC با ولتاژ مرجع خارجی را اموزش داده بودم که ان پست را می توانید “در اینجا” مشاهده کنید. بنابراین در این پست ما نحوه راه اندازی ADC با ولتاژ مرجع داخلی را اموزش خواهیم داد.
در برخی از مواقع که امکان اعمال ولتاژ مرجع خارجی وجود ندارد, میکروکنترلرهای AVR این قابلیت را دارند که از ولتاژ مرجع داخلی انها استفاده کرد. بنابراین با استفاده از قابلیت ولتاژ مرجع داخلی دیگر نیازی به اعمال ولتاژ مرجع خارجی به پایه های AREF و AVCC میکروکنترلر نیست. مهم ترین ویژگی ولتاژ مرجع داخلی میکروکنترلر, دقیق بودن ان و عدم نوسان در ان می باشد که در نتیجه باعث می شود دقت ADC بسیار افزایش پیدا کند.
میکروکنترلرهای ATmega8 , ATmega32 , ATmega16 و برخی دیگر از میکروکنترلرهای AVR دارای یک ولتاژ مرجع داخلی می باشند که دارای مقدار 2.56 ولت است. اگر از میکروکنترلر AVR دیگری به جز موارد گفته شده استفاده می کنید بهتر است برای اینکه از وجود قابلیت ولتاژ مرجع داخلی و همچنین مقدار این ولتاژ مرجع اطمینان پیدا کنید, دیتاشیت ان میکروکنترلر را مطالعه کنید.
از دیگر ویژگی های ولتاژ مرجع داخلی 2.56 ولت می توان به دقت بالاتر در اندازه گیری مقادیر ولتاژ با مقدار کم, نسبت به حالتی که از ولتاژ مرجع خارجی 5 ولت استفاده می کنیم نام برد. مثلا فرض کنید در یک پروژه لازم است ولتاژی با مقدار از 0 تا 1 ولت را اندازه گیری کنید. در این حالت در صورتی که از ولتاژ مرجع داخلی 2.56 ولت استفاده کنیم دقت ADC و اندازه گیری ولتاژ دو برابر حالتی است که از ولتاژ مرجع خارجی 5 ولت استفاده کنیم.
بنابراین در صورتی که حداکثر ولتاژِی که می خواهید اندازه گیری کنید کمتر از 2.56 ولت است, بهتر است از ولتاژ مرجع داخلی میکروکنترلر AVR استفاده کنید تا دقت اندازه گیری بسیار بیشتر شود. البته ولتاژهای بیشتر از 2.56 ولت را هم با ولتاژ مرجع داخلی می توان اندازه گیری کرد فقط لازم است که با تقسیم مقاومتی ولتاژ را کاهش دهید به صورتی که حداکثر ولتاژ اعمالی به پایه ADC میکروکنترلر بیشتر از 2.56 ولت نباشد.
در ادامه یک پروژه ساده برای راه اندازی ADC با ولتاژ مرجع داخلی 2.56 ولت در نرم افزار کدویژن قرار داده شده است. عملکرد پروژه زیر به این صورت است که ما به وسیله یک پتانسیومتر, یک ولتاژ متغیر از 0 تا 2.5 ولت به پایه 40 میکروکنترلر ATmega16 (پایه 40 یکی از ورودی های انالوگ میکرو می باشد) اعمال می کنیم. میکروکنترلر نیز این ولتاژ را اندازه گیری می کند و با توجه به ولتاژ اندازه گیری شده تعدادی LED را برای نمایش محدوده ولتاژ اندازه گیری شده روشن می کند. در زیر شماتیک پروژه را مشاهده می کنید:
در این پروژه در صورتی که ولتاژ اندازه گیری شده کمتر از 0.5 ولت باشد, هر چهار LED خاموش هستند. در صورتی که ولتاژ اندازه گیری شده بین 0.5 تا 1 ولت باشد, LED1 که به پایه 22 (پین 0 از پورت C) میکروکنترلر متصل است روشن می شود. در صورتی که ولتاژ اندازه گیری شده بین 1 تا 1.5 ولت باشد, LED1 و LED2 روشن می شوند. در صورتی که ولتاژ بین 1.5 تا 2 ولت باشد, LED1 تا LED3 روشن می شوند. در صورتی که ولتاژ اندازه گیری شده بیشتر از 2 ولت باشد هر چهار LED روشن می شوند.
تغذیه پروژه بالا 5 ولت DC است که مثبت تغذیه با عبارت VCC مشخص شده و منفی تغذیه نیز با عبارت GND مشخص شده است. توجه کنید که پایه های تغذیه میکروکنترلر (پایه 10 و 11) را که در شماتیک بالا نیست, فراموش نکنید به تغذیه 5 ولت متصل کنید.
برنامه کدویژن:
در این پروژه فرکانس میکروکنترلر 1 مگاهرتز تنظیم شده است. برای تنظیم میکروکنترلر روی ولتاژ مرجع داخلی در محیط کدویزارد باید تنظیمات به صورت زیر باشد:
همانطور که مشاهده می کنید در کدویزارد بخش تنظیمات ADC ما ولتاژ مرجع را روی Int. , cap. on AREF قرار داده ایم. که در این حالت ولتاژ مرجع داخلی 2.56 ولت برای کار با ADC انتخاب می شود.
در زیر برنامه نوشته شده به زبان C و کامپایلر کدویژن را مشاهده می کنید:
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 |
////////// WWW.EMIC.IR ////////// #include <mega16a.h> #include <delay.h> //ايجاد مي شوند adc که توسط خود کدويژن با فعالسازي adc از خط 6 تا 15 دستورات مربوط به// #define ADC_VREF_TYPE ((1<<REFS1) | (1<<REFS0) | (0<<ADLAR)) unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | ADC_VREF_TYPE; delay_us(10); ADCSRA|=(1<<ADSC); while ((ADCSRA & (1<<ADIF))==0); ADCSRA|=(1<<ADIF); return ADCW; } void main(void) { int A=0; //براي استفاده در برنامه int تعريف متغير از نوع// float V=0; //براي استفاده در برنامه float تعريف متغير از نوع// //ميکرو ورودي شده است A در زير پورت// DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); //ميکرو خروجي شده اند C در زير پين هاي 0 تا 3 از پورت// DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (1<<DDC3) | (1<<DDC2) | (1<<DDC1) | (1<<DDC0); PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0); //که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند adc از خط 32 تا 34 رجيسترهاي مربوط به// // ADC initialization // ADC Clock frequency: 500/000 kHz // ADC Voltage Reference: Int., cap. on AREF // ADC Auto Trigger Source: ADC Stopped ADMUX=ADC_VREF_TYPE; ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); while (1) { A=read_adc(0); //مي ريزد A دستور روبرو با توجه به مقدار ولتاژ انالوگ روي پين 40 ميکرو عددي بين 0 تا 1023 خوانده و درون متغير// V=(A*2.56)/1023; //دستور روبرو عدد خوانده شده که بين 0 تا 1023 بود را به معادل ولتاژ ان در محدوده 0 تا 2.56 ولت تبديل مي کند// if(V<=0.5) { //اجرا مي شود if اگر ولتاژ اندازه گيري شده کمتر از 0.5 ولت بود دستورات درون شرط// PORTC.0=0; //به ان متصل است برابر صفر شود LED1 که C پين 0 از پورت// PORTC.1=0; //به ان متصل است برابر صفر شود LED2 که C پين 1 از پورت// PORTC.2=0; //به ان متصل است برابر صفر شود LED3 که C پين 2 از پورت// PORTC.3=0; //به ان متصل است برابر صفر شود LED4 که C پين 3 از پورت// } if((V>0.5)&(V<=1)) { //اجرا مي شود if اگر ولتاژ اندازه گيري شده بين 0.5 تا 1 ولت بود دستورات درون شرط// PORTC.0=1; PORTC.1=0; PORTC.2=0; PORTC.3=0; } if((V>1)&(V<=1.5)) { //اجرا مي شود if اگر ولتاژ اندازه گيري شده بين 1 تا 1.5 ولت بود دستورات درون شرط// PORTC.0=1; PORTC.1=1; PORTC.2=0; PORTC.3=0; } if((V>1.5)&(V<=2)) { //اجرا مي شود if اگر ولتاژ اندازه گيري شده بين 1.5 تا 2 ولت بود دستورات درون شرط// PORTC.0=1; PORTC.1=1; PORTC.2=1; PORTC.3=0; } if(V>2) { //اجرا مي شود if اگر ولتاژ اندازه گيري شده بيشتر از 2 ولت بود دستورات درون شرط// PORTC.0=1; PORTC.1=1; PORTC.2=1; PORTC.3=1; } } } |
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می توانید در قسمت نظرات مطرح کنید. فایل برنامه این پروژه با نرم افزار کدویژن را می توانید از انتهای مطلب دانلود کنید.
کلیپ تست عملی پروژه :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…
عزیزجان دقت تبدیل با کاهش ولتاژ مرجع کاهش پیدا میکنه نه افزایش!!!! دقیقا داری برعکس میگی! هرچه محدوده تبدیل بزرگتر باشه، دقت مبدل در خواندن بیشتر میشه. این دیگه خیلی واضح بود خدایی!
برای اندازه گیری ولتاژ کم هر چه که ولتاژ مرجع ما کمتر باشد و به ولتاژ مورد اندازه گیری نزدیک تر باشد دقت اندازه گیری بیشتر خواهد بود. مثلا برای اندازه گیری ولتاژ 1 یا 2 ولت در صورت استفاده از ولتاژ مرجع 2.56 ولت دقت اندازه گیری دو برابر حالتی است که ولتاژ مرجع ما 5 ولت باشد. 5 ولت تقسیم بر 1024 می شود حدود 4.88 میلی ولت یعنی adc میکرو با مرجع 5 ولت می تواند تغییرات در حد 4.88 میلی ولت را تشخیص دهد در حالی که 2.56 تقسیم بر 1024 می شود 2.5 میلی ولت, یعنی با مرجع 2.56 می توانیم تغییرات کمتر در حد 2.5 میلی ولت را نیز تشخیص دهیم و دقت اندازه گیری بیشتر است.
من این پروژه رو تست کردم و خوشبختانه مشکلم حل شد فقط یک نکته ای داشت این پروژه و اونم اینکه اگه قراره داخل پروتئوس مدار شبیه سازی بشه باید حتما پایه ۳۰ یا همون AVCC به پاور متصل بشه در غیر این صورت فقط ال ای دی 1 روشن میشه .
سپاس فراوان بابت مطالب بسیار مفیدتون🙏🏻.
سلام و عرض ادب و سپاس فراوان بابت مطالب بسیار مفیدتون.
ببخشید من برنامه نویسی رو در سطح خیلی ابتدایی یاد دارم ولی خب پروژه هایی رو انجام دادم . فقط این adcرو نمی تونم ازش استفاده کنم و پروژه های مختلفی رو تست کردم ، اما همشون در اخر برنامه نویسی ارور میده که نمی تونه adc رو شناسایی کنه.
احتمال داره که کدویژن کتابخونه adc رو نداشته باشه؟
ممنون میشم راهنماییم کنید.