CCS Note 04: Using eCAP Module to Detect the PWM Duty
教學
如何使用F2837xD eCAP模組操作在Capture Mode偵測PWM Duty Cycle
環境
本文使用
OS: Windows x64
Code Composer Studio Version: 11.1
開發板: LAUNCHXL-F28379D Development kit
C2000Ware_4_01_00_00 Example
教學文章列表
參考資料
TMS320F2837xD Dual-Core Delfino Microcontrollers Technical Reference Manual
LAUNCHXL-F28379D Overview User’s Guide (Rev. C)
The TMS320F2837xD Architecture: Achieving a New Level of High Performance
Section 1. 原理
Section 1.1 eCAP模組用途與介紹
- 旋轉機械轉速測量(透過Hall Sensor)
- 位置感測器Pulse時間間隔測量
- 週期或Duty量測
以下為eCAP模組特點:
- 4個32bit序列時間郵戳暫存器(按順序紀錄事件觸發時間)
- 可設定事件觸發極性(正緣或負緣觸發)
- 有事件觸發中斷功能
- Single-shot 與 Continuous 模式
- 可操作在APWM模式,作為single-channel PWM輸出
- 任何腳位都可作為eCAP輸入
APWM 模式介紹:
APWM 模式下 CAP1/CAP2 作為 active registers,CAP3/CAP4 作為 shadow registers
Section 1.2 Capture 模式介紹
Capture 模式下輸入腳位之脈波可以經過除頻(高頻訊號降頻用,提高解析度,除頻倍率N可選擇2–62),再輸入到eCAP模組。
Section 1.3 Capture One-shot / Continuous介紹
One-shot CEVT1–4觸發完,不重置凍結暫存器CAP1–4。可手動重置,繼續接受觸發。
Continuous CEVT1–4觸發完,自動重置暫存器CAP1–4,持續覆寫暫存器值。
Section 1.4 eCAP中斷介紹
有7項中斷觸發,CEVT1, CEVT2, CEVT3, CEVT4, CNTOVF, CTR=PRD, CTR=CMP
ECFLG顯示中斷Flag
需打開ECEINT暫存器,使用ECCLR清除中斷,ECFRC可強制進入中斷。
Section 1.5 eCAP偵測Duty與Peroid概念
須將計數器週期數值(tick)換算,才是週期(s)及頻率(Hz)
須將計數器週期數值(tick)換算,才是週期(s)及頻率(Hz)
須將計數器週期數值(tick)換算,才是週期(s)及頻率(Hz)
Section 1.6 會介紹換算方式
Absolute Time-Stamp Operation (絕對值模式)
紀錄絕對時間點(暫存器數值)
計算範例:
Period1 = t3 — t1 (計數器週期數值(tick))
Period2 = t5 — t3 (計數器週期數值(tick))
Duty Cycle1 (on-time %) = (t2 — t1) / Period1 x 100%
Duty Cycle1 (off-time %) = (t3 — t2) / Period1 x 100%
Time Difference (Delta) Operation (差值模式)
紀錄時間差(暫存器差)
計算範例:
Period1 = T1+T2 (計數器週期數值(tick))
Period2 = T3+T4 (計數器週期數值(tick))
Duty Cycle1 (on-time %) = T1 / Period1 x 100%
Duty Cycle1 (off-time %) = T2 / Period1 x 100%
Section 1.6 計數器週期值換算真實時間
基本上沒有特殊設定SYSCLK就等於CPU頻率
以 F28379D 操作在 200MHz下
頻率(Hz) = 200MHz / 計數器週期值
週期(s) = 計數器週期值 / 200MHz
Section 2. 程式講解
Step 1. eCAP 腳位初始化
使用以下程式碼來初始化eCAP GPIO輸入腳位(透過X-bar)
InitECap1Gpio(PIN);
GPIO_SetupPinOptions(PIN, GPIO_INPUT, GPIO_ASYNC);
Step 2. eCAP 模組設定
設定終止觸發事件
ECap1Regs.ECCTL2.bit.STOP_WRAP = 2; // Stop at 3rd event
設定事件觸發條件
ECap1Regs.ECCTL1.bit.CAP1POL = 0; // Rising edge
設定CAP暫存器模式
ECap1Regs.ECCTL1.bit.CTRRST1 = 1; // Difference operation
Cap1 自動為 Absolute Time-Stamp Operation (絕對值模式)
自動重載(重置暫存器)
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
需在重載時間點(可放於中斷結束前),使用以下代碼重載
ECap1Regs.ECCTL2.bit.REARM = 1;
啟用事件觸發中斷
ECap1Regs.ECEINT.bit.CEVT3 = 1; // 3rd event = __interrupt
Step 3. eCAP Time-stamp讀取
在程式中使用ECapXRegs.CAPY 就可以將CAP1–4之值讀取出來了
使用範例如下,計算一PWM之duty cycle(相應Step2設定)
溫馨提醒,用於數值運算記得轉型
因為本身暫存器值可能為integer資料型態
若無轉型可能會出現運算結果異常使用" (float) " 可強制轉型