آموزش STM32 با توابع LL قسمت 36: راه‌اندازی و کنترل Servo Motor

آموزش STM32 با توابع LL قسمت 36: راه‌اندازی و کنترل Servo Motor

آموزش STM32 با توابع LL قسمت 36: راه‌اندازی و کنترل Servo Motor
آموزش STM32 با توابع LL قسمت 36: راه‌اندازی و کنترل Servo Motor

Servo Motor به دستگاه‌هایی گفته می‌شود که می‌توان به‌وسیله آن‌ها موقعیت زاویه‌ای و یا خطی و همچنین سرعت و شتاب را کنترل کرد. Servo Motor درواقع یک موتور الکتریکی ساده است که به‌وسیله سروومکانیزم کنترل می‌شود. در قسمت‌های قبل و پس از معرفی موج PWM گفتیم که این موج برای کنترل این نوع موتور نیز استفاده می‌شود. در این قسمت می‌خواهیم یک Servo Motor را به‌وسیله میکروکنترلر راه‌اندازی و کنترل کنیم. با سیسوگ همراه شوید.

یک سروو موتور نمونه.

می‌دانیم که با استفاده از Servo Motor می‌توانیم موقعیت زاویه‌ای را کنترل کنیم. اما این عمل چگونه انجام می‌شود؟ ساختار سروو موتور چگونه است و از چه اجزایی تشکیل شده است؟ و در آخر نحوه محاسبه و تولید سیگنال کنترلی به چه صورت است؟

در ادامه سعی می‌کنیم به این سؤالات پاسخ دهیم و سروو موتور را با جزییات بیشتر معرفی کنیم. سپس سراغ ایجاد پروژه و کد نویسی خواهیم رفت.

 

اصول Servo Motor و کاربرد آن

در بسیاری از موقعیت‌ها، نیاز به موتور الکتریکی‌ای وجود دارد که امکان تغییر زاویه را به مقدار مشخص و دلخواهی برای ما فراهم کند. در این کاربردها به‌وسیله انواع خاصی از موتورهای الکتریکی و اجزاء دیگر فرمان الکتریکی لازم برای چرخش محور موتور، به میزان موردنظر اعمال می‌شود. درواقع این همان وظیفه‌ای است که می‌خواهیم برای ما انجام بدهد.

Servo Motor ها به‌طورمعمول از یک موتور DC ساده تشکیل‌شده‌اند که به‌وسیله مدار کنترل‌کننده و همچنین یک سروومکانیزم (یک سیستم کنترلی حلقه بسته) در زاویه موردنظر تنظیم می‌شود. سیستم توصیف‌شده امروزه، صنعت گسترده‌ای دارد علاوه بر این‌ها در موارد دیگری ازجمله ربات‌ها، ماشین‌ها و هواپیماهای اسباب‌بازی کنترلی، DVD و CD پلیرها و صدها وسیله روزمره دیگر کاربرد دارند.

 

اجزای Servo Motor و نحوه کارکرد آن

Servo Motor ها خود به دو دسته DC و AC تقسیم می‌شوند که همان‌طور که انتظار می‌رود بسته به نوع موتوری دارد که به سروومکانیزم متصل شده است. همان‌طور که اشاره شد، Servo Motor یک اکچوایتور خطی و یا زاویه‌ای است که به‌وسیله آن می‌توان موقعیت خطی و یا زاویه‌ای و همچنین سرعت و شتاب را به‌صورت دقیق کنترل کرد. هر کدام به‌طورمعمول شامل یک موتور متصل به یک سنسور فیدبک موقعیت می‌شود. علاوه بر آن برای کنترل موقعیت و فرمان دادن به موتور از یک ماژول کنترلر نیز استفاده می‌شود. سایر اجزای تشکیل دهنده یک Servo Motor نمونه و همچنین مراحل تغییر موقعیت آن را می‌توان در شکل زیر مشاهده کرد:

اجزای Servo Motor و نحوه کارکرد آن

اشاره کردیم که سیگنال کنترلی ورودی برای فرمان دادن به Servo Motor و تنظیم آن در زاویه موردنظر، درواقع یک سیگنال PWM است. در دیتاشیت هر Servo Motor مشخصات این سیگنال ازجمله دوره تناوب آن و طول پالس مشخص‌شده برای هر زاویه، نوشته‌شده است. به طور معمول برای کنترل Servo Motor ها، ازجمله نمونه‌ای که در این پروژه استفاده می‌کنیم از یک موج PWM با فرکانس 50‌Hz (یعنی با تناوب 20‌ms) استفاده می‌شود. بازه زاویه قابل چرخش و همچنین طول پالس PWM تعیین‌شده برای هر زاویه، در Servo Motor های مختلف تفاوت دارد. به‌عنوان‌مثال برای Servo Motor به‌کاررفته در این پروژه، طول پالس متناظر با زاویه 0 درجه، 0.55‌ms و طول پالس متناظر با زاویه 180 درجه، 2.8‌ms است که به‌وسیله آزمایش و سعی و خطا تعیین‌شده‌اند.

بنابراین در هر Servo Motor، برای هر زاویه خاص یک طول پالس متناظر تعریف می‌شود که یک نمونه آن در شکل زیر مشخص‌شده است. در این شکل، برای اینکه در موقعیت‌های 0، 90 و 180 درجه قرار بگیرد، طول پالس‌های متناظر نشان داده‌شده است. برای سایر زوایا نیز با استفاده یک نگاشت در همین بازه می‌توان طول پالس مناسب را به مدار اعمال کرد.

 

اجزای Servo Motor و نحوه کارکرد آن

 

همان‌طور که در شکل زیر نشان داده‌شده است، سیگنال کنترلی گفته‌شده به کنترل‌کننده درون Servo Motor منتقل می‌شود و سپس اختلاف زاویه موقعیت فعلی با زاویه ورودی (متناظر با سیگنال اعمال‌شده) محاسبه‌شده و فرمان الکتریکی مناسب به موتور اعمال می‌شود.

 

سیگنال کنترلی به کنترل‌کننده درون Servo Motor می‌رود

اکنون که با ساختار Servo Motor و نحوه کارکرد آن آشنا شدیم، می‌خواهیم به سراغ توسعه یک پروژه برای کنترل این ساختار برویم.

 

ایجاد پروژه

برای این پروژه، تنظیمات را دقیقاً مانند پروژه اولیه‌ی مربوط به PWM انجام می‌دهیم. بدین‌صورت که تنظیمات کلاک و دیباگ را مانند همیشه اعمال می‌کنیم و سپس Timer1 را در حالت PWM تنظیم می‌کنیم. فرکانس شکل موج PWM را نیز به‌وسیله مقدار تقسیم‌کننده فرکانس (PSC) و رجیستر ARR، روی 50‌Hz تنظیم می‌کنیم.

 

تنظیم  Timer1 در حالت PWM.

برای چاپ پیغام‌های خروجی موردنظر در ترمینال سریال می‌توانیم مانند گذشته واحد USART1 را نیز فعال کنیم. همچنین می‌توانیم یک پایه را نیز برای اتصال کلید و به‌منظور فرمان دادن به Servo Motor در حالت ورودی تنظیم کنیم.

در آخر پروژه را ایجاد کرده و به سراغ کد می‌رویم.

نوشتن کد پروژه

در این پروژه برای کنترل سروو، سه فایل servo_config.h، ‌servo.h و servo.c را ایجاد می‌کنیم. در فایل اول یعنی servo_config.h، اطلاعات مربوط به Servo Motor (از دیتا شیت یا آزمایش) را وارد می‌کنیم. و در توابع نوشته‌شده در servo.c از این اطلاعات استفاده خواهد شد. پس ابتدا به سراغ نوشتن فایل servo_config.h می‌رویم.

در این فایل، ابتدا کتابخانه‌های موردنیاز برای نوشتن توابع کنترلی را اضافه کرده و سپس ثابت‌های مربوط به Servo Motor را تعریف می‌کنیم؛

سپس در فایل servo.h فایل‌های موردنیاز را اضافه و توابعی که می‌خواهیم در servo.c تعریف کنیم را اعلان می‌کنیم.

در آخر و در فایل servo.c، ابتدا فایل servo.h را اضافه کرده و سپس توابع را تعریف می‌کنیم. اولین تابع یعنی servo_init، وظیفه راه‌اندازی وسایل جانبی موردنیاز servo (یا همان تایمر) را بر عهده دارد.

همان‌طور که در بدنه تابع دیده می‌شود، مشابه پروژه PWM، برای راه‌اندازی servo_init تنها نیاز داریم که تایمر 1 (یا یک تایمر دیگر) را در حالت PWM راه‌اندازی کنیم. در تابع دوم یعنی servo_moveto، عمل تغییر زاویه به زاویه ورودی موردنظر انجام می‌شود. بدنه این تابع را به‌صورت زیر می‌نویسیم:

در تابع آخر نیز دو ورودی که زاویه شروع و زاویه پایان هستند گرفته می‌شوند و سپس Servo Motor، بازه میان این دو زاویه را sweep می‌کند. بدنه این تابع به‌صورت زیر و با استفاده از تابع servo_moveto نوشته می‌شود:

اکنون‌که نوشتن فایل‌های موردنیاز پروژه به اتمام رسیده است، می‌توانیم از توابع تعریف‌شده، در فایل اصلی برنامه، یعنی main.c، استفاده کنیم. اما قبل از آن، هدرفایل servo.h را به این فایل اضافه می‌کنیم.

در قدم بعدی، قبل از حلقه while(1) تابع servo_init را فراخوانی می‌کنیم تا راه‌اندازی انجام شود؛

اکنون می‌توانیم به Servo Motor فرمان دهیم که در موقعیت مورد نظر ما قرار گیرد. یا اینکه با استفاده از تابع servo_sweep زاویه خاصی را جاروب کنیم.

همچنین درصورتی‌که یک پایه را به‌عنوان پایه ورودی تعریف کرده باشیم می‌توانیم با نوشتن کد زیر در صورت زدن یک کلید، به Servo Motor فرمان دهیم که زاویه 180 درجه تا 0 درجه را جاروب کند و مجدداً به موقعیت 180 درجه بازگردد (این کد برای حالت ساده Dummy Project کاربرد دارد)؛

در صورت اجرای صحیح تمامی مراحل (به‌خصوص واردکردن صحیح طول‌موج‌های مربوط به هر زاویه) می‌توانیم انتظار داشته باشیم که Servo Motor در موقعیت‌های واردشده قرار بگیرد و حرکت کند.

   لینک فایل این پروژه روی گیت‌هاب

0 نفر

پــــســنــدیـده انـد

توجه

سیاوش
سیاوش

کارشناس ارشد الکترونیک دیجیتال، علاقه‌مند به یادگیری

دیدگاه ها

0 دیدگاه

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 3 سال پیش
راه اندازی LCD گرافیکی Nokia 1661

راه اندازی LCD گرافیکی Nokia 1661

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش
ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش
همه چیز درباره ریموت کنترل‌های هاپینگ

همه چیز درباره ریموت کنترل‌های هاپینگ

امنیت همیشه و در همه‌ی اعصار، مقوله‌ی مهم و قابل‌توجه‌ ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموت‌های کنترل خواهیم پرداخت....

Zeus ‌ Zeus ‌
  • 5 سال پیش
مسابقه سوم: استخراج داده از رشته ها در زبان C

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش
مسابقه ششم: بزن میکروکنترلر را بسوزون!

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 12 ماه پیش
آموزش قدم به قدم راه اندازی NRF24L01

آموزش قدم به قدم راه اندازی NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش
کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش
ساخت ماینر با FPGA و ARM

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش
مسابقه چهارم: کدام حلقه سریع‌تر است؟

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 2 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک