راه-اندازی-موتور-dc-توسط-برد-avr-wizzard

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

0

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

هدف از این آموزش راه اندازی واحد PWM میکروکنترلر AVR  به زبان  C  توسط مجموعه اموزشی AVR WIZZARD میباشد    ( شما می توانید موتورهای DC مشابه را به این روش راه اندازی نمایید )

لوازم مورد نیاز

  1. برد اصلی AVR WIZZARD
  2. LCD2X16
  3. موتور DC
  4. تغذیه 9 ولت
  5.  برد جانبی 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 مشاهده می کنید:

[cpp]
/*******************************************************
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 BACKWARD 0
#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(2,STOP ,170 ,FORWARD );
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
TCCR0=(1<<WGM00) | (1<<COM01) | (0<<COM00) | (1<<WGM01) | (0<<CS02) | (1<<CS01) | (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);

}
}

[/cpp]خروجی برنامه

راه اندازی موتور dc توسط برد avr wizzard

Choose your Reaction!
دیدگاه خود را بنویسید

آدرس ایمیل شما منتشر نخواهد شد.

redronic.com