DSP28335 eCAP 测频
F28335共有6组eCAP模块,每个eCAP不但具有捕获功能,而且还可用作PWM输出功能。F28335捕获模块的主要特征如下:
1. 150MHz系统时钟的情况下,32位时基的时间分辨率为6.67ns;
2. 4组32位的时间标志寄存器;
3. 4级捕获事件序列,可以灵活配置捕获事件边沿极性;
4. 四级触发事件均可以产生中断;
5. 软件配置一次捕获可以最多得到4个捕获时间;
6. 可连续循环4级捕获;
7. 绝对时间捕获;
8. 不同模式的时间捕获;
9. 所有捕获都发生在一个输入引脚上;
10. 如果eCAP模块不作捕获使用,可以配置成一个单通道输出的PWM模式。
eCAP模块中一个捕获通道完成一次捕获任务,需要以下关键资源:
1、专用捕获输入引脚;
2、32位时基(计数器);
3、4*32位时间标签捕获寄存器;
4、4级序列器,与外部eCAP引脚的上升/下降沿同步;
5、4个事件可独立配置边沿极性;
6、输入捕获信号预定标(2-62);
7、一个2位的比较寄存器,一次触发后可以捕获4个时间标签事件;
8、采用4级深度的循环缓冲器以进行连续捕获;
9、4个捕获事件中任意一个都可以产生中断。
DSP2833x_SysCtrl.h
// Peripheral clock control register 1 bit definitions: struct PCLKCR1_BITS { // bits description Uint16 EPWM1ENCLK:1; // 0 Enable SYSCLKOUT to EPWM1 Uint16 EPWM2ENCLK:1; // 1 Enable SYSCLKOUT to EPWM2 Uint16 EPWM3ENCLK:1; // 2 Enable SYSCLKOUT to EPWM3 Uint16 EPWM4ENCLK:1; // 3 Enable SYSCLKOUT to EPWM4 Uint16 EPWM5ENCLK:1; // 4 Enable SYSCLKOUT to EPWM5 Uint16 EPWM6ENCLK:1; // 5 Enable SYSCLKOUT to EPWM6 Uint16 rsvd1:2; // 7:6 reserved Uint16 ECAP1ENCLK:1; // 8 Enable SYSCLKOUT to ECAP1 系统时钟150MHz Uint16 ECAP2ENCLK:1; // 9 Enable SYSCLKOUT to ECAP2 Uint16 ECAP3ENCLK:1; // 10 Enable SYSCLKOUT to ECAP3 Uint16 ECAP4ENCLK:1; // 11 Enable SYSCLKOUT to ECAP4 Uint16 ECAP5ENCLK:1; // 12 Enable SYSCLKOUT to ECAP5 Uint16 ECAP6ENCLK:1; // 13 Enable SYSCLKOUT to ECAP6 Uint16 EQEP1ENCLK:1; // 14 Enable SYSCLKOUT to EQEP1 Uint16 EQEP2ENCLK:1; // 15 Enable SYSCLKOUT to EQEP2 };
由上面代码可知eCAP模块的时钟为系统时钟,时基是6.67ns
#define EC_RISING 0 //上升沿电平值 #define EC_FALLING 1 //下降沿电平值 #define EC_ABS_MODE 0 //在CAPx事件中不重置计数器 #define EC_ENABLE 1 //使能在捕获事件中加载CAP1-4寄存器的时间 #define EC_DIV1 00000 //输入信号分频选择 不分频 #define EC_CAP_MODE 0 //ECAP工作于捕获工作模式 #define EC_CONTINUOUS 0 //0为连续模式 1为单次模式 #define EC_SYNCO_DIS 2 //同步输出选择: 10、11屏蔽同步信号输出 #define EC_DISABLE 0 //屏蔽同步输入操作 #define EC_RUN 1 //1计数器启动 0计数器停止
以上代码为宏定义
void InitECAP() { SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;//使能eCAP1 SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 1;//使能eCAP2 // SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 1;//使能eCAP3 // SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 1;//使能eCAP4 // SysCtrlRegs.PCLKCR1.bit.ECAP5ENCLK = 1;//使能eCAP5 // SysCtrlRegs.PCLKCR1.bit.ECAP6ENCLK = 1;//使能eCAP6 IER |= M_INT4;// ECap1Regs.ECEINT.all = 0x0000; // Disable all capture interrupts ECap1Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags ECap1Regs.ECCTL1.bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // Make sure the counter is stopped SetCap1(); SetCap2(); } void SetCap1() { ECap1Regs.ECCTL1.bit.CAP1POL = EC_RISING; //一级事件捕捉上升沿 ECap1Regs.ECCTL1.bit.CAP2POL = EC_RISING; //二级事件捕捉上升沿 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.CTRRST3 = EC_ABS_MODE; //三级事件捕捉后不清零计数器 ECap1Regs.ECCTL1.bit.CTRRST4 = EC_ABS_MODE; //四级事件捕捉后不清零计数器 ECap1Regs.ECCTL1.bit.CAPLDEN = EC_ENABLE; //使能事件捕捉时捕捉寄存器装载计数器值 ECap1Regs.ECCTL1.bit.PRESCALE = EC_DIV1; //对外部信号不分频 ECap1Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE; //捕捉模式ECAP ECap1Regs.ECCTL2.bit.CONT_ONESHT = EC_CONTINUOUS; //连续模式 ECap1Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS; //屏蔽同步信号输出 ECap1Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE; //屏蔽同步输入操作 ECap1Regs.ECEINT.all=0x0000; //关闭所有 CAP 中断 ECap1Regs.ECCLR.all=0xFFFF; //清除所有中断标志位 ECap1Regs.ECCTL2.bit.TSCTRSTOP = EC_RUN; //启动 CAP 计数器 ECap1Regs.ECEINT.bit.CEVT4=1; //使能四级事件中断,即当发生第四次捕捉时进入中断 }
在四级事件后进中断
interrupt void ECAP1_INT_ISR(void) // ECAP-1 { // Insert ISR Code here Uint32 t1,t2,t3,t4,T1,T2; t1 = ECap1Regs.CAP1; t2 = ECap1Regs.CAP2; t3 = ECap1Regs.CAP3; t4 = ECap1Regs.CAP4; T1 = t2-t1; T2 = t4-t3; // To receive more interrupts from this PIE group, acknowledge this interrupt PieCtrlRegs.PIEACK.all = PIEACK_GROUP4; ECap1Regs.ECCLR.all=0xFFFF; //clare all flag }