Cấu hình và điều khiển mô-đun ePWM trên vi điều khiển TMS320F28x

Mô-đun ePWM (enhanced Pulse Width Modulation) trên dòng vi điều khiển TMS320F28x là thành phần then chốt trong các ứng dụng điều khiển động cơ, nguồn điện kỹ thuật số và hệ thống truyền động chính xác. Bài viết này trình bày chi tiết cách vận hành, cấu hình và lập trình mô-đun này dựa trên kiến trúc phần cứng và thanh ghi đặc biệt của nó.

Các thanh ghi điều khiển thời cơ bản

  • TBCTR — Thanh ghi đếm thời cơ: Lưu giá trị đếm hiện tại của bộ đếm thời cơ, dùng để xác định pha và chu kỳ tín hiệu PWM.
  • TBPRD — Thanh ghi chu kỳ thời cơ: Xác định giá trị cuối cùng mà TBCTR đạt tới trước khi tái khởi động hoặc đổi hướng đếm. Giá trị thực tế của chu kỳ PWM phụ thuộc vào chế độ đếm (lên, xuống hoặc lên-xuống).
  • TBPHS — Thanh ghi pha thời cơ: Cho phép thiết lập độ lệch pha ban đầu cho tín hiệu PWM, hỗ trợ đồng bộ hóa giữa nhiều kênh ePWM.
  • CMPA / CMPB — Các thanh ghi so sánh A và B: Dùng để xác định thời điểm thay đổi trạng thái mức cao/thấp trên hai chân đầu ra ePWMAePWMB.
  • ePWMxSYNCI — Tín hiệu đồng bộ đầu vào: Có thể được lấy từ chân ngoài (ví dụ: ePWM1) hoặc từ đầu ra đồng bộ của mô-đun khác (ePWM2 nhận từ ePWM1, v.v.). Được kích hoạt bằng phần mềm qua bit PHSEN trong thanh ghi TBCTL.
  • ePWMxSYNCO — Tín hiệu đồng bộ đầu ra: Có thể được cấu hình để phát xung khi xảy ra một trong ba sự kiện: TBCTR == 0, TBCTR == CMPB, hoặc tiếp nhận tín hiệu ePWMxSYNCI.

Các tín hiệu điều kiện quan trọng

Bốn tín hiệu điều kiện sau đây được sử dụng bởi hai khối chức năng chính:

  • TBCTR == TBPRD → Kích hoạt sự kiện CTR_PRD
  • TBCTR == 0 → Kích hoạt sự kiện CTR_ZERO
  • TBCTR == CMPA → Kích hoạt sự kiện CTR_CMPA
  • TBCTR == CMPB → Kích hoạt sự kiện CTR_CMPB

Các tín hiệu này được đưa vào:

  • AQCTLA / AQCTLB: Để xác định hành vi đầu ra (SET/CLEAR/TOGGLE) trên ePWMAePWMB tại từng thời điểm cụ thể.
  • ETSEL: Để chọn điều kiện ngắt (ví dụ: ET_CTR_PRD, ET_CTR_ZERO) và bật/tắt ngắt tương ứng.

Các chế độ đếm thời cơ

1. Chế độ đếm lên-xuống (TB_COUNT_UPDOWN)

Bộ đếm tăng dần từ 0 đến TBPRD, sau đó giảm dần về 0 và lặp lại. Đây là chế độ phổ biến nhất trong điều khiển động cơ xoay chiều vì tạo ra dạng sóng đối xứng và dễ dàng sinh tín hiệu PWM hai pha lệch nhau 180°.

2. Chế độ đếm lên (TB_COUNT_UP)

Bộ đếm tăng từ 0 đến TBPRD, rồi tự động đặt lại về 0. Phù hợp với các ứng dụng yêu cầu dạng sóng đơn cực (single-ended), ví dụ như điều khiển tốc độ quạt hoặc đèn LED.

3. Chế độ đếm xuống (TB_COUNT_DOWN)

Bộ đếm bắt đầu từ giá trị TBPRD, giảm dần về 0, sau đó nạp lại TBPRD. Ít phổ biến hơn nhưng hữu ích trong một số thuật toán điều khiển đặc biệt hoặc khi cần đảo pha tín hiệu mà không thay đổi logic AQ.

Cấu hình AQ để điều khiển đầu ra PWM

Khối Action Qualifier (AQ) quyết định hành vi đầu ra tại mỗi sự kiện. Ví dụ, để tạo dạng sóng PWM chuẩn với cạnh lên ở đầu chu kỳ và cạnh xuống tại điểm so sánh:

// Cấu hình ePWM6 cho tín hiệu đơn cực, chế độ đếm lên
EPwm6Regs.TBPRD = 999;                      // Chu kỳ = 1000 chu kỳ TBCLK
EPwm6Regs.CMPA.half.CMPA = 250;             // Độ rộng xung A = 25% chu kỳ
EPwm6Regs.CMPB = 750;                       // Độ rộng xung B = 75% chu kỳ
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;
EPwm6Regs.AQCTLA.bit.ZRO = AQ_SET;          // Tại CTR=0 → ePWMA = HIGH
EPwm6Regs.AQCTLA.bit.CAU = AQ_CLEAR;        // Tại CTR=CMPA → ePWMA = LOW
EPwm6Regs.AQCTLB.bit.ZRO = AQ_SET;          // Tại CTR=0 → ePWMB = HIGH
EPwm6Regs.AQCTLB.bit.CBU = AQ_CLEAR;        // Tại CTR=CMPB → ePWMB = LOW

Cấu hình đồng bộ và ngắt cho ePWM1

Ví dụ dưới đây minh họa cách thiết lập ePWM1 làm master đồng bộ cho các kênh khác, kết hợp với ngắt theo chu kỳ:

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;   // Tạm dừng tất cả clock TB
EDIS;

InitEPwmGpio();  // Khởi tạo chân GPIO cho ePWM1

// Cấu hình thời cơ
EPwm1Regs.TBPRD = 1999;                           // Chu kỳ = 2000 TBCLK
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;   // Đếm lên-xuống
EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW;           // Dùng shadow register cho TBPRD
EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;
EPwm1Regs.TBPHS.half.TBPHS = 0;

// Cấu hình so sánh
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

// Cấu hình AQ cho dạng sóng đối xứng
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;  // Lên → chạm CMPA → LOW
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;    // Xuống → chạm CMPA → HIGH
EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR;  // Lên → chạm CMPB → LOW
EPwm1Regs.AQCTLB.bit.CBD = AQ_SET;    // Xuống → chạm CMPB → HIGH

// Cấu hình ngắt
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_PRD;     // Ngắt khi TBCTR == TBPRD
EPwm1Regs.ETSEL.bit.INTEN = 1;
EPwm1Regs.ETPS.bit.INTPRD = ET_1ST;

// Kích hoạt lại clock thời cơ
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
EDIS;

Tính toán tần số và độ rộng xung

Tần số tín hiệu PWM được tính theo công thức:

f_PWM = f_SYSCLK / (TBCLKDIV × HSPCLKDIV × (TBPRD + 1) × N)

Trong đó:

  • f_SYSCLK: Tần số xung nhịp hệ thống
  • TBCLKDIV, HSPCLKDIV: Hệ số chia clock thời cơ
  • N = 1 nếu đếm lên hoặc xuống; N = 2 nếu đếm lên-xuống

Độ rộng xung (duty cycle) được điều chỉnh bằng cách thay đổi giá trị trong CMPA hoặc CMPB:

EPwm1Regs.CMPA.half.CMPA = (Uint16)(TBPRD * duty_ratio);  // 0.0 ≤ duty_ratio ≤ 1.0
EPwm1Regs.CMPB = (Uint16)(TBPRD * duty_ratio);

Ghi chú lập trình quan trọng

  • Luôn sử dụng EALLOW/EDIS khi truy cập các thanh ghi bảo vệ (như PCLKCR0).
  • Đảm bảo clock thời cơ đã được bật trước khi cấu hình ePWM (TBCLKSYNC = 1).
  • Ngắt ePWM phải được đăng ký trong bảng vector ngắt PIE và bật ở cả cấp PIE và CPU (PIEIER3.bit.INTx1, IER).
  • Các thanh ghi shadow (TBPRD, CMPA, CMPB) chỉ được cập nhật khi điều kiện tải (LOADxxMODE) thỏa mãn — thường là tại TBCTR == 0 hoặc TBCTR == TBPRD.

Thẻ: ePWM TMS320F28x PWM-control C2000 embedded-c

Đăng vào ngày 2 tháng 7 lúc 19:55