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.
您好!
我尝试将 ePWM4_A 和 ePWM7_A 同步、如下代码所示。
这两种模式都设置为递增-递减计数器模式、动作限定器控制寄存器设置为在计数器达到零时切换引脚。
我已启用 ePWM4、以便在 CTR=ZERO 条件下以及通过软件触发时发送 EPWMSYNCOUT 信号、并且 ePWM7的 EPWMSYNCINSEL 寄存器设置为0x04。 此配置在 INIT 函数的末尾附近完成。
对于我的特定应用、我需要发送有限数量的 PWM 信号。
我还有两个模块的 ePWMx_B 在运行--它们的运行频率是 ePWMx_A 引脚的两倍,这是我通过在 CTR=ZERO 和 CTR=PRD 上设置/清除来实现的。
我通过将 CLB 配置为对 ePWM4_B 的上升沿和下降沿进行计数、然后在达到该边沿数后冻结中断中的计数器、从而限制 ePWM 脉冲。 我无法对 ePWMx_A 信号的边沿进行计数的原因是我需要频率加倍的分辨率--有时我可能不得不在 ePWMx_A 的高值之间冻结信号
但是、这两个信号之间似乎存在同步问题。
示波器快照向我们显示了正在发生的确切情况--黄色是 ePWM4_A,紫色是 ePWM7_A 在主循环中、我调用 函数来触发 ePWM4_B 脉冲的(预定义)值(未显示在此快照中)。 当达到该数字时、计数器将被冻结。 经过一个小延迟后、代码再次生成 PWM 信号。 我希望这两个波形看起来完全相同、但它们并不相同。
请帮帮我。
谢谢、此致、
Vishnu
void init(void) { EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; EALLOW; CpuSysRegs.PCLKCR2.bit.EPWM4 = 1; GpioCtrlRegs.GPAGMUX1.bit.GPIO6 = 0x00; GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0x01; GpioCtrlRegs.GPAGMUX1.bit.GPIO7 = 0x00; GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0x01; GpioCtrlRegs.GPAQSEL1.bit.GPIO6=0x3; GpioCtrlRegs.GPAQSEL1.bit.GPIO7=0x3; EDIS; EPwm4Regs.TBCTL.bit.CLKDIV = 0x0; EPwm4Regs.TBCTL.bit.HSPCLKDIV = 0x1; EPwm4Regs.TBCTL.bit.PHSEN=TB_DISABLE; EPwm4Regs.TBPHS.bit.TBPHS=0; EPwm4Regs.TBCTR=0; EPwm4Regs.TBCTL.bit.CTRMODE = TB_FREEZE; EPwm4Regs.TBCTL.bit.PRDLD = TB_SHADOW; EPwm4Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm4Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm4Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zero EPwm4Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zero EPwm4Regs.ETSEL.bit.SOCAEN=0; EPwm4Regs.ETSEL.bit.SOCASEL=1; EPwm4Regs.ETSOCPS.bit.SOCAPRD2=1; EPwm4Regs.ETSEL.bit.SOCAEN=1; EALLOW; CpuSysRegs.PCLKCR2.bit.EPWM7 = 1; GpioCtrlRegs.GPAGMUX2.bit.GPIO28 = 0x0; GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 0x3; GpioCtrlRegs.GPAGMUX2.bit.GPIO29 = 0x0; GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 0x3; GpioCtrlRegs.GPAQSEL2.bit.GPIO28=0x3; GpioCtrlRegs.GPAQSEL2.bit.GPIO29=0x3; EDIS; EPwm7Regs.TBCTL.bit.CLKDIV = 0x0; EPwm7Regs.TBCTL.bit.HSPCLKDIV = 0x1; EPwm7Regs.TBCTL.bit.PHSEN=TB_DISABLE; EPwm7Regs.TBPHS.bit.TBPHS=0; EPwm7Regs.TBCTR=0; EPwm7Regs.TBCTL.bit.CTRMODE = TB_FREEZE; EPwm7Regs.TBCTL.bit.PRDLD = TB_SHADOW; EPwm7Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm7Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; EPwm7Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // load on CTR = Zero EPwm7Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; // load on CTR = Zero EPwm7Regs.ETSEL.bit.SOCAEN=0; EPwm7Regs.ETSEL.bit.SOCASEL=1; EPwm7Regs.ETSOCPS.bit.SOCAPRD2=1; EPwm7Regs.ETSEL.bit.SOCAEN=1; EPwm7Regs.EPWMXLINK.bit.TBPRDLINK=3; EPwm4Regs.EPWMXLINK.bit.TBPRDLINK=6; EPwm4Regs.ETPS.bit.INTPSSEL=1; EPwm4Regs.ETSEL.bit.INTSEL=0x3; EPwm4Regs.ETCNTINITCTL.bit.INTINITEN=1; EPwm4Regs.ETCNTINIT.bit.INTINIT=0; EPwm4Regs.EPWMSYNCOUTEN.bit.SWEN=1; EPwm4Regs.EPWMSYNCOUTEN.bit.ZEROEN=1; EPwm7Regs.EPWMSYNCINSEL.bit.SEL=0x04; EPwm4Regs.TBCTL.bit.PHSEN=0; EPwm7Regs.TBCTL.bit.PHSEN=1; EPwm7Regs.TBPHS.bit.TBPHS=0; } void generate_pwm(int steps) { EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; EDIS; EPwm4Regs.TBPRD = startingPeriod; EPwm7Regs.TBPRD = startingPeriod; totalSteps=steps; resetClbCtr1(); Clb_writeInterface(CLB1_MATCH2_CTR0_ADDR, steps); EPwm4Regs.AQCTLA.bit.ZRO = AQ_TOGGLE; EPwm4Regs.AQCTLB.bit.ZRO = AQ_CLEAR; EPwm4Regs.AQCTLB.bit.PRD = AQ_SET; EPwm7Regs.AQCTLA.bit.ZRO = AQ_TOGGLE; EPwm7Regs.AQCTLB.bit.ZRO = AQ_SET; EPwm7Regs.AQCTLB.bit.PRD = AQ_CLEAR; EPwm7Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN; EPwm4Regs.TBCTL.bit.CTRMODE=TB_COUNT_UPDOWN; EPwm4Regs.TBCTL.bit.SWFSYNC=1; EALLOW; CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 1; EDIS; }
您好!
由于假期休息、主题专家不在办公室、因此请在1月6日前回复。 对给您带来的不便深表歉意。
EPWM7的 TBPHS 是否设置为0? 您希望通过这种方式实现完美的同步?
是的-我认为我没有正确理解 ePWM 同步的工作方式、我不需要强制进行软件同步。 不管怎么说、我在几个地方更改了我的固件、这似乎已经达到了这个目的、所以它与硬件无关-只是一个逻辑错误。
感谢您的快速响应。
此致、
Vishnu