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

blog
۱۴۰۱-۰۶-۱۹
6 دقیقه

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

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

اطلاعات
8
0
لینک و اشتراک
profile

سیاوش

متخصص الکترونیک

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

مقالات بیشتر
slide

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند. فروش در پالت
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد. جستجو در آیسی
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند. برو به فروشگاه سیسوگ
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

دغدغه همیشگی فعالان تخصصی هر حوزه وجود بستری برای گفتگو و پرسش و پاسخ است. سیسوگ فروم یک انجمن آنلاین است که بصورت تخصصی امکان بحث، گفتگو و پرسش و پاسخ در حوزه الکترونیک را فراهم می‌کند. پرسش در سیسوگ فرم
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
خانواده سیسوگ

پالت | بازار خرید و فروش قطعات الکترونیک

قطعات اضافه و بدون استفاده همیشه یکی از سرباره‌‌های شرکتها و طراحان حوزه برق و الکترونیک بوده و هست. پالت سامانه‌ای است که بصورت تخصصی اجازه خرید و فروش قطعات مازاد الکترونیک را فراهم می‌کند.
family

آیسی | موتور جستجوی قطعات الکترونیک

سامانه آی سی سیسوگ (Isee) قابلیتی جدید و کاربردی از سیسوگ است. در این سامانه سعی شده است که جستجو، انتخاب و خرید مناسب تر قطعات برای کاربران تسهیل شود. وقتی شما در این سامانه، قطعه الکترونیکی را جستجو می‌کنید؛ آی سی به سرعت نتایج جستجوی شما در اکثر فروشگاه‌های آنلاین در حوزه قطعات الکترونیک را نمایش می‌دهد.
family

فروشگاه سیسوگ

فروشگاه سیسوگ مجموعه ای متمرکز بر تکنولوژی های مبتنی بر IOT و ماژول های M2M نظیر GSM، GPS، LTE، NB-IOT، WiFi، BT و ... جایی که با تعامل فنی و سازنده، بهترین راهکارها انتخاب می شوند.
family

سیسوگ فروم | محلی برای پاسخ پرسش‌های شما

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

دیدگاه ها

profile
عماد گفت :
۱۴۰۳-۱۰-۰۷ ۱۵:۲۸

سلام . حالت sleep با توابع ll چطوری هست. لطفا توضیح بدید باتشکر

profile
Zeus ‌ گفت :
۱۴۰۳-۱۰-۱۸ ۰۸:۵۵

مراحل راه‌اندازی حالت Sleep با توابع LL:

۱. فعال کردن سیستم وقفه: حالت Sleep معمولاً زمانی پایان می‌یابد که یک وقفه خارجی یا داخلی فعال شود. بنابراین باید ابتدا وقفه موردنیاز را پیکربندی کنید.
NVIC_EnableIRQ(IRQn_Type);
NVIC_SetPriority(IRQn_Type, Priority);

۲.پیکربندی رجیستر حالت Sleep: با استفاده از توابع LL، می‌توانید وضعیت SLEEPONEXIT یا SLEEPDEEP را در رجیستر سیستم کنترل (SCB) تنظیم کنید.

اگر SLEEPDEEP صفر باشد، میکروکنترلر وارد حالت Sleep می‌شود.
اگر SLEEPDEEP یک باشد، وارد حالت Deep Sleep می‌شود.

برای حالت Sleep، نیازی به تنظیم SLEEPDEEP نیست:
LL_LPM_EnableSleep();

۳.ورود به حالت Sleep: برای ورود به حالت Sleep باید دستور زیر را اجرا کنید:
__WFI(); // Wait For Interrupt

مثال عملی:
فرض کنید می‌خواهید میکروکنترلر به حالت Sleep برود و با یک وقفه خارجی (مثلاً کلید یا تایمر) از خواب بیدار شود:


#include "stm32f4xx_ll_pwr.h"
#include "stm32f4xx_ll_gpio.h"
#include "stm32f4xx_ll_exti.h"
#include "stm32f4xx_ll_utils.h"

void configure_interrupt(void) {
// تنظیم وقفه روی پین
LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_0);
LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_0);

// فعال کردن وقفه در NVIC
NVIC_EnableIRQ(EXTI0_IRQn);
NVIC_SetPriority(EXTI0_IRQn, 0);
}

void enter_sleep_mode(void) {
// فعال کردن حالت Sleep
LL_LPM_EnableSleep();

// ورود به حالت Sleep
__WFI();
}

int main(void) {
// تنظیمات اولیه
configure_interrupt();

// ورود به حالت Sleep
while (1) {
enter_sleep_mode();

// ادامه اجرای برنامه بعد از وقفه
}
}

// وقفه خارجی
void EXTI0_IRQHandler(void) {
// پاک کردن فلگ وقفه
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_0);
}

profile
mehdi گفت :
۱۴۰۲-۱۰-۱۸ ۲۱:۴۳

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

profile
zeus گفت :
۱۴۰۳-۱۰-۱۸ ۰۸:۵۸

سلام علیکم! 🌹 خیلی خوشحال شدم که آموزش‌ها برای شما مفید بوده، و از پیام پرمهرتون ممنونم. 🥰 این که می‌فرمایید دیر با ما آشنا شدید، مهم نیست؛ مهم اینه که الآن کنار هم هستیم و می‌تونیم با هم مسیر یادگیری رو ادامه بدیم. در مورد آموزش‌های مربوط به توابع LL، کاملاً درکتون می‌کنم. این توابع برای خیلی از پروژه‌ها کارآمد و ساده هستند و قطعاً آموزش‌های بیشتر در این زمینه می‌تونه کمک بزرگی باشه. پیشنهادتون رو به تیم سیسوگ انتقال بدید، شاید با حمایت‌های شما و سایر کاربران دوباره به این موضوع پرداخته بشه. همیشه به یاد داشته باشید، هر جایی که به کمک نیاز داشتید، می‌تونید سؤال‌هاتون رو از همین طریق مطرح کنید. موفق باشید و پرانرژی بمونید! 😊

profile
میثم کهن گفت :
۱۴۰۱-۱۰-۱۵ ۱۹:۲۳

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

profile
elahe گفت :
۱۴۰۱-۱۰-۱۷ ۱۰:۱۶

نظر لطف شماست

profile
میثم کهن گفت :
۱۴۰۱-۱۰-۱۵ ۱۹:۱۶

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

profile
elahe گفت :
۱۴۰۱-۱۰-۱۷ ۱۰:۱۳

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

become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله
become a writer

نویسنده شو !

سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.

ارسال مقاله