尊敬的支持团队:
使用 eCAP1捕获 pwm1的第一个上升沿、使用 ecap2捕获 pwm2的第一个上升沿、并计算两个 PWM 的相位。 发现 eCAP1捕获的值始终大于 ecap2捕获的值、无论是 pwm1优先还是 pwm2优先。
是因为中断优先级? 还是其他原因?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
尊敬的支持团队:
使用 eCAP1捕获 pwm1的第一个上升沿、使用 ecap2捕获 pwm2的第一个上升沿、并计算两个 PWM 的相位。 发现 eCAP1捕获的值始终大于 ecap2捕获的值、无论是 pwm1优先还是 pwm2优先。
是因为中断优先级? 还是其他原因?
非常感谢您的回复、我 的软件配置如下:
void main (void)
{
InitSysCtrl();
InitECap1Gpio (20); //inc A
GPIO_SetupPinOptions (20、GPIO_INPUT、GPIO_异 步);
InitECap2Gpio (21); //inc b
GPIO_SetupPinOptions (21、GPIO_INPUT、GPIO_异 步);
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.ECAP1_INT =&eCAP1_ISR;
PieVectTable.ECAP2_INT =&ecap2_ISR;
EDIS;
InitECapture();
IER |= M_INT4;
PieCtrlRegs.PIEIER4.bit.INTx1 = 1;
PieCtrlRegs.PIEIER4.bit.INTx2 = 1;
EINT;
ERTM;
for (;;)
{
asm (" NOP");
}
}
空 InitECapture()
{
ECap1Regs.ECCTL1.bit.CAP1POL = 0; //上升
ECap1Regs.ECCTL1.bit.CAP2POL=1; //fall
ECap1Regs.ECCTL1.bit.CAP3POL = 0; //上升
ECap1Regs.ECCTL1.bit.CAP4POL = 1; //fall
ECap1Regs.ECCTL1.bit.CTRRST1 = 0; //绝对
ECap1Regs.ECCTL1.bit.CTRRST2 = 0; //绝对
ECap1Regs.ECCTL1.bit.CTRST3 = 0; //绝对
ECap1Regs.ECCTL1.bit.CTRRST4 = 0; //绝对
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; //启用捕捉单元
ECap1Regs.ECCTL1.bit.prescale = 0; ///1
ECap1Regs.ECCTL2.bit.CAP_APWM = 0; //捕获模式
ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0; //连续模式
ECap1Regs.ECEINT.ALL = 0x0000;
ECap1Regs.ECCLR.ALL = 0xFFFF;
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; //起始计数器
ECap1Regs.ECEINT.BIT.CEVT4 = 1; // 4个事件=__interrupt
ECap2Regs.ECCTL1.bit.CAP1POL = 0; //上升
ECap2Regs.ECCTL1.bit.CAP2POL=1; //fall
ECap2Regs.ECCTL1.bit.CAP3POL = 0; //上升
ECap2Regs.ECCTL1.bit.CAP4POL = 1; //fall
ECap2Regs.ECCTL1.bit.CTRRST1 = 0; //绝对
ECap2Regs.ECCTL1.bit.CTRRST2 = 0; //绝对
ECap2Regs.ECCTL1.bit.CTRST3 = 0; //绝对
ECap2Regs.ECCTL1.bit.CTRRST4 = 0; //绝对
ECap2Regs.ECCTL1.bit.CAPLDEN = 1; //启用捕捉单元
ECap2Regs.ECCTL1.bit.prescale = 0; ///1
ECap2Regs.ECCTL2.bit.CAP_APWM = 0; //捕获模式
ECap2Regs.ECCTL2.bit.CONT_ONESHT = 0; //连续模式
ECap1Regs.ECCTL2.bit.SYNCI_EN = 1;
ECap1Regs.ECCTL2.bit.SYNCO_SEL =0;
ECap2Regs.ECCTL2.bit.SYNCI_EN = 1;
ECap2Regs.ECCTL2.bit.SYNCO_SEL =0;
ECap1Regs.ECCTL2.bit.SWSYNC=1;
ECap2Regs.ECCTL2.bit.SWSYNC=0;
EALLOW;
InputXbarRegs.INPUT5SELECT = 0x51;
GpioDataRegs.GPBDAT.bit.GPIO51=0;
SyncSockRegs.SYNCSELETC0.bit.ECAP1SYNCIN = 0x5;
EDIS;
ECap2Regs.ECEINT.ALL = 0x0000;
ECap2Regs.ECCLR.ALL = 0xFFFF;
ECap2Regs.ECCTL2.bit.TSCTRSTOP = 1; //开始计数器
ECap2Regs.ECEINT.BIT.CEVT4 = 1; // 4个事件=__interrupt
}
_interrupt void eCAP1_ISR (void)
{
A_RISE_TIME1 = ECap1Regs.CAP1;
A_FALL_TIME1 = ECap1Regs.CAP2;
A_RISE_TIME2 = ECap1Regs.CAP3;
A_FALL_TIME2 = ECap1Regs.CAP4;
ECap1Regs.ECCLR.ALL = 0xFFFF;
PieCtrlRegs.PIEACX.ALL = PIEACK_group4;
}
_interrupt void ecap2_ISR (void)
{
B_RISE_TIME1 = ECap2Regs.CAP1;
b_f跌倒 时间1 = ECap2Regs.CAP2;
B_RISE_TIME2 = ECap2Regs.CAP3;
b_fall time_2 = ECap2Regs.CAP4;
PHASE_Ab1 = A_RISE_TIME1 - b_RISE_TIME1;
PHASE_AB2 = A_FALL_TIME1 - b_FRAL_TIME1;
ECap2Regs.ECCLR.ALL = 0xFFFF;
PieCtrlRegs.PIEACX.ALL = PIEACK_group4;
}
您好!
如果传入信号频率太高、则可能会导致其中一个 ECAP 模块的计数器溢出、从而导致读数不正确。 我认为最好的方法是在单次触发模式下使用 ECAP 模块并同时启动两个模块的计数器。 而不是测量两个上升沿之间的差值、而是测量下降沿之间的差值、即 ECAP 的第二个事件。 这将有助于两个信号之间的相位差大于180度的情况。 您可以在 ECAP2中断结束时重新启用模块。
请告诉我建议的配置是否适合您。
此致
Himanshu
您好!
是同步设置似乎可以、但请记住、同步所做的所有操作都是将相位寄存器中的值加载到计数器中。 因此、您不必在 ECAP 之间使用此同步来测量信号之间的相位差。 如果您只是使用单次捕获模式、那么重置两个 ECAP 模块的计数器并将它们重新布设在一起应该能够完美地工作。 正如我之前建议的、您可以在 ECAP1上的捕获事件3上触发中断、并计算中断期间的增量。
如果我的回复回答了您的问题、请点击位于我帖子底部的"我的问题已解决"按钮。
此致
Himanshu