博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DSP28335 eCAP 测频
阅读量:7221 次
发布时间:2019-06-29

本文共 4581 字,大约阅读时间需要 15 分钟。

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}

 

转载于:https://www.cnblogs.com/ylhwx/p/7781086.html

你可能感兴趣的文章
Luxand_FaceSDK_Documentation.pdf
查看>>
iOS下bound,center和frame
查看>>
sql 集合查询 数据更新操作语句
查看>>
REP 前缀
查看>>
js高级程序设计(六)面向对象
查看>>
C# JS URL 中文传参出现乱码的解决方法
查看>>
OO第三单元作业总结
查看>>
[译]从零开始成为数据科学家的9个步骤
查看>>
Python 10 MySQL数据库(一)
查看>>
Python 21 Flask(二)上下文管理详解
查看>>
C#+AE 调整TOCControl控件中图层的显示顺序
查看>>
Javascript闭包,比较好懂的一篇文章
查看>>
iOS 最新版 CocoaPods 的安装流程
查看>>
ArcGIS Server 内存占用相关
查看>>
结对开发----找一
查看>>
我的Android进阶之旅------>Android项目目录结构分析
查看>>
linux下配置apache多站点访问-小案例
查看>>
B树等介绍
查看>>
iOS应用性能调优的25个建议和技巧
查看>>
Kotlin中使用简洁明了的代码替换findViewByid
查看>>