/*F28335的脉冲捕获模块–eCAP,通过捕获脉冲的上升沿与下降沿,来计算脉冲的宽度、占空比、频率。
F28335一共有6组eCAP模块,每个eCAP不止具有输入捕获功能,还具有PWM输出。
在150Mhz下,32位时基的时间分辨率为6.67ns
4组32位的时间标志寄存器,4组捕获时间序列,均可以产生中断。
软件配置一次捕获可以获取4个捕获时间。
在不用做CAP功能时,可配置成一个单通道输出的PWM,称作APWM。
CAP1、CAP2寄存器作为主要的周期和比较寄存器,CAP3、CAP4寄存器作为周期和比较寄存器的影子寄存器。
//-----------------------------------------------------------------------------------------------
先看看eCAP的寄存器:
TSCTR:时间标志寄存器,捕捉事件的时间标志
CTRPHS:计数相位控制寄存器,
CAP1:捕获寄存器1,在CAP模式中,加载捕获事件中的时间标志(TSCTR的值);在APWM下起到APRD作用,周期寄存器;
CAP2:捕获寄存器2,在CAP模式中,加载捕获事件中的时间标志(TSCTR的值);在APWM模式下起到ACMP的作用,比较寄存器;
CAP3:捕获寄存器3,在CAP模式中,加载捕获事件中的时间标志(TSCTR的值);在APWM下起到APRD的影子寄存器作用;
CAP4:捕获寄存器4,在CAP模式中,加载捕获事件中的时间标志(TSCTR的值);在APWM下起到ACMP的影子寄存器作用;
ECCTL1:eCAP控制寄存器1,主要控制输入信号分频系数(1-62分频)、CAPx的重置计数器,捕获极性(上升/下降)选择x=1,2,3,4
ECCTL2:eCAP控制寄存器2,主要控制在APWM下的输出极性、CAP与APWM模式选择、计数器的设置以及选择连续/单次模式。
ECEINT:eCAP中断使能寄存器。
ECFLG:eCAP的中断标志寄存器。
ECCLR:中断清除寄存器
ECFRC:强制中断寄存器
按照下列设置,当检测到脉冲第一个上升沿时,将TSCTR的值传递给CAP1,第一个下降沿,将TSCTR的值传递给CAP2,
第二个上升沿时,将TSCTR的值传递给CAP3,第二个下降沿时,将TSCTR的值传递给CAP4,并触发中断。
在中断结束后,清除TSCTR的数据,继续1->2->3->4->1的循环。
由于TSCTR计数是在系统主频下,进行计数;
可以得知,两个CAPx之间的差值*(1/SYSCLK)= 两次捕获的间隔时间;
*/
void InitECapture()
{
InitECap1Gpio();
ECap1Regs.ECEINT.all = 0x0000; //禁止所有CAP的中断
ECap1Regs.ECCLR.all = 0xFFFF; //清除所有CAP的中断标志
ECap1Regs.ECCTL1.bit.CAPLDEN = 0; //禁止捕获单元
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; //停止时间计数器
// 配置CAP寄存器
ECap1Regs.ECCTL2.bit.CONT_ONESHT = 1; // 单次模式
ECap1Regs.ECCTL2.bit.STOP_WRAP = 3; // 单次模式下,在CAP4的捕捉事件发生后产生停止信号
ECap1Regs.ECCTL1.bit.CAP1POL = 1; // 设置CAP1为下降沿捕获
ECap1Regs.ECCTL1.bit.CAP2POL = 0; // 设置CAP2为上升沿捕获
ECap1Regs.ECCTL1.bit.CAP3POL = 1; // 设置CAP3位下降沿捕获
ECap1Regs.ECCTL1.bit.CAP4POL = 0; // 设置CAP4为上升沿捕获
ECap1Regs.ECCTL1.bit.CTRRST1 = 0; // CAP1捕获事件后重置计数器
ECap1Regs.ECCTL1.bit.CTRRST2 = 0; // CAP2捕获事件后重置计数器
ECap1Regs.ECCTL1.bit.CTRRST3 = 0; // CAP3捕获事件后重置计数器
ECap1Regs.ECCTL1.bit.CTRRST4 = 1; // CAP4捕获事件后重置计数器
ECap1Regs.ECCTL1.bit.PRESCALE = 0; // 不分频
ECap1Regs.ECCTL2.bit.SYNCI_EN = 1; // 使能同步信号输入
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0; // 选择同步输入事件为同步信号输出
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // 启用捕获单元
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // 启动计数器
ECap1Regs.ECCTL2.bit.REARM = 1; // 强制单次模式
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // 启动捕获单元
ECap1Regs.ECEINT.bit.CEVT4 = 1; // 使能捕获事件4中断
}
__interrupt void ecap1_isr(void)
{
Uint32 t1,t2,t3,t4,T1;
float freq,duty;
t1 = ECap1Regs.CAP1;
t2 = ECap1Regs.CAP2;
t3 = ECap1Regs.CAP3;
t4 = ECap1Regs.CAP4;
T1 = (t3 - t1);
freq = (150000/T1)*1000; //得到脉冲频率
duty = (t2 - t1)*100/T1; //得到百分比的结果
//清除中断标志
ECap1Regs.ECCLR.bit.CEVT4 = 1;
ECap1Regs.ECCLR.bit.INT = 1;
// Acknowledge this interrupt to receive more interrupts from group 4
PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}