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.

TI TMS320F28335的EPWM如何软件强制开关状态

Other Parts Discussed in Thread: TMS320F28335, TMS320LF2407A

TI TMS320F28335的EPWM如何软件强制开关状态

在DSP用于电机控制的应用中,有时需要用到强制脉宽调制(PWM)的脉冲开关状态这种操作,比如封锁脉冲以停止电力电子开关管工作;在上电的初始时刻,经常也需要对PWM状态进行一种强制的初始化,比如强制高、强制低等等;一些特殊的PWM算法,如果不是基于三角载波比较法的,如一些SHEPWM、滞环PWM方法等等,也需要直接输出PWM脉冲的状态,此时不能使用比较值与定时器的直接比较来得到开关状态,而且在需要的开关状态已知情况下,直接强制PWM状态,即可得到需要PWM脉冲。

在基于事件管理器(EV)的TI C2000 DSP中,如TMS320LF2407A、F2810、2812中,强制脉冲状态是一件很简单的事情,直接写ACTRx寄存器就可以了,比如:

EvaRegs.ACTRA.all=0xfff;

这样的语句就能强制EVA对应的6个PWM管脚全部为高电平,等于0则可以全部强制低电平,需要强制特定管脚的值只需要修改对应的位即可。

在基于改进的PWM模块的C2000 DSP中,如2833x系列,都使用了新型的增强型PWM模块(EPWM),其每个PWM管脚都可以有单独的配置,这样就造成了PWM配置的复杂性增加了。在网上找了好久,都没有找到如何强制脉冲状态。本来想,换了个新片子,大不了照葫芦画瓢配置一番就行了,于是拿过EPWM的手册,照着AQSFRC寄存器配置了半天,却总是没反应。看名字,AQSFRC是Action-Qualifier Software Force Register,应该是可以force它听话的啊!代码

EPwm1Regs.AQSFRC.bit.OTSFA=1;

EPwm1Regs.AQSFRC.bit.ACTSFA=1;

这样子的根本不产生任何效果。

后来才发现是研究不深啊,原来真正需要配置的是AQCSFRC:

EPwm1Regs.AQSFRC.all=0xc0;

EPwm1Regs.AQCSFRC.all=state;

两个寄存器的datasheet的页码就差一页,下次真得要读仔细了。

 

转自paradoxfx

  • 嗯  我看了这帖子  也是这么配置的  但是还是没动静  不需要什么触发吗?

  • #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
    #include "DSP2833x_Examples.h" // DSP2833x Examples Include File
    #define uint unsigned int
    int Duty1A,Duty1B,cnt1=0,step=0;
    interrupt void MainISR(void);

    void Configue_EPwm1()
    {
    InitEPwm1Gpio();
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;
    EDIS;

    EPwm1Regs.TBPRD = 15000;
    EPwm1Regs.TBPHS.half.TBPHS = 2;
    EPwm1Regs.TBCTL.bit.CLKDIV = 0; //时间基准时钟预分频
    EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; //高速时间基准时钟预分频
    EPwm1Regs.TBCTL.bit.CTRMODE = 0; //递增计数模式
    EPwm1Regs.TBCTL.bit.PHSEN = 1; //
    EPwm1Regs.TBCTL.bit.PRDLD = 0;
    EPwm1Regs.TBCTL.bit.SYNCOSEL = 0;

    EPwm1Regs.CMPCTL.bit.LOADAMODE = 0;
    EPwm1Regs.CMPCTL.bit.LOADBMODE = 0;
    EPwm1Regs.CMPCTL.bit.SHDWAFULL = 0;
    EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0;

    // EPwm1Regs.AQCTLA.bit.CAD = 2;
    EPwm1Regs.AQCTLA.bit.CAU = 2;//当时间基准计数器的值等于CMPA得值,且在增计数,使PWM1A为高电平
    EPwm1Regs.AQCTLA.bit.ZRO = 0;//当时间基准计数器的值等于0得值,无动作
    EPwm1Regs.AQCTLA.bit.PRD = 1;//当时间基准计数器的值等于周期寄存器值,使PWM1A为低电平
    // EPwm1Regs.AQCTLB.bit.CBD = 2;
    EPwm1Regs.AQCTLB.bit.CBU = 1;//低电平
    EPwm1Regs.AQCTLB.bit.PRD = 2;//高电平
    EPwm1Regs.AQCTLB.bit.ZRO = 0;


    EPwm1Regs.ETSEL.bit.INTEN=1;//使能EPWM1中断
    EPwm1Regs.ETCLR.bit.INT=1;//清除中断状态标志位
    EPwm1Regs.ETSEL.bit.INTSEL=2;//TBCTR=TBPRD时产生中断
    EPwm1Regs.ETPS.bit.INTPRD=1;//每发生一次事件,产生中断信号

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;
    EDIS;
    }


    void Delay_loop(uint i)
    {
    for(;i>0;i--)
    {
    uint x=100;
    while(x--)
    {}

    }
    }
    void main(void)
    {
    InitSysCtrl();//系统初始化
    DINT;//禁止CPU中断
    InitPieCtrl();
    IER=0x0000;
    IFR=0x0000;
    InitPieVectTable();
    EALLOW; // This is needed to write to EALLOW protected registers
    PieVectTable.EPWM1_INT = &MainISR;
    EDIS;
    InitEPwm1Gpio();
    Configue_EPwm1();
    IER |= M_INT3;
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//使能PIE第三组第一个向量为PWM1中断向量
    EINT; // Enable Global interrupt INTM
    ERTM; // Enable Global realtime interrupt DBGM
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; // Must acknowledge the PIE group // Initialize the Watchdog Timer

    while(1)
    { if(cnt1<1000)

    {
    Duty1A=5000,Duty1B=5000;
    EPwm1Regs.CMPA.half.CMPA =Duty1A;
    EPwm1Regs.CMPB =Duty1B;
    }
    else
    EPwm1Regs.AQSFRC.all=0xc0;
    EPwm1Regs.AQCSFRC.bit.CSFA=2;
    Delay_loop(1000);
    cnt1=0;

    }
    }
    interrupt void MainISR(void){
    cnt1++;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; // Must acknowledge the PIE group
    EPwm1Regs.ETCLR.bit.INT = 1;
    }

    写了一个小的程序 ,需要在没有波形输出时  强制状态为低电平 为什么这么配置 怎么改变EPwm1Regs.AQCSFRC.bit.CSFA的值都没有动作?

  • 问题解决了吗 看到有网友遇到类似的问题
x 出现错误。请重试或与管理员联系。