آموزش STM32 با توابع LL, توصیه شده

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

سرو موتور

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 در موقعیت‌های واردشده قرار بگیرد و حرکت کند.

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

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

شما نیز میتوانید یکی از نویسندگان سیسوگ باشید.   همکاری با سیسوگ

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

  1. Avatar for mehdi mehdi گفت:

    سلام علیکم ازاموزش های عالیتون متشکرم ولی عصابم خورده ازین که دیر باهاتون اشنا شدم و اموزشاتون در رابطه با توابع LL دیگه نمیزارین😥
    بازم تشکر

  2. Avatar for میثم کهن میثم کهن گفت:

    سلام و خسته نباشید
    تشکر ویژه از شما بابت این سری از اموزش ها
    خیلی خیلی خوشحالم که اموزش های توابع LL رو دارید ادامه میدید.
    امیدوارم این اموزش ها ادامه داشته باشه تا سطح های بالاتر و کارهای پیچیده تر از میکرو

    1. Avatar for elahe elahe گفت:

      نظر لطف شماست

  3. Avatar for میثم کهن میثم کهن گفت:

    سلام و خسته نباشید
    خیلی خیلی خوشحالم که اموزش های توابع LL رو دارید ادامه میدید

    1. Avatar for elahe elahe گفت:

      نظر لطف شماست
      یادتون باشه سیسوگ رو به دوستانتون معرفی کنید.

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

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