TMS320F28335入门(七)eCAP学习

/*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;
}

你可能感兴趣的:(F28335学习)