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.

请问28335的ePWM模块如何同步开关PWM信号?{急}



需求:
在第N个周期任意时刻计算并更新第N+1个周期的占空比 ,同时使能PWM信号,希望第N+1个周期时PWM信号使能(连续增减计数,载波过零点开始计算)。
之前软件是2812的,利用EV模块的ACTRA和ACTRB两个寄存器实现脉冲同步开关,即要求在载波过零点使能比较器的行为,ACTRA和ACTRB是带shadow寄存器的,可以实现这样的功能,代码片段如下:
/#define ACTR_INIT_STATE ( \

COMPARE1_AH| \
COMPARE2_AL| \
COMPARE3_AH| \
COMPARE4_AL| \
COMPARE5_AH| \
COMPARE6_AL )

#define ACTR_FL_STATE ( \
COMPARE1_FL | \
COMPARE2_FL | \
COMPARE3_FL | \
COMPARE4_FL | \
COMPARE5_FL | \
COMPARE6_FL )

 

// 载波过零时生效

void EnablePWM(PWMGEN *p)
{
    EvaRegs.ACTRA.all = ACTR_INIT_STATE;
}

// 载波过零时生效
void DisablePWM(PWMGEN *p)
{
    EvaRegs.ACTRA.all = ACTR_FL_STATE;
}

目前代码移植到28335平台,ePWM通过AQCTLA和AQCTLB两个寄存器来定义比较匹配时的行为,实际使用中发现这两个寄存器不带shadow,设置以后马上生效,因此在第N个周期,软件设置完以后PWM就开始输出,而不是在第N+1个周期的载波过零点开始输出,如何才能达到同步开关PWM信号呢?即第N个周期的任意时刻使能PWM信号以后,信号到第N+1个周期的载波过零点才开始生效?之前2812的EV模块是可以做到这一点的,28335的ePWM模块是升级版,不会没有这个功能吧?

  • 你好,

    首先,寄存器AQCTLA和AQCTLB的作用是定义PWM计数达到COMPARE值时的动作,这个是在PWM初始化中完成的,定义完成后不再更新,2812和28335都有这两个寄存器,不同的是2812的寄存器直接用不同的位指定不同路的PWM,而28335的因为PWM更多,工作模式更复杂,每一路PWM都单独有这个寄存器,动作方式两者都是一样的,只是由于寄存器不一样程序配置上有不同。

    而你说的第N个周期的任意时刻使能PWM信号以后,信号到第N+1个周期的载波过零点才开始生效,PWM的寄存器大部分都是初始化时一次配置完成,需要实时更新的只有COMPARE比较值,通过实时更新比较值输出不同占空比的PWM波,这个和上述两个寄存器无关。

  • 能否给一些建设性意见?事实上,2812的AQCTL是可以异步更新的,带shadow寄存器,但是28335做不到。如何才能做到PWM同步使能关闭?
    目前能想到的只有通过设置CMPA和CMPB为大于周期的值来关闭?这是否是正确的做法?

  • 2812的ACTRA和ACTRB与28335的AQCTLA和AQCTLB是对应的,而这两个寄存器2812有Shadow寄存器,28335没有,更新了立即执行。

    你这个主要是用作什么? 据我了解像28335中这个可以用在故障时是28335的PWM信号强制低,以关闭PWM输出,起保护作用,是需要立即执行的。

  • 我希望脉冲可以同步打开,即第N个开关周期软件使能PWM脉冲,不希望打不完整的脉冲出去,希望脉冲从第N+1个脉冲的过零点开始生效。

  • 楼主你的问题解决了没?我前段时间使用F28335做一个电源,也遇到了同样的问题,就是让PWM输出几个脉冲之后关闭,因为电源的后级输出需要脉冲形式,最后我们采用的是在周期中断里面关闭IO口的功能实现的,效果还不错,(我们的频率低,100Hz到1kHz)