پروژه-راه-اندازی-سروو-موتور-با-avr-wizzard-board

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

0

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

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

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

  1. برد اصلی AVR WIZZARD
  2. LCD2X16
  3. سروو موتور SG90
  4. تغذیه 9 ولت
  5. برد جانبی Robo Shield

سروو موتور

موتورهای سروو مدت زیادی است که در بسیاری از کاربردها مورد استفاده قرار می گیرند. اندازه آنها کوچک است اما دارای گشتاور بالا و بسیار کارآمد هستند. این ویژگی به آنها امکان استفاده در اتومبیل های اسباب بازی ، ربات ها و هواپیماهای کنترل شده از راه دور یا رادیویی را می دهد. موتورهای سروو همچنین در کاربردهای صنعتی ، رباتیک ، خطوط تولید ، داروسازی و خدمات غذایی استفاده می شود. اما این موتورها چطور کار می کنند؟

مدار سروو درست در داخل موتور ساخته می شود و دارای شافت قابل تنظیم است ، که معمولاً به یک دنده تعبیه می شود موتور با یک سیگنال الکتریکی کنترل می شود که میزان حرکت شافت را تعیین می کند.

داخل سروو موتور
داخل سروو موتور

نحوه کنترل سروو موتور

سروها با ارسال پالس الکتریکی با عرض متغیر یا مدولاسیون عرض پالس (PWM) از طریق سیم کنترل کنترل می شوند. حداقل ، حداکثر و میزان تکرار پالس برای هر یک وجود دارد. یک موتور سروو معمولاً فقط می تواند 90 درجه در هر جهتی و در کل 180 درجه حرکت کند. موقعیت خنثی موتور به عنوان موقعیتی تعریف می شود که سروو همان مقدار چرخش بالقوه را در هر دو جهت عقربه های ساعت یا خلاف جهت عقربه های ساعت داشته باشد. PWM ارسال شده به موتور موقعیت شافت را تعیین می کند و بر اساس مدت زمان پالس ارسال شده از طریق سیم کنترل روتور به موقعیت مورد نظر تبدیل می شود. موتور سروو انتظار دارد که هر 20 میلی ثانیه (میلی ثانیه) یک پالس را ببیند و طول پالس تعیین می کند که موتور تا چه اندازه دور می شود. به عنوان مثال ، یک پالس 1.5ms باعث می شود موتور به حالت 90 درجه برگردد. کوتاهتر از 1.5ms ، آن را در جهت خلاف جهت عقربه های ساعت به سمت موقعیت 0 درجه حرکت می دهد و هر طولانی تر از 1.5ms ، سرو را در جهت عقربه های ساعت به سمت موقعیت 180 درجه می چرخانند.

نحوه پالس به سروو

هنگامی که به این سرووها دستور داده می شود حرکت کنند ، آنها به سمت موقعیت حرکت می کنند و آن موقعیت را نگه می دارند. اگر یک نیروی خارجی در حالی که سروو در حال نگه داشتن موقعیت است ، علیه سروو فشار وارد کند ، سروو از حرکت در خارج از آن موقعیت مقاومت می کند. حداکثر نیرویی که سروو قادر به اعمال آن است ، نرخ گشتاور سروو نام دارد. سروو موقعیت خود را برای همیشه حفظ نخواهد کرد. پالس موقعیت باید تکرار شود تا به سروو دستور دهد تا در موقعیت خود قرار بگیرد.

نحوه اتصال  سروو موتور به برد ROBO_SHIELD از مجموعه آموزشی AVR WIZZARD

در برد شیلد ربات موسوم به ROBO_SHIELD از مجموعه آموزشی AVR WIZZARD کافی است موتور را به ترمینال خروجی SERVO متصل کنیم.

نحوه اتصال سروو موتور

نحوه برنامه نویسی و کنترل سروو موتور

ابتدا باید یک تایمر در مد WGM  (Waveform Generation Mode )را انتخاب کنیم که برای سروو مناسب باشد. در مرحله بعد ، باید دوره PWM را انتخاب کنیم که با سروو کار کند. سرووهایی که در اینجا استفاده می شود یک دوره 20 میلی ثانیه ای را می پذیرند و ما برای ایجاد این دوره از ثبت ICR1 استفاده خواهیم کرد. برای انجام این کار ، ما باید یک prescaler را تعیین کنیم تا تایمر از منبع کلاک میکروکنترلر به درستی استفاده کند. حال باید PWM را تنظیم کنیم که در حالت صحیح معکوس یا غیر معکوس باشد در آخر ، ما نیاز داریم که از کدام OCR  1A یا 1B استفاده کنیم.

در ادامه نحوه کنترل سروو موتور را در تابع 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>
#include <delay.h>
// Alphanumeric LCD functions
#include <alcd.h>
int speed=0;
int stop;
int buff1 = 0;
int buff2 = 0;
// Declare your global variables here
void Servo_Init(char numb,int angle_1,int angle_2)
{

if((buff1== angle_1) && (buff2== angle_2)) stop=1;
else stop=0;
buff1 = angle_1; // store pre value
buff2 = angle_2; // store pre value
angle_1 = angle_1*(933/89) + 800 ; // change degree to value for servo
angle_2 = angle_2*(933/89) + 800 ; // change degree to value for servo
switch (numb)
{
case 1 :
if(angle_2== angle_1)
{
if((OCR1B>=angle_1))
{
for (speed=OCR1B;speed>=angle_1;speed–)
{
OCR1B=speed;
delay_ms(2);
}
}
else
{
for (speed=OCR1B;speed<=angle_1;speed++)
{
OCR1B=speed;
delay_ms(2);
}
}
}
else
{
if(stop ==0 )
{
if(angle_1>angle_2)
{
if((OCR1B>=angle_1))
{
for (speed=OCR1B;speed>=angle_1;speed–)
{
OCR1B=speed;
delay_ms(2);
}
}
else
{
for (speed=OCR1B;speed<=angle_1;speed++)
{
OCR1B=speed;
delay_ms(2);
}
}
for (speed=angle_1;speed>=angle_2;speed–)
{
OCR1B=speed;
delay_ms(2);
}

}
if(angle_2>angle_1)
{
if((OCR1B>=angle_1))
{
for (speed=OCR1B;speed>=angle_1;speed–)
{
OCR1B=speed;
delay_ms(2);
}
}
else
{
for (speed=OCR1B;speed<=angle_1;speed++)
{
OCR1B=speed;
delay_ms(2);
}
}
for (speed=angle_1;speed<=angle_2;speed++)
{
OCR1B=speed;
delay_ms(2);
}
}
}

}
break;
}
}
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
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) | (0<<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=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<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) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<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) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2000.000 kHz
// Mode: Ph. & fr. cor. PWM top=ICR1
// 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: 2.6 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) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x4E;
ICR1L=0x20;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x06;
OCR1BL=0x40;

// 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_clear();
lcd_putsf( " HI Wellcom " ) ;
lcd_gotoxy( 0 , 1 );
lcd_putsf( "TO REDRONIC.COM" ) ;
delay_ms(2000);
#asm("sei")
while (1)
{
Servo_Init(1,90,90); //set sevo at 90 degree point
delay_ms(2000);
Servo_Init(1,1,1); //set sevo at 1 degree point
delay_ms(2000);
Servo_Init(1,180,180); //set sevo at 180 degree point
delay_ms(2000);
Servo_Init(1,180,0);
delay_ms(2000); //command servo to move from 180 degree to 0

}
}

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

پروژه راه اندازی سروو موتور با avr wizzard board

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

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

redronic.com