- หน้าแรก
- คลังความรู้
- อิเล็กทรอนิกส์กำลัง
- ควบคุมแบบดิจิทัล
// บทที่ 15.13 · อิเล็กทรอนิกส์กำลัง · Digital Control
ควบคุมคอนเวอร์เตอร์ DC-DC แบบดิจิทัล: ADC, DPWM, Limit Cycle, Tustin และโค้ด PI
จังหวะสุ่มสัญญาณ ดีเลย์ ความละเอียด DPWM กับ limit cycle แปลงตัวชดเชยด้วย Tustin โค้ด PI พร้อม anti-windup การป้องกันในฮาร์ดแวร์ และขั้นตอน bring-up
- สุ่มกลางช่วง ON/OFF ได้ค่าเฉลี่ย iL โดยไม่ต้องกรอง
- ดีเลย์ กินเฟส
- ไม่เกิด limit cycle: DPWM ต้องละเอียดกว่า ADC
- OCP ต้องอยู่ในฮาร์ดแวร์ ไม่ผ่าน CPU
โครงสร้าง
ADC สุ่ม (และ ) → ตัวชดเชยดิจิทัล → DPWM (ตัวนับ) → gate driver
สิ่งที่ต่างจากอนาล็อก: (1) delay จากการสุ่ม-คำนวณ-อัปเดต (2) quantization ทั้ง ADC และ PWM (3) aliasing
จังหวะการสุ่ม
สุ่ม ตรงกลางช่วง ON หรือ OFF (ใช้ trigger จาก timer PWM) จะได้ค่าเฉลี่ยของ โดยไม่ต้องกรอง และหลบหนามจากการสวิตช์ — เป็นเทคนิคมาตรฐานของ C2000/STM32 HRTIM/dsPIC
Delay รวมโดยประมาณ (ZOH) → เฟสหาย เช่น kHz, , kHz → เสียเฟส 27°
ความละเอียดและ limit cycle
ความละเอียดแรงดันขาออกจาก DPWM (buck): โดย เงื่อนไขไม่เกิด limit cycle: (PWM ละเอียดกว่า ADC) + ตัวควบคุมต้องมีอินทิเกรเตอร์ และ gain ของอินทิเกรเตอร์ไม่สูงเกิน
ตัวอย่าง: clock 170 MHz, kHz → 850 count (≈9.7 บิต) → mV ขณะที่ ADC 12 บิตกับตัวแบ่ง 3.3/15 V → 3.7 mV ⇒ เกิด limit cycle! ต้องใช้ High-resolution PWM (HRTIM 184 ps ใน STM32G4, HRPWM ใน C2000 ~150 ps) หรือ dithering
แปลงตัวชดเชยต่อเนื่อง → ดิจิทัล
Tustin (bilinear) พร้อม prewarp ที่ :
Z1 Tustin (bilinear) transform การแปลงบิลิเนียร์
ได้รูปทั่วไป (2P2Z / 3P3Z):
Z2 2P2Z / 3P3Z difference equation สมการผลต่างของตัวชดเชย
หรือออกแบบโดยตรงใน z-domain (direct digital design) เมื่อ ใกล้
โค้ด PI ภาษา C (จุดลอยตัว, เรียกใน ISR ของ ADC)
typedef struct { float kp, ki_T, i, umin, umax; } PI;
static inline float pi_step(PI *c, float ref, float meas) {
float e = ref - meas;
float u = c->kp * e + c->i + c->ki_T * e; // ลอง output ก่อน
if (u > c->umax) u = c->umax; // clamp
else if (u < c->umin) u = c->umin;
else c->i += c->ki_T * e; // conditional integration = anti-windup
return u; // duty 0..Dmax
}
// ISR: duty = pi_step(&vloop, vref_soft, adc_to_volt(ADC1->DR));
// TIM->CCR1 = (uint32_t)(duty * PERIOD);
ซิมูเลเตอร์ของเว็บนี้ใช้อัลกอริทึมเดียวกัน (โหมด Voltage-mode PI) — ลองเพิ่ม Ki จนแกว่ง แล้วสังเกตผลของ soft-start
การป้องกันที่ต้องทำในฮาร์ดแวร์ ไม่ใช่ซอฟต์แวร์
OCP แบบ cycle-by-cycle ต้องใช้ comparator ภายใน MCU ต่อเข้าตัว PWM โดยตรง (fault input / blanking window) ไม่ผ่าน CPU — ซอฟต์แวร์ค้าง/รีเซ็ตต้องไม่ทำให้สวิตช์ค้าง ON
MCU ที่แนะนำ
ดูตารางเต็มที่ การเลือกตัวควบคุม — โดยสรุป: TI C2000 (F28003x/F28P55x/F28P65x), STM32G474 (HRTIM), Microchip dsPIC33CK/CH และ dsPIC33A เป็นสายที่ออกแบบมาเพื่อ power conversion โดยตรง; ESP32/Arduino เหมาะกับลูปช้า (MPPT, ชาร์จแบต, การสื่อสาร) แต่ไม่ควรใช้กับลูปกระแสเร็ว
ขั้นตอน bring-up
- รันลูปเปิด: ตรวจ ADC scaling, ทิศทาง, offset
- ปิดลูปด้วย gain ต่ำ, ต่ำ ผ่านแหล่งจ่ายจำกัดกระแส
- วัด Bode โดยฉีดสัญญาณในซอฟต์แวร์ (เพิ่ม sine ที่ค่าอ้างอิงหรือ duty — เหมือนฟังก์ชันเจนฯ ในซิม) แล้วอ่านกลับผ่าน DAC/UART
- ทดสอบ step load, ต่ำ-สูง, อุณหภูมิ
คำถามที่พบบ่อย
limit cycle ในคอนเวอร์เตอร์ดิจิทัลคืออะไร?
เมื่อ DPWM หยาบกว่า ADC แรงดันขาออกไม่มีระดับ duty ที่ตรงค่าอ้างอิงพอดี อินทิเกรเตอร์จึงกระโดดไปมาระหว่างสองระดับ เกิดการแกว่งความถี่ต่ำ แก้ด้วย high-resolution PWM หรือ dithering