پروژه راه اندازی موتورهای DC با استفاده از مجموعه آموزشی AVR WIZZARD توسط برد پلاریس به زبان C

راهنمای راه اندازی موتورهای DC با استفاده از مجموعه آموزشی AVR WIZZARD به زبان C
هدف از این آموزش راه اندازی واحد PWM میکروکنترلر AVR به زبان C توسط مجموعه اموزشی AVR WIZZARD میباشد ( شما می توانید موتورهای DC مشابه را به این روش راه اندازی نمایید )
لوازم مورد نیاز
- برد اصلی AVR WIZZARD
- LCD2X16
- موتور DC
- تغذیه 9 ولت
- برد جانبی Robo Shield
موتور DC
موتور DC یا موتور مستقیم در واقع ، رایج ترین محرک برای تولید حرکت مداوم است و سرعت چرخش آن به راحتی قابل کنترل می باشد به همین دلیل اغلب از آنها در کنترل سرعت ، کنترل انوع سروو ، و / یا کنترل موقعیت استفاده می کنند. موتور DC از دو بخش تشکیل شده است ، Stator كه قسمت ثابت و Rotor كه قسمت چرخشی می باشد. اساساً سه نوع DC موتور وجود دارد:
موتور Brushed: این نوع موتور با عبور یک جریان الکتریکی از طریق یک محور انتقال دهنده و Brush کربن ، یک میدان مغناطیسی را در یک روتور ایجاد می کند . میدان مغناطیسی استاتورها (قسمت ثابت) با استفاده از سیم پیچ استاتور یا توسط آهنرباهای دائمی تولید می شوند. به طور کلی این موتورها ارزان و کوچک بوده و به راحتی کنترل می شوند.
موتور Brushless : این نوع موتور با استفاده از آهنرباهای دائمی متصل به آن ، یک میدان مغناطیسی در روتور ایجاد می کند و تبدیل به صورت الکترونیکی حاصل می شود. آنها معمولاً کوچکتر اما گرانتر از موتورهای DC معمولی هستند زیرا از اثر هال در استاتور استفاده می کنند تا دنباله چرخشی مورد نیاز استاتور را تولید کنند .اما از ویژگی های گشتاور سرعت بهتری برخوردار هستند و عمر عملیاتی بیشتری دارند.
سروو موتور: این نوع موتورها در اصل یک موتور Brushed DC با نوعی کنترل بازخورد موقعیتی است که به شافت روتور متصل است که معمولا توسط یک کنترلر از نوع PWM متصل و کنترل می شوند و عمدتاً در سیستم های کنترل موقعیت مورد استفاده قرار می گیرند.
درایور L298
آی سیL298N ، دارای 15 پایه است. سطح منطقی آی سی L298N با استاندارد TTLسازگاری دارد و از آن میتوان برای راه اندازی موتور DC، استپ موتور، رله و غیره استفاده کرد. از آنجا که آی سی درایور موتور L298Nیک آی سی درایور پل کامل دوتائی است، می توان برای کنترل دو موتور به صورت همزمان با ورودی های منحصر به فرد از آن استفاده کرد. ولتاژ منبع تغذیه منطقی آن 5 ولت است اما ولتاژ منبع تغذیه موتور بالای 45 ولت است. پیک جریان خروجی هر کانال هم 2 آمپر است.
نحوه اتصال موتور به برد ROBO_SHIELD از مجموعه آموزشی AVR WIZZARD
در برد شیلد ربات موسوم به ROBO_SHIELD از مجموعه آموزشی AVR WIZZARD درایور L298 و مدار راه انداز ان پیاده سازی شده است و کافی است موتور را به ترمینال های خروجی متصل کنیم.
نحوه برنامه نویسی و کنترل موتور DC
برای کنترل سرعت موتور A استفاده می شود. با HIGH کردن این پین باعث چرخش موتور A و LOW کردن آن باعث می شود موتور متوقف شود. با اتصال این پین به ورودی PWM می توانیم سرعت موتور A را کنترل کنیم.
پین های IN1 & IN2 برای کنترل جهت چرخش موتور A استفاده می شود. هنگامی که یکی از آنها HIGH و دیگری LOW است ، موتور A می چرخد. اگر هر دو ورودی یا HIGH یا LOW باشند موتور A متوقف می شود.
پین های IN3 و IN4 برای کنترل جهت چرخش موتور B استفاده می شوند. هنگامی که یکی از آنها HIGH و دیگری LOW باشد ، موتور B چرخش می یابد. اگر هر دو ورودی یا HIGH یا LOW باشند موتور B متوقف می شود.
پین های ENB برای کنترل سرعت موتور B استفاده می شود. با HIGH نگه داشتن این پین باعث چرخش موتور B می شود ، با LOW کردن آن باعث متوقف شدن موتور خواهد شد. با اتصال این پین به ورودی PWM می توانیم سرعت موتور B را کنترل کنیم.
برنامه نویسی موتورهای DC با استفاده از مجموعه آموزشی AVR WIZZARD به زبان C
در ادامه نحوه کنترل موتور A و B را در تابع MAIN مشاهده می کنید:
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 : 05/13/2019 Author : Company : Comments: Chip type : ATmega16A Program type : Application AVR Core Clock frequency: 16.000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *******************************************************/ #include <mega16a.h> #define FORWARD 1 #define START 1 #define STOP 0 // Alphanumeric LCD functions #include <alcd.h> #include <delay.h> // Declare your global variables here void DC_Motor_Run(int numb,int ena ,int speed ,int way ) { if (speed<=80) speed=80; if (speed>=255) speed=255; if(numb==1) { if (way==BACKWARD) { PORTD.5=0; // FORWARD PORTC.0=1; } if (way==FORWARD) { PORTD.5=1; PORTC.0=0; } if(ena==START) { OCR2 = speed; } if(ena==STOP) { OCR2 =0; } } //case 2 : if(numb==2) { if (way==BACKWARD) { PORTD.6=1; PORTC.1=0; } if (way==FORWARD) { PORTD.6=0; PORTC.1=1; } if(ena==START) { OCR0 = speed; } if(ena==STOP) { OCR0 =0; } } } void Turn_Right(void) { DC_Motor_Run(2,START ,170 ,FORWARD ); DC_Motor_Run(1,STOP ,170 ,FORWARD ); delay_ms(1200); DC_Motor_Run(1,STOP ,170 ,FORWARD ); } void Turn_Left(void) { DC_Motor_Run(2,STOP ,170 ,FORWARD ); DC_Motor_Run(1,START ,170 ,FORWARD ); delay_ms(1200); DC_Motor_Run(2,STOP ,170 ,FORWARD ); DC_Motor_Run(1,STOP ,170 ,FORWARD ); } void main(void) { char spd = 120; DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Port C initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRC=(1<<DDC7) | (0<<DDC6) | (1<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (1<<DDC1) | (1<<DDC0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (1<<PORTC1) | (1<<PORTC0); // Port D initialization // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0); // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTD=(0<<PORTD7) | (1<<PORTD6) | (1<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 250.000 kHz // Mode: Fast PWM top=0xFF // OC0 output: Non-Inverted PWM // Timer Period: 1.024 ms // Output Pulse(s): // OC0 Period: 1.024 ms Width: 0.51401 ms | (1<<CS00); TCNT0=0x00; OCR0=0x80; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: 250.000 kHz // Mode: Fast PWM top=0xFF // OC2 output: Non-Inverted PWM // Timer Period: 1.024 ms // Output Pulse(s): // OC2 Period: 1.024 ms Width: 0.51401 ms ASSR=0<<AS2; TCCR2=(1<<PWM2) | (1<<COM21) | (0<<COM20) | (1<<CTC2) | (1<<CS22) | (0<<CS21) | (0<<CS20); TCNT2=0x00; OCR2=0x80; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0); // Alphanumeric LCD initialization // Connections are specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTB Bit 0 // RD - PORTB Bit 1 // EN - PORTB Bit 2 // D4 - PORTA Bit 4 // D5 - PORTA Bit 5 // D6 - PORTA Bit 6 // D7 - PORTA Bit 7 // Characters/line: 16 lcd_init(16);; lcd_putsf( " HI Wellcom " ) ; lcd_gotoxy( 0 , 1 ); lcd_putsf( "TO REDRONIC.COM" ) ; delay_ms(2000); //lcd_clear(); #asm("sei") while (1) { DC_Motor_Run(1,START ,spd ,FORWARD ); // intialize DC motor1 with Speed Of spd in Forward Mode DC_Motor_Run(2,START ,spd ,FORWARD ); // intialize DC motor2 with Speed Of spd in Forward Mode delay_ms(2000); DC_Motor_Run(1,STOP ,spd ,BACKWARD ); // stop DC motors DC_Motor_Run(2,STOP ,spd ,BACKWARD ); // stop DC motors delay_ms(2000); DC_Motor_Run(1,START ,spd ,BACKWARD ); // intialize DC motor1 with Speed Of spd in Backward Mode DC_Motor_Run(2,START ,spd ,BACKWARD ); // intialize DC motor1 with Speed Of spd in Backward Mode delay_ms(2000); Turn_Left(); delay_ms(2000); Turn_Right(); delay_ms(2000); } }
خروجی برنامه