您好!
我观察到以下有趣的行为:
首先、我有一个 PWM 控制任务被分成两部分、所以我使用两个 ADC 转换:一个在零事件(TBCTR = 0)上、另一个在周期事件上、而使用的两个模块的 PWM 计数器模式为上-下。 工作正常、我在每个周期获得2个 ADC 中断(比率1:1)。
其次、我必须将我的 PWM 与外部信号同步。 我使用第三个 ePWM 模块作为内部同步信号的源、该信号与使用 ECAP 的外部信号进行比较。 第三个 ePWM (EPwm1)为其他两个 ePWM (7和8)生成 SYNCI 信号。 通过调整 EPwm1的周期和同步链来实现同步(请参阅图13-7)。 TRM SPRUHX5E.pdf 中的时基计数器同步方案)将同步转发至另外两个模块。 也可以正常工作。
但是,一旦同步运行(外部信号打开),我在0上获得的 ADC 转换/中断比在0上得到的时间要少得多,现在这个比率大约为1/sqrt (2):1。 由于我使用 TBPHS = 0、所以我希望零事件(生成)在每个周期中发生(TBCTR = TBPHS = 0!)、但很明显、它不会发生。
作为一种权变措施、我将 EPwm1用于 ADCSOC 生成、一切都很好。
我在 TRM 中没有发现任何有关此行为的提示。
弗兰克
下面是一些代码片段以进行说明:
/*时基控制寄存器(TBCTL)-设置计数器模式、分频器*/
ePWM_regs->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//向上计数/向下计数*/
ePWM_regs->TBCTL.bit.PHSEN = TB_ENABLE; //启用相位加载
ePWM_regs->TBCTL.bit.PRDLD = 0; //在 CTR = 0和 SYNC */上
ePWM_regs->TBCTL.bit.SYNCOSEL = 0; // SYNCO = SYNCI *
ePWM_regs->TBCTL.bit.HSPCLKDIV = TB_DIV1; //时钟 DIVS = 1 *
ePWM_regs->TBCTL.bit.CLKDIV = TB_DIV1;
ePWM_regs->TBCTL.bit.free_soft = 0x02; // 0x02 =自由运行*/
/*时基控制寄存器2 (TBCTL2)*/
ePWM_regs->TBCTL2.all = 0x0000; //默认= 0 */
/*时基计数器寄存器(TBCTR)-清除计数器*/
ePWM_regs->TBCTR = 0x0000;
/*时基状态寄存器(TBSTS)-清除事件*/
ePWM_regs->TBSTS.bit.CTRMAX = 1;
ePWM_regs->TBSTS.bit.SYNCI = 1;
/*时基相位高(TBPHS)*/
ePWM_regs->TBPHS.all = 0x00000000;
这对于同步 ePWM 模块不起作用:
/*在0上生成 SOC 事件*/
ePWM_regs->ETSEL.bit.SOCAEN = 1; //在组上启用 SOC */
ePWM_regs->ETSEL.bit.SOCASEL = 1; // 1 = SOC on CTR = ZRO */