尊敬的C2000专家:
我想使用F2.8023万的ePWM在CBC模式下工作,并要求在5个连续的开关循环中发生CBC后锁定ePWM。
但是我遇到了一个问题,如果我清除TZCLR寄存器,PWM在CBC模式下不工作。 TZCLR寄存器清除后TZ状态似乎消失了。 请您分享您对此的意见吗?
我的操作顺序如下所示:
在每个PWM周期中ISR:
-阅读TZFLG以查看是否发生CBC
-如果是CBC,则统计数字并设置TZCLR寄存器(这将导致PWM问题),如果是连续的5个PWM循环,则锁定PWM
否则请清除计数器
这是我的测试波,正常的PWM周期是50us,但PWM周期在清除TZCLR寄存器后更改。
下面是我关于CBC初始化的代码:
void init_pfc_acomp_tTrip ePWM (void)
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK =1; //为ADC启用时钟
AdcRegs.ADCCTL1.bit.ADCBGPWD =1; //比较器共享ADC的内部BG参考,即使未使用ADC,也必须为其供电
//启用模拟比较器
DELAY _US (1000); //加电延迟
SysCtrlRegs.PCLKCR3.bit.COMP1ENCLK =1; //为比较器1块启用时钟
Comp1Regs.COMPCTL.bit.COMPDACEN =1; //本地通电比较器1
//Comp1Regs.COMPCTL.bit.COMPSOURCE = 1; //将反相输入连接到引脚COMP1B
////////////////// 取消注释以下2行以使用DAC,而不是引脚COMP1B //////////////////////
Comp1Regs.COMPCTL.bit.SYNCSEL = 1; //传递比较器输出的同步版本
Comp1Regs.COMPCTL.bit.QUALSEL = 31; //在Qual块CAN输出之前,块的输入必须连续3个时钟保持一致
//更改
Comp1Regs.COMPCTL.bit.COMPSOURCE = 0; //将反相输入连接到内部DAC
Comp1Regs.DACVAL.bit.DACVAL = COMP_DAC_VALUE; //将DAC输出设置为中点
EDIS;
EALLOW;
//根据TZ1和TZ2定义事件(DCAEVT1)
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP1OUT; // DCAH =比较器1输出
EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL = DC_TZ2; // DCAL = TZ2
//EPwm1Regs.TZDCSEL.bit.DCAEVT1 = TZ_DCAH_LOW; // DCAEVT1 = DCAH LOW (当比较器输出变为低电平时将变为活动状态)
//EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1; // DCAEVT1 = DCAEVT1 (未过滤)
//EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_Async; //采用异步路径
EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAH_LOW;
EPwm1Regs.DCACTL.bit.EVT2SRCSEL = DC_EVT2;// DCAEVT2 = DCAEVT2 (未过滤)
EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = DC_EVT_Async;//采用异步路径//启用DCAEVT2 AS
//一触式跳闸源
//注:可以定义DCxEVT1事件
//启用DCAEVT1和DCBEVT1是一个触发跳闸源
//注:DCxEVT1事件可以定义为单次触发。
// DCxEVT2事件可定义为逐周期。
EPwm1Regs.TZsel.bit.DCAEVT1 = 0;
EPwm1Regs.TZsel.bit.DCAEVT2 = 1;
//我们希望DCAEVT1和DCBEVT1事件做什么?
// DCAEVTx事件可以强制EPWMxA
// DCBEVTx事件可以强制EPWMxB
EPwm1Regs.TZCTL.bit.TZA = TZ_FORM_LO; // EPWM1A将会高电平
EDIS;
}
ISR中的CBC处理程序代码:
内联void ePWM_CBC_handler (void)
{
挥发性接头 TZFLG_REG tzflg;
静态内部16 CBC_COUNT = 0;
EALLOW;
tzflg.all = EPwm1Regs.TZFLG.all;
IF (tzflg.bit.CBC == 1)/CBC发生
{
EPwm1Regs.TZCLL.ALL = tzflg.all;//清除CBC标志
CBC_COUNT ++;
IF (CBC_COUNT == 5)
{
turn-off-PFC ();
PFC_VCC_OFF;
PFC_vars.CBC_FAULT = 1;
}
}
否则
{
CBC_COUNT = 0;
}
EDIS;
}
此致,
千斤顶