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.
这让我有点失望、如果您需要更多信息、请告诉我、我会尽量保持简洁。 感谢你的帮助。
我在高分辨率模式下使用 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 |
不应配置 CALPWRON 寄存器。 为什么要启用它? 您是否还没有使用 SFO 库?
感谢 Nima 的回应、
CALPWRON 不在代码中的任何位置使用(进行了控制 h 搜索)、并且是的、定期调用 SFO 例程。 (虽然 SPRUHM8I 指示它复位为0、所以必须在某个位置设置)当 我访问这些寄存器时、"EPWM1 CALPWRON 被设置为1且 HRMSTEP 为67"语句来自调试器。 表中的数据也来自调试器。 我试图获取尽可能多的独立于软件的数据。
Dave
我编写此示例是为了快速检查、当我使用 HR 模块时、我在所有 ePWM 模块上都获得相同的延迟。
是这样吗?
//为 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 向上时打开下开关
因为如果你使用 HRPWM、你想要:
如果使用向上计数、则使用 PRD/ZERO 执行操作、使用 CMPA 执行通道 A 的另一个操作
或与 CMPB 相同的其他通道。
您不想在同一信道上使用 CMPA 和 CMPB。
2.如果使用向上/向下计数、则对通道 A 使用 CMPAU 和 CMPAD
或者通道 B 的 CMPBU 和 CMPBD 也是如此
NIMA
谢谢 Nima、
我有点困惑…
您引用的示例是否实际起作用? 如果是这样、下一条关于同一通道上的 CMPA 和 CMPB 不工作的评论毫无意义。
我们进行相移的方法需要同时使用 CMPA 和 CMPB、如果您找到了一种使其正常工作的方法、那就很好了。
再次感谢
Dave
还有一件事 Nima、
我已经尝试找到一些有关如何实现 HRPWM 的文档。 在我发现的所有文档中、我会一直返回到专门针对该器件的 SPRUHM8I。 HRPWM 延迟似乎被添加到死区或 tripzone 逻辑的某个位置、但并不清楚。 如果有一个文档对此进行了更详细的解释、这将有助于我理解。
再次感谢 Nima、
Dave
你好、Nima、
已经一周了、是否有任何更新?
Dave
我提供的示例使用 CMPA U/D 事件来控制通道 A
用于控制通道 B 的 CMPB U/D 事件
您应该能够更新 PWM 生成算法、以便对 HRWPM 执行同样的操作。
在本例中、CMPAHR 将添加到通道 A 上的 CMPA 中。 CMPBHR 与 CMPB 和通道 B 也是如此
就添加 HR 部分的位置而言、它会添加到动作限定器模块之后、并在 ePWM 输出中考虑死区、斩波器和跳匣区域的影响。
NIMA
再次感谢 Nima 的回应、
我真的不能错过任何东西。 作为修复程序显示的代码与我使用的代码完全相同
//为 A 和 B 比较寄存器设置比较、作为 EPWM5的补充
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 向上时打开较低的开关
那么、如果我将计数器寄存器设置为向上/向下计数、这是否起作用?
Dave
David、
这是您真正想要的:
EPwm6Regs.AQCTLA.bit.CAU = AQ_SET; //在比较 A 向上时打开上部开关
EPwm6Regs.AQCTLA.bit.CAD = AQ_CLEAR; //在比较 B 向上时关闭上部开关
EPwm6Regs.AQCTLB.bit.CBU = AQ_CLEAR; //在比较 A 向上时关闭下部开关
EPwm6Regs.AQCTLB.bit.CBD = AQ_SET; //在比较 B 向上时打开下部开关
您需要将通道连接到 CHANNELx 与 CMPx 和 CMPxHR (x =A 或 B)
再次感谢 Nima、
有时候,我很难明白。 当我发现 CMPA 和 CMPB 与计数器进行比较、并且 CMPAHR 和 CMPBHR 分别是通道 A 和 B 的延迟时、我就能使其正常工作。 基本上必须将 CMPA 从 CMPAHR 中去耦、同样对于 CMPB/CMPBHR 也是如此。 由于我将 CHA 和 CHB 用于桥臂中的上/下开关、CMPAHR 和 CMPBHR 必须相同。
BR
Dave