您好!
我尝试将 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;
}