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.

[参考译文] TMS320F28374S:可变频率应用的全局加载/影子寄存器

Guru**** 2538950 points
Other Parts Discussed in Thread: TMS320F28374S, SYSCONFIG, C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1187635/tms320f28374s-global-load-shadow-register-for-variable-frequency-application

器件型号:TMS320F28374S
Thread 中讨论的其他器件: SysConfigC2000WARE

我们使用 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 模块之间不产生毛刺脉冲。

感谢您的支持。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Florian、

    让我来看看这一点、今天结束后再回到您的身边。

    最棒的

    Ryan Ma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Florian、

    我们确实有一个很好的资源、 可以在此处提供 有关设置 ePWM 模块之间的链接和全局负载支持的资源。 如果您滚动到第9章"关于全局加载"、则会显示需要配置的内容。  

    请告诉我这是否有帮助!

    最棒的

    Ryan Ma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢您、我将介绍一下。 我们目前尚未使用 SysConfig 工具在此项目中、我必须检查兼容性

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SysConfig 工具还对在工具中选择设置的 IP 进行验证。 它将让您了解需要根据您的选择配置哪些内容、以及是否存在任何错误的配置。

    在 SysConfig 中选择设置后、您可以查看在相应的 driverlib 中编辑的位字段。

    如果您在设置 SysConfig 以使用最新的 C2000Ware 方面需要帮助、请告诉我、如果有任何有关链接的问题、我可以回答。