در این پست از سایت اِمیک, یک پروژه بسیار جالب و آموزشی به نام پروژه AVR کنترل حرکت سروو موتور با جوی استیک قرار داده شده است. همانطور که از نام پروژه مشخص است, ما در این پروژه می توانیم مقدار و جهت حرکت یک سروو موتور را به وسیله یک ماژول جوی استیک کنترل کنیم. این پروژه با میکروکنترلر ATmega16 انجام شده است. در ادامه در مورد پروژه بیشتر توضیح خواهم داد.
برای آشنایی بیشتر با سروو موتور توصیه می کنم پست “راه اندازی سروو موتور با میکروکنترلر AVR” را مطالعه کنید. همچنین برای آشنایی با ماژول جوی استیک می توانید پست “راه اندازی ماژول جوی استیک با میکروکنترلر AVR” را مطالعه کنید. در زیر شماتیک پروژه AVR کنترل حرکت سروو موتور با جوی استیک را مشاهده می کنید:
همانطور که مشاهده می کنید, ما در این پروژه از میکروکنترلر ATmega16 استفاده کرده ایم. از یک ماژول جوی استیک نیز استفاده کرده ایم که پایه VRX آن به پین 0 از پورت A میکرو (پایه 40 میکرو) متصل شده و پایه های 5V+ و GND ماژول نیز به ترتیب به مثبت و منفی تغذیه 5 ولت متصل شده اند. از یک سروو موتور نیز استفاده کرده ایم که سیم های مثبت و منفی تغذیه سروو (VCC و GND) به تغذیه متصل شده اند و سیم سیگنال کنترل نیز به پین 4 از پورت D میکرو (پایه 18 میکرو) متصل شده است.
عملکرد پروژه بالا به این صورت است که با حرکت اهرم جوی استیک به سمت جلو و عقب, سروو موتور نیز به همان میزان و در همان جهت حرکت می کند. به عبارت دیگر با حرکت اهرم جوی استیک به سمت جلو, محور سروو به سمت 180 درجه حرکت می کند. در صورت حرکت اهرم جوی استیک به سمت عقب نیز محور سررو به سمت 0 درجه حرکت می کند. میزان حرکت محور سروو نیز به میزان حرکت اهرم جوی استیک بستگی دارد و با رها کردن اهرم جوی استیک نیز, سروو در موقعیت خود باقی می ماند. در انتهای مطلب می توانید کلیپ تست عملی پروژه را مشاهده کنید.
پایه 10 میکرو به مثبت تغذیه و همچنین پایه های 30 و 32 میکرو نیز به دلیل استفاده از ADC میکرو به مثبت تغذیه 5 ولت متصل شده اند. خازن ها نیز برای حذف نویز و نوسان تغذیه استفاده شده اند و باید در فاصله بسیار نزدیک به پایه های میکرو متصل شوند. پایه های 11 و 31 نیز به منفی تغذیه یا GND متصل می شوند.
برنامه کدویژن:
در این پروژه فرکانس میکروکنترلر 1 مگاهرتز تنظیم شده است. در زیر برنامه نوشته شده به زبان 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 72 73 74 75 |
////////// WWW.EMIC.IR ////////// #include <mega16a.h> //معرفي کتابخانه ميکروکنترلر مگا 16// #include <delay.h> //delay معرفي کتابخانه// //ايجاد مي شوند adc که توسط خود کدويژن با فعالسازي adc از خط 6 تا 15 دستورات مربوط به// #define ADC_VREF_TYPE ((0<<REFS1) | (0<<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 VRx=0, Value=400; //در روبرو چند متغير براي استفاده در برنامه تعريف شده است// //ورودي شده است ADC ميکرو براي استفاده از 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); //است را خروجي کرده ايم PWM که در واقع پين خروجي موج D در زير پين 4 از پورت// DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); //از خط 43 تا 50 تنظيمات واحد تايمر/کانتر 1 ميکرو مي باشند که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند// //در زير مي توانيد توضيحات مربوط به تنظيمات رجيسترهاي تايمر/کانتر 1 ميکرو را مشاهده کنيد// // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000/000 kHz // Mode: Fast PWM top=OCR1A // OC1A output: Disconnected // OC1B output: Non-Inverted PWM // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 20 ms // Output Pulse(s): // OC1B Period: 20 ms Width: 0.4 ms // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1A=20000; //دوره تناوب سيگنال ما را مشخص مي کند که برابر با 20000 ميکرو ثانيه يا 20 ميلي ثانيه قرار داده شده است OCR1A رجيستر// OCR1B=400; //را مشخص مي کند که براي شروع ان را بربر با 400 ميکرو ثانيه يا 0.4 ميلي ثايه قرار داده ايم PWM عرض پالس سيگنال OCR1B رجيستر// //که با توجه به تنظيمات ما در محيط کدويزارد ايجاد مي شوند adc از خط 56 تا 58 رجيسترهاي مربوط به// // ADC initialization // ADC Clock frequency: 500/000 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) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0); SFIOR=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0); while (1) { VRx=read_adc(0); //VRx ميکرو که عددي بين 0 تا 1023 است و ريختن ان در متغير A خواندن مقدار ولتاژ انالوگ روي پين 0 از پورت// delay_ms(10); //ايجاد تاخير// if (VRx <= 450) { //روبرو مي شويم if کوچکتر يا مساوي 450 بود وارد شروط VRx در صورتي که// Value=Value-10; //ده تا کمتر مي شود Value متغير if با هر بار اجراي شرط// if (Value <= 400) Value = 400; //از 400 کمتر شود Value برابر 400 يا کمتر شد ان را دوباره 400 مي کند. در واقع اجازه نمي دهد که متغير Value در صورتي که متغير// OCR1B=Value; //مي شود Value قرار مي دهد که در نتيجه باعث حرکت سروو با توجه به مقدار Value را برابر متغير OCR1B دستور روبرو رجيستر// } if (VRx >= 600) { //روبرو مي شويم if بزرگتر يا مساوي 600 بود وارد شروط VRx در صورتي که// Value=Value+10; //ده تا بيشتر مي شود Value متغير if با هر بار اجراي شرط// if (Value >= 2400) Value = 2400; //از 2400 بيشتر شود Value برابر با 2400 يا بيشتر شد ان را دوباره 2400 مي کند. در واقع اجازه نمي دهد که متغير Value در صورتي که متغير// OCR1B=Value; //مي شود Value قرار مي دهد که در نتيجه باعث حرکت سروو با توجه به مقدار Value را برابر متغير OCR1B دستور روبرو رجيستر// } } } |
توضیحات قسمت های مهم برنامه نوشته شده, اگر سوالی داشتید می توانید در قسمت نظرات مطرح کنید. از انتهای مطلب نیز می توانید فایل برنامه این پروژه با نرم افزار کدویژن را دانلود کنید.
کلیپ تست عملی پروژه :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…