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 มีความถูกต้องมากที่สุด

Datasheet for L293x Quadruple Half-H Drivers

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

ในรูปที่ 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
}


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

สำหรับในรูปที่ 6 เป็นวงจรที่ออกแบบและใช้ในการทดลองโครงงาน ซึ่งจากการทดลองตัวมอเตอร์กระแสตรงจะหมุนได้แม่นยำขึ้นเนื่องจากมีช่วงของ Open circuit หรือ Coasting น้อยมาก สำหรับการทดลองโครงงานนี้อาจจะใช้ขับมอเตอร์ที่กระแสไม่สูงมากนัก เนื่องจากต้องการศึกษาแนวความคิดของการทำงานและผลการทดลองที่เกิดขึ้น โดยเราสามารถออกแบบในส่วนขับกำลังใหม่ให้เหมาะสมกับมอเตอร์ที่เลือกใช้งาน สำหรับการขับมอเตอร์กระแสตรงด้วยวงจรการขับกำลังแบบฮาฟบริด เป็นเทคนิคหนึ่งที่มีประสิทธิภาพในการควบคุมความเร็วให้กับมอเตอร์กระแสตรงอีกวิธีหนึ่ง
Reference
- https://www.ti.com/lit/ds/symlink/l293d.pdf
- https://www.st.com/resource/en/datasheet/l293d.pdf
- https://www.4qd.co.uk/docs/half-bridge-tour-6/
- https://electronics.stackexchange.com/questions/612854/half-bridge-motor-driver-best-motor-placement
- https://forum.digikey.com/t/breadboard-an-arduino-based-h-bridge-motor-controller/45230
- https://www.electronicsdna.com/simple-dc-motor-speed-control-by-ir2153/
- https://electronics.stackexchange.com/questions/674622/braking-vs-coasting-during-the-pwm-off-state-of-a-h-bridge
- https://electronics.stackexchange.com/questions/329852/dc-motor-constant-acceleration