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
xin zhang11:
嗯 我看了这帖子 也是这么配置的 但是还是没动静 不需要什么触发吗?
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
xin zhang11:
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File#include "DSP2833x_Examples.h" // DSP2833x Examples Include File#define uint unsigned intint 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的值都没有动作?
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
mangui zhang:
回复 xin zhang11:
问题解决了吗看到有网友遇到类似的问题