سبد خرید 0

هیچ محصولی در سبد خرید نیست.

سبد خرید 0

هیچ محصولی در سبد خرید نیست.

آموزش راه اندازی سروو SG 5010 با میکروکنترلر Atmega32 در Atmel Studio

در آموزش راه اندازی سروو SG 5010 با میکروکنترلر Atmega32 در Atmel Studio ،  ابتدا  مشخصات سروو موتور SG 5010  را نام برده و سپس نحوه راه اندازی آن با میکرو کنترلر Atmega32  با استفاده از کامپایلر Atmel Studio  آورده شده و در پایان سورس کد و شماتیک پروژه برای دانلود قرار داده شده است.

 

مشخصات سرو SG5010:
SG-5010 یک سرو موتور محصول شرکت Tower Pro است که مناسب برای ساخت روباتهای پیشرفته و دقیق ،استفاده در هواپیماهای مدل و انواع بازوهای صنعتی می باشد.این سرو موتور دارای قابلیت چرخش 180 درجه می باشد. این موتور دارای سه پین برای تغذیه و کنترل است.

 

مشخصات کلی این سرو به شرح ذیل است:

 

توضیحات سرو

4.8 – 6 ولتاژ (V) SG5010 مدل
0.16sec @ 4.8v 0.2sec @ 6v سرعت (Deg/sec) 5.2kg.cm@ 4.8v 6kg.cm@ 6v گشتاور (kg.cm)
4 پهنای باند (usec) تایوان کشور سازنده
coreless motor تیپ موتور پلاستیکی جنس گیربکس
180 زاویه چرخش(درجه) 0 – 50 محدوده دمای کاری(C)
40 طول (mm) دارد سخت افزار جانبی
36.5 ارتفاع (mm) 20 عرض (mm)

 

 

نحوه تنظیم رجیسترهای ATtmega32 برای راه اندازی سرو SG5010 :با استفاده از خاصیت PWM در میکروکنترلرها می توان با ارسال پالس مناسب به سروو، آنها را کنترل کرد. مقدار پالس مناسب در دیتاشیت هر سروو موتورآمده است. برای تولید پالس مناسب در ATtmega32 می توان از تایمر استفاده کرد. بنابراین با استفاده از تایمر 16 بیتی شماره یک میکروکنترلر ATtmega32 و مقدار دهی رجیستر OCR1A می توان پالس دلخواه را ایجاد کرد.
مثلا اگر بخواهیم سرو در درجه 70 درجه متوقف شود باید محاسبات مربوطه انجام گیرد و سپس بر اساس این محاسبات رجیستر OCR1A مقدار دهی شود.
برای انجام این محاسبات تایمر یک به صورت زیر مقدار دهی می شود.
فرکانس کاری میکروکنترلر 8 مگاهرتز و clock value تایمر1 را برابر 1000 کیلوهرتز قرار میدهیم. مابقی رجیسترهای تایمر یک را به صورت زیر انجام می دهیم:

 

TCCR1A=0xA0;
TCCR1B=0x12;// Clock value: 1000 kHz
TCNT1H=0x00;
TCNT1L=0x00;

 

 

برای مقدار دهی رجیستر ICR1 به صورت زیر عمل می کنیم:

pwm = Fcpu/(2*N * (1+TOP))= 50Hz

 

ابتدا با استفاده از رابطه بالا مقدار TOP را محاسبه کرده و سپس رجیستر را با مقدار TOP مقدار دهی می کنیم.توجه داشته باشید رجیستر ICR1 ، 16 بیتی است پس برای مقدار دهی 8 بیت پرارزش ICR1 از رجیستر 8 بیتی ICR1H و برای مقدار دهی 8 بیت کم ارزش از رجیستر ICR1L استفاده می کنیم.
Fpwm فرکانس سرو موتور و برابر 50 هرتز است.
Fcpu فرکانس کاری میکروکنترلر و برابر 8 مگاهرتز است.
N مقدار تقسیم کلاک است و برابر است با 8

بنابر این :

Fpwm =Fcpu/( 2*N  * (1+TOP) )=>  8000000HZ/( 2*8  *(1+TOP) ) = 50MHZ
// N =Fcpu/ClockValue=8MHZ/1000KHZ = 8

 //TOP = 9999 => TOP =  0x270F =>

ICR1L=0x0F;
ICR1H=0x27;

 

نحوه کنترل سروو موتورها با AVR : (به دست آوردن عدد مناسب برای مقدار دهی رجیستر OCR1A)
همانطور که در دیتاشیت سروو SG 5010 آمده، حداقل پالس برای چرخش سروو به ترتیب برابر 600 میکروثانیه و حداکثر 2400 میکروثانیه می باشد. SG 5010 می تواند از صفر تا 180 درجه بچرخد لذا 600 میکرو ثانیه برای تنظیم روی صفر درجه و 2400 میکروثانیه برای تنظیم روی 180 درجه می باشد.
پس 600 تقسیم بر 2 برابر 300 میکروثانیه برای 0 درجه و 2400 تقسیم بر 2 برابر 1200 میکروثانیه برای 180 درجه.
پالس لازم برای اختلاف یک درجه از رایطه زیر محاسبه می شود:

 

(1200-300)/(180-0)=5

 

به عنوان مثال برای تنظیم روی یک درجه مقدار پالس لازم برابر 5 + 300 = 305 میکروثانیه می باشد. پس رجیستر OCR1A را با عدد 305 مقدار دهی می کنیم.
برای تنظیم روی n درجه مقدار پالس لازم برابر  300 + (n * 5)  می باشد.

کدهای پروژه در اتمل استودیو (Atmel Studio6.2) :

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <math.h>
void SetRegisters()
{
    PORTB = 0x00;DDRB = 0x00;
    PORTD=0x00; DDRD=0x20;
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: Ph. & fr. cor. PWM top=ICR1
    // OC1A output: Non-Inv.
    // OC1B output: Non-Inv.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0xA0;
    TCCR1B=0x12;// Clock value: 1000 kHz
    TCNT1H=0x00;
    TCNT1L=0x00;
    // Fpwm = Fcpu/( 2*N  * (1+TOP) ) =>  50HZ = 8000000HZ/( 2*8  *(1+TOP) )
    // => TOP = 9999 => 0x270F , N = Fcpu/ClockValue = 8MHZ/1000KHZ = 8
    ICR1H=0x27;ICR1L=0x0F;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
}
void SampleDegree()
{
    // Time = 8MHZ/(2*8) => 2us
    // pulse width = 600us-2400us => 0° = 600  , 180° = 2400
    OCR1A=300; //  0° =>   600us/2us = 300
    _delay_ms(800);
    OCR1A = 1200; // 180°    2400us/2us = 1200
    _delay_ms(800);
    //  1° distance value =  (1200-300)/180 = 5
    OCR1A= 305;// => 1° => 0° + 5 => 300 + 5 = 305
    _delay_ms(800);
    // => 2° => 1° + 10 => 305 + 5 = 310
    //...
    // => x° = x*5 + 300
    OCR1A= 550; // 50° = 50*5 + 300
    _delay_ms(800);
    OCR1A= 915; // 123° = 123*5 + 300
    _delay_ms(800);
}
int main(void)
{
    SetRegisters();
    while(1)
    {
        SampleDegree();
    }
}

شماتیک مدار نیز به صورت زیر است:

 

 

دانلود سورس کد این آموزش به همراه شماتیک

محصول با موفقیت به سبد خرید اضافه شد.