فهرست مطالب:

سرو موتور کنترل با STM32F4 ARM MCU: 4 مرحله
سرو موتور کنترل با STM32F4 ARM MCU: 4 مرحله

تصویری: سرو موتور کنترل با STM32F4 ARM MCU: 4 مرحله

تصویری: سرو موتور کنترل با STM32F4 ARM MCU: 4 مرحله
تصویری: درس 86: کنترل موقعیت سروو موتور با استفاده از پتانسیومتر (انگلیسی) 2024, جولای
Anonim
سرو موتور کنترل با STM32F4 ARM MCU
سرو موتور کنترل با STM32F4 ARM MCU
سرو موتور کنترل با STM32F4 ARM MCU
سرو موتور کنترل با STM32F4 ARM MCU

سلام دوباره دوستان:) بنابراین ، در این پروژه ما یک موتور سروو با STM32F4 ARM MCU را کنترل می کنیم. در مورد من ، من از صفحه کشف استفاده خواهم کرد ، اما اگر اصل مشکل را درک کنید ، می توانید آن را برای هر MCU اعمال کنید. بنابراین. بیایید شروع کنیم:)

مرحله 1: سخت افزار و نرم افزار مورد نیاز

از نظر سخت افزاری به موارد زیر نیاز داریم:

  • MCU که در مورد من برد کشف STM32f4 است
  • یک سروو موتور معمولی ، مانند SG90 یا هر موتور دیگر

از نظر نرم افزاری به موارد زیر نیاز داریم:

  • STM32CubeMX
  • Keil uVision

اگر همه این موارد را دارید ، به مرحله بعدی بروید:)

مرحله 2: پیکربندی STM32CubeMX

همانطور که می دانید ، برای کنترل موتور سروو ما نیاز به سیگنال PWM داریم. شرایط مورد نیاز از نظر سیگنال PWM به شرح زیر است:

  • دوره PWM باید 20 میلی ثانیه باشد
  • در زمان باید بین 0.5 میلی ثانیه تا 2.5 میلی ثانیه باشد. هنگامی که به موقع 0.5 میلی ثانیه باشد ، سروو 0 درجه ، 1.5 میلی ثانیه برای 90 درجه و 2.5 میلی ثانیه برای 180 درجه می چرخد.

بنابراین ، ما باید PWM را پیکربندی کنیم و برای این منظور از Timer1 استفاده می کنیم.

  • ابتدا TIM1 را از قسمت Timers انتخاب کنید. این مرحله
  • سپس ، از بخش حالت

    1. ساعت داخلی را انتخاب کنید این مرحله
    2. PWM Generation CH1 این مرحله
  • سپس ، از بخش پیکربندی

    1. در این مرحله Prescaler را روی 160 تنظیم کنید
    2. در این مرحله Counter Period را روی 2000 تنظیم کنید
    3. در این مرحله Pulse را روی 50 تنظیم کنید
  • علاوه بر این ، از تنظیمات ساعت ، ساعت های APB1 Timer را روی 16 مگاهرتز تنظیم کنید. این مرحله

حالا بیایید کمی در مورد این مرحله صحبت کنیم:

فرکانس ساعت APB1 Timer ما 16 مگاهرتز است. بنابراین ، به این معنی است که برای بدست آوردن 1 ثانیه به 16،000 ، 000 کنه نیاز است. با این حال ، ما پیش فروش خود را روی 160 تنظیم کردیم. بدین معنی که ما فرکانس خود را بر این عدد تقسیم می کنیم و تعداد کنه ها را به 100000 کاهش می دهیم. بنابراین ، برای 1 ثانیه به 100،000 کنه نیاز داریم. با این حال ، ما همانطور که قبلاً بیان کردیم به 20 میلی ثانیه دوره PWM نیاز داریم. بنابراین ، بر اساس ریاضیات ساده ، ما به 2000 تیک برای 20mS نیاز داریم. بنابراین ، با تنظیم Counter Period روی 2000 ، دوره سیگنال PWM را که 20mS است تعیین می کنیم. در حال حاضر ما باید شماره تیک را برای زمانهای دریافت از 0.5mS تا 2.5mS تعیین کنیم. ما می توانیم این معادله را از ریاضیات ساده بدست آوریم و این است:

On_Time = (Tick_Number / 100). به خاطر داشته باشید که این زمان روشن است که زاویه سروو موتور را تغییر می دهد. بنابراین ، در زیر تصویر ، این مرحله را خلاصه می کنم. اگر سوالی داشتید در نظرات بنویسید و من در اسرع وقت پاسخ خواهم داد.

تصویر محاسبات

بعد از انجام همه اینها کد تولید کنید:)

مرحله 3: کدگذاری Keil UVision

بنابراین ، بیایید ابتدا تعیین کنیم که می خواهیم چه کار کنیم؟ ما می خواهیم یک تابع بنویسیم که درجه را بپذیرد و آن را به سروو بنویسیم. بنابراین ، چگونه این کار را خواهیم کرد؟ همانطور که قبلاً گفتیم ، برای تغییر زاویه ، باید زمان را تغییر دهیم. زوایای ما بین [0 ، 180] و تعداد کنه های ما که به موقع تعیین می شود بین [50 ، 250] تغییر می کند. بنابراین ، ما به یک تابع نقشه برداری نیاز داریم که زاویه داده شده را به محدوده تعداد تیک ها ترسیم کند. به عنوان مثال ، برای کنه 0 درجه 50 ، برای کنه 180 درجه 250 و غیره … بنابراین بیایید تابع نقشه برداری خود را بنویسیم:

int int (int st1، int fn1، int st2، int fn2، int value) {return (1.0*(value-st1))/((fn1-st1)*1.0)*(fn2-st2)+st2؛ }

این تابع نقشه برداری ما است. آیا می دانید چگونه مشتق شده است؟ سپس آن را بخوانید. بنابراین ، محدوده ها و مقداری را که می خواهیم ترسیم کنیم ، در نظر می گیریم.

حال ، بیایید یک تابع بنویسیم که زاویه را بپذیرد و آن را در محدوده تیک ها ترسیم کند:

void servo_write (int angle) {htim1. Instance-> CCR1 = map (0، 180، 50، 250، angle)؛ }

همانطور که مشاهده می کنید ، این کد زاویه را می پذیرد و آن را در محدوده تعداد تیک ها ترسیم می کند. سپس ، تعداد کنه ها به ثبت CCR1 داده می شود که زاویه به موقع و غیره را کنترل می کند.

با این حال ، برای اینکه همه اینها کار کنند ، ابتدا pwm را شروع می کنیم که فقط با یک خط کد قابل انجام است:

HAL_TIM_PWM_Start (& htim1 ، TIM_CHANNEL_1) ؛

بنابراین ، ما یک تابع داریم که زاویه را می پذیرد و آن را به سروو می نویسد. بیایید آن را آزمایش کرده و تابع رفت و برگشت خود را بنویسیم که بسیار آسان است:

void servo_sweep (void) {for (int i = 0؛ i <= 180؛ i ++) {servo_write (i)؛ HAL_ تاخیر (10) ؛ } برای (int i = 180؛ i> = 0؛ i--) {servo_write (i)؛ HAL_ تاخیر (10) ؛ }}

بنابراین ، فقط تا 180 و سپس تا 0 شمارش کنید و این مقادیر را در سرو بنویسید:) بنابراین ، بیایید نتیجه را ببینیم!

مرحله 4: نتیجه:)

بنابراین ، این پایان است. اگر سوالی دارید لطفا بپرسید. خوشحال می شوم به آنها پاسخ دهم. خیلی ممنون که خواندید و امیدوارم در پروژه بعدی شما را ببینم:)

توصیه شده: