به نام خدا : آموزش راه اندازی سروو موتور SG5010 ؛ در این آموزش ابتدا در مورد سروو موتورها توضیحات مختصری آمده و سپس مشخصات سروو موتور SG 5010 و سپس نحوه راه اندازی آن با میکرو کنترلر Atmega32 با استفاده از کامپایلر Atmel Studio 6.2 صحبت کرده ایم. و در پایان سورس کد و شماتیک پروژه نیز قرار داده شده است.
سروو موتور چیست؟
سروو برگرفته از یک کلمه یونانی به نام servus که به معنی خدمتکار است.این سیستم نیز که تحت این نام کار می کند را سیستم سروو می گویند.بدین دلیل که مستقیما به فرامین پاسخ می دهد.
سروموتور به انگلیسی: Servomotor یا موتور کنترل به انگلیسی: Control motor نوعی از موتورهای الکتریکی است که با هدف بکارگیری در سیستمهای کنترل فیدبک طراحی میشود. لختی (اینرسی) در این موتورها پایین بوده و در نتیجه تغییر سرعت در این موتورها بسیار سریع است. معمولا قطر این موتورها کم اما درازای آنها زیاد میباشد.
در کاربردهای مـدرن ، واژه سرو یا مکانیــسم سرو به یک سیستم کنـترلی فیدبک که متغیر کنترل شونده ، موقعیت یا مشتق موقعیت مکانیکی به عنوان سرعت و شتاب است، محدود می شود.
یک سیستم کنترلی فیدبک ، سیـستم کنـترلی است که به نگهـداشتن یک رابطه مفروض بین یک کمیت کنـترل شده و یک کمیـت مرجع ، با مقایسه توابع آنها و اسـتفاده از اختلاف به عنوان وسیله کنترل منجر می شود.
سیستم کنـترلی فیدبک الکتریکی ، عموما برای کار به انرژی الکتـریکی تکیه می کند . مشخصـات مهمی که معمولا برای چنین کنترلی مورد نیاز است ، عبارتند از :
1- پاسخ سریع ،
2- دقت بالا ،
3- کنترل بدون مراقبت و
4- کارکرد از راه دور .
تعریف عمومی سرو موتور بدین شکل است: سرو موتور یک دستگاه کوچکی است که یک محور (shaft) خروجی دارد. این محور قادر است تا در یک موقعیت و زاویه ای خاص با ارسال سیگنال رمزی قرار گیرد. در واقع چگونگی حرکت وموقعیت های زاویه ای این محور خروجی توسط دسته ای از سیگنالهای رمزی که برای سیم کنترل آن تعریف می شودکنترل می شود. برای طول مدت زمانیکه یک سیگنال فعال بوده و یک پالس برروی خط ورودی آن قرار دارد این محور خروجی در موقعیت خاص زاویه ای که مختص آن سیگنال است قرار می گیرد و با تغییر سیگنال رمزی موقعیت زاویه ای تغییر می کند. در عمل سرو موتورها در صنایع رباتیک وتولیدات صنعتی مانند موتورهای کنترل کننده هواپیماها کنترل موقعیت سطوح ( مانند آسانسورها و … ) و… کاربرد وسیعی دارند .
مقایسه سرو موتور با استپر موتور:
در واقع یک استپر موتور از طریق پالسی که دریافت می کند به موتور دستور میدهد که طبق یک درجه خاص بچرخد اما ممکن است این چرخش به مقدار کافی دقیق نباشد که این اختلاف چرخش در پروژه های حساس مشکل آفرین است.اما سروو موتور یک نوع استپر موتوراست که از یک طرف به انکودر متصل می باشد و در هر لحظه میزان چرخش موتور توسط انکودر اندازه گیری می شود(احتمالا از طریق یک پالس در جهت معکوس ) و یک فیدبک از درجه موجود به موتور ارسال می گردد و موتور با دقت مناسب در درجه مشخص شده متوقف می گردد.
مشخصات سرو 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 کیلوهرتز قرار میدهیم. مابقی رجیسترهای تایمر یک را به صورت زیر انجام می دهیم:
1 2 3 4 |
TCCR1A=0xA0; TCCR1B=0x12;// Clock value: 1000 kHz TCNT1H=0x00; TCNT1L=0x00; |
برای مقدار دهی رجیستر ICR1 به صورت زیر عمل می کنیم:
1 |
Fpwm = Fcpu/(2*N * (1+TOP))= 50Hz |
ابتدا با استفاده از رابطه بالا مقدار TOP را محاسبه کرده و سپس رجیستر را با مقدار TOP مقدار دهی می کنیم.توجه داشته باشید رجیستر ICR1 ، 16 بیتی است پس برای مقدار دهی 8 بیت پرارزش ICR1 از رجیستر 8 بیتی ICR1H و برای مقدار دهی 8 بیت کم ارزش از رجیستر ICR1L استفاده می کنیم.
Fpwm فرکانس سرو موتور و برابر 50 هرتز است.
Fcpu فرکانس کاری میکروکنترلر و برابر 8 مگاهرتز است.
N مقدار تقسیم کلاک است و برابر است با 8
بنابر این :
1 2 3 4 5 6 |
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 درجه.
پالس لازم برای اختلاف یک درجه از رایطه زیر محاسبه می شود:
1 |
(1200-300)/(180-0)=5 |
به عنوان مثال برای تنظیم روی یک درجه مقدار پالس لازم برابر 5 + 300 = 305 میکروثانیه می باشد. پس رجیستر OCR1A را با عدد 305 مقدار دهی می کنیم.
برای تنظیم روی n درجه مقدار پالس لازم برابر 300 + (n * 5) می باشد.
کدهای پروژه در اتمل استودیو (Atmel Studio6.2) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#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(); } } |
شماتیک مدار نیز به صورت زیر است:
دقت کنید در تنظیمات مدل سروو باید مقادیر به شکل بالا باشند تا شبیه سازی درستی از سروو SG 5010 در پروتئوس داشته باشید.
فایل های اصلی پروژه به همراه شماتیک و سورس کد :
موفق باشید؛ نظر یادتون نره
مهمان
و باز هم دمت گرم
مهمان
سلام
آقا دم شما گرم! پدرم درآمد از بس سرچ کردم و مطلب به درد بخور گیر نیاوردم تا اینکه آموزش شما کارم رو راه انداخت
مهمان
این را فرمودید که
لذا 600 میکرو ثانیه برای تنظیم روی صفر درجه و 2400 میکروثانیه برای تنظیم روی 180 درجه می باشد.
پس چرا 600 تقسیم به دو می کنید واسه صفر درجه؟
مهمان
محاسبات این شکلیه که فرکانس پالس های دریافتی سروو برابر ۵۰ هرتزه که طول فرکانس میشه ۲۰۰۰۰ میکروثانیه
از طرفی با این فرکانس TOP باید عدد ۱۰۰۰۰ یا همون ۹۹۹۹ باشه
خب حالا با یه نسبت میشه فهمید که برا بدست اوردن پهنای پالس ۶۰۰ میکرو ثانیه باید OCR برابر ۳۰۰ بشه
در واقع این عدد ۲ از تقسیم ۲۰۰۰۰/۱۰۰۰۰ بدست اومده
مهمان
سلام
خسته نباشید ببخشید اگه صفحه اسیلوسکوپ رو ضربدر کرده باشیم دیگه نمیاد باید چی کار کنیم
مدیر سایت
سلام – اسکپ کار نکردم – تو انجمن Eca مطرح کن.
مهمان
سلام مهندس!
ممنون برای مطالب خوب و مفیدت!
من میخوام سروو رو با آردوینو راه اندازی کنم.
چنتا مشکل دارم،اگه ممکنه از طریق ایمیل یا تلگرام یکم راهنمایی میخوام ازت
این ایمیلم:mstf.ghasemi@gmail.com
اینم شماره م : ۰۹۳۸۲۱۰۹۱۸۹
ممنون میشم واقعا اگه راهنماییم کنی
مدیر سایت
سلام
لینک زیر مربوط به آردوینو هستش –ببین بدردت میخوره یا نه و اگه سوال داشتی تو همون مطلب زیر مطلب کن-تو تلگرام به سوالا جواب داده نمیشه
https://dmf313.ir/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%DA%A9%D8%A7%D9%85%D9%84-%D9%88-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%B3%D8%B1%D9%88-%D9%85%D9%88%D8%AA%D9%88%D8%B1-%D8%A8%D8%A7-%D8%A2%D8%B1%D8%AF%D9%88%DB%8C%D9%86%D9%88/
مهمان
سرو موتور همون موتور براشلس است ؟
مدیر سایت
نه
براشلس برا ربات پرنده استفاده میشه…..ولی سور موتور برا بازو های ربات….
ok?
مهمان
سلام
خیلی ممنون بابت اموزشا
یه سوال داشتم مهندس
من یه سروپ دارم که داخلش رو دستکاری کردم که کامل دور بزنه،حالا اگه بخوام این موتور در جهت مخالف دور بزنه باید چیکارش کنم؟
ممنون
مدیر سایت
سلام

تو eca مطرح کنی بهتره
نویسنده این مطلب
سلام
تفاوت چندانی نداره. کد زیر رو توی کدویژن کامپایل کنید. یادتون باشه که توی تنظیمات کدویژن فرکانس میکرو رو روی 8 مگاهرتز قرار بدین.
#include // mega32
#include // delay.h
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
}
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);
}
void main(void)
{
SetRegisters();
while(1)
{
SampleDegree();
}
}
مهمان
سلام
ممنون از توضیحات تون
ببخشید این پروژه رو اگر بخوام با کد ویژن بنویسم چه تغییراتی تو برنامه داده میشه؟
ممنون میشم زودتر جواب بدید
خیلی به این برنامه برای کارم نیاز دارم
نویسنده این مطلب
سلام دوستان


ببخشید که دیر جواب میدم:
منظور از سیگنال رمزی همون مقدار پالسی هست که به ازای درجه خاصی باید ارسال بشه… یعنی باید مقدار پالس تبدیل به درجه بشه! (دیکود بشه)
قسمت آخر تعریف feedback رو اینجوری نوشتید: “رابطه از پیش تعیین شده میان خروجی و ورودی را حفظ می کند.”
باید بگم که رابطه بین ورودی و خروجی را نه تنها حفظ میکنه بلکه در بعضی موارد تصحیح هم می کنه که برمیگرده به مباحث هوش مصنوعی و … که در این خارج از بحث ماست.
تفاوتشون تو سیستم فیدبکی هست که سروو داره. باعث میشه دقت بالا بره ولی استپر این فیدبک رو نداره و ممکنه با ادقیقا روی درجه ای که میخایم توقف نکنه …
استاد خودتی… ما شاگردیم…
کتابخونشو خودم نوشتم
سروو رو هم خریدم
مهمان
سلام استاد
خوب هستید
میگم این سروو رو از کجا گیر اوردی تو ISIS ??
خودت ساختی یا کتابخونشو دانلود کردی
مرسی از مطالب بینظیرتون
مهمان
دمت گرم داش حمید زارع
و درست تعریف میکنم :
ببین اصطلاحاتی که تو مطلب قرار دادی درست مگم
1) feedback control system : سیستمی است که از راه مقایسه خروجی و ورودی مبنا و با استفاده از اختلاف آنها به عنوان وسیله کنترل ، رابطه از پیش تعیین شده میان خروجی و ورودی را حفظ می کند.
2) اینرسی، لختی، یا ماند : تمایل جسم است به حفظ وضعیت فعلی. یعنی جسم ساکن تمایل به حفظ سکون دارد و جسم متحرک تمایل به ادامه حرکت بر خط مستقیم، با سرعت ثابت.
————————————————————————————————
3) منظورت از “سیگنال رمزی” چیه؟؟؟؟(تو اوایل مطلب هستش)
4) اون طوری که فهمیدم باید مثل موتور پله ای باشه….مگه نه؟؟؟؟(آخه بر اساس درجه حرکت میکنه دقیقا مثل موتور پله ای)
5) میشه بیشتر در مورد فرق بین موتور پله ای و و سروو موتور بیشتر توضیح بدی….من یکم گیج شدم …..فرقشون رو هنوز نفهمیدم
شرمنده که سوالا زیاد شد
مهمان
من با اتمل کار نکردم ولی این طوری که معلومه زیاد با کدویژن فرقی نداره>>مثلا تو تعریف کتاب خونه یکم فرق داره(که اونم اصلا مهم نیست)>>> با یه _ که اول تابع دیلای اضافه میشه>>>>من چه غولی از اتمل برا خودم ساخته بودم. در کل ممنون.
نویسنده این مطلب
خیلی تفاوتی نیست ولی اتمل هم سرعت کامپایلش بیشتره و هم دست برنامه نویس توش بازتره، مثلا متغیر رو همه جای تابع میشه تعریف کرد ولی تو کدویژن فقط اول تابع باید تعریف کنیم.