gyeongsangseaman 6 days ago
비상 정지 후 급발진 방지 코드 구현
@363c1627210c916824b7dbe0cfbddbfe556b8d92
vdwd2.5.ino (Renamed from vdwd2.0.ino)
--- vdwd2.0.ino
+++ vdwd2.5.ino
@@ -117,10 +117,12 @@
     }
 
     if (vUpdated || wUpdated) {
+      double pkjR = 1;
+      double pkjL = 1;
       double rpm_r = (v + (WHEEL_DISTANCE / 2.0) * w) / WHEEL_RADIUS * 60.0 / (2 * PI);
       double rpm_l = (v - (WHEEL_DISTANCE / 2.0) * w) / WHEEL_RADIUS * 60.0 / (2 * PI);
-      setRPM1 = (int)(rpm_r);
-      setRPM2 = (int)(rpm_l);
+      setRPM1 = (int)(rpm_r * pkjR);
+      setRPM2 = (int)(rpm_l * pkjL);
 
       Serial.print("★ V,W 명령 적용 → ");
       Serial.print("V: "); Serial.print(v, 3);
@@ -161,6 +163,27 @@
     rpm1 = calculateRPM(cnt1);
     rpm2 = calculateRPM(cnt2);
 
+    // === 모터 드라이버 전원 상태 감지용 ===
+  static int zeroRPMCount = 0;
+  const int maxZeroRPMCount = 10;  // 10*30ms = 300ms 동안 0이면 모터 정지 처리
+
+  if (rpm1 == 0 && rpm2 == 0 && (setRPM1 != 0 || setRPM2 != 0)) {
+    zeroRPMCount++;
+  } else {
+    zeroRPMCount = 0;
+  }
+  
+  if (zeroRPMCount > maxZeroRPMCount) {
+    // 모터 드라이버가 꺼진 것으로 간주하여 안전 정지
+    setRPM1 = 0;
+    setRPM2 = 0;
+    integral1 = 0;  // 누적된 적분항 초기화
+    integral2 = 0;
+    calPWM1 = 0;
+    calPWM2 = 0;
+  }
+
+
     calPWM1 = computePID(rpm1, error1, prevError1, integral1, derivative1, setRPM1, kp1, ki1, kd1, true);
     calPWM2 = computePID(rpm2, error2, prevError2, integral2, derivative2, setRPM2, kp2, ki2, kd2, false);
 
@@ -170,4 +193,4 @@
     analogWrite(PWM_2, constrain(abs(calPWM2), 0, 255));
   }
   serialSetTwist();  // 추가된 V, W 명령
-}
(파일 끝에 줄바꿈 문자 없음)
+}
Add a comment
List