Servo motor یک قطعه مکانیکی است که قابلیت چرخش در زوایای مختلف بسته به نوع سرو موتور دارد. این زاویه بین ۰ تا ۳۶۰ درجه در مدل های مختلف متفاوت است. البته سرو موتورهای ۲۷۰ درجه، ۱۸۰ درجه و ۹۰ درجه فقط قابلیت کنترل زاویه را دارند. جهت تشخیص زاویه سرو موتور کافیست شافت را تغییر دهید تا زاویه مشخص شود. در این آموزش قصد داریم تا با استفاده از برد BluePill یا همان میکروکنترلر STM32F103C8T6 یک سرو موتور را راه اندازی و زاویه آن را تنظیم کنیم. در ادامه راه اندازی سرو با STM32 با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.
سرو موتور Servo motor
توسط شافت سرو موتور میتوانید وسیله های مختلفی را در زاویه مورد نظر قرار دهید. انتخاب نوع سرو موتور بسته به ایده ای که دارید، کاملا متفاوت خواهد بود. سرو موتورها در نوع ظاهر، ابعاد، زاویه چرخش و ولتاژ کاری و جریان مورد نیاز بسیار متفاوت هستند. سرو موتورهای ۱۸۰ درجه زاویه پذیر هستند و امکان تعیین زاویه مشخص بین ۰ تا ۱۸۰ برای سرو موتور فراهم است. سرو موتورها همگی دارای ۳ پایه هستند.
موج مربعی یا PWM
موج مربعی یا pwm یا Pulse Width Modulation به معنی مدولاسیون پهنای پالس، روشی برای تنظیم توان الکتریکی، با تغییردادن زمان قطع و وصل شدن منبع در هر سیکل است. در واقع pwm یک سیگنال مربعی میباشد که در یک زمان می تواند ۱ یعنی ۵ ولت (یا ۳٫۳ ولت) و یا ۰ ولت که به زمین متصل باشد که در این بین ما با تغییر Duty Cycle به نتیجه دلخواه که در نور led، حرکت در موتور و موارد دیگر می شویم. برای مثال اگر Duty Cycle یک موج PWM برابر با ۸۰% باشد یعنی در هر سیکل ۸۰% ولتاژ برابر ۵ولت و ۲۰% ولتاژ برابر۰ ولت است. در شکل زیر PWM نشان داده شده است. در این آموزش برای راه اندازی سرو با STM32 به موج مربعی یا همان PWM نیاز داریم.
اتصالات پروژه
با اعمال ولتاژ ۵ ولت و GND به سرو موتور، میتوان سرو موتور را با سیگنال PWM کنترل کرد. زاویه سرو موتور توسط سیگنال PWM مشخص میشود. پایه مربوط به PWM در این آموزش پایه A0 موجود بر روی برد BluePill است. ترتیب پایه های سرو موتور برای راه اندازی سرو با STM32 به صورت زیر است.
- سیم نارنجی: پایه سیگنال PWM است که به پایه های PWM برد های آردوینو و ESP8266 متصل میشود.
- سیم قرمز: پایه VCC پایه تغذیه است و به ۵ ولت متصل میشود. بسته به نوع انتخاب سرو موتور ولتاژ کاری متفاوت است.
- سیم قهوه ای: پایه GND است و به پایه GND برد آردوینو و ESP8266 متصل میشود.
پیکربندی میکروکنترلر در نرمافزار CubeMX
پس از ساخت پروژه جدید در نرمافزار STM32CubeMX و انتخاب میکروکنترلر STM32F103C8T6 بایستی بخش SYS و RCC را تنظیم کنید. در صورتی که با تنظیمات مربوط به این بخش ها آشنایی کافی ندارید. ابتدا بخش آول آموزش میکروکنترلر های STM32 را مطالعه کنید. سپس مطالعه این آموزش را ادامه دهید. همانطور که گفته شد برای راه اندازی سرو موتور بایستی از PWM استفاده شود. بنابراین پس از انجام تنظیمات اولیه، از نوار سمت چپ تایمر ۲ را انتخاب کنید. بخش Clock Source را بر روی گزینه Internal Clock تنظیم کنید. سپس بخش Channel1 را بر روی گزینه PWM Generation CH1 تنظیم کنید. برای راه اندازی سرو موتور بایستی فرکانس تایمر را بر روی ۵۰ هرتز تنظیم کنیم. از این رو در بخش Parameter Setting گزینه ی Prescale را بر روی ۸۷۹ و گزینه Counter Period را بر روی ۹۹۹ تنظیم کنید.
سپس بایستی وارد بخش Clock Configuration شده و فرکانس بخش های HCLK و APB1 Timer Clocks را بر روی ۴۴ مگاهرتز قرار دهید. با محاسبه عدد های تنظیم شده طبق فرمول مربوط به تایمر به عدد ۵۰ هرتز که بالا تر گفته شد خواهیم رسید.
در آخر در قسمت Project Manager ابتدا نام پروژه و مسیر مورد نظر برای ذخیره پروژه را مشخص کنید. سپس گزینه Toolchain را بروی MDK-ARM و ورژن آن را بر روی ۵ تنظیم کرده و بر روی گزینه GENERATE CODE در قسمت نوار بالایی کلیک کنید تا پروژه ساخته شود.
کد نویسی در نرمافزار KEIL
پس از ورود به نرم افزار KEIL بایستی وارد فایل main.c شده و برنامه نویسی راه اندازی سرو با STM32 را در این فایل انجام دهید. برای شروع کار تایمر بایستی دستور زیر را در تایع main قبل از حلقه while(1) قرار دهید.
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
سپس برای اعمال پالس PWM بایستی رجیستر CCR1 را مقدار دهی کنیم. برای مقدار دهی به این رجیستر میتوانید از دستور زیر استفاده کنید. بازه چرخش سرو موتور MG90S بین اعداد ۲۵ تا ۱۲۵ است.
htim2.Instance->CCR1 = 25;
در ادامه داخل حلقه while(1) با نوشتن کد زیر سرو موتور در چند مرحله حرکت کرده و به جای اولیه بازمیگردد.
htim2.Instance->CCR1 = 25; // duty cycle is .5 ms HAL_Delay(1000); htim2.Instance->CCR1 = 75; // duty cycle is 1.5 ms HAL_Delay(1000); htim2.Instance->CCR1 = 125; // duty cycle is 2.5 ms HAL_Delay(1000);
همچنین با نوشتن کد زیر سرو موتور محدوده قابل چرخش خود را یک بار به آرامی طی کرده و به نقطه شروع باز میگردد و این حلقه دائم تکرار خواهد شد.
for(int i=25;i<=125;i++) { htim2.Instance->CCR1 = i; HAL_Delay(50); } for(int i=125;i>=25;i--) { htim2.Instance->CCR1 = i; HAL_Delay(50); }
در اخر برای پروگرام برنامه بر روی میکروکنترلرهای stm32 از منوی Project گزینهی Build Target را انتخاب کنید پس از اتمام کامپایل، از منوی Flash گزینه ی Download را انتخاب کنید. پس از پروگرام شدن کامل برنامه روی میکروکنترلر، بار دیگر کلید reset را فشار دهید. پس از آن اگر اتصالات را به درستی انجام داده باشید. سرو موتور بایستی شروع به حرکت کند.
لوازم مورد نیاز
- پروگرامر STC Auto Programmer
- برد STM32 مدل F103C8T6 دارای تراشه ARM
- موتور MG90S دارای دنده و گیربکس فلزی
جمع بندی
در آموزش راه اندازی سرو با STM32 ایتدا با سرو موتور و نحوه کار آن آشنا شدیم. سپس مفهوم PWM توضیح داده شد. در ادامه اتصالات مورد نیاز برای راه اندازی سرو موتور MG90S معرفی شد. پس از نحوه پیکربندی و انجام تظیمات مورد نیاز PWM برای میکروکنترلر STM32 در نرمافزار STM32CubeMX توضیح داده شد. در اخر ۲ نمونه کد برای کار با سرو موتور قرار داده شده است. به عنوان نکته آخر دقت داشته باشید که در این آموزش صرفا برای تست سرو موتور مستقیما به میکروکنترلر متصل شده است. برای استفاده مداوم از مدار بایستی سرو موتور را با استفاده از درایور مناسب به میکروکنترلر متصل کنید.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
سلام مهندس وقت بخیر .
من برد stm32f103 دارم میخوام با پورت usb پروگرمش کنم . اما هر کاری کردم نرم افزار flash loader نمیشناستش . میشه راهنمایی کنید مشکلم حل بشه .
با سلام
لطفا ابتدا آموزش زیر و همچنین بخش نظرات آن را مطالعه کنید. در صورتی که مشکل رفع نشد مشکل خود را در قسمت نظرات این آموزش بیان کنید.
آموزش راه اندازی و پروگرام برد STM32 در کامپایلر آردوینو IDE
سلام وقت بخیر.
من طبق آموزش بردstm32f1 تونستم راه اندازی کنم . برنامه چشمک زن پایه ۱۳ هم دانلودش کردم . برنامه اوکی شد . فقط یه مشکل دارم میخوام یه برنامه دیگه دانلود در هین بارگزاری از داخل device manager پورت قطع میشه و بارگزاری انجام نمیشه . و برد با همون برنامه قبلی کار میکنه میشه راهنمایی کنید . در قسمت آموزش راه اندازی آردوینو درمورد مشکل راه اندازی پیام گذاشتم خبری نشد . برای همین اینجا پرسیدم.
با سلام
بنده کامنت شما رو در پست مربوطه پاسخ میدم، تا اگر در آینده این مشکل برای دیگر کاربران ایجاد شد با مشاهده کامنت شما مشکل رفع شود.
سلام جناب مهندس
من با همین میکرویی که شما آموزش دادید کار میکنم.
با کدهای شما تماما servo داره بدرستی کار میکنه و کمال تشکر و احترام رو دارم.
چون فرمودید که فرکانس servo باید روی ۵۰htz تنظیم کرد و طبق آموزشهای مبتدی که دیدم F(servo)=F(clock)/(prescaler*counter)
اگر مطابق کدهای شما جایگزاری کنیم دقیقا فرکانس ۵۰htz بدست میاد ولی من اگر prescaler=45 و conter=20 جایگزاری کنم طبق تیوری فرکانس همون ۵۰htz میشه ولی servo تکون نمیخوره.میشه لطفا برای اینکه مطلب دقیقتر درک بشه راهنمایی بفرمایید.ممنونم از وقتی که میذارید
سلام جناب مهندس زاهدی
با تشکر از راهنماییتون در مورد پروژهُ servo
من تماما فرکانسها رو با فرکانسهایی که داخل پروژه آموزش دادید set کردم و servo motor خیلی دقیق داره کار میکنه
طی دوره مبتدی که داشتم
Fservo= Fclock/(prescaler*autoreload)
اگر مقادیر شما رو جایگزین کنیم Fservo حدودا همون ۵۰htz بدست میاد.ولی وقتی prescaler رو به ۴۵۰۰۰ و autoreload رو ۲۰ جایگزین کنیم طبق تئوری فرکانس ۵۰ هرتز خواهد شد ولی servo تکون نمیخوره،میشه لطفا راهنمایی کنید که محاسبات ۵۰ هرتز میکرو رو بر چه اساسی انجام میدید؟ممنون و سپاس از پاسخگوییتون
سلام من این اوزش رو روی یک led انجام دادم وکار کرد فقط حلا میخام pwmرو بجایpina8که مالtimer1هست روی یک پایه دیگه مثلc13که پایهledرویblackpillهست اجراش کنم ایا امکانش هست؟وقتی blackpillخام رو برای اولین بار بهusbوصل میکنیم ledاش مثل حالتpwmروشن وخاموش میشه این همونpwmهست یا به روش دیگه ای ساخته شده؟
ممنون
با سلام
بله، امکان تغییر پایه PWM در میکروکنترلر STM32F103C8T6 وجود دارد. برای تغییر پایه PWM از PA8 به PC13، باید تنظیمات مربوط به Timer مورد استفاده را تغییر دهید. برای این کار، مراحل زیر را دنبال کنید:
۱- تنظیمات Timer:
مطمئن شوید که Timer1 برای PWM در نظر گرفته شده است.
تنظیمات مربوط به PWM بر روی PA8 را پیدا کرده و آنها را به PC13 تغییر دهید.
۲-تنظیمات GPIO:
تنظیمات مربوط به پایه PC13 را به عنوان خروجی PWM انجام دهید.
۳- برنامهنویسی کد:
در کد برنامه، تغییرات لازم را برای اشاره به پایه PC13 انجام دهید.
در مورد سوال دوم شما در خصوص LED که هنگام اتصال به USB به صورت PWM روشن و خاموش میشود، احتمالا از PWM برای تنظیم روشنایی LED استفاده شده است. این عمل ممکن است از طریق نرمافزار (کد برنامه) یا حتی تنظیمات پیشفرض در میکروکنترلر انجام شده باشد. برنامهنویسی و تنظیمات مربوط به PWM ممکن است در کتابخانهها یا محیط توسعه مورد استفاده شما تعریف شده باشند. برای دقت بیشتر، باید به کد برنامه یا تنظیمات پیشفرض میکروکنترلر مراجعه کنید و مشخص شود که LED با استفاده از PWM یا روش دیگری کنترل میشود.
شاد و پیروز باشید.
سلام مهندس وقت بخیر
من میخوام موتور براشلس بدون استفاده از اسپیدکنترل راه اندازی کنم میشه راهنماییم کنید؟
با سلام
بنده در این خصوص اطلاعی ندارم.