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.

TMS320F280049: F280049的ECAP、pwm

Part Number: TMS320F280049

void configPWM1(void)
{
EALLOW;
EPwm1Regs.TBCTL.bit.CLKDIV = 6; //时钟频率100M/64
EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; //时钟频率100M
EPwm1Regs.TBCTL.bit.CTRMODE = 2; //增减计数
EPwm1Regs.TBCTL.bit.PHSEN = 1; //使能装载相位计数
EPwm1Regs.TBCTL.bit.PRDLD = 1; //禁止使用影子寄存器
EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; //同步信号输出链接到SYNCI/soft
// EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; //同步信号输出由TBCTL2决定
EPwm1Regs.TBCTL2.bit.SYNCOSELX = 0; //不使能同步信号输出
EPwm1Regs.TBCTL.bit.PHSDIR = 1; //同步信号后增计数

// EPwm1Regs.TBCTL.bit.SWFSYNC = 1; //软件强制同步脉冲

EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; //CMPA采用影子装载模式
EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0; //CMPB采用影子装载模式
EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; //影子装载模式下,装载条件等于0
EPwm1Regs.CMPCTL.bit.LOADBMODE = 0; //影子装载模式下,装载条件等于0

EPwm1Regs.AQCTLA.all = 0x25; //PWMA 向上计数等于CMPA时置位,等于PRD时复位,等于0时复位
EPwm1Regs.AQCTLB.all = 0x805; //PWMB 向下计数等于CMPB时置位,等于PRD时复位,等于0时复位
EPwm1Regs.AQSFRC.all = 0x2D; //一次性软件强制动作时复位AB脉冲
EPwm1Regs.AQCSFRC.all = 0x05; //软件连续强制动作为低

EPwm1Regs.TZSEL.all = 0;
EPwm1Regs.TZCTL.all = 0;
EPwm1Regs.TZEINT.all = 0;
EPwm1Regs.TZFLG.all = 0;
EPwm1Regs.TZCLR.all = 0;
EPwm1Regs.TZFRC.all = 0;

EPwm1Regs.ETSEL.bit.SOCAEN = 0; //不使能SOCA信号产生
EPwm1Regs.ETSEL.bit.SOCASEL = 6; //向上计数等于CMPB或CMPD时触发
EPwm1Regs.ETSEL.bit.INTEN = 0; //不使能中断
EPwm1Regs.ETSEL.bit.INTSEL = 6; //向上计数等于CMPB或CMPD时触发

EPwm1Regs.ETPS.bit.SOCAPRD = 2; //2次事件产生SOCA信号
EPwm1Regs.ETPS.bit.INTPRD = 2; //2次事件产生中断信号

EPwm1Regs.ETCLR.bit.INT = 1; //清除中断标志位
EPwm1Regs.ETCLR.bit.SOCA = 1; //清除SOCA触发标志位

EPwm1Regs.DBCTL.all = 0x00; //
EPwm1Regs.DBRED.all = 0; //上升沿死区时间,半时钟计数死区时间0ns
EPwm1Regs.DBFED.all = 0; //下降沿死区时间,半时钟计数死区时间0ns

EPwm1Regs.TBPHS.bit.TBPHS = 0; //相位寄存器延时0
EPwm1Regs.TBCTR = 0; //时基计数器清零
EPwm1Regs.TBPRD = 15625; //周期寄存器赋值,时钟频率100m/64=0.64us,20ms计时,增减计数除以2
EPwm1Regs.TBSTS.all = 0; //时基状体寄存器清零

EPwm1Regs.CMPA.bit.CMPA = 15625; //初始化为0占空比
EPwm1Regs.CMPB.bit.CMPB = 0; //初始化为0占空比

EPwm1Regs.HRCNFG.all = 0x00; //不要死区
EPwm1Regs.HRCNFG.bit.EDGMODE = 2; //在CMPAHR下降沿的时候控制
EPwm1Regs.HRCNFG.bit.CTLMODE = 0; //控制模式为CMPA/CMPB/TBPRD控制,不需要TBPHS控制
EPwm1Regs.HRCNFG.bit.HRLOAD = 1; //在计数为PRD时加载CMPAHR的值
EPwm1Regs.HRCNFG.bit.AUTOCONV = 0; //不启动SFO自动计算公式

EPwm1Regs.HRCNFG.bit.SWAPAB = 0;
EPwm1Regs.HRCNFG.bit.SELOUTB = 0;

EPwm1Regs.HRCNFG2.bit.CTLMODEDBFED = 1; //计数等于PRD时装载HRDB
EPwm1Regs.HRCNFG2.bit.CTLMODEDBRED = 1; //计数等于PRD时装载HRDB
EPwm1Regs.HRCNFG2.bit.EDGMODEDB = 2; //使能下降沿DB延时

EPwm1Regs.HRPCTL.bit.HRPE = 0; //不使能高分辨PRD控制模式,使CMP可以小于3到0,但CMPAHR必须赋值为0;

EDIS;
}

void Cap1_Config(void)
{
EALLOW;
InputXbarRegs.INPUT1SELECT = 11; //INPUT1使用GPIO11作为输入XBAR
GpioCtrlRegs.GPAPUD.bit.GPIO11 = 1; // Enable pull-up
GpioCtrlRegs.GPAQSEL1.bit.GPIO11 = 0; //同步采样,与系统时钟同步
GpioCtrlRegs.GPADIR.bit.GPIO11 = 0; //配置为输入引脚

ECap1Regs.ECCTL0.bit.INPUTSEL = 0; //ECAP1捕获引脚对应INPUT1

ECap1Regs.ECCTL1.bit.CAP1POL = 0; //事件1在上升沿触发
ECap1Regs.ECCTL1.bit.CAP2POL = 1; //事件2在下降沿触发
ECap1Regs.ECCTL1.bit.CAP3POL = 0; //事件3在上升沿触发
ECap1Regs.ECCTL1.bit.CAP4POL = 1; //事件4在下降沿触发

ECap1Regs.ECCTL1.bit.CTRRST1 = 0; //事件1后不复位计数器
ECap1Regs.ECCTL1.bit.CTRRST2 = 1; //事件2后不复位计数器
ECap1Regs.ECCTL1.bit.CTRRST3 = 0; //事件3后复位计数器
ECap1Regs.ECCTL1.bit.CTRRST4 = 0; //事件4后复位计数器

ECap1Regs.ECCTL1.bit.PRESCALE = 0; //事件分频器,不分频
ECap1Regs.ECCTL1.bit.CAPLDEN = 1; //使能CAP1~CAP4事件发生时,加载TSCTR计数器的值

ECap1Regs.ECCTL2.bit.CAP_APWM = 0; //配置ECAP1模块为ECAP功能
ECap1Regs.ECCTL2.bit.SYNCI_EN = 0; //不使能同步计数器TSCTR装载相位寄存器CTRPHS的值
ECap1Regs.ECCTL2.bit.SYNCO_SEL = 2; //不使能同步信号输出
ECap1Regs.ECCTL2.bit.CONT_ONESHT = 0; //连续模块

ECap1Regs.ECEINT.all = 0x0000; // Disable all capture interrupts 清除所有中断
ECap1Regs.ECCLR.all = 0xFFFF; // Clear all CAP interrupt flags 清除所有ecap中断标志
ECap1Regs.ECCTL2.bit.TSCTRSTOP = 0; // Start Counter 计数器TSCTR控制位,0计数停止,1运行

ECap1Regs.ECCTL2.bit.STOP_WRAP = 1; //只启动CEVT1和CEVT2事件

ECap1Regs.ECEINT.bit.CEVT1 = 1; // 1 events = interrupt 捕获CEVT1事件中断使能位,0禁止中断,1允许中断
ECap1Regs.ECEINT.bit.CEVT2 = 0;
ECap1Regs.ECEINT.bit.CEVT3 = 0;
ECap1Regs.ECEINT.bit.CEVT4 = 0;

ECap1Regs.ECCTL2.bit.TSCTRSTOP = 1; //开始计数器运行

EDIS;

这边做一个三相的过零检测,使用Ecap检测比较器后的上升沿做为pwm的发波使用的,PWM1、2、3,分别作为三相的过零发波,但是实际运行中有时会出现pwm1、2、3同时发波的情况,有时又正常为三相依次发波,pwm配置是不使能同步信号