چنانچه قصد ساخت یک پرینتر سه بعدی یا یک دستگاه CNC را دارید، به کنترل تعدادی استپر موتور نیاز خواهید داشت. کنترل تمام آنها به پردازش زیادی نیاز دارد و با داشتن یک آردوینو امکان کنترل چیز دیگری جز موتورها را نخواهید داشت، مگر اینکه از ماژول درایور DRV8825 که یک درایور ویژه برای استپر موتورها است، استفاده نمایید. با کمک این درایور میتوانید سرعت و جهت چرخش یک استپر موتور دوقطبی مانند استپر موتور NEMA17 را تنها با دو پایه کنترل کنید. چقدر عالی!
استپر موتورها چگونه کار میکنند؟
استپر موتورها برای دوران یک پله در هر زمان، از چرخدندهای با 32 دندانه و 4 آهنربای الکتریکی استفاده میکنند. ارسال هر پالس HIGH، به سیمپیچ انرژی میدهد. خاصیت مغناطیسی ایجاد شده توسط سیم پیچ نیز، نزدیکترین دندانهی چرخدنده را جذب میکند و در نهایت موتور را یک پله به حرکت درمیآورد. نحوه عملکرد استپر موتور را میتوانید در انیمیشن زیر مشاهده کنید:
نحوهی پالس دادن شما به این سیمپیچها، بهشدت بر رفتار موتور تاثیر میگذارد:
- توالی پالسها، جهت دوران موتور را تعیین میکند.
- فرکانس پالس، سرعت موتور را تعیین میکند.
- تعداد پالسها، میزان دوران موتور را تعیین میکند.
تراشهی درایور استپر موتور DRV8825
در قلب ماژول درایور DRV8825، یک تراشهی درایور میکرواستپ تحت عنوان DRV8825. قرار دارد. این تراشهی بسیار کوچک (0.6×0.8 اینچ) ساخت شرکت Texas Instruments میباشد.
درایور استپر موتور DRV8825 با حداکثر ولتاژ خروجی 45 ولت، امکان کنترل یک استپر موتور دوقطبی با حداکثر جریان خروجی 2.2 آمپر به ازای هر سیمپیچ را فراهم میسازد.
این درایور دارای دو پایهی کنترلی است، یک پایه برای کنترل سرعت و دیگری برای کنترل جهت چرخش موتور. علاوهبراین، این درایور با 6 رزولوشن مختلف کار میکند: یک پله یا گام کامل، یک دوم گام، یک چهارم گام، یک هشتم گام، یک شانزدهم گام و یک سیام گام.
پایههای ماژول درایور DRV8825
این تراشه برای ارتباط با دنیای بیرون 16 پایه دارد که در تصویر زیر نشان داده شدهاست:
پایههای تغذیه
پایههای VMOT و GND MO، تغذیهی موتور را تأمین میکنند و میتوان آنها را به ولتاژهای 8.2 تا 45 ولت متصل نمود. طبق دیتاشیت، لازم است یک خازن دیکوپلینگ با قابلیت تحمل 4 آمپر به پایههای تغذیه متصل شود.
از آنجایی که درایورDRV8825 ، ولتاژ تغذیه خود را از رگولاتور داخلی 3.3 ولت تأمین میکند، نیازی به هیچ پایهی تغذیهی منطقی ندارد. با این حال باید پایهی GND LOGIC را به پایهی زمین میکروکنترلر خود متصل کنید.
هشدار:
بر روی برد این ماژول یک خازن سرامیکی قرار دارد که تراشهی درایور را در برابر افزایش ولتاژ آسیبپذیر میسازد. گاهی این افزایش ولتاژ به بیش از 45 ولت (ماکزیمم ولتاژ نامی DRV8825) میرسد که سبب آسیب جدی به برد و حتی موتور خواهد شد.
یک راه برای محافظت از درایور در برابر افزایش ولتاژهای بیش از حد، افزودن یک خازن الکترولیتی100 میکروفاراد (یا حداقل 47 میکروفاراد) به دو سر پایههای تغذیهی موتور است.
پایههای انتخاب میکرواستپ
درایور DRV8825 با تقسیم هر گام کامل به چندین گام بسیار کوچک، میکرواستپینگ را میسر میسازد. در واقع این امر با تغییر سطح جریان سیمپیچها انجام میشود.
برای مثال، با انتخاب درایور NEMA17 با زاویهی چرخش 1.8 درجه که به ازای یک دور چرخش کامل 200 استپ (گام) را طی میکند، در مد یک چهارم گام به ازای یک دور چرخش کامل 800 میکرواستپ را طی میکند.
پایههای M0, M1 & M2 در درایور DRV8825 ، سه پایهی ورودی انتخاب سایز میکرواستپ هستند. با تنظیم سطح ولتاژ منطقی این سه پایه میتوانید یکی از 6 رزولوشن زیر را برای موتور تنظیم کنید.
M0 | M1 | M2 | Microstep Resolution |
Low | Low | Low | Full step |
High | Low | Low | Half step |
Low | High | Low | 1/4 step |
High | High | Low | 1/8 step |
Low | Low | High | 1/16 step |
High | Low | High | 1/32 step |
Low | High | High | 1/32 step |
High | High | High | 1/32 step |
سه پایهی انتخاب میکرواستپ با مقاومتهای داخلی Pull-down شدهاند؛ بنابراین اگر آنها را بدون اتصال باقی بگذارید، موتور در مد گام کامل عمل خواهد کرد.
پایههای کنترلی ورودی
این درایور دارای دو پایه کنترلی ورودی STEP و DIR است.
پایهی ورودی STEP ، میکرواستپهای موتور را کنترل میکند. به ازای هر پالس HIGH که به این پایه ارسال میشود، موتور را بر اساس تعداد میکرواستپهایی که توسط پایههای انتخاب میکرواستپ تنظیم شدهاست، حرکت میدهد. ارسال هرچه سریعتر پالس ها، سبب چرخش سریعتر موتور خواهدشد.
پایهی ورودی DIR ، جهت چرخش موتور را کنترل میکند. با اعمال ولتاژ HIGH به این پایه، موتور به صورت ساعتگرد و با اعمال ولتاژ LOW به این پایه، موتور به صورت پادساعتگرد خواهد چرخید.
اگر میخواهید موتور تنها در یک جهت بچرخد، کافیاست این پایه را مستقیماً به VCC یا GND متصل کنید.
پایههای کنترل وضعیت توان
تراشهی DRV8825 ، سه ورودی مختلف برای کنترل وضعیت توان دارد: EN, RST, SLP.
EN: این پایهی ورودی، active low است؛ یعنی یا اعمال ولتاژ LOW به این پایه، درایور DRV8825 فعال میشود. به صورت پیش فرض این پایه در وضعیت LOW قرار دارد؛ بنابراین درایور همیشه فعال است مگر آنکه آن را در وضعیت HIGH قرار دهید.
SLP: این پایهی ورودی، active low است؛ یعنی یا اعمال ولتاژ LOW به این پایه، درایور در مد Sleep قرار میگیرد و مصرف توان آن به حداقل میرسد. زمانهایی که موتور بلااستفاده است به منظور صرفهجویی در مصرف توان میتوانید این پایه را به این صورت مقداردهی کنید.
RST: این پایهی ورودی، active low است؛ یعنی یا اعمال ولتاژ LOW به این پایه، تمام ورودیهای پایهی STEP نادیده گرفته میشوند، تا زمانی که ولتاژ HIGH به این پایه اعمال شود. همچنین این پایه در وضعیت از پیش تعریف شده Home ، میتواند درایور را ریست کند. وضعیت Home وضعیت اولیهای است که موتور شروع بهکار میکند و با توجه به انتخاب میکرواستپ میتواند متفاوت باشد.
پایه تشخیص خطا ماژول درایور DRV8825
این درایور یک خروجی FAULT دارد و هر زمان که ترازیستورهای FE پل H به منظور محافظت در برابر افزایش جریان یا حرارت بیش از حد غیرفعال میشوند، وضعیت این خروجی به LOW تغییر خواهد کرد.
در عمل پایه FAULT به پایه SLEEP متصل میشود و هرزمان که وضعیت پایهی تشخیص خطا LOW میشود، کل تراشه غیرفعال شده و غیر فعال باقی میماند تا زمانی که ریست شود یا ولتاژ تغذیه موتور (VMOT) قطع و وصل شود.
پایههای خروجی ماژول درایور DRV8825
درایور موتور DRV8825 دارای 4 پایهی خروجی 1B, 1A, 2A , 2B میباشد. شما میتوانید هر استپر موتور دوقطبی با ولتاژ 8.2 الی 45 ولت را به این پایهها متصل نمایید. هر یک از پایههای خروجی قادر به تأمین جریان حداکثر 2.2 آمپر برای موتور هستند. با این وجود، مقدار جریان تأمین شده برای موتور، به منبع تغذیهی سیستم، سیستم خنککننده و تنظیم محدودکنندهی جریان بستگی دارد.
سیستم خنککننده(هیتسینک) ماژول درایور DRV8825
اتلاف توان بیش از حد آیسی درایور DRV8825، منجر به افزایش دما میشود و چنانچه از میزان دمای قابل تحمل آیسی فراتر رود، منجر به آسیب دیدن آیسی خواهد شد.
اگرچه حداکثر جریان قابل تحمل آیسی درایور DRV882 به ازای هر سیمپیچ 2.2 آمپر است، اما این تراشه تنها میتواند 1.5 آمپر را بدون اینکه بیش از حد داغ شود، برای هر سیمپیج تأمین کند. برای عبور جریان بیش از 1.5 آمپر به ازای هر سیمپیچ، استفاده از یک هیتسینک یا سایر روشهای خنکسازی ضروری است.
معمولاً همراه با ماژول درایور DRV8825، یک هیتسینک هم هست که توصیه میشود قبل از استفاده از درایور آن را نصب کنید.
محدود کنندهی جریان
پیش از استفاده از موتور، باید حداکثر جریان عبوری از سیمپیچهای استپر موتور محدود شود تا مانع از افزایش جریان بیش از حد موتور گردد.
این امر توسط پتانسیومتر کوچکی که بر روی ماژول درایور DRV8825 قرار گرفته است، انجام میشود. شما باید جریان محدود کننده را بر روی حداقل مقدار جریان قابل تحمل موتور یا کمتر تنظیم کنید. بدین منظور دو روش وجود دارد:
روش اول:
در این روش جریان محدود کننده، با اندازهگیری ولتاژ مرجع (Vref) از پایه “ref” انجام میشود.
- دیتاشیت استپر موتور مورد نظر خود را مطالعه نموده و جریان قابل تحمل آن را یادداشت نمایید. برای مثال، جریان قابل تحمل استپر موتور NEMA 17 با 200 پله در هر دور چرخش، 350 میلیآمپر به ازای 12 ولت است.
- درایور را در مد گام کامل قرار دهید. بدین منظور باید سه پایهی انتخاب میکرواستپ را بدون اتصال باقی بگذارید.
- موتور را در وضعیت ثابتی قرار دهید. بدین منظور هیچ پالسی نباید به پایهی ورودی STEP اعمال شود.
- درحالی که پتانسیومتر را تنظیم میکنید، ولتاژ آن (Vref) را اندازهگیری نمایید.
- جریان محدودکننده را از رابطهی زیر محاسبه کنید:
جریان محدود کننده = 2 Vref x
Current Limit = Vref x 2
برای مثال، چنانچه جریان قابل تحمل استپر موتور 350 میلیآمپر باشد، باید ولتاژ مرجع را بر روی 0.175 ولت تنظیم نمایید.
نکته:
یک راه آسان برای تنظیم پتانسیومتر بر روی مقدار موردنظر این است که از گیره سوسماری استفاده کنید. به طوری که یک سر گیره را به پیچگوشتی وصل کرده و سر دیگر ان را به مولتیمتر خود متصل کنید. بدین ترتیب میتوانید همزمان با چرخاندن پتانسیومتر، ولتاژ را با مولتیمتر اندازه بگیرید.
روش دوم:
در این روش جریان محدود کننده با اندازهگیری جریان عبوری از سیمپیچ انجام میشود.
- دیتاشیت استپر موتور مورد نظر خود را مطالعه نموده و جریان قابل تحمل آن را یادداشت نمایید. برای مثال، جریان قابل تحمل استپر موتور NEMA 17 با 200 پله در هر دور چرخش، 350 میلی آمپر به ازای 12 ولت است.
- درایور را در مد گام کامل قرار دهید. بدین منظور باید سه پایهی انتخاب میکرواستپ را بدون اتصال باقی بگذارید.
- موتور را در وضعیت ثابتی قرار دهید. بدین منظور هیچ پالسی نباید به پایهی ورودی STEP اعمال شود.
- یک آمپرمتر را با یکی از سیمپیچهای استپر موتور خود سری و جریان عبوری از آن را اندازهگیری کنید.
- با استفاده از یک پیچگوشتی، پتانسیومتر را چرخانده و جریان محدود کننده را بر روی مقدار جریان قابل تحمل استپر موتور تنظیم کنید.
نحوه اتصال ماژول درایور DRV8825 به آردوینو UNO
با داشتن اطلاعات کامل درباره این درایور ، اکنون آن را به آردوینو متصل میکنیم.
اتصالات به سادگی انجام میشود. پایه ریست را به پایه SLP/SLEEP و سپس هر دو را به پایه 5 ولت آردوینو وصل کنید تا درایور فعال شود.
پایه زمین ماژول را به زمین آردوینو متصل کنید. سپس پایههای ورودی DIR و STEPرا به ترتیب به پایههای خروجی دیجیتال 2 و 3 آردوینو وصل نمایید.
در این مرحله، استپر موتور را به پایههای A1, A2, B1, B2 متصل کنید.
هشدار:
اتصال و جدا کردن استپر موتور درحالی که درایور به تغذیه متصل است، به درایور آسیب میرساند.
توجه داشته باشید که پایههای انتخاب میکرواستپ را بدون اتصال باقی بگذارید تا موتور در مد گام کامل عمل کند.
در نهایت، پایه تغذیه موتور را به پایههای VMOTو GND MOT از ماژول درایور وصل کنید. به یاد داشته باشید که یک خازن الکترولیتی دیکوپلینگ 100 میکروفاراد نیز بین دو پایهی تغذیهی موتور قرار دهید.
کد آردوینو- مثال مقدماتی
برنامهی زیر درک کاملی راجع به نحوه کنترل سرعت و جهت یک استپر موتور دو قطبی با استفاده از ماژول درایور DRV8825 به شما خواهد داد. که میتوانید از ان به عنوان برنامهی پایه در اکثر پروژهها و آزمایشات عملی استفاده نمایید.
// Define pin connections & motor's steps per revolution
const int dirPin = 2;
const int stepPin = 3;
const int stepsPerRevolution = 200;
void setup()
{
// Declare pins as Outputs
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
}
void loop()
{
// Set motor direction clockwise
digitalWrite(dirPin, HIGH);
// Spin motor slowly
for(int x = 0; x < stepsPerRevolution; x++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin, LOW);
delayMicroseconds(2000);
}
delay(1000); // Wait a second
// Set motor direction counterclockwise
digitalWrite(dirPin, LOW);
// Spin motor quickly
for(int x = 0; x < stepsPerRevolution; x++)
{
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
}
delay(1000); // Wait a second
}
توضیحات کد:
برنامه با معرفی پایههای آردوینو که به ترتیب به پایههایSTEP و DIRماژول درایور DRV8825 متصل شدهاند، آغاز میشود.
سپس متغیر stepsPerRevolution تعریف و با توجه به مشخصات استپر موتور موردنظر مقداردهی میگردد.
const int dirPin = 2;
const int stepPin = 3;
const int stepsPerRevolution = 200;
در تابع setup ، تمام پایههای کنترلی موتور به عنوان یک خروجی دیجیتال معرفی میشوند.
inMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
در تابع loop، چرخش موتور به آرامی و به صورت ساعتگرد انجام میشود و سپس در طی مدت زمان یک ثانیه به سرعت جهت چرخش موتور تغییر و به صورت پادساعتگرد خواهد چرخید.
کنترل جهت چرخش: به منظور کنترل جهت چرخش یک موتور، پایه DIR را در وضعیت HIGH یا LOW قرار میدهیم. ورودی HIGH موتور را به صورت ساعتگرد و ورودی LOW موتور را به صورت پادساعتگرد خواهد چرخاند.
digitalWrite(dirPin, HIGH);
کنترل سرعت: سرعت یک موتور با فرکانس پالسهای ارسالی به پایه STEP تعیین میشود. پالسهای بیشتر موتور را با سرعت بیشتری میچرخاند. پالس چیزی نیست جز HIGH کردن خروجی، انتظار به اندازهی یک بیت و سپسLOW کردن خروجی و انتظار مجدد به اندازهی یک بیت. با تغییر تأخیر بین دو پالس، فرکانس پالسها و در نتیجه سرعت موتور تغییر میکند.
for(int x = 0; x < stepsPerRevolution; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin, LOW);
delayMicroseconds(1000);
}
کد آردوینو- استفاده از کتابخانه AccelStepper
در کاربردهای سادهی تک موتوره، کنترل استپر موتور بدون یک کتابخانه ساده است. اما برای کنترل چندین استپر موتور به یک کتابخانه نیاز خواهید داشت.
در مثال بعدی از یک کتابخانه پیشرفته استپر تحت عنوان کتابخانهی AccelStepper استفاده میکنیم. این کتابخانه موارد زیر را پشتیبانی میکند.
- افزایش و کاهش سرعت
- مدیریت همزمان چندین استپر موتور
نصب کتابخانه
ابتدا برای نصب کتابخانه به مسیر Sketch > Include Library > Manage Libraries بروید. صبر کنید تا Library Manager لیست کتابخانهها را دانلود کرده و لیست کتابخانههای نصب شده را آپدیت کند.
سپس جستجوی خود را با نوشتن عبارت ‘accelstepper’ فیلتر کنید. از بین چند گزینهای که میبینید، اولی را نصب کنید.
کد آردوینو
در این برنامه، ابتدا سرعت موتور در یک جهت افزایش یافته، سپس کاهش مییابد و در حالت استراحت قرار میگیرد. پس از یک دور چرخش کامل موتور، جهت چرخش تغییر میکند. این امر چندین مرتبه تکرار میشود.
// Include the AccelStepper Library
#include <AccelStepper.h>
// Define pin connections
const int dirPin = 2;
const int stepPin = 3;
// Define motor interface type
#define motorInterfaceType 1
// Creates an instance
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);
void setup() {
// set the maximum speed, acceleration factor,
// initial speed and the target position
myStepper.setMaxSpeed(1000);
myStepper.setAcceleration(50);
myStepper.setSpeed(200);
myStepper.moveTo(200);
}
void loop() {
// Change direction once the motor reaches target position
if (myStepper.distanceToGo() == 0)
myStepper.moveTo(-myStepper.currentPosition());
// Move the motor one step
myStepper.run();
}
توضیحات کد:
برنامه با افزودن کتابخانهی نصب شده AccelStepper آغاز میشود.
#include <AccelStepper.h>
پس از آن پایههای آردوینو که به ترتیب به پایههای STEP و DIR از ماژول درایور DRV8825 متصل شدهاند، تعریف میشوند. همچنین مقدار متغیر motorInterfaceType را 1 قرار میدهیم (1 به معنای یک درایور خارجی استپر موتور با پایههای STEP و DIR است).
// Define pin connections
const int dirPin = 2;
const int stepPin = 3;
// Define motor interface type
#define motorInterfaceType 1
سپس یک شیء از کتابخانه تحت عنوان myStepper میسازیم.
AccelStepper myStepper(motorInterfaceType, stepPin, dirPin);
در تابع setup، ابتدا حداکثر سرعت موتور را بر روی 1000 تنظیم کرده و سپس یک ضریب سرعت برای موتور تعیین میکنیم تا امکان افزایش و کاهش سرعت استپر موتور را فراهم سازیم.
سرعت معمولی موتور و تعداد پلههایی که میخواهیم حرکت کند را بر روی 200 تنظیم میکنیم. (به خاطر اینکه استپر موتور NEMA 17 در یک دور کامل 200 پله را طی میکند).
void setup() {
myStepper.setMaxSpeed(1000);
myStepper.setAcceleration(50);
myStepper.setSpeed(200);
myStepper.moveTo(200);
}
در تابع loop، از دستور if برای بررسی اینکه موتور باید چه مسافتی را طی کند ( با خواندن مقدار تابع distanceToGo) تا به موقعیت هدف برسد (با استفاده از تابع moveTo)، استفاده میکنیم. زمانیکه مقدار تابع distanceToGo به صفر برسد، با کمک تابع moveTo
جهت چرخش موتور را تغییر میدهیم.
در انتهای تابع loop، تابع ()run فراخوانی میشود. این تابع مهمترین تابع است؛ زیرا بدون اجرای این تابع موتور حرکت نخواهد کرد.
void loop() {
if (myStepper.distanceToGo() == 0)
myStepper.moveTo(-myStepper.currentPosition());
myStepper.run();
}
همانطور که دیدید، راه اندازی استپر موتور با استفاده از ماژول درایور DRV8825 و برد آردوینو چندان دشوار نیست. در این مقاله ما از موتور پلهای دو قطبی NEMA 17 به عنوان نمونه استفاده کردیم، اما شما میتوانید از استپر موتور دیگری در این پروژه استفاده کنید. تنها کافی است به تفاوتهای موتور خود با موتور استفاده شده در این مقاله دقت کنید.
۲ دیدگاه. Leave new
عالی واقعا مفید بود
سلام و درود جواد عزیز
ما هم از این حس قدردانی شما سپاسگذاریم:)