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
提问方式:有啥不懂的可以随时向我提问哈,扫描下方二维码我会在第一时间给大家回复的哈,谢谢。