พื้นฐานเบื้องต้น:
ถ้าน้องอยากควบคุมความเร็วของมอเตอร์กระแสตรง (DC Motor) วิธีที่ง่ายที่สุดคือใช้ทรานซิสเตอร์ จัดการได้เพราะเรามี PWM นะตัวนี้ PWM (Pulse-Width Modulation) คือสัญญาณที่มีรอบหน้าที่แปรเปลี่ยนได้ (variable duty cycle) ถ้าเราเอาเจ้านี่คู่กับทรานซิสเตอร์ เราก็ควบคุมความเร็วมอเตอร์ได้สบายๆ
ดูวงจรตัวอย่างนี้หน่อย:
ในวงจรนี้ ขดลวด (inductor) นี่แทนตัวมอเตอร์เลย ขอบคุณสัญญาณ PWM ที่ทำให้มอเตอร์ไม่รู้สึกว่าได้ไฟ 12V เต็มๆ แต่แรงดันที่มันได้จะเป็นสัดส่วนกับค่า PWM พูดง่ายๆ แรงดันขึ้นอยู่กับรอบหน้าที่เราเรียกกันว่า δ (Duty Cycle)

รอบหน้าที่ว่าคืออันนี้แหละ:

มันคือตัวเลขตั้งแต่ 0 ถึง 1 แต่ส่วนใหญ่เราพูดเป็นเปอร์เซ็นต์ 0% ถึง 100% นั่นแหละ ตัวอย่างเช่น ถ้า δ = 0.5 (50%) และ Vmax = 12V มอเตอร์จะได้แรงดันประมาณ 6V แต่ถ้า δ = 1 (100%) มอเตอร์ก็จะได้ 12V เต็มๆ ซึ่ง δ = 1 นี่หมายความว่าสัญญาณมัน HIGH ตลอดเวลา ก็คือกลายเป็นไฟตรง (DC) ธรรมดา พลังงานก็จะเต็มที่สุดๆ ไปเลย
เจาะลึกเทคนิค (แบบเด็กช่าง)
- BJT-Saturation & PWM Duty-Cycle Harmonics:
สืบสวนการสวิตช์ของ NPN: ทรานซิสเตอร์ 2N2222 ตัวนี้ทำหน้าที่เหมือนประตูเปิด-ปิดความเร็วสูงของเมคคาทรอนิกส์ หลักฐานสำคัญคือเราต้องขับเบส $(\text{Pin } 13)$ ผ่านตัวต้านทาน $1\text{k}\Omega$ เพื่อให้แน่ใจว่าทรานซิสเตอร์เข้าสู่สถานะ "อิ่มตัว (Saturation)" เมื่อ $PWM$ เป็น HIGH การวิเคราะห์จะโฟกัสที่รอบหน้าที่ $(\delta)$ โดยที่แรงดันเฉลี่ยที่มอเตอร์ $(V_{\text{avg}})$ เป็นผลคูณตรงๆ ของ $V_{\text{max}} \times \delta$
จัดการฮาร์ดแวร์ไทเมอร์ที่ 5kHz: เพื่อกำจัดเสียงหวีดรบกวนจากการสวิตช์ (audible switching-whine) และเพิ่มความแข็งแกร่งของแรงบิด (torque-stiffness) ระบบนี้จะไม่ใช้ไลบรารีมาตรฐาน แต่จะไปจัดการรีจิสเตอร์ของ TIMER0 $(\text{CTC mode})$ โดยตรงแทน โดยสร้างอินเตอร์รัพท์ $(\text{ISR})$ ทุกๆ $2\mu\text{s}$ ระบบจะสร้างสัญญาณ PWM แบบกำหนดเองที่ $5\text{kHz}$ ด้วยความแม่นยำระดับไมโครวินาทีย่อย ทำให้ได้ฮาร์มอนิกส์ของความเร็วที่เหนือกว่าในช่วงการทำงาน $(30\% - 100\%)$ ทั้งหมด
- จัดการสไปค์จากขดลวด & ความสมบูรณ์ของสัญญาณ:
สืบสวนไดโอดฟลายแบ็ก 1N4007: มอเตอร์กระแสตรงเป็นโหลดแบบขดลวด (inductive load) ที่สร้างสไปค์แรงดันย้อนกลับมหาศาล $(-L \cdot di/dt)$ ขณะสวิตช์ความถี่สูง การวิเคราะห์ต้องรวมไดโอด 1N4007 ในรูปแบบต่อต้านขนาน (anti-parallel configuration) สะพานไดโอดแบบสืบสวนนี้จะอนุญาตให้กระแสจากขดลวดไหลวนได้อย่างปลอดภัยเมื่อ BJT ปิดอยู่ ป้องกันไม่ให้ฮาร์มอนิกส์ของแรงดันชั่วขณะ (transient-voltage harmonics) มาทำลายรอยต่อเซมิคอนดักเตอร์แบบย่อยยับ
ฮิวริสติกส์การลดคลื่นรบกวนบนเรลไฟ: เพื่อรักษาเสถียรภาพให้กับเรลไฟที่แชร์กันระหว่างลอจิกและแอคชูเอเตอร์ เราใส่ตัวเก็บประจุ $100\mu\text{F}$ ไว้ การวิเคราะห์เกี่ยวข้องกับการดูดซับกระแสริปเปิล (ripple-currents) ที่เกิดจากการเปลี่ยนขั้วของมอเตอร์ (commutation) เพื่อให้แน่ใจว่าการอ่านค่า $ADC$ ของ Arduino จากโพเทนชิออมิเตอร์จะปราศจากสัญญาณรบกวนและมีค่าแน่นอน
วิธีทำ! (จัดไปวัยรุ่น)
- ฮาร์ดแวร์
ฮาร์ดแวร์ไม่ต้องใช้อะไรมาก ประกอบด้วย:
- ทรานซิสเตอร์ 1 ตัว: เพื่อผลลัพธ์ที่ดีควรเป็นทรานซิสเตอร์สวิตช์ความเร็วสูง เช่น 2n2222
- ไดโอด (D1) 1 ตัว: ในกรณีนี้จำเป็นเพราะเราใช้มอเตอร์ซึ่งมันก็คือขดลวดชนิดนึง พอเราควบคุมขดลวดด้วยคลื่นสี่เหลี่ยม มันจะสร้างสไปค์แรงดันสูงขึ้นมาได้ ซึ่งอาจทำลายทรานซิสเตอร์ได้ ไดโอดตัวนี้จะจัดการสไปค์พวกนั้นให้
- ตัวต้านทานเบสสำหรับทรานซิสเตอร์ 1 ตัว: ตัวอย่างใช้ 1KΩ แต่ค่าที่ใกล้เคียงกันก็ใช้ได้เหมือนกัน ห้ามช็อตนะตัวนี้
- ซอฟต์แวร์
ในกรณีนี้เราอาจใช้สัญญาณ PWM ของ Arduino ได้ แต่มันมีความถี่ประมาณ 1kHz ซึ่งอาจได้ยินเสียงมอเตอร์ดังเอี๊ยดๆ ดังนั้นใช้ความถี่ที่สูงกว่านี้จะดีกว่า พี่จะใช้ Internal Timer ของ Arduino เองเพื่อสร้าง สัญญาณ PWM แบบเฉพาะของเราเอง สู้งานนะน้อง
ถ้าอยากรู้เรื่อง Timer มากขึ้น ลองไปดูโปรเจคของพี่ได้: Internal Timer
พี่สร้าง PWM ความถี่ 5kHz จาก Arduino ด้วย TIMER0 นี่แหละ
TCCR0A = (1 << WGM01); //Set the CTC mode
OCR0A = 0x04; //Value for ORC0A for 2us
TIMSK0 |= (1 << OCIE0A); //Set the interrupt request
sei(); //Enable interrupt
TCCR0B |= (1 << CS01); //Set the prescale 1/8 clock
TCCR0B |= (0 << CS00); //Now timer is on
เสร็จแล้วพี่ก็สร้าง ISR (Interrupt Request Service) ให้ทำงานทุกๆ 2μs
ISR(TIMER0_COMPA_vect) { //This is the interrupt request
timer++; //+1 every 2 us
if (timer <= (percent * 2)) // The duty cycle depends on the value
// of "percent" which represent the per cent
// of duty cylce that we have requested
digitalWrite(13, HIGH);
else
digitalWrite(13, LOW);
if (timer >= 200) timer = 0; //Every 200us reset the timer value
}
เราจะมีโพเทนชิโอมิเตอร์ (Potentiometer) ไว้วบค่า Duty Cycle กับมีปุ่มกดสำหรับควบคุมสถานะ ในชุด Elegoo's kit พี่เจอจอยสติ๊กที่มีปุ่มกดกับโพเทนชิโอมิเตอร์สองตัว เลยเอามาใช้เลยจ้า


วิศวกรรมและการนำไปใช้ (Engineering & Implementation)
- การชดเชยแรงบิดและการวินิจฉัยตอนเริ่มต้น (Torque-Compensation & Startup Diagnostics):
การลดผลกระทบจากฮาร์มอนิกส์ที่จุดหยุดนิ่ง (Stall-Point Mitigation Harmonics): มอเตอร์ DC ส่วนใหญ่จะมีแรงเสียดทานที่ไม่เป็นเชิงเส้น $(\text{มักจะต่ำกว่า } 30\% \delta)$ วิธีแก้คือเขียนโค้ด "Kick-Start" วินิจฉัย โดยให้มอเตอร์ทำงานที่ Duty Cycle $100\%$ สั้นๆ ประมาณ $100\text{ms}$ ก่อนจะปรับไปที่ความถี่ PWM ที่ผู้ใช้เลือก
การวิเคราะห์การแปลงสัญญาณอนาล็อกเป็นดิจิทัล (Analog-to-Digital Mapping Analytics): ความเร็วควบคุมผ่านโพเทนชิโอมิเตอร์แบบหมุน ต้องทำการแมปค่าอินพุตอนาล็อก 10-bit $(\text{0-1023})$ ให้เข้ากับช่วง Duty Cycle PWM ที่เฉพาะเจาะจง เพื่อให้อินเทอร์เฟซระหว่างคนกับเครื่อง (HMI) ให้ความรู้สึกเร่งแบบเส้นตรง (linear-acceleration harmonics) โดยไม่มีจุดตาย (dead-zones)
- การจัดการความร้อนความเร็วสูง (High-Speed Thermal Management):
การนำไปใช้เน้นที่ขีดจำกัดความร้อนของทรานซิสเตอร์ 2N2222 ต้องตรวจสอบความถี่ PWM ให้แน่ใจว่าการสูญเสียจากการสวิตช์ (switching-losses) ไม่ทำให้อุณหภูมิรอยต่อ $T_j$ (Junction Temperature) สูงเกินไป เพื่อรักษาประสิทธิภาพสูงสุดระหว่างการทำงานของมอเตอร์ภายใต้โหลดสูงต่อเนื่อง
ตอนนี้มีปัญหานะเฟ้ย! (NOW THERE IS A PROBLEM!)
ตอนนี้ซอฟต์แวร์ต้องคำนวณให้สอดคล้องกับความเป็นจริง เพราะฉะนั้นมีข้อจำกัดสำคัญสองข้อ:
- เราใช้ช่วง PWM ไม่ได้เต็ม 100% แต่ใช้ได้แค่จาก 100% ถึง 30% เพราะต่ำกว่า 30% มอเตอร์จะหยุด (อันนี้ขึ้นอยู่กับชนิดของมอเตอร์นะ)
- เราต้องสร้างฟังก์ชันที่สตาร์ทมอเตอร์โดยไม่ใช้ PWM ก่อน เช่น ให้มอเตอร์วิ่งที่ความเร็วสูงสุด 1 วินาที แล้วค่อยควบคุมด้วย PWM เพราะเราไม่สามารถสตาร์ทมอเตอร์ด้วย PWM 30% ได้นั่นเอง
ด้วยเหตุผลเหล่านี้ พี่เลยย้ายโค้ดควบคุม PWM ออกจาก ISR ไปไว้ในฟังก์ชัน loop() แทน ใน ISR พี่เหลือแค่ timer++ เท่านั้น ดูโค้ดเต็มๆ ด้านล่างเลย
และนี่คือผลลัพธ์สุดท้าย จัดไปวัยรุ่น!
สรุปสั้นๆ อย่าให้ยาว
Transistor-Torque นี่แหละตัวดี จัดเต็มในเรื่อง Elementary Power-Drive Design เลยนะตัวนี้ พอเจอเขยิบมาเจาะลึก BJT-Switching Forensics กับ 5kHz Hardware-Timer Orchestration แบบนี้ Marcazzan_M ก็เลยปั้นคอนโทรลเลอร์ควบคุมความเร็วออกมาได้แบบจัดจ้าน ระดับมืออาชีพเลยทีเดียว งานนี้บอกเลยว่าควบคุมการเคลื่อนไหวได้แม่นยำสุดๆ ด้วยการวินิจฉัยฮาร์ดแวร์ขั้นสูง
Kinetic Precision: ควบคุมมอเตอร์ให้อยู่หมัดด้วยการสืบสวน BJT แบบสายช่างตัวจริง