🌀 مدار کنترل دور موتور DC (Motor Speed Control): با پتانسیومتر، ترانزیستور و PWM

پنکه‌ی رومیزی چند دور دارد، دریل شارژی هرچه ماشه را بیشتر فشار بدهی تندتر می‌چرخد و ماشین کنترلی آرام راه می‌افتد. پشت همه‌ی این‌ها یک مدار کنترل دور موتور (Motor Speed Control Circuit) است؛ همان چیزی که بیشتر با عنوان کنترل سرعت موتور DC جست‌وجو می‌شود. ساده‌ترین ایده این است که یک پتانسیومتر سر راه موتور بگذاری، ولی خیلی زود می‌بینی پتانسیومتر داغ می‌شود و موتور در دور کم زور ندارد. در این راهنما سه روش را قدم‌به‌قدم می‌سازیم و با عدد مقایسه می‌کنیم: پتانسیومتر سری، ترانزیستور یا ماسفت به‌عنوان کلید با دیود هرزگرد، و PWM. آخر هم یک مدار PWM موتور با آردوینو و ولوم می‌بندیم که کد کاملش آماده است. همه‌ی مرحله‌ها در شبیه‌ساز تینکرکد فارسی نمونه‌ی آماده دارند.

سرعت موتور DC به چه بستگی دارد؟

داخل موتور DC یک سیم‌پیچ بین آهنرباها می‌چرخد. دو قانون ساده رفتارش را توضیح می‌دهد:

پس برای کم کردن سرعت باید ولتاژ مؤثر موتور را کم کنی، بدون این‌که جلوی جریانِ لازم برای زورش را بگیری. سه روش زیر سه جواب متفاوت به همین مسئله‌اند. برای عوض کردن جهت چرخش، سراغ مدار پل H (H-Bridge) برو.

قطعه‌های مدار کنترل دور موتور

#قطعهEnglishمقدار یا مدلکار در مدار
۱موتور DC (یا موتور گیربکس)DC Motor / Gear Motor۳ تا ۶ ولتبار مدار
۲پتانسیومترPotentiometer۱۰ کیلو برای آردوینوفرمان سرعت
۳رئوستاتRheostatسیم‌پیچی، چند ده اهمکنترل مستقیم در روش ۱
۴ترانزیستور NPNNPN Transistorمثل 2N2222کلید جریان موتور
۵ماسفت NN-Channel Logic-Level MOSFETIRLZ44Nکلید بهتر برای جریان زیاد
۶دیود هرزگردFlyback Diode1N4007 یا شاتکی 1N5819محافظت در برابر ولتاژ برگشتی
۷مقاومت ۱ کیلوBase Resistor۱kΩمحدود کردن جریان بیس
۸مقاومت ۱۰ کیلوGate Pull-Down Resistor۱۰kΩخاموش نگه داشتن ماسفت در لحظه‌ی روشن شدن
۹خازن سرامیکیNoise Suppression Capacitor۱۰۰ نانوفاراد روی پایه‌های موتورکم کردن نویز جرقه‌های موتور
۱۰پک ۴ تایی باتری قلمی4×AA Battery Pack۶ ولتتغذیه‌ی جدای موتور
۱۱آردوینو اونوArduino Uno—تولید PWM در روش ۳

روش ۱: پتانسیومتر سری (Rheostat Speed Control)

ساده‌ترین مدار: + باتری ← پتانسیومتر (یک سر و پایه‌ی وسط، یعنی به‌شکل مقاومت متغیر) ← موتور ← − باتری. با چرخاندن ولوم، مقاومت سری کم و زیاد می‌شود و بخشی از ولتاژ روی آن می‌افتد. نمونه‌های سرعت موتور با پتانسیومتر (Pot controls motor) و پنکه‌ی سرعت‌متغیر (Variable fan) در شبیه‌ساز همین‌اند و درس کم‌وزیاد کردن نور این ایده را از LED به موتور می‌برد.

حساب گرما با یک مثال

موتوری داری که با ۶ ولت حدود ۳۰۰ میلی‌آمپر می‌کشد و می‌خواهی با نصف ولتاژ بچرخد. اگر جریانش در این حالت حدود ۲۵۰ میلی‌آمپر باشد:

پتانسیومترهای کوچک معمولی برای حدود ۰.۱ تا ۰.۲۵ وات ساخته شده‌اند؛ ۰.۷۵ وات یعنی بوی سوختگی. برای همین در عمل از رئوستات سیم‌پیچی بزرگ استفاده می‌کنند. دو مشکل دیگر هم هست:

  1. مقدار پتانسیومتر باید خیلی کم باشد. با پتانسیومتر ۱۰ کیلو، جریان حداکثر ۶ ÷ ۱۰۰۰۰ = ۰.۶ میلی‌آمپر است و موتور تکان هم نمی‌خورد. نمونه‌ی شبیه‌ساز برای همین یک پتانسیومتر ۵۰ اهمی دارد؛ مقدارش را ۱۰ کیلو کن و ببین موتور می‌ایستد.
  2. زور موتور در دور کم از بین می‌رود. وقتی بار سنگین‌تر می‌شود، جریان بیشتر، افت روی پتانسیومتر بیشتر و ولتاژ موتور کمتر می‌شود؛ یعنی دقیقاً وقتی زور لازم داری، موتور کند می‌شود یا می‌ایستد.

نسخه‌ی پله‌ای همین ایده پنکه‌ی دو سرعته (A two-speed fan) است: یک کلید تبدیل، موتور را یا مستقیم یا از راه یک مقاومت ۱۰۰ اهمی به باتری وصل می‌کند.

روش ۲: ترانزیستور یا ماسفت به‌عنوان کلید (Low-Side Switch)

به‌جای این‌که خود جریان موتور از ولوم رد شود، یک ترانزیستور می‌گذاریم که جریان بزرگ موتور را با یک جریان کوچک فرمان کنترل کند. چون ترانزیستور بین موتور و منفی (زمین) قرار می‌گیرد، به این چیدمان کلید سمت پایین (Low-Side Switch) می‌گویند.

#ازبه
۱+ باتریپایه‌ی + موتور
۲پایه‌ی − موتورکلکتور (C) ترانزیستور
۳امیتر (E)− باتری (و GND آردوینو، اگر هست)
۴سیگنال فرمان (دکمه یا پین آردوینو)مقاومت ۱ کیلو ← بیس (B)
۵کاتد دیود (سر نواردار)پایه‌ی + موتور
۶آند دیودپایه‌ی − موتور (سمت کلکتور)

در شبیه‌ساز، موتور با ترانزیستور (Motor via transistor) همین مدار را با یک دکمه به‌جای سیگنال نشان می‌دهد: یک دکمه‌ی کوچک، یک موتور بزرگ. درس ترانزیستور: کلید برقی هم همین ایده را قدم‌به‌قدم می‌سازد و ترانزیستور چطور کار می‌کند درونش را توضیح می‌دهد.

حساب مقاومت بیس

ترانزیستور NPN جریان بیس را تقریباً β برابر می‌کند (β یا hFE برای ترانزیستورهای کوچک حدود ۱۰۰ است). با فرمان ۵ ولتی آردوینو و افت حدود ۰.۷ ولتی بیس-امیتر:

IB = (۵ − ۰.۷) ÷ RB ؛ با RB = ۱ کیلواهم: IB ≈ ۴.۳ میلی‌آمپر

با β ≈ ۱۰۰، ترانزیستور می‌تواند تا حدود ۴۳۰ میلی‌آمپر را کامل باز (اشباع) نگه دارد؛ برای موتور کوچک ۳۰۰ میلی‌آمپری کافی است و جریان پین آردوینو هم زیر ۲۰ میلی‌آمپر می‌ماند. برای کلید مطمئن، IB را دو سه برابر حداقل لازم می‌گیرند. گرمای ترانزیستور اشباع‌شده با افت حدود ۰.۳ ولت: ۰.۳ × ۰.۳ = ۰.۰۹ وات؛ مقایسه کن با ۰.۷۵ وات پتانسیومتر!

ماسفت: کلید بهتر برای جریان زیاد

ماسفت N با ولتاژ گیت روشن می‌شود، نه جریان بیس. ماسفت‌های «لاجیک‌لول» مثل IRLZ44N با ۵ ولت آردوینو کامل باز می‌شوند و مقاومت کانالشان (RDS(on)) حدود ۰.۰۲۵ اهم است. گرما برای همان ۳۰۰ میلی‌آمپر: P = I² × R = ۰.۳² × ۰.۰۲۵ ≈ ۰.۰۰۲ وات؛ تقریباً هیچ. یک مقاومت ۱۰ کیلو بین گیت و زمین (پول‌داون) هم بگذار تا وقتی آردوینو هنوز بوت نشده، گیت شناور نماند و موتور خودسرانه روشن نشود. نمونه‌ی شبیه‌ساز: موتور با ماسفت (Motor via MOSFET).

دیود هرزگرد: چرا واجب است

سیم‌پیچ موتور یک سلف (Inductor) است و سلف با تغییر ناگهانی جریان مخالفت می‌کند. لحظه‌ای که ترانزیستور قطع می‌شود، سیم‌پیچ می‌خواهد جریان را ادامه بدهد و ولتاژی به اندازه‌ی V = L × (ΔI ÷ Δt) می‌سازد. با سلف ۱ میلی‌هانری، جریان ۰.۳ آمپر و قطع در ۱ میکروثانیه: V = ۰.۰۰۱ × ۰.۳ ÷ ۰.۰۰۰۰۰۱ = ۳۰۰ ولت! این ضربه ترانزیستور را بعد از چند بار قطع و وصل می‌کشد. دیود موازی با موتور (کاتد به +) در حالت عادی خاموش است، ولی در آن لحظه مسیری می‌دهد تا جریان سیم‌پیچ آرام در خودش بچرخد و تمام شود. نمونه‌ی دیود محافظ موتور (Motor with a flyback diode) را در شبیه‌ساز ببین.

روش ۳: PWM، کلیدی که خیلی سریع روشن و خاموش می‌شود

حالا که یک کلید سریع و خنک داریم، به‌جای کم کردن ولتاژ، آن را خیلی سریع روشن و خاموش می‌کنیم. اگر در هر سیکل نیمی از زمان روشن باشد، موتور به‌طور میانگین نصف ولتاژ را «حس» می‌کند؛ اینرسی چرخش و سلف سیم‌پیچ پالس‌ها را صاف می‌کنند. به سهم زمان روشن «چرخه‌ی کار» یا Duty Cycle می‌گویند و به خود روش مدولاسیون پهنای پالس (PWM).

Vمیانگین = D × Vتغذیه

در آردوینو، analogWrite(pin, x) عدد x را از ۰ تا ۲۵۵ می‌گیرد و D = x ÷ ۲۵۵. مثال: باتری ۶ ولت و analogWrite(9, 150): D = ۱۵۰ ÷ ۲۵۵ ≈ ۵۹٪ و ولتاژ میانگین ≈ ۰.۵۹ × ۶ ≈ ۳.۵ ولت. این عددها را با ماشین‌حساب PWM هم چک کن.

چرا PWM بهتر است؟ ترانزیستور یا کاملاً روشن است (افت ولتاژ کم) یا کاملاً خاموش (جریان صفر)؛ در هر دو حالت توان تلفاتی‌اش ناچیز است. و چون در زمان روشن بودن، موتور ولتاژ کامل باتری را می‌بیند، زورش در دور کم هم حفظ می‌شود.

پین‌های PWM آردوینو اونوفرکانس پیش‌فرض
۵ و ۶حدود ۹۸۰ هرتز
۳، ۹، ۱۰ و ۱۱حدود ۴۹۰ هرتز

این فرکانس‌ها در محدوده‌ی شنوایی‌اند؛ برای همین موتور در دور کم کمی «وزوز» می‌کند که کاملاً طبیعی است. درایورهای حرفه‌ای فرکانس را بالای ۲۰ کیلوهرتز می‌برند تا شنیده نشود. برای فهم کامل PWM، آموزش PWM آردوینو و درس کم‌نور و پرنور با PWM را ببین.

مقایسه‌ی سه روش

ویژگیپتانسیومتر سریترانزیستور، فقط روشن/خاموشPWM با ترانزیستور یا ماسفت
گرمای تلف‌شده (مثال بالا)۰.۷۵ وات۰.۰۹ وات۰.۰۰۲ تا ۰.۰۹ وات
کنترل سرعتپیوسته، ولی وابسته به بارنداردپیوسته
زور در دور کمضعیف—خوب
پیچیدگیخیلی کمکمآردوینو یا آی‌سی ۵۵۵ لازم است

نسخه‌ی آردوینو: کنترل دور موتور با آردوینو، ولوم و PWM

این همان «پدال گاز» است (در انگلیسی DC Motor PWM Arduino): آردوینو ولوم را می‌خواند، عدد را به ۰ تا ۲۵۵ نگاشت می‌کند و با PWM به ترانزیستور می‌دهد. مدار قدرت همان روش ۲ است و موتور از باتری جدا تغذیه می‌شود. این مدار برای حدود ۱۰ سال به بالا مناسب است.

قطعهپایهوصل به
پتانسیومتر ۱۰ کیلویک پایه‌ی کناری / پایه‌ی کناری دیگر / وسط5V / GND / A0
مقاومت ۱ کیلواز پین ۹به بیس ترانزیستور NPN
ترانزیستور NPNکلکتور / امیترپایه‌ی − موتور / GND
موتور DCپایه‌ی ++ باتری موتور
دیودکاتد / آندپایه‌ی + موتور / پایه‌ی − موتور
باتری موتور−GND آردوینو (زمین مشترک)
// مدار کنترل دور موتور DC با PWM — ولوم روی A0، ترانزیستور روی پین 9
const int POT = A0;
const int MOTOR = 9;          // پین PWM (علامت ~ روی برد)
const int DEAD_ZONE = 15;     // ته ولوم یعنی خاموش کامل
const int MIN_PWM = 70;       // زیر این عدد موتور واقعی فقط وزوز می‌کند
int lastPwm = 0;

void setup() {
  pinMode(MOTOR, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int knob = analogRead(POT);                // 0 تا 1023
  int pwm = map(knob, 0, 1023, 0, 255);      // 0 تا 255

  if (pwm < DEAD_ZONE) {
    pwm = 0;                                 // ناحیه‌ی مرده
  } else if (pwm < MIN_PWM) {
    pwm = MIN_PWM;                           // کمترین سرعتی که موتور راه بیفتد
  }

  if (lastPwm == 0 && pwm > 0) {
    analogWrite(MOTOR, 255);                 // ضربه‌ی شروع (kick start)
    delay(40);
  }
  analogWrite(MOTOR, pwm);
  lastPwm = pwm;

  int duty = map(pwm, 0, 255, 0, 100);       // درصد چرخه‌ی کار
  Serial.print("PWM: ");
  Serial.print(pwm);
  Serial.print("  duty: ");
  Serial.print(duty);
  Serial.println("%");
  delay(100);
}

قدم‌به‌قدم:

  1. analogRead(A0) ولتاژ وسط پتانسیومتر را به عددی بین ۰ و ۱۰۲۳ تبدیل می‌کند (آموزش analogRead).
  2. map آن را به محدوده‌ی PWM یعنی ۰ تا ۲۵۵ می‌برد (ماشین‌حساب map).
  3. ناحیه‌ی مرده: ته ولوم یعنی خاموش کامل، تا نویز کوچک ADC موتور را تکان ندهد.
  4. حداقل PWM: موتور واقعی زیر حدود ۶۰ تا ۸۰ از ۲۵۵ فقط وزوز می‌کند، چون زورش به اصطکاک نمی‌رسد؛ پس عددهای کمتر را به MIN_PWM می‌رسانیم.
  5. ضربه‌ی شروع (Kick Start): وقتی موتور ایستاده و فرمان حرکت می‌آید، ۴۰ میلی‌ثانیه تمام‌گاز می‌دهیم تا اصطکاک ایستایی شکسته شود و بعد به سرعت خواسته‌شده برمی‌گردیم.

پین ۹ را عمداً انتخاب کرده‌ایم چون PWM دارد؛ روی پین‌های بدون ~ مثل ۷ یا ۸، analogWrite فقط روشن یا خاموش می‌کند. با باتری ۹ ولت و PWM برابر ۱۲۸، ولتاژ میانگین موتور حدود ۰.۵ × ۹ = ۴.۵ ولت است.

ساختن در شبیه‌ساز تینکرکد فارسی

مدارهای بدون کد در مود «ساده» ساخته می‌شوند (بچه‌ها از حدود ۷ سالگی) و مدارهای آردوینو در مود سه‌بعدی؛ آردوینو اونو و همه‌ی این قطعه‌ها رایگان‌اند. نمونه‌های آماده‌ی هر مرحله:

#مدارEnglishمودصفحه
۱سرعت موتور با پتانسیومترPot controls motorسادهباز کن
۲پنکه‌ی دو سرعتهA two-speed fanسادهباز کن
۳موتور با ترانزیستورMotor via transistorسادهباز کن
۴موتور با ماسفتMotor via MOSFETسادهباز کن
۵دیود محافظ موتورMotor with a flyback diodeسادهباز کن
۶موتور PWMMotor PWM rampآردوینوباز کن
۷پتانسیومتر کنترل موتورPot controls motor (Arduino)آردوینوباز کن
۸موتور با ترانزیستور، دیود هرزگرد و باتری جداMotor via transistor (Arduino)آردوینوباز کن
۹کنترل دما با فن (PID)Fan temperature control (PID)آردوینوباز کن

در نمونه‌های «موتور PWM» و «پتانسیومتر کنترل موتور»، برای این‌که مفهوم PWM ساده دیده شود، موتور مستقیم به پین ۹ وصل است و سرعت پروانه با عدد analogWrite بالا و پایین می‌رود. ولی دقت کن: شبیه‌ساز همان‌جا هشدار می‌دهد که از پین آردوینو جریان بیش از حد کشیده می‌شود. این دقیقاً همان دلیلی است که در دنیای واقعی ترانزیستور لازم است. سیم‌کشی درست مدار قدرت را در نمونه‌ی «موتور با ترانزیستور» (ردیف ۸) ببین؛ کد این مقاله و یک پتانسیومتر روی A0 را به همان اضافه کن. درس‌های مرتبط: موتور و قدرت، ترانزیستور، قهرمان جریان و برای کنترل حلقه‌بسته کنترل دما با فن. با اشتراک Plus، شکل موج PWM را روی اسیلوسکوپ هم می‌بینی (اسیلوسکوپ و مولتی‌متر برای PWM).

کنترل دور موتور را در شبیه‌ساز امتحان کن 🌀

انواع مدار کنترل دور موتور (فارسی / انگلیسی)

#اسم فارسیEnglishایده
۱دیمر موتور با رئوستاتRheostat Speed Controlمقاومت متغیر سری؛ ساده ولی پرتلفات
۲کنترل خطی با ترانزیستورLinear (Emitter-Follower) Controlولوم ولتاژ بیس را تعیین می‌کند؛ گرما روی ترانزیستور
۳کلید سمت پایینLow-Side Transistor Switchروشن/خاموش با جریان کم
۴مدار PWM با آی‌سی ۵۵۵555 PWM Motor Controllerچرخه‌ی کار با ولوم، بدون برنامه‌نویسی
۵کنترل دور با آردوینوArduino PWM Speed Controlهمین مقاله
۶درایور ماسفتیMOSFET PWM Driverجریان زیاد با گرمای کم
۷کنترل سرعت و جهتH-Bridge Speed and Directionمدار پل H (H-Bridge) و L293D
۸کنترل حلقه‌بستهClosed-Loop PID Speed Controlاندازه‌گیری سرعت با انکودر و اصلاح خودکار
۹دیمر AC (تریاک)TRIAC AC Motor Dimmerبرای موتورهای برق شهر؛ فقط تئوری

برای ساختن مولد پالس با آی‌سی ۵۵۵، مدار تایمر ۵۵۵ (555 Timer) را ببین. اگر به‌جای سرعت، زاویه‌ی دقیق می‌خواهی، موتور DC ابزار درستی نیست و سروو موتور مناسب‌تر است: سروو موتور با آردوینو.

اشتباه‌های رایج

نکته‌های ایمنی

سؤال‌های رایج

چرا موتور DC را مستقیم به پین آردوینو وصل نکنم؟

هر پین آردوینو اونو برای حدود ۲۰ میلی‌آمپر طراحی شده و حد مطلقش ۴۰ میلی‌آمپر است، در حالی که یک موتور کوچک صدها میلی‌آمپر می‌کشد. پین آسیب می‌بیند و ولتاژ برگشتی موتور هم میکروکنترلر را تهدید می‌کند. بین آردوینو و موتور یک ترانزیستور یا ماسفت با دیود هرزگرد، یا یک درایور مثل L293D بگذار.

دیود هرزگرد چیست و چطور وصل می‌شود؟

دیودی است که موازی با موتور بسته می‌شود، با کاتد (سر نواردار) به سمت مثبت تغذیه. در حالت عادی جریانی از آن رد نمی‌شود، ولی لحظه‌ای که ترانزیستور موتور را قطع می‌کند، ولتاژ برگشتی سیم‌پیچ را از راه خودش خالی می‌کند و از سوختن ترانزیستور جلوگیری می‌کند. 1N4007 یا دیود شاتکی مثل 1N5819 رایج است.

PWM چطور سرعت موتور را کم و زیاد می‌کند؟

PWM تغذیه‌ی موتور را خیلی سریع روشن و خاموش می‌کند و موتور ولتاژ میانگین را حس می‌کند: نسبت زمان روشن ضرب در ولتاژ تغذیه. در آردوینو، analogWrite با عدد ۰ تا ۲۵۵ این نسبت را تعیین می‌کند؛ مثلاً ۱۲۸ یعنی حدود نیمی از ولتاژ.

چرا موتور در سرعت کم راه نمی‌افتد و فقط وزوز می‌کند؟

چون در PWM کم، زور موتور به اصطکاک ایستایی نمی‌رسد. در کد یک حداقل PWM (حدود ۶۰ تا ۸۰ از ۲۵۵) بگذار و برای شروع حرکت، چند ده میلی‌ثانیه تمام‌گاز بده و بعد به سرعت دلخواه برگرد. صدای وزوز هم از فرکانس PWM حدود ۴۹۰ هرتز است و طبیعی است.

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

برای موتورهای خیلی کوچک یک ترانزیستور NPN با مقاومت بیس کافی است. برای جریان‌های چند صد میلی‌آمپر به بالا، ماسفت N لاجیک‌لول مثل IRLZ44N بهتر است، چون با ۵ ولت کامل باز می‌شود، مقاومت روشنش چند صدم اهم است و تقریباً گرم نمی‌شود.

مقاله‌های دیگر

🌗

PWM در آردوینو — چطور نور LED را کم و زیاد کنیم

🔀

ترانزیستور چطور کار می‌کند — شیر برقی مدار

🌉

مدار پل H (H-Bridge): چپ‌گرد و راست‌گرد کردن موتور