11369|5

2606

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

[转帖] F28335学习系列——Ecap使用总结 [复制链接]

作者: guicy    时间: 2011-7-15 09:18     标题: F28335学习系列——Ecap使用总结

28335 Ecap有好几个功能,

第一:捕获外部信号,可以设置为捕捉信号的上升还是下降沿,该功能一般最常用;

第二:计算外部方波信号的周期和占空比,在这里可以分别对CAP1CAP2CAP3CAP4上升沿或下降沿动作进行设置,当外部信号和当前CAPx设置一致时,并将当前CTR值赋给CAPx寄存器。这样,可以根据四个CAPx寄存器里面的值,进行捕获的方波信号周期和占空比的计算。另外,CTR的变化模式取决于ECap6Regs.ECCTL1.bit.CTRRSTx的设置,如果为‘0’,则动作匹配时,不复位CTR,将一直往上增加,直至溢出;如果为‘1’,则动作匹配时,复位CTR

如果,一个程序当中,四个CPAx均用到的话,假如:

CPA1:上升沿

CPA2:下降沿

CPA3:上升沿

CPA4:下降沿

对于输入信号,第一上升沿时,CPA1动作,并且产生CEVT1事件(如果该事件中断使能的话,则可以进入中断),同时将CTR数加载到CPA1中;接下来,下降沿时,CPA2动作,并且产生CEVT2事件(如果该事件中断使能的话,则可以进入中断),同时将CTR数加载到CPA2中;再接下来,上升沿时,CPA3动作,并且产生CEVT3事件(如果该事件中断使能的话,则可以进入中断),同时将CTR数加载到CPA3中;再接下来,下降沿时,CPA4动作,并且产生CEVT4事件(如果该事件中断使能的话,则可以进入中断),同时将CTR数加载到CPA4中;接下来在从CPA1往返动作。这时在一个循环里,可以利用四个CAPx里面的值进行周期和占空比的计算。

如果,程序不需要计算输入信号的周期和占空比,那么可能只要用到一个CAPx,这时就更简单了。(如下面觉得例子),这时CTR可以不运行(ECap6Regs.ECCTL2.bit.TSCTRSTOP = EC_FREEZE),CAPx寄存器加载也可以禁止(ECap6Regs.ECCTL1.bit.CAPLDEN = EC_DISABLE;)。

以上2个其实均为CAP口捕获功能,对应的I/O口为输入。ECAP口另外一个功能是产生APWM,和上述2个有很大的差别,对应的I/O口为输出。由于上面2个比较常用,特别是第一个,所以接下来,对设置CAP口为捕获功能的配置进行相关说明,以Ecap为例:

首先要设置GPIO引脚:

EALLOW;

GpioCtrlRegs.GPAPUD.bit.GPIO1 = 0;
// Enable pull-up on GPIO1 (CAP6)

// GpioCtrlRegs.GPBPUD.bit.GPIO49 = 0;
// Enable pull-up on GPIO49 (CAP6)

// Inputs are synchronized to SYSCLKOUT by default.

// Comment out other unwanted lines.

GpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 0;
// Synch to SYSCLKOUT GPIO1 (CAP6)

// GpioCtrlRegs.GPBQSEL2.bit.GPIO49 = 0; // Synch to SYSCLKOUT GPIO49 (CAP6)

GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 2;
// Configure GPIO1 as CAP6

// GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 1;
// Configure GPIO49 as CAP6

EDIS;

Ecap6的外部信号输入引脚,可以选择GPIO1.GPIO49

其次,功能寄存器设置:

ECap6Regs.ECEINT.all = 0x0000;
// Disable all capture interrupts



ECap6Regs.ECCLR.all = 0xFFFF;
// Clear all CAP interrupt flags



ECap6Regs.ECCTL1.bit.CAPLDEN = EC_DISABLE; // Disable CAP1-CAP4 register loads

ECap6Regs.ECCTL2.bit.TSCTRSTOP = EC_FREEZE; // Make sure the counter is stopped



// Configure peripheral registers



ECap6Regs.ECCTL2.bit.CAP_APWM = EC_CAP_MODE;
//CAP mode



ECap6Regs.ECCTL2.bit.CONT_ONESHT = EC_ONESHOT; // One-shot



ECap6Regs.ECCTL2.bit.STOP_WRAP = EC_EVENT1;
// Stop at 1 events



ECap6Regs.ECCTL1.bit.CAP1POL = EC_FALLING;
// Falling edge

         



ECap6Regs.ECCTL2.bit.SYNCI_EN = EC_DISABLE;
// Disable sync in



ECap6Regs.ECCTL2.bit.SYNCO_SEL = EC_SYNCO_DIS;// Disable sync out signal



ECap6Regs.ECCTL2.bit.
REARM = 1;
// Arm one-shot



ECap6Regs.ECEINT.bit.CEVT1 = 1;
// Enable 1 events interrupt

       其中,ECap6Regs.ECCTL2.bit.REARM这位决定ECAP口能否多次捕捉,外部信号的边沿。如果在中断响应函数里面没有“ECap6Regs.ECCTL2.bit.REARM = 1;”语句,则该ECAP口以后不响应信号边沿中断;如果为有“ECap6Regs.ECCTL2.bit.REARM = 1;”语句,则该ECAP口可以继续响应下一次中断。


ECAP
可以产生以下几个中断:

       CTR = CMP

CTR = PRD
-------
针对APWM功能

CTROVF

CEVT4

CEVT3

CEVT2

CEVT1
------- ECAP
口,CAPx对应的动作匹配

最后,外部PIECPU中断使能。

DINT;

EALLOW;
// This is needed to write to EALLOW protected registers

PieVectTable.ECAP6_INT = &ECap6_isr;

EDIS;

// Enable CPU INT4 which is connected to ECap6-4 INT:

IER |= M_INT4;

// Enable eCAP INTn in the PIE: Group 3 interrupt 1-6

PieCtrlRegs.PIEIER4.bit.INTx6 = 1;

// Enable global Interrupts and higher priority real-time debug events:

EINT;
// Enable Global interrupt INTM

ERTM;
// Enable Global realtime interrupt DBGM

interrupt void ECap6_isr(void)

{


LED1_flash;


ECap6IntCount++;


ECap6Regs.ECCLR.bit.CEVT1 = 1;


ECap6Regs.ECCLR.bit.INT = 1;

   ECap6Regs.ECCTL2.bit.REARM = 1; //该句要不要,在上面已经分析过,取决于系统设计要求


Acknowledge this interrupt to receive more interrupts from group 4


PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;

}

按照上述配置便可实现,ECAP捕获外部信号的功能,该功能可以实现很多算法,常用的如锁相角跟踪算法等等。


[ 本帖最后由 安_然 于 2011-8-12 14:16 编辑 ]

最新回复

好贴,正需要,多谢楼主慷慨分享!  详情 回复 发表于 2014-1-16 11:39
 
点赞 关注
个人签名工程 = 数学+物理+经济

回复
举报

42

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
好贴。
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主真棒。
 
 
 

回复

2606

帖子

0

TA的资源

五彩晶圆(初级)

4
 
 
个人签名工程 = 数学+物理+经济
 
 

回复

31

帖子

0

TA的资源

一粒金砂(高级)

5
 

回复 4楼 安_然 的帖子

补充一点。因为ECAP一般用于快速脉冲捕获,要求中断内程序尽量少。所以最好不用位控制。
ECap6Regs.ECCLR.bit.CEVT1 = 1;
ECap6Regs.ECCLR.bit.INT = 1;
一般把这两句合并为对ECCLR的直接赋值。能省点时间。
 
 
 

回复

182

帖子

7

TA的资源

一粒金砂(中级)

6
 
好贴,正需要,多谢楼主慷慨分享!
 
个人签名每天进步一点,大神带菜鸟,真是谢谢您们的支持、帮助和无私的奉献。
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表