برد STM رباتیک

راه اندازی و کنترل سرو موتور با میکروکنترلر STM32

نوشته شده توسط علی زاهدی

Servo motor یک قطعه مکانیکی است که قابلیت چرخش در زوایای مختلف بسته به نوع سرو موتور دارد. این زاویه بین ۰ تا ۳۶۰ درجه در مدل های مختلف متفاوت است. البته سرو موتورهای ۲۷۰ درجه، ۱۸۰ درجه و ۹۰ درجه فقط قابلیت کنترل زاویه را دارند. جهت تشخیص زاویه سرو موتور کافیست شافت را تغییر دهید تا زاویه مشخص شود. در این آموزش قصد داریم تا با استفاده از برد BluePill یا همان میکروکنترلر STM32F103C8T6 یک سرو موتور را راه اندازی و زاویه آن را تنظیم کنیم. در ادامه راه اندازی سرو با STM32 با مرجع تخصصی بردهای امبدد به زبان فارسی، دیجی اسپارک همراه باشید.

 


سرو موتور Servo motor


توسط شافت سرو موتور میتوانید وسیله های مختلفی را در زاویه مورد نظر قرار دهید. انتخاب نوع سرو موتور بسته به ایده ای که دارید، کاملا متفاوت خواهد بود. سرو موتورها در نوع ظاهر، ابعاد، زاویه چرخش و ولتاژ کاری و جریان مورد نیاز بسیار متفاوت هستند. سرو موتورهای ۱۸۰ درجه زاویه پذیر هستند و امکان تعیین زاویه مشخص بین ۰ تا ۱۸۰ برای سرو موتور فراهم است. سرو موتورها همگی دارای ۳ پایه هستند.

راه اندازی سرو با STM32 - دیجی اسپارک

 


موج مربعی یا PWM


موج مربعی یا pwm یا Pulse Width Modulation به معنی مدولاسیون پهنای پالس، روشی برای تنظیم توان الکتریکی، با تغییردادن زمان قطع‌ و‌ وصل شدن منبع در هر سیکل است. در واقع pwm یک سیگنال مربعی می‌باشد که در یک زمان می تواند ۱ یعنی ۵ ولت (یا ۳٫۳ ولت) و یا ۰ ولت که به زمین متصل باشد که در این بین ما با تغییر Duty Cycle به نتیجه دلخواه که در نور led، حرکت در موتور و موارد دیگر می شویم. برای مثال اگر Duty Cycle یک موج PWM برابر با ۸۰% باشد یعنی در هر سیکل ۸۰% ولتاژ برابر ۵ولت و ۲۰% ولتاژ برابر۰ ولت است. در شکل زیر PWM نشان داده شده است. در این آموزش برای راه اندازی سرو با STM32 به موج مربعی یا همان PWM نیاز داریم.

شناخت موج مربعی Pulse Width Modulation - دیجی اسپارک

 


اتصالات پروژه


با اعمال ولتاژ ۵ ولت و GND به سرو موتور، میتوان سرو موتور را با سیگنال PWM کنترل کرد. زاویه سرو موتور توسط سیگنال PWM مشخص می‌شود. پایه مربوط به PWM در این آموزش پایه A0 موجود بر روی برد BluePill است. ترتیب پایه های سرو موتور برای راه اندازی سرو با STM32 به صورت زیر است.

  • سیم نارنجی: پایه سیگنال PWM است که به پایه های PWM برد های آردوینو و ESP8266 متصل می‌شود.
  • سیم قرمز: پایه VCC پایه تغذیه است و به ۵ ولت متصل می‌شود. بسته به نوع انتخاب سرو موتور ولتاژ کاری متفاوت است.
  • سیم قهوه ای: پایه GND است و به پایه GND برد آردوینو و ESP8266 متصل می‌شود.

شماتیک راه اندازی سرو با STM32 - دیجی اسپارک

 


پیکربندی میکروکنترلر در نرم‌افزار CubeMX


پس از ساخت پروژه جدید در نرم‌افزار STM32CubeMX و انتخاب میکروکنترلر STM32F103C8T6 بایستی بخش SYS و RCC را تنظیم کنید. در صورتی که با تنظیمات مربوط به این بخش ها آشنایی کافی ندارید. ابتدا بخش آول آموزش میکروکنترلر های STM32 را مطالعه کنید. سپس مطالعه این آموزش را ادامه دهید. همانطور که گفته شد برای راه اندازی سرو موتور بایستی از PWM استفاده شود. بنابراین پس از انجام تنظیمات اولیه، از نوار سمت چپ تایمر ۲ را انتخاب کنید. بخش Clock Source را بر روی گزینه Internal Clock تنظیم کنید. سپس بخش Channel1 را بر روی گزینه PWM Generation CH1 تنظیم کنید. برای راه اندازی سرو موتور بایستی فرکانس تایمر را بر روی ۵۰ هرتز تنظیم کنیم. از این رو در بخش Parameter Setting گزینه ی Prescale را بر روی ۸۷۹ و گزینه Counter Period را بر روی ۹۹۹ تنظیم کنید.

آموزش راه اندازی سرو با STM32 در نرم افزار STM32Cube - دیجی اسپارک

 

سپس بایستی وارد بخش Clock Configuration شده و فرکانس بخش های HCLK و APB1 Timer Clocks را بر روی ۴۴ مگاهرتز قرار دهید. با محاسبه عدد های تنظیم شده طبق فرمول مربوط به تایمر به عدد ۵۰ هرتز که بالا تر گفته شد خواهیم رسید.

تنظیمات نرم افزار STM32 برای راه اندازی سرو با STM32 - دیجی اسپارک

 

در آخر در قسمت 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 را فشار دهید. پس از آن اگر اتصالات را به درستی  انجام داده باشید. سرو موتور بایستی شروع به حرکت کند.

آموزش راه اندازی سرو با STM32 - دیجی اسپارک

 


لوازم مورد نیاز


 


جمع بندی


در آموزش راه اندازی سرو با STM32 ایتدا با سرو موتور و نحوه کار آن آشنا شدیم. سپس مفهوم PWM توضیح داده شد. در ادامه اتصالات مورد نیاز برای راه اندازی سرو موتور MG90S معرفی شد. پس از نحوه پیکربندی و انجام تظیمات مورد نیاز PWM برای میکروکنترلر STM32 در نرم‌افزار STM32CubeMX توضیح داده شد. در اخر ۲ نمونه کد برای کار با سرو موتور قرار داده شده است. به عنوان نکته آخر دقت داشته باشید که در این آموزش صرفا برای تست سرو موتور مستقیما به میکروکنترلر متصل شده است. برای استفاده مداوم از مدار بایستی سرو موتور را با استفاده از درایور مناسب به میکروکنترلر متصل کنید.

 

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

 

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

علی زاهدی

برنامه نویس و طراح سیستم های مبتنی بر میکروکنترلر

دانسته هایتان را مانند یک ساعت مچی در دست کنید، نه صرفا به این خاطر که نشان دهید آن را دارید. بلکه به این خاطر که اگر کسی از شما ساعت را پرسید، برایش بگویید.
لرد چسترفیلد

تبادل نظر و رفع عیب با ثبت دیدگاه

۸ دیدگاه

  • سلام مهندس وقت بخیر .
    من برد stm32f103 دارم میخوام با پورت usb پروگرمش کنم . اما هر کاری کردم نرم افزار flash loader نمیشناستش . میشه راهنمایی کنید مشکلم حل بشه .

  • سلام وقت بخیر.
    من طبق آموزش برد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 یا روش دیگری کنترل می‌شود.

      شاد و پیروز باشید.