这让我有点失望、如果您需要更多信息、请告诉我、我会尽量保持简洁。 感谢你的帮助。
我在高分辨率模式下使用 ePWM。 ePWM 以递增计数的方式设置、并将 CMPA 用于一个触发器、而 CMPB 用于另一个触发器。 我一直在比较一个 ePWM 和另一个 ePWM (5&6)、并获得一些非常奇怪的结果这里没有使用死区时间来确保不会在那里发生混乱。 我已经查看了 ePWM 寄存器、它们看起来是正确的。 对于 EPWM1、CALPWRON 设置为1、HRMSTEP 设置为67 (所有其他 ePWM 为0) 、我使用 EPWM5作为基准、然后将由 CMPA 控制的 B 通道(下部开关)的上升沿与 EPWM6中的上升沿进行比较。 这也是在下降沿完成的。 ePWM 时钟为100MHz。
正如您在以下数据中看到的、下降延迟与 CMPA 之间的关系就好像高分辨率未激活一样。
但是、上升沿延迟与 CPMB 之间的关系看起来正常、但似乎与下降沿之间存在一些相互作用、这很奇怪。
我可以分享几个屏幕截图、但不确定如何做到。
这是设置代码
//########## EPWM5
EALLOW;
//假设 ePWM 时钟已启用
EPwm5Regs.TBPRD = PWM_TBPRD; //设置 ePWMx 的周期
EPwm5Regs.TBCTR = 0x0000; //清除计数器
EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1; //时基时钟预分频位
EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //高速时基时钟预分频位
EPwm5Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // ePWMx 是一个"从器件"、同步直通
EPwm5Regs.TBCTL.bit.PHSEN = TB_ENABLE; // ePWMx 是一个"从器件"、在 SYNC 上从 TBPHS 加载时间度计数器
EPwm5Regs.TBPHS.bit.TBPHS = 0x0000; //初始化相移
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //向上计数模式
EPwm5Regs.CMPA.bit.CMPAHR = 0; //初始化 HRPWM 扩展
EPwm5Regs.CMPB.bit.CMPBHR = 0; //初始化 HRPWM 扩展
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE; // CmpA 影子模式
EPwm5Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // CMPB 影子模式
EPwm5Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; //载波底部的负载(用于递增计数)
EPwm5Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //在载波底部加载(用于递增计数)
//为 A 和 B 比较寄存器设置比较
EPwm5Regs.AQCTLA.bit.CAU = AQ_SET; //在比较 A 向上时打开上部开关
EPwm5Regs.AQCTLA.bit.CBU = AQ_CLEAR; //在比较 B 向上时关闭上部开关
EPwm5Regs.AQCTLB.bit.CAU = AQ_CLEAR; //在比较 A 向上时关闭下部开关
EPwm5Regs.AQCTLB.bit.CBU = AQ_SET; // 在比较 B 向上时打开较低的开关
// EPwm5Regs.TZSEL.bit.OSHT1 = 0; //禁用 TZ1作为单次触发源
EPwm5Regs.TZSEL.bit.OSHT1 = 1; //启用 TZ1作为单次触发源
// EPwm5Regs.TZSEL.bit.OSHT2 = 0; //禁用 TZ2作为单次触发源
EPwm5Regs.TZSEL.bit.OSHT2 = 1; //启用 TZ2作为单次触发源
// EPwm5Regs.TZSEL.bit.OSHT3 = 0; //禁用 TZ3作为单次触发源
EPwm5Regs.TZSEL.bit.OSHT3 = 1; //启用 TZ3作为单次触发源
EPwm5Regs.TZSEL.bit.OSHT6 = 1; //启用 TZ6作为单次触发源,以防止仿真停止期间发生击穿(暂停、复位、重新编程)
EPwm5Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // TZ1强制输出低电平
EPwm5Regs.TZCTL.bit.TSB = TZ_FORCE_LO; // TZ1强制 B 输出低电平
EPwm5Regs.TZEINT.BIT.OST = 1; //启用 TZ 中断
EPwm5Regs.HRCNFG.ALL = 0x0; //复位 HRCNFG
EPwm5Regs.HRCNFG.bit.EDGMODE = HR_BEP; //HR_REP; //HR_FEP; //下降沿 DAP 上的 MEP 控制
EPwm5Regs.HRCNFG.bit.EDGMODEB = HR_BEP; //HR_FEP; //HR_REP; //上升沿 DAP 上的 MEP 控制
EPwm5Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO; //在载波底部加载(用于递增计数)
EPwm5Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO; //在载波底部加载(用于递增计数)
EPwm5Regs.HRCNFG.bit.AUTOCONV = 0x1; //启用基于 MEP_ScaleFactor 的 CMPAHR 自动缩放。 启用此选项后、CMPAHR 仅为[0x0000 0xFF00]。
EDIS;
//########## EPWM6
EALLOW;
//假设 ePWM 时钟已启用
EPwm6Regs.TBPRD = PWM_TBPRD; //设置 ePWMx 的周期
EPwm6Regs.TBCTR = 0x0000; //清除计数器
EPwm6Regs.TBCTL.bit.CLKDIV = TB_DIV1; //时基时钟预分频位
EPwm6Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; //高速时基时钟预分频位
EPwm6Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_IN; // ePWMx 是一个"从器件"、同步直通
EPwm6Regs.TBCTL.bit.PHSEN = TB_ENABLE; // ePWMx 是一个"从器件"、在 SYNC 上从 TBPHS 加载时间度计数器
EPwm6Regs.TBPHS.bit.TBPHS = 0x0000; //初始化相移
EPwm6Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; //向上计数模式
EPwm6Regs.CMPA.bit.CMPAHR = 0; //初始化 HRPWM 扩展
EPwm6Regs.CMPB.bit.CMPBHR = 0; //初始化 HRPWM 扩展
EPwm6Regs.CMPCTL.bit.SHDWAMODE = CC_SHADODE; // CmpA 影子模式
EPwm6Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // CMPB 影子模式
EPwm6Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO; //载波底部的负载(用于递增计数)
EPwm6Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; //载波底部的负载(用于递增计数)
//为 A 和 B 比较寄存器设置比较
EPwm6Regs.AQCTLA.bit.CAU = AQ_SET; //在比较 A 向上时打开上部开关
EPwm6Regs.AQCTLA.bit.CBU = AQ_CLEAR; //在比较 B 向上时关闭上部开关
EPwm6Regs.AQCTLB.bit.CAU = AQ_CLEAR; //在比较 A 向上时关闭下部开关
EPwm6Regs.AQCTLB.bit.CBU = AQ_SET; //在比较 B 向上时打开较低的开关
// EPwm6Regs.TZSEL.bit.OSHT1 = 0; //禁用 TZ1作为单次触发源
EPwm6Regs.TZSEL.bit.OSHT1 = 1; //启用 TZ1作为单次触发源
// EPwm6Regs.TZSEL.bit.OSHT2 = 0; //禁用 TZ2作为单次触发源
EPwm6Regs.TZSEL.bit.OSHT2 = 1; //启用 TZ2作为单次触发源
// EPwm6Regs.TZSEL.bit.OSHT3 = 0; //禁用 TZ3作为单次触发源
EPwm6Regs.TZSEL.bit.OSHT3 = 1; //启用 TZ3作为单次触发源
EPwm6Regs.TZSEL.bit.OSHT6 = 1; //启用 TZ6作为单次触发源,以防止仿真停止期间发生击穿(暂停、复位、重新编程)
EPwm6Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // TZ1强制输出低电平
EPwm6Regs.TZCTL.bit.TSB = TZ_FORCE_LO; // TZ1强制 B 输出低电平
EPwm6Regs.TZEINT.BIT.OST = 1; //启用 TZ 中断
EPwm6Regs.HRCNFG.ALL = 0x0; //复位 HRCNFG
EPwm6Regs.HRCNFG.bit.EDGMODE = HR_BEP; //HR_REP; //HR_FEP; //下降沿 DAP 上的 MEP 控制
EPwm6Regs.HRCNFG.bit.EDGMODEB = HR_BEP; //HR_FEP; //HR_REP; //上升沿 DAP 上的 MEP 控制
EPwm6Regs.HRCNFG.bit.HRLOAD = HR_CTR_ZERO; //在载波底部加载(用于递增计数)
EPwm6Regs.HRCNFG.bit.HRLOADB = HR_CTR_ZERO; //在载波底部加载(用于递增计数)
EPwm6Regs.HRCNFG.bit.AUTOCONV = 0x1; //启用基于 MEP_ScaleFactor 的 CMPAHR 自动缩放。 启用此选项后、CMPAHR 仅为[0x0000 0xFF00]。
EDIS;
下面是结果、我尝试附加图形、但不太幸运。
延迟 NS 下降 | 延迟 NS 上升 | 5 CMPA | 5 CMPB | 6 CMPA | 6 CMPB |
0 | 0 | 0x04DB4000 | 0x04E7BF00 | 0x04DB4000 | 0x04E7BF00 |
0 | 0 | 0x04DB4000 | 0x04E7BF00 | 0x04DB6000 | 0x04E7BF00 |
0 | 0 | 0x04DB4000 | 0x04E7BF00 | 0x04DBC000 | 0x04E7BF00 |
0 | 0 | 0x04DB4000 | 0x04E7BF00 | 0x04DBE000 | 0x04E7BF00 |
0 | 0 | 0x04DB4000 | 0x04E7BF00 | 0x04DBFF00 | 0x04E7BF00 |
10. | 0 | 0x04DB4000 | 0x04E7BF00 | 0x04DC0000 | 0x04E7BF00 |
10. | 0 | 0x04DB4000 | 0x04E7BF00 | 0x04DC4000 | 0x04E7BF00 |
10. | 0 | 0x04DB4001 | 0x04E7BF01 | 0x04DCFF00 | 0x04E7BF01 |
20. | 0 | 0x04DB4000 | 0x04E7BF00 | 0x04DD0000 | 0x04E7BF00 |
延迟 NS 下降 | 延迟 NS 上升 | 5 CMPA | 5 CMPB | 6 CMPA | 6 CMPB |
0 | 0 | 0x04DB4000 | 0x04E7BF00 | 0x04DB4000 | 0x04E7BF00 |
1 | 1 | 0x04DB4000 | 0x04E7BF00 | 0x04DB4000 | 0x04E7DF00 |
1.5 | 2. | 0x04DB4000 | 0x04E7BF00 | 0x04DB4000 | 0x04E7FF00 |
-2. | 5. | 0x04DB4000 | 0x04E7BF00 | 0x04DB4000 | 0x04E83F00 |
-1.5 | 6.5. | 0x04DB4000 | 0x04E7BF00 | 0x04DB4000 | 0x04E85F00 |
-1 | 7.5. | 0x04DB4000 | 0x04E7BF00 | 0x04DB4000 | 0x04E87F00 |
-0.5 | 9. | 0x04DB4000 | 0x04E7BF00 | 0x04DB4000 | 0x04E89F00 |
0 | 10. | 0x04DB4000 | 0x04E7BF00 | 0x04DB4000 | 0x04E8BF00 |
1 | 12.5. | 0x04DB4000 | 0x04E7BF00 | 0x04DB4000 | 0x04E8FF00 |