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中ECAP用作APWM时和EPWM之间的相位问题

Other Parts Discussed in Thread: CONTROLSUITE

我的问题是这样的:

        EPWM已经全部用作PWM的发生单元,还有两路PWM打算使用ECAP的APWM功能。

这两部分PWM频率是一样的,现在想问下他们之间的相位是怎样的?

我知道EPWM内部是可以调节之间的相位关系,APWM内也可以 调节互相的相位关系,但是EPWM和APWM可以调节相位关系吗?

或者我不做设置时,EPWM和APWM是自动同相的吗?

期待高手解疑,在线等。

非常感谢!

  • APWM中也有一个同步输入信号SYNCI,这个信号是从PWM1中的SYNCO来的,在寄存器ECCTL2中可以使能它,这样实现与PWM模块的相位同步。如果不做设置,EPWM跟APWM是不会自动同步的。

  • 好的,非常感谢!

  • 我按照您说的 把SYNCI置一 但是EPWM和APWM还是不能同步 您能再具体讲下 还有什么地方需要设置吗 谢谢 我真的调了好久了 一直两个就是不同步
  • 你C2000哪个系列产品,EPWM通道几要和APWM同步?EPWM的同步拓扑在目前的几个系列中有区别,比如F28035就是完全从上到下串联,然后ECAP1并联在PWM1模块上的

  • 谢谢 用的是28335 我想让所有的EPWM和ecap产生的pwm同步 怎么做呢?
  • 那你要把所有PWM的PHASE ENABLE打开,并且除了PWM1的同步信号输出设置为0点,其他都设置为SYNCIN,ECAP模块也是

  • 谢谢您 但是我改了下 EPWM还是和APWM有一个250ns的延迟,下面是我的程序 您看下 哪里写的不对 麻烦了

    void SetupAPWM(void)//ecap产生APWM
    {

    ECap1Regs.CAP1 = 0x5DC; // Set Period value按照150M计算的
    ECap1Regs.CTRPHS=0x1; //相位控制寄存器
    ECap1Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
    ECap1Regs.ECCTL2.bit.APWMPOL=0;//1:输出为低电平有效 0:高电平
    ECap1Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
    ECap1Regs.CAP2 = 0x2EE; // Set Compare value50%处
    ECap1Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
    ECap1Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int


    ECap3Regs.CAP1 = 0x5DC; // Set Period value按照150M计算的
    ECap3Regs.CTRPHS=0x1; //相位控制寄存器
    ECap3Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
    ECap3Regs.ECCTL2.bit.APWMPOL=0;//1:输出为低电平有效 0:高电平
    ECap3Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
    ECap3Regs.CAP2 = 0x2EE; // Set Compare value50%处
    ECap3Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
    ECap3Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int

    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;
    ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1;

    }

    void SetupEPwmAB_A1A2(void) //byJJ 上下桥臂50% 完全互补
    {
    //setup TimeBase(TB)
    EPwm1Regs.TBPRD = 1500; //Tpwm=TBPRD*Ttbclk Set PWM period 10us 100kHz
    EPwm1Regs.TBPHS.half.TBPHS = 1; // Phase is 0
    EPwm1Regs.TBCTR = 0x0000; // Clear counter

    // Setup TBCTL
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // updown count mode
    EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 不使用移相方式
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
    EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 计数到0时输出同步清零信号
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT150MHz
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟

    // Setup CMPCTL
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW; // Load registers every ZERO
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    // Setup CMP
    EPwm1Regs.CMPA.half.CMPA =750;

    // Set actions
    // Set PWM1A ///
    EPwm1Regs.AQCTLA.bit.CAU=AQ_SET; //计数器(增加时)=比较器A时,输出high
    EPwm1Regs.AQCTLA.bit.ZRO=AQ_CLEAR; //计数器(递减时)=比较器B时,输出low

    //set Deadband
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //A:刚得到的波形反向 B刚得到的波形 所以保证了phaseAB_A就是对角桥臂的移相角 这样比较直观
    EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;//D BA_ALL 这种模式实际上只需要epwmxa作为输入,即可产生带死区的两路xa,xb输出了
    EPwm1Regs.DBRED = EPWM_MIN_DB; //上升沿延时
    EPwm1Regs.DBFED = EPWM_MIN_DB; //下降沿延时

    }

    void SetupEPwmAB_A3A4(void) //byJJ 上下桥臂50% 完全互补
    {
    //setup TimeBase(TB)
    EPwm2Regs.TBPRD = 1500; //Tpwm=TBPRD*Ttbclk Set PWM period 10us 100kHz
    EPwm2Regs.TBPHS.half.TBPHS = 1; // Phase is 0
    EPwm2Regs.TBCTR = 0x0000; // Clear counter

    // Setup TBCTL
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // updown count mode
    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 不使用移相方式
    EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 同步信号与epwm1一致
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟

    // Setup CMPCTL
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW; // Load registers every ZERO
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;


    EPwm2Regs.CMPA.half.CMPA=750;

    EPwm2Regs.AQCTLA.bit.CAU=AQ_CLEAR; //计数器(增加时)=比较器A时,输出low
    EPwm2Regs.AQCTLA.bit.ZRO=AQ_SET; //计数器(递减时)=比较器B时,输出high

    //set Deadband
    // Active High Com plementary PWMs - Setup Deadband 使用了死区模块,这里设置为输入只用了EPwmxA,因此输出一定是互补的了
    EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //A:刚得到的波形反向 B刚得到的波形 所以保证了phaseAB_A就是对角桥臂的移相角 这样比较直观
    EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;//D BA_ALL 这种模式实际上只需要epwmxa作为输入,即可产生带死区的两路xa,xb输出了
    EPwm2Regs.DBRED = EPWM_MIN_DB; //上升沿延时
    EPwm2Regs.DBFED = EPWM_MIN_DB; //下降沿延时
    }

  • 您好 这句话我有点不知道怎么设置 PWM1的同步信号输出设置为0点,其他都设置为SYNCIN 是用寄存器SYNCOSEL吗?将PWM1设置成0 那其余的怎么设置呢 哪个寄存器是SYNCIN的呢?谢谢
  • //setup TimeBase(TB)
    EPwm1Regs.TBPRD = 1500; //Tpwm=TBPRD*Ttbclk Set PWM period 10us 100kHz
    EPwm1Regs.TBPHS.half.TBPHS = 1; // Phase is 0
    EPwm1Regs.TBCTR = 0x0000; // Clear counter

    // Setup TBCTL
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // updown count mode
    EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 不使用移相方式
    EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
    EPwm1Regs.TBCTL.bit.SYNCOSEL = 1 // 计数到0时输出同步清零信号
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT150MHz
    EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟

    // Setup CMPCTL
    EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW; // Load registers every ZERO
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW;
    EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;

    // Setup CMP
    EPwm1Regs.CMPA.half.CMPA =750;

    // Set actions
    // Set PWM1A ///
    EPwm1Regs.AQCTLA.bit.CAU=AQ_SET; //计数器(增加时)=比较器A时,输出high
    EPwm1Regs.AQCTLA.bit.ZRO=AQ_CLEAR; //计数器(递减时)=比较器B时,输出low

    //set Deadband
    EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
    EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //A:刚得到的波形反向 B刚得到的波形 所以保证了phaseAB_A就是对角桥臂的移相角 这样比较直观
    EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL;//D BA_ALL 这种模式实际上只需要epwmxa作为输入,即可产生带死区的两路xa,xb输出了
    EPwm1Regs.DBRED = EPWM_MIN_DB; //上升沿延时
    EPwm1Regs.DBFED = EPWM_MIN_DB; //下降沿延时

    }

    void SetupEPwmAB_A3A4(void) //byJJ 上下桥臂50% 完全互补
    {
    //setup TimeBase(TB)
    EPwm2Regs.TBPRD = 1500; //Tpwm=TBPRD*Ttbclk Set PWM period 10us 100kHz
    EPwm2Regs.TBPHS.half.TBPHS = 1; // Phase is 0
    EPwm2Regs.TBCTR = 0x0000; // Clear counter

    // Setup TBCTL
    EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // updown count mode
    EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; // 不使用移相方式
    EPwm2Regs.TBCTL.bit.PRDLD = TB_SHADOW; //变化TBPRD时,使用shadow寄存器(即当计数器为0时才更新)
    EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // 同步信号与epwm1一致
    EPwm2Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // Clock ratio to SYSCLKOUT
    EPwm2Regs.TBCTL.bit.CLKDIV = TB_DIV1; //两个均直通,即计数器时钟为系统时钟

    // Setup CMPCTL
    EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW; // Load registers every ZERO
    EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;//CC_IMMEDIATE;//CC_SHADOW;
    EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
    EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;


    EPwm2Regs.CMPA.half.CMPA=750;

    EPwm2Regs.AQCTLA.bit.CAU=AQ_CLEAR; //计数器(增加时)=比较器A时,输出low
    EPwm2Regs.AQCTLA.bit.ZRO=AQ_SET; //计数器(递减时)=比较器B时,输出high

    //set Deadband
    // Active High Com plementary PWMs - Setup Deadband 使用了死区模块,这里设置为输入只用了EPwmxA,因此输出一定是互补的了
    EPwm2Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; //启用死区发生器,EPwmxa和EPwmxb均使用
    EPwm2Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; //A:刚得到的波形反向 B刚得到的波形 所以保证了phaseAB_A就是对角桥臂的移相角 这样比较直观
    EPwm2Regs.DBCTL.bit.IN_MODE = DBA_ALL;//D BA_ALL 这种模式实际上只需要epwmxa作为输入,即可产生带死区的两路xa,xb输出了
    EPwm2Regs.DBRED = EPWM_MIN_DB; //上升沿延时
    EPwm2Regs.DBFED = EPWM_MIN_DB; //下降沿延时

    PWM1和PWM2红色的地方注意。其他PWM和PWM2一样

  • ECap1Regs.CAP1 = 0x5DC; // Set Period value按照150M计算的
    ECap1Regs.CTRPHS=0x1; //相位控制寄存器
    ECap1Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
    ECap1Regs.ECCTL2.bit.APWMPOL=0;//1:输出为低电平有效 0:高电平
    ECap1Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
    ECap1Regs.CAP2 = 0x2EE; // Set Compare value50%处
    ECap1Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
    ECap1Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int


    ECap3Regs.CAP1 = 0x5DC; // Set Period value按照150M计算的
    ECap3Regs.CTRPHS=0x1; //相位控制寄存器
    ECap3Regs.ECCTL2.bit.CAP_APWM = 1; // Enable APWM mode
    ECap3Regs.ECCTL2.bit.APWMPOL=0;//1:输出为低电平有效 0:高电平
    ECap3Regs.ECCTL2.bit.SYNCI_EN=1;//同步信号选择
    ECap3Regs.CAP2 = 0x2EE; // Set Compare value50%处
    ECap3Regs.ECCLR.all = 0x0FF; // Clear pending interrupts
    ECap3Regs.ECEINT.bit.CTR_EQ_CMP = 1; // enable Compare Equal Int

    ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1;
    ECap3Regs.ECCTL2.bit.TSCTRSTOP = 1;

    }

    ECAP注意红色的地方设置时对的就没问题

  • 谢谢您 按照您给的办法 已经解决问题了 很棒~~ 我自己弄了好久 thanks

  • 您好 我还想问一个问题 就是我用eCAP设置好 产生APWM 为什么要把这个段设置程序写在主函数的for循环里才能生成PWM波形呢 跟EPWM模块不同 EPWM模块不是设置好了 就一直生成波形的 不用放在主函数的for循环里 谢谢

  • 您好 我又看了一下 是不是要将 对CAP3 CAP4的赋值写在主程序的循环中就可以了

  • 不需要,你设置好影子模式就可以一直自己出了,可以参考controlsuite中的以下例程

    C:\TI\controlSUITE\device_support\f2833x\v141\DSP2833x_examples_ccsv5\ecap_apwm