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.
大家好,我们遇到了2个ePWM模块之间的软件同步问题。 我们已使用以下代码初始化ePWM2和ePWM3:
// PWM2B,1KHz EPwm2Regs.TBCTL.bit.PRDLD = TB_shadow; EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_DOWN; EPwm2Regs.SYCTL.bit.PHTB= TB_enable;CTwm2Regs.PCCTL.bit.EPCCL_SE_DIV = DEV2.TB_DEV = EPmSION_SE_DEV = EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm2Regs.TBPRD = 5万; //设置计时器周期,TBCLK / 5万 = 1ms --> 1kHz EPwm2Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0 EPwm2Regs.TBCTR = 0x0000; //清除计数 器EPwm2Regs.CMPB.bit.CMPB = 2.5万; // Duty 50 % EPwm2Regs.AQCTLB.bit.PRD = AQ_SET; EPwm2Regs.AQCTLB.bit.CBB = AQ_CLEAR; EPwm2Regs.TBCTL2.bit.PRDLDSYNC = 2; EPwm2Regs.CMPCTL.bit.LOADBPWNC = 2; // SYMPWNC 2kHz EPwm3Regs.TBCTL.bit.PRDLD = TB_shadow; EPwm3Regs.TBCTL.bit.CTRMODE = TB_COUNT_DOWN; EPwm3Regs.TBCTL.bit.PHSEN = TB_enable;EPwm3Regs.CTCL.bit.PCNCOTB= EPw_DIV2.TB_DIV= EPwm3Regs.TBCTL.bit.CLKDIV = TB_DIV1; EPwm3Regs.TBPRD = 2.5万; //设置计时器周期,TBCLK / 5万 = 1ms --> 1kHz EPwm3Regs.TBPHS.bit.TBPHS = 0x0000; //相位为0 EPwm3Regs.TBCTR = 0x0000; //清除计数 器EPwm3Regs.CMPA.bit.CMPA = 1.25万; // Duty 50 % EPwm3Regs.AQCTLA.bit.PRD = AQ_SET; EPwm3Regs.AQCTLA.bit.CAD = ASYAQ_CLEAR; EPwm3Regs.TBCTL2.bit.PRDLDSYNC = 2; EPwm3Regs.CMPCTL.bit.LOADNC = 2;
在代码中的某个时刻,我们需要使用软件同步模式更新频率和占空比。 我们发布频率和软件同步的更改,如下所示:
EPwm2Regs.TBPRD = 2.5万; //设置计时器周期ePWM2B EPwm2Regs.CMPB.bit.CMPB = 1.25万;// Duty 50 % EPwm3Regs.TBPRD = 1.2万; //设置计时器周期ePWM3A EPwm3Regs.CMPA.bit.CMPA = 6000; // Duty 50 % EPwm2Regs.TBCTL.bit.SWFSYNC = 1;//相位软件同步
我们预期PWM信号从每个ePWM单元中的周期值开始,但仅ePWM2重新启动。ePWM3继续以相同频率进行。
有人能帮我们吗? 出什么问题了?
您好,Massimo:
我查看了您的设置,您似乎已经设置了软件同步从EPWM2传播到EPWM3的正确方式。 似乎没有生成SYNCO,尽管这是基于您所描述的EPWM3行为。
编辑:我怀疑SWFSYNC有问题。 作为一项测试,您是否可以将EPWM2的SYNCOSEL设置为0x1,而不是执行SWFSYNC并查看EPWM2的TBCTR =0时EPWM3是否同步? 如果SYNCOSEL的另一个值更方便,您也可以使用它。
您的系统中EPWMCLK的频率是多少(注意这不是TBCLK,而是SYSCLK/EPWMCLKDIV)?
此致,
克里斯
请您回复。
是的,我们尝试同步这两个装置,它工作正常。 我们将此方法用于我们的目的,但我们想知道为什么第一种方法不起作用。
Massimo,
我正在使用您的确切代码,我看到SWFSYNC正在工作。
您如何在设备上检查此项? 我看到,如果我单步执行SWFSYNC指令或在表达式窗口中写入SWFSYNC指令,它将不会生效。 我右键单击并在SWFSYNC指令上执行了"移至行",然后在某些NOP的末尾设置断点并看到它成功执行。
我没有示波器,所以我的验证方法是将EPWM3上的TBCTR修改为远不同步的内容,并验证执行以下操作后计数器是否恢复同步。
EPwm2Regs.TBCTL.bit.SWFSYNC = 1; //移至行
ASM (" NOP");
ASM (" NOP");
ASM (" NOP");
ASM (" NOP");
ASM (" NOP");
ASM (" NOP");
ASM (" NOP");
ASM (" NOP");
ASM (" NOP");
ASM (" NOP");
ASM (" NOP");
asm (" NOP"); //设置断点
此致,
克里斯