Thread 中讨论的其他器件: SysConfig、 C2000WARE
我们使用 TI DSP TMS320F28374S 来驱动具有降压-升压级的 LLC 转换器 
在运行期间、我们需要动态更改开关频率。
因此、我们希望使用技术参考手册第1756页中描述的全局加载功能。
以下 PWM 模块已链接、需要以相同的频率运行:
EPWM1 (主器件)
EPWM2 (从)
EPWM3 (从器件)
EPWM4 (从器件)
EPWM5 (从器件)
所有计数器都配置为运行加/减、我希望所有 PWM 单元在 PWM1达到 CTR = 0时从影子寄存器更新 PRD 和 CMPA 值。
我测试了多种全局负载选通脉冲配置、但 PWM 模式与预期不符、因为 EPWM2、3和 EPWM4、5之间会出现滞后。
我怀疑我们的代码中存在配置问题。

这是我们初始化 PWM 寄存器的代码的一部分
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;
//配置4个 LLC HRPWM 模块
对于(j=0;j<=3;j++)
{
//TODO 考虑使用跳闸区域
// EALLOW;
//(* LLC_ePWMArray[j]).TZSEL.bit.DCBEVT1 = true;//启用 DCBEVT1作为单次触发事件源(软件 TZ)
///(* LLC_ePWMArray[j]).TZSEL.bit.OSHT3 = true;//启用\TZ3作为单次触发事件源(硬件 TZ)
//(* LLC_ePWMArray[j]).TZFRC.bit.DCBEVT1 = true;//初始化期间强制 TZ 中断
//(* LLC_ePWMArray[j]).TZCTL.bit.TZA = TZ_FORCE_LO;// EPWMxA 将在跳闸事件中强制拉低
//(* LLC_ePWMArray[j]).TZCTL.bit.TSB = TZ_FORCE_LO;// EPWMxB 将在跳闸事件中强制为低电平
// EDIS;
(* LLC_ePWMArray[j]).TBPRD = PWM_50kHz_PRD_CNTUPDOWN;// PWM 频率= 1/(2 * TBPRD)
(* LLC_ePWMArray[j]).EPWMXLINK.BIT.TBPRDLINK = 0x0;//将 PRD 寄存器链接到 EPWM1单元的设置
//(更新 EPWM1 PRD 自动更新此模块的 PRD 值)
//TODO 在这些行中进行注释、如果我们不需要死区时间、并且可以对所有桥使用相同的 CMPA 值
//(* LLC_ePWMArray[j]).EPWMXLINK.bit.CMPALINK = 0x1;//将 CMPA/CMPAHR 寄存器链接到 EPWM2单元的设置
////(EPWM2比较值的更新自动更新该模块的比较值)
(* LLC_ePWMArray[j]).cmpa.bit.cmpaHR =(0 << 8);//初始化 HRPWM 扩展
(* LLC_ePWMArray[j]).TBPHS.ALL = 0;
(* LLC_ePWMArray[j]).TBCTR = 0;
(* LLC_ePWMArray[j]).TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;//选择上-下计数模式。
//3.
(* LLC_ePWMArray[j]).TBCTL.bit.PRDLD = TB_SHADOW;//设置影子加载
(* LLC_ePWMArray[j]).TBCTL.bit.HSPCLKDIV = TB_DIV1;
(* LLC_ePWMArray[j]).TBCTL.bit.CLKDIV = TB_DIV1;// TBCLK = SYSCLKOUT
(* LLC_ePWMArray[j]).TBCTL.bit.free_soft = 1;
(* LLC_ePWMArray[j]).cmPCTL.bit.SHDWAMODE = CC_SHADOW;
(* LLC_ePWMArray[j]).cmPCTL.bit.SHDWBMODE = CC_SHADOW;
(* LLC_ePWMArray[j]).cmPCTL.bit.LOADAMODE = CC_CTR_ZERO;//在 ZRO 上加载 CMPA。
(* LLC_ePWMArray[j]).cmPCTL.bit.LOADBMODE = CC_CTR_ZERO;
//将死区模块配置为能够在输出 A 上使用上升沿和下降沿延迟
//有关详细信息,请参阅 DeadBandModuleConfigLLCPwms.png
(* LLC_ePWMArray[j]).DBCTL.bit.OUTSWAP = 3;
(* LLC_ePWMArray[j]).DBCTL.bit.DEDB_MODE = 1;
(* LLC_ePWMArray[j]).DBCTL.bit.out_mode = 1;
(* LLC_ePWMArray[j]).DBCTL.bit.SHDWDBFEDMODE = 1;
(* LLC_ePWMArray[j]).DBCTL.bit.SHDWDBREDMODE = 1;
if (j =0 || j =2)
{
// CMP 事件时的操作:
(* LLC_ePWMArray[j]).AQCTLA.bit.CAU = AQ_CLEAR;// PWM 切换为高电平/低电平
(* LLC_ePWMArray[j]).AQCTLA.bit.CAD = AQ_CLEAR;
(* LLC_ePWMArray[j]).cmpa.bit.cmpA = PWM_50kHz_PRD_CNTUPDOWN_50DUTY;//- PWM_Deadtime_in_ticks;//初始设置占空比50%
}
其他
{
(* LLC_ePWMArray[j]).AQCTLA.bit.CAU = AQ_CLEAR;// PWM 切换为高电平/低电平
(* LLC_ePWMArray[j]).AQCTLA.bit.CAD = AQ_CLEAR;
(* LLC_ePWMArray[j]).cmpa.bit.cmpA = PWM_50kHz_PRD_CNTUPDOWN_50DUTY;//+ PWM_Deadtime_in_ticks;//开始时设置占空比50%
}
EALLOW;
(* LLC_ePWMArray[j]).HRCNFG.ALL = 0x0;
//4.
#ifdef PWM_PHSHR
(* LLC_ePWMArray[j]).HRCNFG.bit.HRLOAD = HR_CTR_ZERO;// CTR 上的负载= 0 (HR 相移所需)
其他
(* LLC_ePWMArray[j]).HRCNFG.bit.HRLOAD = HR_CTR_ZERO _PRD;// CTR = 0和 PRD 上的负载(HR 占空比需要)
#endif
(* LLC_ePWMArray[j]).HRCNFG.bit.AUTOCONV = 1;//启用 HR 周期的自动转换
(* LLC_ePWMArray[j]).HRCNFG.bit.EDGMODE = HR_BEP;//两个边沿上的 MEP 控制
(* LLC_ePWMArray[j]).HRCNFG.bit.CTLMODE = HR_CMP;//选择控制 MEP 的寄存器(CMP/TBPRD 或 TBPHS)//MKH:HR 相移仍与 HR_CMP 一同工作
//5.
(* LLC_ePWMArray[j]).HRPCTL.bit.TBPHSHRLOADE = 1;//此位允许您在 SYNCIN、TBCTL[SWFSYNC]或数字比较事件上同步具有高分辨率相位的 ePWM 模块
//所有都是从器件...
(* LLC_ePWMArray[j]).TBCTL.bit.PHSEN = TB_ENABLE;//在发生 SYNCIN 或 TBCTL[SWFSYNC]事件时使用相位寄存器加载时基计数器
(* LLC_ePWMArray[j]).TBCTL.bit.SYNCOSEL = TB_SYNC_IN;//仅当 SYNCOSEL = 00选择 EPWMxSYNCI 时、SWFSYNC 才有效(运行)。
(* LLC_ePWMArray[j]).TBCTL.bit.PHSDIR = 1;//在同步事件后递增计数并加载相位的新值(TBPHS)。
(* LLC_ePWMArray[j]).TBPHS.bit.TBPHS = 2;//初始-相对于 ePWM1的粗略相位偏移(数据表/手册中的值)
(* LLC_ePWMArray[j]).HRPCTL.bit.HRPE = 1;// 6. 启用高分辨率周期控制。
//6. 为 LLC 的影子寄存器配置全局加载功能
(* LLC_ePWMArray[j]).TBCTL2.bit.PRDLDSYNC = 0x2;//接收到同步时影子到活动负载
GlobalLoadConfig (LLC_ePWMArray[j]);
全局加载在之后的单独函数中进行配置:
void GlobalLoadConfig (volatile struct ePWM_regs * ePWM_reg)
{
//为影子寄存器配置全局加载功能
//在基本配置中,全局加载被禁用
EALLOW;
(* ePWM_reg).GLDCFG.bit.TBPRD_TBPRDHR = 0x1;//允许 TBRD 和 TBRDHR 上的全局加载
(* ePWM_reg).GLDCFG.bit.CMPA_CMPAHR = 0x1;//允许 CMPA 和 CMPAHR 上的全局加载
(* ePWM_reg).GLDCFG.bit.CMPB_CMPBHR = 0x1;//允许 CMPA 和 CMPAHR 上的全局加载
(* ePWM_reg).GLDCTL.bit.OSHTMODE = 0x0;//一次性模式被禁用
(* ePWM_reg).GLDCTL.bit.GLDMODE = 0x03;//在发生 SYNCEVT 事件时加载影子寄存器
(* ePWM_reg).GLDCTL.bit.GLDPRD = 0x1;//第一个事件触发
(* ePWM_reg).GLDCTL.bit.GLD = 0x1;//使用全局加载选通(全局加载启用)
(* ePWM_reg).EPWMXLINK.BIT.GLDCTL2LINK = 0x0;//将 GLDCTL2链接到 ePWM1 ->单次加载同步到 ePWM1
//EDIS;
}
发生频率变化时、会激活并触发一次性加载
如果您能提供示例或解释如何正确链接寄存器以实现所请求的行为、我将不胜感激。
我们的最终目标是让所有 PWM 寄存器一次性更新(周期和占空比)、在 ePWM 模块之间不产生毛刺脉冲。
感谢您的支持。