我用的是28031只有一个ECAP,一个ECAP的中断,我希望能够捕捉脉冲的上升沿和下降沿后计算占空比。参考了TI提供的20831的例程中的ECAP_CAPTURE_PWM, 设置事件1位上升沿,事件2位下降沿,使能了2个事件为中断的触发源,可是发现每次只有CEVT1进入了中断,而CEVT2根本进不去。后来索性将CEVT1的事件相关的都去掉了,只剩下CEVT2的,可是在CAP的中断设置断点,查看标志位,发现还是CEVT1的标志位被置位了,不知道是怎么回事,请各位大神帮忙,谢谢。以下是关于ECAP的一些设置,附件是程序。
另外对于这个ECap1Regs.ECCTL2.bit.STOP_WRAP不是很明白,这个位选择1-4,表示的是什么意思?假设我有一个CEVT1,如果我选择了4,是不是说要经过四个上升沿以后才进入中断,如果我同时使用CEVT1-4,分别为CEVT1为上升沿,CEVT2为下降沿,CEVT3为上升沿,CEVT4为下降沿,如果我选择4,是不是说只有到到CEVT4对应的下降沿以后才会触发中断?如果按这样说,是不是我想用1个ECAP口捕捉上升沿和下降沿就需要选择1?非常感谢,谢谢!
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 = 1; // One-shot
ECap1Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 2 events
// ECap1Regs.ECCTL1.bit.CAP1POL = 0; // rising edge
ECap1Regs.ECCTL1.bit.CAP2POL = 1; // falling edge
//ECap1Regs.ECCTL1.bit.CAP3POL = 1; // Falling edge
//ECap1Regs.ECCTL1.bit.CAP4POL = 0; // Rising edge
//ECap1Regs.ECCTL1.bit.CTRRST1 = 1; // Difference operation
ECap1Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation
//ECap1Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation
//ECap1Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation
ECap1Regs.ECCTL2.bit.SYNCI_EN = 1; // Enable sync in
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0; // Pass through
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter
ECap1Regs.ECCTL2.bit.REARM = 1; // arm one-shot
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
// ECap1Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt
ECap1Regs.ECEINT.bit.CEVT2 = 1; // 2 events = interrupt
}
mangui zhang:
你好 同一个CAP引脚 你确定能够在上升沿触发后就能切换到下降沿触发 吗
这样的话你是不是知道PWM波的周期 我觉得占空比应该是已知的吧
我用的是28031只有一个ECAP,一个ECAP的中断,我希望能够捕捉脉冲的上升沿和下降沿后计算占空比。参考了TI提供的20831的例程中的ECAP_CAPTURE_PWM, 设置事件1位上升沿,事件2位下降沿,使能了2个事件为中断的触发源,可是发现每次只有CEVT1进入了中断,而CEVT2根本进不去。后来索性将CEVT1的事件相关的都去掉了,只剩下CEVT2的,可是在CAP的中断设置断点,查看标志位,发现还是CEVT1的标志位被置位了,不知道是怎么回事,请各位大神帮忙,谢谢。以下是关于ECAP的一些设置,附件是程序。
另外对于这个ECap1Regs.ECCTL2.bit.STOP_WRAP不是很明白,这个位选择1-4,表示的是什么意思?假设我有一个CEVT1,如果我选择了4,是不是说要经过四个上升沿以后才进入中断,如果我同时使用CEVT1-4,分别为CEVT1为上升沿,CEVT2为下降沿,CEVT3为上升沿,CEVT4为下降沿,如果我选择4,是不是说只有到到CEVT4对应的下降沿以后才会触发中断?如果按这样说,是不是我想用1个ECAP口捕捉上升沿和下降沿就需要选择1?非常感谢,谢谢!
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 = 1; // One-shot
ECap1Regs.ECCTL2.bit.STOP_WRAP = 0; // Stop at 2 events
// ECap1Regs.ECCTL1.bit.CAP1POL = 0; // rising edge
ECap1Regs.ECCTL1.bit.CAP2POL = 1; // falling edge
//ECap1Regs.ECCTL1.bit.CAP3POL = 1; // Falling edge
//ECap1Regs.ECCTL1.bit.CAP4POL = 0; // Rising edge
//ECap1Regs.ECCTL1.bit.CTRRST1 = 1; // Difference operation
ECap1Regs.ECCTL1.bit.CTRRST2 = 1; // Difference operation
//ECap1Regs.ECCTL1.bit.CTRRST3 = 1; // Difference operation
//ECap1Regs.ECCTL1.bit.CTRRST4 = 1; // Difference operation
ECap1Regs.ECCTL2.bit.SYNCI_EN = 1; // Enable sync in
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 0; // Pass through
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable capture units
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; // Start Counter
ECap1Regs.ECCTL2.bit.REARM = 1; // arm one-shot
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads
// ECap1Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt
ECap1Regs.ECEINT.bit.CEVT2 = 1; // 2 events = interrupt
}
Yu Zhao2:
回复 mangui zhang:
还不知道如何解决这个问题,不过可以在中断中将上升沿改为下降沿就可以了