راه اندازی موتور دی سی با درایور DRV8833{جلسه سی ام}

مقدمه

در این جلسه قصد داریم درایور موتور DRV8833 را راه اندازی کنیم. ولی قبل از آن لازم است که مطلب زیر را بخوانید:

در جلسات قبل دو درایور L293D و L298D را راه اندازی کردیم و کامل با آنها آشنا شدیم. در پروژه های بسیاری نیز از آنها استفاده می شود. اما سوال اینجاست که چه نیاز به راه اندازی درایور موتور DRV8833 در پروژه‌های آردوینو وجود دارد، در صورتی که می‌‎توانیم از درایورهای L293D و L298D استفاده کنیم؟ مهمترین دلیلی که باعث شده درایور موتور DRV8833، گزینه بهتری باشد، این است که L293D و L298D در حین قابل اطمینان بودن، از ترانزیستورهای BJT استفاده می‌کنند که در مقوله مصرف انرژی بهینه نیستند و در حالت روشن دارای یک افت ولتاژ هستند و گرمای زیادی تولید می کنند که اگر دقت کنید پشت همه آنها یک هیت سینگ میبندیم. ولی درایور DRV8833، بسیار بهینه‌تر کار می کند. زیرا در ساخت آن ماسفت (MOSFET) به کار برده شده است و افت ولتاژ ماسفت‌ ناچیز است که باعث می شود کل ولتاژ منبع تغذیه به موتور برسد و علاوه بر بهینه تر بودن حرارت کمتری تولید کنند.

 

در مرکز این ماژول تراشه DRV8833 قرار دارد. 

قابلیت های تراشه DRV8833:

  1. دارای دو درایور پل اِچ NMOS است که می تواند دو موتور ‌DC، یک استپر موتور دو قطبی را کنترل کند.
  2. ولتاژ آن ۲.۷ تا ۱۰.۸ ولت است و می‌تواند به ازای هر کانال، به طور مداوم تا ۱.۲ آمپر جریان را تامین کند و حداکثر جریان لحظه‌ای آن ۲ آمپر است.
  3. از ویژگی های حفاظتی درایور DRV8833 می‌توان به حفاظت در برابر کاهش بیش از حد ولتاژ، جلوگیری از جریان اضافی و نیز حفاظت در برابر افزایش دمای ماکزیمم اشاره کرد که نشان می دهد این تراشه ضریب اطمینان بالایی دارد. به وجود آمدن هر یک از موارد مذکور باعث قطع شدن ماسفت‌های پل H می‌شود که پس از رفع شدن خطا، درایور به شرایط عادی خود برمیگردد و می تواند عمل جریان دهی را انجام دهد.
  4. این درایور دارای مد low-power sleep است که باعث می شود در زمانی که موتورها در حال کار نیستند انرژی بیشتری ذخیره کند.

تذکر: عیب این درایور این است که برای موتورهای کوچک با ولتاژ پایین کاربرد دارد.

ولتاژ موتور  2.7 تا 10.8 ولت
سطح ولتاژ منطقی   3 یا ۵ ولت
جریان خروجی مداوم (در هر کانال) 1.2 آمپر
جریان خروجی لحظه‌ای(در هر کانال) ۲ آمپر
تعداد کانال های موتور ۲
امکانات حفاظتی حفاظت کاهش ولتاژ، اضافه جریان و اضافه دما

معرفی پین های درایور DRV8833

این درایور دارای دوازده پایه می باشد که به صورت زیر است:

همه موتور های دی سی جاروبک دار دارای دو ورودی و دو خروجی می باشند که پایه های آنها در درایور DRV8833 به صورت زیر است:

  • در تصویر بالا دو تا پایه GND و VCC برای تغذیه موتورها استفاده می شود و 4 عدد خروجی داریم که موتور دی سی اول را به خروجی های OUT1 و OUT2 متصل می کنیم و موتور دی سی دوم را به خروجی های OUT3 و OUT4 متصل می کنیم.
  • هر موتور دارای دو ورودی است که ورودی های IN1 و IN2 برای کنترل موتور دی سی اول و ورودی های IN3 و IN4 برای کنترل موتور دی سی دوم به کار می رود.

تعیین جهت چرخش موتور DC

به منظور کنترل جهت چرخش موتورها می بایست سیگنال‌های منطقی High و Low به پایه‌های کنترلی اعمال شود که به صورت زیر است:

جهت چرخش IN2/IN4 IN1/IN3
خاموش Low(0) Low(0)
جلو Low(0) High(1)
عقب High(1) Low(0)
خاموش High(1) High(1)

به منظور کنترل سرعت موتور می بایست روی پایه‌ای که High است موج PWM را اعمال کنیم. چنانچه قصد کنترل سرعت ندارید فقط کافی است پایه‌ها را High یا Low کنیم. برای شناخت تکنیک PWM می توانید از لینک زیر استفاده کنید:

تذکر: پایه‌های کنترلی به صورت داخلی pull down شده‌اند تا به صورت پیش‌فرض خروجی‌های موتور غیرفعال باشند.

پایه خواب درایور

پایه Sleep یا خواب (که روی مدار چاپی برد با EEP نمایان است) حالت خواب درایور است. با Low کردن این پایه،درایور به حالت خواب یا کم مصرف می‌رود و high کردن آن درایور را مجددا فعال می سازد.

 

در حالت خواب، پل‌های H غیرفعالند، پمپ شارژ گیت خاموش است، همه مدارات منطقی در حالت ریست قرار می گیرند، کلاک‌های داخلی متوقف می شوند و به ورودی‌ها عکس العملی نشان نمی دهند. نکته مهم این است که درایور هنگام خروج از حالت خواب به زمان بسیار کوتاهی (تقریبا ۱ میلی ثانیه) نیاز دارد تا به وضعیت عادی خود برگردد.

پایه SLEEP به صورت پیش‌فرض روی برد پول آپ است. بنابراین اگر قصد ندارید از حالت خواب استفاده کنید می‌توان این پایه را آزاد گذاشت و به جایی متصل نکرد.

اگر به پشت برد دقت کنید یک جامپرفعالساز قرار دارد که در حالت پیشفرض بسته است و پایه اسلیپ را پولاپ میکند تا درایور فعال بماند . در صورتی که این جامپر را باز کنید اتصال پولاپ قطع شده و پول دان داخلی فعال می شود بنابراین درایور به حال خواب فرو می رود و اگر قصد داشته باشید از درایور استفاده کنید می بایست پایه EEP را HIGH کنید.

پایه شناخت خطا

پایه FAULT(که روی برد با ULT نمایان شده است) یک خروجی open-drain است که با وقوع خطا (جریان اضافی، دمای بالا یا کمبود ولتاژ) توسط تراشه low می‌شود.

به صورت پیشفرض در وضعیت آزاد (floating) است. پس به منظور مشاهده وضعیت خطای درایور می‌توان یک مقاومت پول آپ خارجی روی این پایه قرار داد یا اینکه از میکروکنترلری که قابلیت پول آپ در داخل خود دارد استفاده کرد.

راه اندازی درایورDRV8833 با آردوینو

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

  • ورودی‌ها (IN1, IN2,IN3, IN4) را به ۴ خروجی آردوینو (10, 9, 6, 5) وصل می‌کنیم.
  • یکی از موتورها را به ترمینال A (OUT1 و OUT2) و موتور دوم را به ترمینال B (OUT3 و OUT4) وصل می‌کنیم. در صورتی که قصد داشتید جهت چرخش را عوض کنید می توانید جای سیم پیچ هارا عوض کنید.
  • در صورتی که قصد استفاده از پایه FAULT را داشتید می توانید آن را پولاپ کنید.

تذکر: برای اتصال دو مدار به هم می بایست زمین مشترک داشته باشند .پس زمین مشترک مدار و آردوینو را به هم وصل کنید.

تذکر: در دورهای پایین ممکن است موتورهای دی سی صدای هووووم بدهند که طبیعی است و به این دلیل است که در دورهای پایین موتورهای دی سی نیاز به حداقل ولتاژ دارند.

// Define the control inputs
#define MOT_A1_PIN 10
#define MOT_A2_PIN 9
#define MOT_B1_PIN 6
#define MOT_B2_PIN 5

void setup(void)
{
  // Set all the motor control inputs to OUTPUT
  pinMode(MOT_A1_PIN, OUTPUT);
  pinMode(MOT_A2_PIN, OUTPUT);
  pinMode(MOT_B1_PIN, OUTPUT);
  pinMode(MOT_B2_PIN, OUTPUT);

  // Turn off motors - Initial state
  digitalWrite(MOT_A1_PIN, LOW);
  digitalWrite(MOT_A2_PIN, LOW);
  digitalWrite(MOT_B1_PIN, LOW);
  digitalWrite(MOT_B2_PIN, LOW);

  // Initialize the serial UART at 9600 baud
  Serial.begin(9600);
}

void loop(void)
{
  // Generate a fixed motion sequence to demonstrate the motor modes.

  // Ramp speed up.
  for (int i = 0; i < 11; i++) {
    spin_and_wait(25*i, 25*i, 500);
  }
  // Full speed forward.
  spin_and_wait(255,255,2000);

  // Ramp speed into full reverse.
  for (int i = 0; i < 21 ; i++) {
    spin_and_wait(255 - 25*i, 255 - 25*i, 500);
  }

  // Full speed reverse.
  spin_and_wait(-255,-255,2000);

  // Stop.
  spin_and_wait(0,0,2000);

  // Full speed, forward, turn, reverse, and turn for a two-wheeled base.
  spin_and_wait(255, 255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(-255, 255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(-255, -255, 2000);
  spin_and_wait(0, 0, 1000);
  spin_and_wait(255, -255, 2000);
  spin_and_wait(0, 0, 1000);
}

/// Set the current on a motor channel using PWM and directional logic.
///
/// \param pwm    PWM duty cycle ranging from -255 full reverse to 255 full forward
/// \param IN1_PIN  pin number xIN1 for the given channel
/// \param IN2_PIN  pin number xIN2 for the given channel
void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{
  if (pwm < 0) {  // reverse speeds
    analogWrite(IN1_PIN, -pwm);
    digitalWrite(IN2_PIN, LOW);

  } else { // stop or forward
    digitalWrite(IN1_PIN, LOW);
    analogWrite(IN2_PIN, pwm);
  }
}

/// Set the current on both motors.
///
/// \param pwm_A  motor A PWM, -255 to 255
/// \param pwm_B  motor B PWM, -255 to 255
void set_motor_currents(int pwm_A, int pwm_B)
{
  set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);
  set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);

  // Print a status message to the console.
  Serial.print("Set motor A PWM = ");
  Serial.print(pwm_A);
  Serial.print(" motor B PWM = ");
  Serial.println(pwm_B);
}

/// Simple primitive for the motion sequence to set a speed and wait for an interval.
///
/// \param pwm_A  motor A PWM, -255 to 255
/// \param pwm_B  motor B PWM, -255 to 255
/// \param duration delay in milliseconds
void spin_and_wait(int pwm_A, int pwm_B, int duration)
{
  set_motor_currents(pwm_A, pwm_B);
  delay(duration);
}

ابتدا پایه‌های متصل به DRV8833 را تعریف می کنیم:

 ابتدا چهار پایه متصل به موتورها را به صورت خروجی تعریف میکنیم. سپس همه آنها را LOW می کنیم تا در شروع حرکت متوقف باشند. در انتها ارتباط سریال با باودریت 9600 را قرار می دهیم.

void setup(void)
{
  // Set all the motor control inputs to OUTPUT
  pinMode(MOT_A1_PIN, OUTPUT);
  pinMode(MOT_A2_PIN, OUTPUT);
  pinMode(MOT_B1_PIN, OUTPUT);
  pinMode(MOT_B2_PIN, OUTPUT);

  // Turn off motors - Initial state
  digitalWrite(MOT_A1_PIN, LOW);
  digitalWrite(MOT_A2_PIN, LOW);
  digitalWrite(MOT_B1_PIN, LOW);
  digitalWrite(MOT_B2_PIN, LOW);

  // Initialize the serial UART at 9600 baud
  Serial.begin(9600);
}

در تابع ()loop چند دنباله حرکتی ثابت شامل افزایش سرعت موتور، به حداکثر سرعت رسیدن، کاهش سرعت و سپس مراحل در جهت عکس و در نهایت متوقف شدن موتور است.

حال برای چرخش، باید یک چرخ باید رو به جلو و چرخ دیگر رو به عقب حرکت کند. پس از انجام تمام مراحل این چرخه دوباره تکرار می شود.

// Full speed, forward, turn, reverse, and turn for a two-wheeled base.
spin_and_wait(255, 255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(-255, 255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(-255, -255, 2000);
spin_and_wait(0, 0, 1000);
spin_and_wait(255, -255, 2000);
spin_and_wait(0, 0, 1000);

سه تابع تعریف شده‌اند که شامل؛ ()set_motor_pwm() ،set_motor_currents و ()spin_and_wait.
تابع ()set_motor_pwm با تعیین عرض پالس و جهت چرخش موتور ها، سرعت موتور و جهت چرخش آن را تنظیم می‌کند. به شکلی که اگر مقدار PWM ارسالی، منفی است، موتور در یک جهت و اگر ۰ یا مثبت است، موتور توقف کرده یا در جهت برعکس می‌چرخد.

void set_motor_pwm(int pwm, int IN1_PIN, int IN2_PIN)
{
  if (pwm < 0) {  // reverse speeds
    analogWrite(IN1_PIN, -pwm);
    digitalWrite(IN2_PIN, LOW);

  } else { // stop or forward
    digitalWrite(IN1_PIN, LOW);
    analogWrite(IN2_PIN, pwm);
  }
}

 

تابع ()set_motor_currents، از تابع قبل برای تنظیم جریان موتورها استفاده بهره می برد (تنظیم جریان باعث تنظیم سرعت می‌شود). این تابع همچنین مقادیر PWM موتورها را روی SerialMonitor چاپ می‌کند.

void set_motor_currents(int pwm_A, int pwm_B)
{
  set_motor_pwm(pwm_A, MOT_A1_PIN, MOT_A2_PIN);
  set_motor_pwm(pwm_B, MOT_B1_PIN, MOT_B2_PIN);

  // Print a status message to the console.
  Serial.print("Set motor A PWM = ");
  Serial.print(pwm_A);
  Serial.print(" motor B PWM = ");
  Serial.println(pwm_B);
}

تابع ()spin_and_wait سرعت موتور را تنظیم می کند و قبل از اجرای دستور بعدی، مدت زمانی را صبر می‌کند. این دستور نیز از ()set_motor_currents برای عرض پالس موتورها استفاده می کند و به اندازه duration برحسب میلی ثانیه منتظر می ماند.

void spin_and_wait(int pwm_A, int pwm_B, int duration)
{
  set_motor_currents(pwm_A, pwm_B);
  delay(duration);
}

این جلسه نیز به پایان رسید. در صورتی که نیاز به اطلاعات اضافی داشتید می توانید در قسمت کامنت ها بیان نمایید تا مطالب وب سایت آپدیت شوند.

دوستان عزیز بیشتر دوره های مربوط به این وب سایت رایگان می باشد. در صورت تمایل می توانید به اندازه وسع مالی خود(هر چند ناچیز) جهت پرداخت هزینه های نگهداری وب سایت از ما حمایت کنید:

مثل همیشه میتوانید ما را در تلگرام و یا اینستاگرام دنبال کنید‌:

اشتراک گذاری:
مطالب زیر را حتما بخوانید

2 دیدگاه

به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.

  • سلام. بهترین درایور برای موتورهای دی سی کدام است؟ چندتا درایور داریم؟

    • سلام و احترام
      معمول ترین درایورهای بازار عبارتند از:
      1-L298D
      2-L293D
      3-L297D
      4-DRV8833
      5-ULN2003
      6-ULN2803
      که البته مدل های مختلف دیگری نیز وجود دارد و بستگی به میزان جریان مصرفی موتورتان و تعداد موتوری که قصد راه اندازی دارید دارد.
      موفق باشید

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