[讨论] 【C2000 LaunchPad】单相交流电压+电流表__捕获篇(测频率)

ltbytyn   2013-5-10 12:34 楼主
28027 EcapCAP1CAP2CAP3CAP4具有捕获边沿信号的功能。将CAPx设置为上升沿捕获或下降沿捕获,当外部信号和当前CAPx设置一致时,并将当前TSCTR值赋给CAPx寄存器。根据CAPx之间的差值计算捕获的方波信号周期和占空比。TSCTR的变化模式取决于ECap1Regs.ECCTL1.bit.CTRRSTx的设置,如果为‘0’,则动作匹配时,不复位TSCTR,将一直往上增加,直至溢出;如果为‘1’,则动作匹配时,复位TSCTR。
举例:在计算一个方波的周期时,只需要CAP1CAP2即可:
CPA1:上升沿,ECap1Regs.ECCTL1.bit.CTRRST1=1(复位CTSTR)
CPA2:上升沿,设置CEVT2中断
图片1.jpg
第一上升沿时,CPA1动作,复位TSCTR。当第二个上降沿时,CPA2动作,并且产生CEVT2事件。同时将TSCTR数加载到CPA2中。这时可以利用CAP2里面的值计算出方波的周期。
如果计算方波的占空比,大家根据计算周期的方法想想就能找到方法。
28027ECAP计算方波周期为例。
第一步:初始化ECAP引脚(28027GPIO5GPIO19均可配置为ECAP口,本例中将GPIO19配置为ECAP引脚。可参见F2802x_ECap.c中的InitECap1Gpio函数)
void InitECap1Gpio(void)
{
   EALLOW;
// GpioCtrlRegs.GPAPUD.bit.GPIO5=0;  //Enable pull-up on GPIO5 (CAP1)
   GpioCtrlRegs.GPAPUD.bit.GPIO19=0; // Enable pull-up on GPIO19 (CAP1)
// GpioCtrlRegs.GPAQSEL1.bit.GPIO5=0; // Synch to SYSCLKOUT GPIO5 (CAP1)
   GpioCtrlRegs.GPAQSEL2.bit.GPIO19=0;//Synch to SYSCLKOUT GPIO19(CAP1)
// GpioCtrlRegs.GPAMUX1.bit.GPIO5=3; // Configure GPIO5 as CAP1
   GpioCtrlRegs.GPAMUX2.bit.GPIO19=3; // Configure GPIO19 as CAP1
   EDIS;
}
第二步:设置ECap寄存器:
void InitECapture()
{
   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
   // Configure peripheral registers
   ECap1Regs.ECCTL2.bit.CAP_APWM = 0;  //CAP mode
   ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0; // continuous mode   ECap1Regs.ECCTL2.bit.STOP_WRAP = 1;   // Stop at 2 events
   ECap1Regs.ECCTL1.bit.PRESCALE = 0;    // Divide by 1
   ECap1Regs.ECCTL1.bit.CAP1POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CAP2POL = 0;          // Rising edge
   ECap1Regs.ECCTL1.bit.CTRRST1 = 1;          // Difference operation
   ECap1Regs.ECCTL1.bit.CTRRST2 = 0;          // Difference operation
   ECap1Regs.ECCTL2.bit.SYNCI_EN = 0;         // Enable sync in
   ECap1Regs.ECCTL2.bit.SYNCO_SEL = 3;        //  Disable sync out signal
   ECap1Regs.ECCTL1.bit.CAPLDEN = 1;          // Enable capture units
   ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;        // Start Counter
   ECap1Regs.ECEINT.bit.CEVT2 = 1;            // 2 events = interrupt
}
第三步:外部PIECPU中断使能。
EALLOW;  // This is needed to write to EALLOW protected registers
PieVectTable.ECAP1_INT = &ecap1_isr;
EDIS; // This is needed to disable write to EALLOW protected registers  // Enable CPU INT4 which is connected to ECAP1-4 INT:
IER |= M_INT4;
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;
// Enable eCAP INTn in the PIE: Group 3 interrupt 1-6
EINT;   // Enable Global interrupt INTM
ERTM;   // Enable Global realtime interrupt DBGM
interrupt void ecap1_isr(void)
{
//ECap1Count = ECap1Regs.CAP1;
   ECap2Count = ECap1Regs.CAP2;
//ECap1Regs.ECCLR.all = 0xFFFF;
   ECap1Regs.ECCLR.bit.CEVT2 = 1;
   ECap1Regs.ECCLR.bit.CEVT1 = 1;
   ECap1Regs.ECCLR.bit.INT = 1;
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;
}
注:当使用One-shot mode方式时,若需要不断的捕获方波,需在中断程序中需加入“Cap1Regs.ECCTL2.bit.REARM = 1; ”,否则只能捕获一次。以后即使有方波信号也不会进入捕获中断处理函数。
如上即可利用ECAP的捕获功能来计算方波周期。当然灵活利用ECAP功能可以实现很多,这些需要大家去摸索。

    目前“单相交流电压+电流表”已通过捕获功能实现频率测量。为什么在做“单相交流电压+电流表”时会关注,并且计算它的频率呢?大家可以考虑一下。我将在后续“单相交流电压+电流表__采样篇”做介绍。

回复评论 (15)

【C2000 LaunchPad】捕获篇(如何测频率)

测试时发现了一个问题,用新的就是项目文件单纯的覆盖旧的项目文件。仿真可能有问题。比如我碰到的问题,在家里程序测试正常,在公司测试时不进中断。一样的程序在家里和公司两种情况。我后来直接在CCS中将就旧项目文件完全删除,再在CCS中重新添加新项目文件,测试OK。所以建议大家做的不要单纯的去覆盖旧文件。

[ 本帖最后由 ltbytyn 于 2013-5-10 12:46 编辑 ]
点赞  2013-5-10 12:35
楼主动作好快啊!,我现在一直还在琢磨epwm呢
点赞  2013-5-10 13:09

回复 板凳 蓝雨夜 的帖子

epwm比ecap难。加油啊epwm等你的心得了
点赞  2013-5-10 13:15

回复 4楼 ltbytyn 的帖子

做测量用到的EPWM只是改变他的周期,难度不是很大哦,我有成功的经验,给你打打气哦!
点赞  2013-5-12 15:20

求答

请问一下程序interrupt void ecap1_isr(void)

{

//ECap1Count = ECap1Regs.CAP1;

   ECap2Count = ECap1Regs.CAP2;

//ECap1Regs.ECCLR.all = 0xFFFF;

   ECap1Regs.ECCLR.bit.CEVT2 = 1;

   ECap1Regs.ECCLR.bit.CEVT1 = 1;

   ECap1Regs.ECCLR.bit.INT = 1;

   PieCtrlRegs.PIEACK.all = PIEACK_GROUP4;

}中ECap2Count = ECap1Regs.CAP2;语句的作用是什么呢?
点赞  2013-5-23 22:24
ECap1Regs.CAP2是个计时器,记录两次上升沿的间隔时间。通过修改捕获分频器寄存器可以修改捕获时钟
点赞  2013-5-24 10:26
你好,我想问一下,为什么cap1事件时不复位计数器呀,计数器会一直往上边加
点赞  2013-9-22 22:07

回复 8楼woshilee 的帖子

cap1事件时是否复位计数器和设置有关。
如上面例子中讲到的:ECap1Regs.ECCTL1.bit.CTRRST1=1(当发生cap1事件时,复位TSCTR,即复位计数器)
点赞  2013-9-22 22:26

回复 9楼ltbytyn 的帖子

就是直接复制上边的程序,不知道为什么不复位计数器,已经郁闷了很长时间了
点赞  2013-9-23 11:41
测试方法:GPIO19加个频率固定的方波信号(如示波器的探头测试信号),观察进入捕获中断时的( ECap2Count = ECap1Regs.CAP2)值。

我不知道你是怎么判断没有复位计数器的?
点赞  2013-9-23 13:12
楼主想请问下,28027是不是只能捕捉一路,不能同时捕捉两路??比如测交流电压电流的相位
点赞  2014-8-31 19:21
楼主说的就是这个帖子吧,下载了,调通了 ,TI原版程序就行,直接读ECAP1/ 2 /3/ 4  就可以  。谢谢
点赞  2014-11-18 16:46
今天看到楼主的帖子,感觉很清楚,谢谢楼主分享。
每天进步一点,大神带菜鸟,真是谢谢您们的支持、帮助和无私的奉献。
点赞  2014-12-29 23:07
感谢楼主分享,学习了
点赞  2015-6-26 09:51
厉害厉害
点赞  2018-9-26 10:08
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复