F280049C的捕獲模塊功能強大,既可以實現捕獲功能的輸入,又可以實現APWM的輸出。作爲捕獲功能時,可以實現對信號脈寬、週期、頻率、佔空比的測量。還可以用來對外界邊沿信號的捕獲。
特點:
- 任何一個GPIO引腳都可以配置作爲捕獲的輸入引腳,可設置爲上升沿、下降沿捕獲。使用起來很方便。
- 每一個捕獲模塊都擁有一個32位的時間戳(time stamps)計數器,計數頻率爲CPU主頻。
- 每一個捕獲模塊都包含四個捕獲事件寄存器,捕獲到信號時會裝載此時的計數值到32位的CAPx寄存器中。
- 捕獲模式包含的中斷源有:CEVT1-CEVT4中斷、計數器溢出中斷。
示例圖如下所示:
(1)引腳配置
我配置的是GPIO5引腳作爲捕獲的輸入,使用了X-BAR的INPUT1輸入通道。
相關的配置如下所示:
void InitECapGpio(void)
{
EALLOW;
InputXbarRegs.INPUT1SELECT = 5; //使用INPUT1--GPIO5引腳
GpioCtrlRegs.GPADIR.bit.GPIO5 = 0; //配置爲輸入
GpioCtrlRegs.GPAPUD.bit.GPIO5 = 0; //配置爲上拉
GpioCtrlRegs.GPAQSEL1.bit.GPIO5 = 3; //GPIO配置爲非同步模式
EDIS;
}
- 配置INPUT1對應到GPIO5引腳
- 配置GPIO5引腳作爲上拉輸入模式
- 配置eCAP的ECCTL0[INPUTSEL]寄存器
(2)eCAP初始化配置
程序源代碼如下所示:
void InitECap(void)
{
EALLOW;
ECap1Regs.ECCTL0.bit.INPUTSEL = 0; //ECap1捕獲引腳對應到INTPUT1
ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING; //上升沿捕獲
ECap1Regs.ECCTL1.bit.CAP2POL = EC_FALLING; //下降沿捕獲
ECap1Regs.ECCTL1.bit.CAP3POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CAP4POL = EC_RISING;
ECap1Regs.ECCTL1.bit.CTRRST1 = EC_ABS_MODE; //捕獲到事件不清空計數器
ECap1Regs.ECCTL1.bit.CTRRST2 = EC_ABS_MODE;
ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE; //使能裝載
ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1; //輸入信號不分頻
ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE; //配置爲捕獲模式
ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS; //連續計數模式
ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; //時間戳計數器自由運行
ECap1Regs.ECEINT.bit.CEVT3 = 1; //事件3中斷捕獲使能
EDIS;
}
eCAP配置示意圖如下所示:
配置步驟:
- 配置捕獲信號極性,分別配置了事件1(上升沿捕獲)、事件2(下升沿捕獲)、事件3(上升沿捕獲)
- 捕獲到事件後計數器不清零。不使用Delta模式(捕獲到事件後計數器清零)
- 捕獲信號後計數器裝載使能(捕獲到事件後從計數器裝載計數值到捕獲寄存器)
- 輸入信號分頻設置
- 配置爲捕獲模式
- 配置爲連續計數模式(捕獲到事件後事件計數器加一,0->1->2->3->0)
- 只使用一個捕獲模塊,不需要使用同步功能(使用多個捕獲模塊是按需求使用捕獲模塊。同步功能主要是用來同步計數器)
- 配置計數器爲連續計數模式(計數器從0x00000000->0xFFFFFFFF),計滿最大值後會產生計數溢出中斷(if enable)
(3)中斷配置
本例程中配置的是事件3觸發中斷,相應的配置程序如下所示:
中斷入口配置:
EALLOW; // This is needed to write to EALLOW protected register
PieVectTable.ECAP1_INT = &ECap1ISR;
EDIS;
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;
IER |= M_INT4; // Enable CPU Interrupt 1
PieCtrlRegs.PIEACK.bit.ACK4 = 1;
中斷函數配置:
__interrupt void ECap1ISR(void)
{
ECap1Regs.ECCLR.bit.INT = 1;
Tst1 = ECap1Regs.CAP1; //讀取捕獲時刻的計數值
Tst2 = ECap1Regs.CAP2;
Tst3 = ECap1Regs.CAP3;
if(Tst2>Tst1&&Tst3>Tst2)
{
Proid = Tst3 - Tst1;
duty = (Tst2 - Tst1)*1.0/Proid;
}
PieCtrlRegs.PIEACK.bit.ACK4 = 1;
}
中斷函數中主要是讀取CAP寄存器中的值,用於計算信號的脈寬頻率;還需要清除中斷標誌位,以及全局中斷應答。
注:F280049C實現捕獲功能的完整CCS程序我已經上傳到了CSDN上,該程序主要是實現對方波信號脈寬、頻率的測量。需要的可自行下載哈,程序中有不懂得地方都可以給我留言。下載鏈接如下:
https://download.csdn.net/download/fanxianyan1993/11978084
提問方式:有啥不懂的可以隨時向我提問哈,掃描下方二維碼我會在第一時間給大家回覆的哈,謝謝。