استپر موتورها (Stepper Motors) قلب تپنده سیستمهای موقعیتیابی دقیق، دستگاههای CNC، پرینترهای سهبعدی و بازوهای رباتیک هستند. برخلاف موتورهای DC معمولی که با اعمال ولتاژ بیوقفه میچرخند، استپر موتورها به صورت «گسسته» و پلهپله حرکت میکنند. این ویژگی به ما اجازه میدهد بدون نیاز به سنسورهای فیدبک (مانند انکودر)، زاویه و موقعیت دقیق محور را کنترل کنیم.
اما یک میکروکنترلر چگونه با این موتورها ارتباط برقرار میکند؟ در این مقاله، مسیر تکامل کنترل استپر موتورها را از پایهایترین مفاهیم سختافزاری تا پیشرفتهترین متدهای برنامهنویسی بررسی میکنیم.
۱. کالبدشکافی درایور استپر موتور (Hardware Interface)
میکروکنترلرها به تنهایی توانایی تامین جریان بالای مورد نیاز سیمپیچهای موتور را ندارند. به همین دلیل، قطعهای به نام درایور (Driver) در نقش یک واسط و تقویتکننده قدرتمند ظاهر میشود. درایورهای صنعتی (مانند TB6600 یا DM542) و درایورهای ماژولار (مانند A4988)، همگی از یک استاندارد ارتباطی سهپین برای دریافت فرمان از میکروکنترلر استفاده میکنند:
پین پالس یا گام (PUL / STEP)
این پین مهمترین مسیر ارتباطی است. درایور با دریافت هر لبهی بالا رونده (تغییر ولتاژ از صفر به ۵ یا ۳.۳ ولت) روی این پین، موتور را دقیقاً یک گام (Step) به جلو یا عقب میراند.
کنترل موقعیت (زاویه): با شمردن تعداد پالسهای ارسال شده کنترل میشود.
کنترل سرعت: با تغییر فرکانس پالسها (فاصله زمانی بین هر پالس) کنترل میشود. هرچه پالسها سریعتر ارسال شوند، موتور تندتر میچرخد.
پین جهت (DIR / DIRECTION)
این پین جهت چرخش محور موتور را تعیین میکند.
اگر این پین در وضعیت منطقی
High(یک) قرار گیرد، موتور در جهت عقربههای ساعت (CW) میچرخد.اگر در وضعیت منطقی
Low(صفر) قرار گیرد، چرخش در خلاف جهت عقربههای ساعت (CCW) خواهد بود.
پین فعالساز (ENA / ENABLE)
این پین برای روشن و خاموش کردن بخش قدرت درایور استفاده میشود. نکته بسیار مهم در اکثر درایورهای صنعتی این است که منطق این پین به صورت معکوس (Active Low) است:
هنگامی که پین آزاد باشد یا روی
Lowتنظیم شود، درایور فعال است و شفت موتور قفل میشود (Holding Torque).
هنگامی که پین روی
Highتنظیم شود، جریان سیمپیچها قطع شده و محور موتور آزادانه با دست میچرخد.
۲. مکانیک حرکت: زاویه و سرعت چگونه محاسبه میشوند؟
استپر موتورهای استاندارد معمولاً دارای زاویه گام ۱.۸ درجه هستند. این یعنی برای یک دور چرخش کامل (۳۶۰ درجه)، موتور به ۲۰۰ پالس نیاز دارد 200 = 360/1.8
مفهوم میکرواستپ (Microstepping):
برای حرکت نرمتر و کاهش لرزش، درایورها قابلیتی به نام میکرواستپ دارند. با تنظیم دیپسوئیچهای روی درایور، میتوانید هر گام فیزیکی را به گامهای کوچکتر (مثلاً ۱/۸، ۱/۱۶ یا ۱/۳۲) تقسیم کنید. اگر درایور روی حالت ۱/۸ تنظیم شود، برای یک دور چرخش کامل به ۱۶۰۰ پالس نیاز خواهید داشت 1600 = 200 * 8
مثال کنترل زاویه: اگر موتور روی میکرواستپ ۱/۴ (۸۰۰ پالس بر دور) تنظیم شده باشد و بخواهید محور دقیقاً ۹۰ درجه بچرخد، میکروکنترلر باید دقیقاً ۲۰۰ پالس به پین PUL ارسال کند.
مثال کنترل سرعت: اگر بخواهید این موتور با سرعت ۲ دور بر ثانیه بچرخد، باید در هر ثانیه ۱۶۰۰ پالس ارسال کنید (فرکانس خروجی پین PUL باید ۱۶۰۰ هرتز باشد).
۳. مسیر تکامل برنامهنویسی استپر موتور در میکروکنترلرها
برای تولید پالس و ارسال آن به درایور، برنامهنویسان سیستمهای نهفته (Embedded) در طول زمان روشهای مختلفی را توسعه دادهاند. هر روش مزایا و معایب خود را دارد:
نسل اول: روش تاخیر نرمافزاری (Blocking Delay)
سادهترین روش برای راهاندازی موتور، صفر و یک کردن متوالی پین PUL با استفاده از توابع تاخیر (مانند HAL_Delay) است.

مزایا: پیادهسازی بسیار آسان.
معایب: این روش یک فاجعه برای سیستمهای بلادرنگ (Real-Time) است. در تمام مدتی که موتور در حال چرخش است، پردازنده (CPU) در حلقهی تاخیر قفل (Block) میشود و میکروکنترلر نمیتواند هیچ کار دیگری (مثل خواندن سنسور، ارتباط سریال یا اجرای الگوریتم) انجام دهد. سرعت تولید پالس نیز ناپایدار و پر از جیتر (Jitter) است.
نسل دوم: استفاده از سختافزار PWM (بدون وقفه)
برای آزادسازی CPU، برنامهنویسان به سراغ تایمرهای سختافزاری و تولید موج PWM رفتند. تایمر بدون دخالت پردازنده، موج مربعی دقیقی تولید میکند.
مزایا: فرکانس بسیار دقیق، لرزش صفر، و عدم درگیری CPU.
معایب (یک چالش بزرگ): سختافزار PWM بیوقفه پالس تولید میکند. تایمر نمیداند چه زمانی باید متوقف شود! با این روش، شما سرعت را کنترل میکنید اما کنترل موقعیت (تعداد گامها) را از دست میدهید.
نسل سوم: بلوغ کامل با روش PWM + Interrupt (راهکار نهایی صنعتی)
این روش ترکیبی از بهترین ویژگیهای سختافزار و نرمافزار است و همان معماری قدرتمندی است که در کتابخانههای پیشرفته (مانند کتابخانه ماژولار STM32) پیادهسازی میشود.
در این روش:
تایمر سختافزاری: فرکانس پالسها را با دقت بینظیری تولید میکند و مستقیماً به درایور میفرستد (کنترل سرعت بدون درگیری CPU).
نتیجه این معماری چیست؟ میکروکنترلر فرمان «۱۶۰۰ گام با فرکانس ۱۰۰۰ هرتز حرکت کن» را صادر میکند و سپس کاملاً آزاد میشود تا به سایر وظایف بپردازد. تایمر به صورت مستقل پالسها را تولید کرده و دقیقاً روی گام ۱۶۰۰ ترمز میکند. این دقیقاً همان استانداردی است که به شما اجازه میدهد چندین موتور را همزمان با یک میکروکنترلر ساده همگامسازی کنید.
لایه وقفه (Interrupt Service Routine): با هر پالسی که سختافزار تولید میکند، یک رویداد وقفه (Update Event) در پسزمینه رخ میدهد.
مدیریت موقعیت: یک متغیر در نرمافزار به سرعت تعداد پالسهای صادر شده را میشمارد. به محض رسیدن به تعداد گام هدف، وقفه دستور خاموش شدن آنی تایمر را صادر میکند.
۱. راهنمای جامع تنظیمات تایمر در CubeMX
برای اینکه کتابخانه عملکرد صحیحی داشته باشد، تنظیمات تایمر در نرمافزار STM32CubeMX باید به دقت انجام شود. در این مثال ما از TIM16 و کانال مکمل آن (CH1N) استفاده میکنیم:
انتخاب مد کاری (Mode):
در بخش Timers، روی TIM16 کلیک کنید.
گزینه Activation را فعال کنید.
کانال 1 (Channel 1) را روی مد PWM Generation CH1N تنظیم کنید (این کار سیگنال را به پین مکمل، معمولاً
PB6هدایت میکند).
تنظیمات پارامترها (Configuration -> Parameter Settings):
Prescaler (PSC): مقدار را روی
0بگذارید (توسط کتابخانه به صورت پویا محاسبه میشود).Counter Mode: روی
Upتنظیم شود.Period (ARR): مقدار را روی
0بگذارید (توسط تابع تنظیم سرعت تغییر میکند).Auto-reload Preload: گزینهی Enable را انتخاب کنید. (این بخش بسیار حیاتی است؛ زیرا مانع از بروز نویز و پالسهای ناقص در هنگام تغییر آنی سرعت موتور میشود).
تنظیمات کانال PWM (PWM Generation CH1N):
PWM Mode: روی
PWM mode 1قرار گیرد.Pulse (CCR1): مقدار اولیه
0باشد.CH1N Polarity: روی
Highتنظیم شود.
تنظیمات وقفه (NVIC Settings):
تیک گزینهی TIM16 global interrupt را بزنید تا وقفه تایمر Enable شود.
تنظیمات پین خروجی (GPIO Configuration):
پین مربوطه (مثلاً
PB6) را روی مد Alternate Function Push-Pull با سرعت High تنظیم کنید.گزینه Pull-up/Pull-down را حتماً روی Pull-down بگذارید تا در لحظه ریست شدن میکرو، پین به زمین متصل بماند و موتور جریان اضافه نکشد.
۲. فایل هدر کتابخانه (stepper.h)
این فایل ساختار دادهای (Structure) موتور را تعریف میکند. با این معماری، شما میتوانید بدون کپی کردن کد، چندین استپر موتور را تنها با تعریف چند متغیر مستقل راهاندازی کنید.
۳. فایل سورس کتابخانه (stepper.c)
در این بخش، کدهای اصلی پیادهسازی شدهاند. محاسبات فرکانس کاملاً داینامیک است تا محدوده فرکانسی وسیعی را پوشش دهد. همچنین هماهنگی کامل با لایه متغیرهای داخلی HAL حفظ شده است.
۴. نحوه ادغام کاملاً استاندارد کتابخانه در پروژه
بزرگترین مزیت این روش این است که شما فایل stm32f0xx_it.c را دستکاری نمیکنید. لایه اصلی مدیریت وقفهها در اختیار HAL باقی میماند و ما تنها نتایج رویداد را در قالب استاندارد CallBack در فایل main.c دریافت میکنیم.
از اینکه در این آموزش با ما همراه بودید سپاسگزاریم!
با سایر آموزش های اصفهان درایو همراه باشید!










