</> Make for Iran – بسازیم برای ایران

پروژه‌ها، آموزش‌ها و ابزارها برای سازندگان و علاقه‌مندان الکترونیک

  • خانه
  • الکترونیک
  • پرینت سه‌بعدی
  • حکاکی و برش لیزری
  • ابزار کارگاهی
  • پهپاد
  • ربات زمینی UGV
  • ربات پرنده UAV
  • صنایع دستی
  • آموزش
  • پروژه‌ها
  • درباره ما
خانه›آموزش›موتور DC با Encoder: کنترل دقیق سرعت و موقعیت با PID (فارسی)
آموزش ربات‌های زمینی (UGV)

موتور DC با Encoder: کنترل دقیق سرعت و موقعیت با PID (فارسی)

​ ژوئن 12, 2026 1 دقیقه مطالعه
موتور DC Encoder PID کنترل سرعت موقعیت آردوینو

Encoder چیست و چرا موتور DC را دقیق می‌کند؟

Encoder (انکودر) یک حسگر است که دور موتور را می‌شمارد. انکودر دو کانال (A و B) جهت چرخش را هم تشخیص می‌دهد — این نوع Quadrature Encoder نام دارد. با شمارش پالس‌ها می‌توانیم RPM دقیق را بدانیم و با PID آن را کنترل کنیم. نتیجه: موتورهای دو طرف UGV دقیقاً با سرعت یکسان می‌چرخند — ربات مستقیم می‌رود!

🛠️ کارت پروژه

Encoder HC-020K یا LM393 با دیسک سوراخ‌دار (20PPR)
قیمت ~۴۰K هر encoder

اتصال Encoder به Arduino

Encoder Arduino نکته
OUT (A) D2 (interrupt) interrupt RISING
OUT (B) — اگر quadrature D4 (digital input) برای تشخیص جهت

کد PID سرعت با Encoder

volatile long pulses = 0;
void isr(){ pulses += (digitalRead(4)==HIGH) ? 1 : -1; }  // quadrature

const int PPR = 20;         // پالس در هر دور
const float Kp=3.0, Ki=0.5, Kd=0.2;
float setRPM=0, curRPM=0;
float errSum=0, lastErr=0;
unsigned long lastTime=0;

void setup(){
  attachInterrupt(digitalPinToInterrupt(2), isr, RISING);
}

void loop(){
  // RPM محاسبه هر ۱۰۰ms
  if(millis()-lastTime >= 100){
    long snap = pulses; pulses=0;
    float dt = (millis()-lastTime)/1000.0; lastTime=millis();
    curRPM = (snap/(float)PPR) / dt * 60.0;

    float err = setRPM - curRPM;
    errSum += err*dt; errSum = constrain(errSum,-100,100);
    float out = Kp*err + Ki*errSum + Kd*(err-lastErr)/dt;
    lastErr = err;

    int pwm = 128 + constrain((int)out, -128, 127);
    analogWrite(ENA, pwm);
  }
}

جدول چک تنظیم

تست نتیجه صحیح
encoder پالس می‌دهد Serial.println(pulses) با چرخش موتور عوض می‌شود
جهت درست جلو = +، عقب = −
RPM در setRPM=100 curRPM به ۱۰۰ همگرا می‌شود ≤۵٪ خطا
UGV مستقیم می‌رود هر دو موتور RPM یکسان دارند

  • Arduino Playground: راهنمای Rotary Encoder
  • آپارات: encoder موتور DC آردوینو
برچسب‌ها: Encoder Interrupt PID Quadrature آردوینو موتور DC کنترل سرعت کنترل موقعیت
​
مطلب بعدی ربات تحویل با مسیریابی GPS — از انبار تا درب خانه (فارسی) مطلب قبلی سرو موتور MG996R — کنترل دقیق فرمان UGV با PWM و آردوینو (فارسی)
</> Make for Iran – بسازیم برای ایران

پروژه‌ها، آموزش‌ها و ابزارها برای سازندگان و علاقه‌مندان الکترونیک

یاد بگیر، بساز، به اشتراک بگذار. جامعه‌ای برای سازندگان، مهندسان و علاقه‌مندان به فناوری در ایران.

دسته‌بندی‌ها

  • پروژه‌ها
  • ربات‌های پرنده (UAV)
  • آموزش
  • ربات‌های زمینی (UGV)
  • الکترونیک
  • پهپاد و مولتی‌روتور

پیوندها

  • خانه
  • درباره ما
  • تماس
  • فید RSS

آخرین مطالب

  • خلاصه دوره ArduPilot/iNAV و گام‌های بعدی (فارسی)
  • رادیو تله‌متری در مقابل LTE/4G برای کنترل از راه دور (فارسی)
  • Ground Station روی موبایل و تبلت — QGroundControl و Solex (فارسی)
  • راه‌اندازی Ground Station با Mission Planner (فارسی)
© 2026 Make for Iran – بسازیم برای ایران. تمامی حقوق محفوظ است.
ساخته شده با ❤️ برای سازندگان ایران  |  ورود