Mini Half-bridge Power State Drive for DC motor

โครงงานนี้เป็นการออกแบบวงจรขับมอเตอร์กระแสตรง (DC Motor) ขนาด 12V โดยใช้การขับกำลังแบบฮาฟบริด (Half-bridge Power State Drive for DC motor) ที่ให้ความแม่นยำในการหมุนมากกว่าการขับทั่วไป แต่การออกแบบวงจรซับซ้อนและใช้อุปกรณ์มากว่า ทั้งนี้การออกแบบวงจรขับมอเตอร์กระแสตรงแบบฮาฟบริดครั้งนี้ เป็นไอเดียมาจากบทความ Simple S-Curve Motion Profile Based on Arduino UNO ที่ผ่านมา เพื่อให้การควบคุมมอเตอร์เพื่อการเคลื่อนที่แบบ S-curve Motion Profile มีความถูกต้องมากที่สุด

รูปที่ 1 แสดงตำแหน่งขาสำหรับไอซี L293D

Datasheet for L293x Quadruple Half-H Drivers

รูปที่ 2 ตัวอย่างการต่อใช้งานไอซี L293D สำหรับขับมอเตอร์

รูปที่ 1 และรูปที่ 2 เป็นไอซี L293D ที่จะนำมาใช้ในการออกแบบวงจรขับมอเตอร์กระแสตรงแบบฮาฟบริดในโครงงานนี้ ทั้งนี้ไอซี L293D เป็นไอซีอีกเบอร์หนึ่งที่ใช้งานได้ง่ายและสามารถต่อเป็นวงจรขับแบบฮาฟบริดหรือฟูลบริดได้ตามต้องการและรับสัญญาณควบคุมระดับลอกจิก (TTL Signal) จากไมโครคอนโทรลเลอร์ทั่วไปได้โดยตรง และในรูปทั้งสองแสดงตำแหน่งขาสำหรับไอซีและตัวอย่างการต่อใช้งานสำหรับขับมอเตอร์กระแสตรง

Mini Half-bridge Power State Drive for DC motor
รูปที่ 3 ลักษณะการต่ออุปกรณ์สำหรับการทดลอง

ในรูปที่ 3 แสดงการต่ออุปกรณ์สำหรับทดลองวงจรการขับกำลังแบบฮาฟบริดร่วมกับไอซี L293D และใช้มอเตอร์กระแสตรงขนาด 12V จากนั้นจะใช้โปรแกรมสำหรับควบคุมความเร็วมอเตอร์จากบทความ Simple S-Curve Motion Profile Based on Arduino UNO เพื่อสังเกตการทำงานและสามารถนำไปใช้งานกับการเคลื่อนที่แบบ S-curve Motion Profile ได้ถูกต้อง

// ** S-Curve Motion Profile for DC Motor using PWM **

// Motor Control Pins
const int pwmPin = 9;   //  PWM pin
// const int dirPin = 2;   // Direction pin

// Motion Parameters
const int V_MAX = 255;      // Maximum PWM duty cycle (0-255)
const long ACCEL_TIME = 1500; // Acceleration/Deceleration time in milliseconds (T_a)
const long HOLD_TIME = 2000;  // Constant velocity time in milliseconds (T_v)
const long MOVE_DURATION = ACCEL_TIME + HOLD_TIME + ACCEL_TIME; // Total move time

// Time tracking
unsigned long startTime = 0;
bool moveStarted = false;

void setup() {
  pinMode(pwmPin, OUTPUT);
  //pinMode(dirPin, OUTPUT);
  Serial.begin(9600);
  Serial.println("S-Curve PWM Demo Ready. Sending PWM pulses now...");
}

void loop() {
  if (!moveStarted) {
    // Start the move sequence
    // digitalWrite(dirPin, HIGH); // Set Direction
    startTime = millis();
    moveStarted = true;
  }

    // --- S-Curve Calculation ---
  unsigned long elapsedTime = millis() - startTime;
  int currentPWM = 0;

  if (elapsedTime <= ACCEL_TIME) {
    // Phase 1: Acceleration (Ramp Up)
    float ratio = (float)elapsedTime / ACCEL_TIME;
    // Sinusoidal ramp from 0 to 1. V(t) will be the integral of a sine wave.
    float smoothRatio = 0.5 * (1.0 - cos(ratio * PI)); 
    currentPWM = (int)(V_MAX * smoothRatio);

  } else if (elapsedTime <= (ACCEL_TIME + HOLD_TIME)) {
    // Phase 2: Constant Velocity (Hold)
    currentPWM = V_MAX;

  } else if (elapsedTime <= MOVE_DURATION) {
    // Phase 3: Deceleration (Ramp Down)
    unsigned long timeInDecel = elapsedTime - (ACCEL_TIME + HOLD_TIME);
    float ratio = 1.0 - ((float)timeInDecel / ACCEL_TIME);
    // Sinusoidal ramp from 1 back to 0.
    float smoothRatio = 0.5 * (1.0 - cos(ratio * PI)); 
    currentPWM = (int)(V_MAX * smoothRatio);

  } else {
    // Move Complete
    currentPWM = 0;
    moveStarted = false; // Reset for next move
    Serial.println("Move Complete. Stopping.");
    delay(2000); // Wait 2 seconds before repeating
  }

  // Apply the calculated PWM value
  analogWrite(pwmPin, currentPWM);  
  Serial.println(currentPWM); // Uncomment to plot the profile
  delay(20); // Update speed every 10ms for smooth transitions
}
Mini Half-bridge Power State Drive for DC motor
รูปที่ 4 ลักษณะของการทดลองโครงงาน
Mini Half-bridge Power State Drive for DC motor
รูปที่ 5 สัญญาณพัลซ์วิดธ์มอดูเลตชั่นที่ขา 3 และขา 6 สำหรับขับมอเตอร์

รูปที่ 4 และรูปที่ 5 ลักษณะของการทดลองโครงงานและสัญญาณพัลซ์วิดธ์มอดูเลตชั่นสำหรับขับมอเตอร์ (ความถี่ประมาณ 490Hz) โดยจะป้อนเข้าที่่ขา 2 และขา 7 ของไอซี L293D ส่วนเอาต์พุตสำหรับขับมอเตอร์ที่ขา 3 และขา 6 ในรูปที่ 5 (ขณะยังไม่ต่อมอเตอร์) จะต่อขนานกันเพื่อให้สามารถจ่ายกระแสขับมอเตอร์ได้สูงขี้น

Mini Half-bridge Power State Drive for DC motor
รูปที่ 6 วงจรที่ออกแบบและใช้ในการทดลองโครงงาน

สำหรับในรูปที่ 6 เป็นวงจรที่ออกแบบและใช้ในการทดลองโครงงาน ซึ่งจากการทดลองตัวมอเตอร์กระแสตรงจะหมุนได้แม่นยำขึ้นเนื่องจากมีช่วงของ Open circuit หรือ Coasting น้อยมาก สำหรับการทดลองโครงงานนี้อาจจะใช้ขับมอเตอร์ที่กระแสไม่สูงมากนัก เนื่องจากต้องการศึกษาแนวความคิดของการทำงานและผลการทดลองที่เกิดขึ้น โดยเราสามารถออกแบบในส่วนขับกำลังใหม่ให้เหมาะสมกับมอเตอร์ที่เลือกใช้งาน สำหรับการขับมอเตอร์กระแสตรงด้วยวงจรการขับกำลังแบบฮาฟบริด เป็นเทคนิคหนึ่งที่มีประสิทธิภาพในการควบคุมความเร็วให้กับมอเตอร์กระแสตรงอีกวิธีหนึ่ง

Reference

  1. https://www.ti.com/lit/ds/symlink/l293d.pdf
  2. https://www.st.com/resource/en/datasheet/l293d.pdf
  3. https://www.4qd.co.uk/docs/half-bridge-tour-6/
  4. https://electronics.stackexchange.com/questions/612854/half-bridge-motor-driver-best-motor-placement
  5. https://forum.digikey.com/t/breadboard-an-arduino-based-h-bridge-motor-controller/45230
  6. https://www.electronicsdna.com/simple-dc-motor-speed-control-by-ir2153/
  7. https://electronics.stackexchange.com/questions/674622/braking-vs-coasting-during-the-pwm-off-state-of-a-h-bridge
  8. https://electronics.stackexchange.com/questions/329852/dc-motor-constant-acceleration