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

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

بازدید: 1057

پروژه-راه-اندازی-سروو-موتور-با-avr-wizzard-board
  1. Home
  2. »
  3. پروژه‌ها
  4. »
  5. پروژه های AVR
  6. »
  7. پروژه راه اندازی سروو موتور با استفاده از مجموعه آموزشی AVR WIZARD توسط برد پلاریس…

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

بازدید: 1057

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

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

قطعات مورد نیاز:

سروو موتور

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

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

شکل 1.داخل سروو موتور

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

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

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

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

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

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

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

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

در ادامه نحوه کنترل سروو موتور را در تابع MAIN مشاهده می کنید:

				
					
#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
}
}

				
			

خروجی برنامه

نظرتان را درباره این مقاله بگویید 12 نظر

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

با ثبت نظر و نوشتن کامنت، تیم ما را در راستای بهبود و افزایش کیفیت محتوا یاری خواهید کرد :)

فهرست مطالب

مقالات مرتبط

مشاهده محصولات

بروزترین مقالات

این مقاله را با دوستانتان به اشتراک بگذارید!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

13 + 4 =

فروشگاه