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.

TMS320F280025C: EPWM禁用时改变CMPA会重新启用

Part Number: TMS320F280025C

//控制8路PWM
__interrupt void ePWM7_ISR(void)
{
    //因为是同步所以放一个中断里 8路PWM:ePWM1A ~ ePWM7A 、eCAP2的APWM
    EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD * Inverter_DATA[PV1_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比       
    EPwm2Regs.CMPA.bit.CMPA = EPwm2Regs.TBPRD * Inverter_DATA[PV1_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比       
    EPwm3Regs.CMPA.bit.CMPA = EPwm3Regs.TBPRD * Inverter_DATA[PV2_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比      
    EPwm4Regs.CMPA.bit.CMPA = EPwm4Regs.TBPRD * Inverter_DATA[PV2_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比    
    EPwm5Regs.CMPA.bit.CMPA = EPwm5Regs.TBPRD * Inverter_DATA[PV3_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比    
    EPwm6Regs.CMPA.bit.CMPA = EPwm6Regs.TBPRD * Inverter_DATA[PV3_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比   
    EPwm7Regs.CMPA.bit.CMPA = EPwm7Regs.TBPRD * Inverter_DATA[PV4_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比  
    ECap2Regs.CAP2          = ECap2Regs.CAP1  * Inverter_DATA[PV4_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比        
    Inverter_Flag[FlagX_sin_Number]++;
    if(Inverter_Flag[FlagX_sin_Number] >= Sin_sampling_Number){Inverter_Flag[FlagX_sin_Number] = 0;}
    EPwm7Regs.ETCLR.bit.INT = 1;//写1对ETFLG[INT]状态标志位清零才能进行下一次中断
    PieCtrlRegs.PIEACK.all=PIEACK_GROUP3;       //确认组3中断
}

我屏蔽掉

EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD * Inverter_DATA[PV1_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比       
    EPwm2Regs.CMPA.bit.CMPA = EPwm2Regs.TBPRD * Inverter_DATA[PV1_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比       
    EPwm3Regs.CMPA.bit.CMPA = EPwm3Regs.TBPRD * Inverter_DATA[PV2_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比      
    EPwm4Regs.CMPA.bit.CMPA = EPwm4Regs.TBPRD * Inverter_DATA[PV2_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比    
    EPwm5Regs.CMPA.bit.CMPA = EPwm5Regs.TBPRD * Inverter_DATA[PV3_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比    
    EPwm6Regs.CMPA.bit.CMPA = EPwm6Regs.TBPRD * Inverter_DATA[PV3_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比   
    EPwm7Regs.CMPA.bit.CMPA = EPwm7Regs.TBPRD * Inverter_DATA[PV4_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比  
    ECap2Regs.CAP2          = ECap2Regs.CAP1  * Inverter_DATA[PV4_PWM_control] * sina[ Inverter_Flag[FlagX_sin_Number] ];     //按照sin变化占空比        
   这几个之后他就不会有波形但是没有屏蔽他就会有

我在主函数中有禁用ePWM 时钟

   EALLOW;
    CpuSysRegs.PCLKCR2.bit.EPWM1 = 0;               // 禁用ePWM1时钟
    CpuSysRegs.PCLKCR2.bit.EPWM2 = 0;               // 禁用ePWM2时钟
    CpuSysRegs.PCLKCR2.bit.EPWM3 = 0;               // 禁用ePWM3时钟
    CpuSysRegs.PCLKCR2.bit.EPWM4 = 0;               // 禁用ePWM4时钟
    CpuSysRegs.PCLKCR2.bit.EPWM5 = 0;               // 禁用ePWM5时钟
    CpuSysRegs.PCLKCR2.bit.EPWM6 = 0;               // 禁用ePWM6时钟
    CpuSysRegs.PCLKCR2.bit.EPWM7 = 0;               // 禁用ePWM7时钟
    ECap2Regs.ECCTL2.bit.TSCTRSTOP   = 0;           //禁用eCAP2计数器开始计数    APWM
    EDIS;

  • Hi,

    我不太理解您的问题,能否重新表述一下?

    另外,如果方便的话,请使用 ‘插入-->代码’ 来插入代码,便于我们查看,以为您更好地解决问题:

    --

    谢谢

  • 就是我在主函数中关闭了EPWM1~EPWM7的输出    如果不进行CMPA.bit.CMPA 的修改他是正常的(就是不输出PWM)如果在中断中修改CMPA.bit.CMPA 的话他会不执行关闭输出的操作(又进行输出PWM)我的本意是让他在我关闭它输出的时候ePWM停止输出,打开的时候继续输出

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //HRPWM_Config - ePWMePWMxAePWMxBHRPWM;
    //ePWMx:PWM(ePWM1~ePWM7) period: dutyfactor_A:A dutyfactor_B:B
    void ePWM_Config(Uint16 ePWMx,float period,float dutyfactor_A)
    {
    float count;
    if(ePWMx==1) ePWM=&EPwm1Regs; //ePWM1
    else if(ePWMx==2) ePWM=&EPwm2Regs; //ePWM2
    else if(ePWMx==3) ePWM=&EPwm3Regs; //ePWM3
    else if(ePWMx==4) ePWM=&EPwm4Regs; //ePWM4
    else if(ePWMx==5) ePWM=&EPwm5Regs; //ePWM5
    else if(ePWMx==6) ePWM=&EPwm6Regs; //ePWM6
    else if(ePWMx==7) ePWM=&EPwm7Regs; //ePWM7
    dutyfactor_A = 1-dutyfactor_A / 100.0; //A(使1-)
    //ePwMHRPwM
    //ePWMxA/MEP沿
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC = 0; //EPWMTBCLK EPWMCLK = TBCLK = 100 MHz TBCLKePWM(EPWMCLK)ePWM使Clock
    EDIS;
    count=50000000.0/period; //()
    (*ePWM).TBPRD = (Uint16)(count); //PWM=1/(2*TBPRD) //(period,2(2))
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 您在主函数中是通过什么来关闭输出的?AQ的动作吗?

  •  EALLOW;
        CpuSysRegs.PCLKCR2.bit.EPWM1 = 0;               // 禁用ePWM1时钟
        CpuSysRegs.PCLKCR2.bit.EPWM2 = 0;               // 禁用ePWM2时钟
        CpuSysRegs.PCLKCR2.bit.EPWM3 = 0;               // 禁用ePWM3时钟
        CpuSysRegs.PCLKCR2.bit.EPWM4 = 0;               // 禁用ePWM4时钟
        CpuSysRegs.PCLKCR2.bit.EPWM5 = 0;               // 禁用ePWM5时钟
        CpuSysRegs.PCLKCR2.bit.EPWM6 = 0;               // 禁用ePWM6时钟
        CpuSysRegs.PCLKCR2.bit.EPWM7 = 0;               // 禁用ePWM7时钟
        ECap2Regs.ECCTL2.bit.TSCTRSTOP   = 0;           //禁用eCAP2计数器开始计数    APWM
        EDIS;

    使用这些语句

    或者您有什么好方法么

  • 那个  这个比较着急  方便看一下么

  • Hi,

    正常情况下都是通过AQ的动作来关闭或打开输出的

  • 是怎么操作呢

  • 我使用这个也还在输出波形

    EPwm2Regs.AQCSFRC.bit.CSFA = 1;               // 禁用ePWM2

  • AQCSFRC

    这个是软件封锁,您试一下修改硬件动作

  • 方便说一下是怎么操作么

  • Hi,

    是这几个寄存器。