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 یکسان دارند |