你(们)好
我使用 TMS320F28032的 EPWM1A 来控制我的单端逆变器、并且在运行期间捕获到一个假脉冲。
正常脉冲宽度约为5us、假脉冲宽度约为53us。
我正在使用计数器的向上计数。 当计数器为零时、PWM 输出高电平、当计数器等于 CMPA 时、它将输出低电平。 总 PWM 周期为66.7us (15kHz)、但我不使用所有周期时间。 我有一个到 EPWM1的 SYNC 信号输入、当接收到 SYNC 信号时、计数器将加载相移值以完成低于66.7us 的周期。 正常周期约为40us、脉宽约为5us。 假脉冲的宽度为50us。
我在手册"注意:EPWMxSYNCI 外部同步事件会导致 TBCTR 计数序列中断。 这可能导致跳过比较事件。 这种跳跃被认为是正常操作、必须考虑在内。" 我怀疑这可能与此相关、但无法确认。
您能帮我就我的失败给出一些建议吗?
下面是我对 EPWM1的设置和控制。
EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//TB_SYNC_DISABLE
EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;
EPwm1Regs.AQSFRC.bit.RLDCSF = CC_CTR_ZERO;
EPwm1Regs.TBPRD = PWM1_TIMER_TBPRD_10kHz;
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//TB_COUNT_UP;//向上计数
EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;//时钟与 SYSCLKOUT 的比率
EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm1Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//;et_CTR_PRD;//选择 INT ON 周期事件
EPwm1Regs.ETSEL.bit.INTEN = 0;//禁用 INT
EPwm1Regs.ETPS.bit.INTPRD = et_1st;//在发生第一个事件时生成 INT
EPwm1Regs.ETCLR.bit.INT = 1;
/*生成 PWM */
EPwm1Regs.CMPA.half.CMPA =(EPwm1Regs.TBPRD*3>5);
EPwm1Regs.CMPB =(EPwm1Regs.TBPRD>2);
EPwm1Regs.TBCTL.bit.PHSEN = TB_ENABLE;
u32delay =((EPwm1Regs.TBPRD>>3);
EPwm1Regs.TBPHS.Half.TBPHS = 0;
EPwm1Regs.TBPHS.half.TBPHS = u32延迟;
EPwm1Regs.TBCTL.bit.PHSDIR = TB_UP;
EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;
EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET;
EPwm1Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm1Regs.DBCTL.bit.HALFCYCLE = 0;
EPwm1Regs.DBCTL.bit.IN_MODE = DB_DISABLE;//DBA_RED_DBB_FED;
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_DISABLE;//DB_FUL_ENABLE;
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;
EPwm1Regs.DBRED = 0;
EPwm1Regs.DBFED = 0;
/*用于 ADC 触发器*/
#if 1.
EPwm1Regs.ETSEL.bit.SOCBEN = 1;//在 B 组上启用 SOC
EPwm1Regs.ETSEL.bit.SOCBSEL = 6;//2;//在定时器递增时选择等于 CMPB 的 SOC 时基计数器
EPwm1Regs.ETPS.bit.SOCBCNT = 1;//已发生事件。
EPwm1Regs.ETPS.bit.SOCBPRD = 1;//在发生第一个事件时生成脉冲
#define SET_PWM_Duty (X){EPwm1Regs.TBPRD = GET_15K_PWM_PRD;\
EPwm1Regs.CMPA.half.CMPA =((uint32)(Base_Time_10us *((uint32)(X))>>10);\
EPwm1Regs.CMPB = EPwm1Regs.CMPA.half.CMPA;\
EPwm1Regs.TBPHS.Half.TBPHS =((uint32)(EPwm1Regs.TBPRD-(EPwm1Regs.TBPRD>9)* DELAY_TIME);}