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.
大家好、
我们需要定期生成固定数量的 PWM 周期。
要求:
我们需要在 ECAP1中断中启动 PWM 信号、并通过在每个周期溢出时向 PWM 寄存器写入数字周期数、并在传输结束时生成 DMA 中断(93个周期)、从而使用 DMA 对数字周期进行计数 在 DMA ISR 中、禁用 PWM 并在下一个 ECAP 中断时重复该操作。
实施:
PWM_Initialization { ... … //强制为低 EPwm2Regs.AQCSFRC.bit.CSFA = 0x01; EPwm2Regs.AQCSFRC.bit.CSFB = 0x01; … ...} eCAP1_ISR{ … … //强制被禁用 EPwm2Regs.AQCSFRC.bit.CSFA = 0x03; EPwm2Regs.AQCSFRC.bit.CSFB = 0x03; … ...} DMA_INT //这在93个 PWM 周期 后得到处理{..... … //再次强制为低 EPwm2Regs.AQCSFRC.bit.CSFA = 0x01; EPwm2Regs.AQCSFRC.bit.CSFB = 0x01; .... }
我们正在观察 PWM 启动延迟和 PWM 信号停止延迟? 我在开始时已经发布了延迟的图片。
**在图中,PWM2和 PWM3被强制为低电平,PWM4未被强制为低电平,PWM2 -> PWM3 -> PWM4被同步。
请建议一种方法来消除开始和结束时的这2个周期延迟
谢谢、
Ajay
大家好、
我们正在开发 TMS320F28069而不是 TMS320F280049
谢谢、
Ajay
您好、Ajay、
您正在配置哪些其他 ePWM 子模块?
您是否尝试使用跳闸区域子模块而不是 AQCSFRC?
此致、
Marlyn
您好、Marlyn、
我正在配置时基、计数器比较、动作限定器和事件触发子模块。 请检查以下 PWM 初始化函数。
void EPwm2_Init (void) { EPwm2Regs.TBPRD = 387; EPwm2Regs.TBPHS.Halt.TBPHS= 0x0000; EPwm2Regs.TBCTR = 0x0000; //设置 TBCTL EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; //递增和递减计数模式 EPwm2Regs.TBCTL.bit.PHSEN = TB_ENABLE; EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0x00; EPwm2Regs.TBCTL.bit.CLKDIV = 0x01; EPwm2Regs.TBCTL.bit.PRDLD = TB_Immediate;//0x00; EPwm2Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; //比较值从 DMA 写入 EPwm2Regs.CMPA.half.CMPA = 311; EPwm2Regs.CMPB = 76; // EPwm2A 的设置操作 EPwm2Regs.AQCTLA.bit.ZRO = 0x02; EPwm2Regs.AQCTLA.bit.PRD = 0x01; // EPwm2B 的设置操作 EPwm2Regs.AQCTLB.bit.ZRO = 0x02; EPwm2Regs.AQCTLB.bit.CAU = 0x01; EPwm2Regs.AQCTLB.bit.PRD = 0x02; EPwm2Regs.AQCTLB.bit.CBD = 0x01; /TX 突发在初始化中被禁用 EPwm2Regs.AQCSFRC.bit.CSFA = 0x01; EPwm2Regs.AQCSFRC.bit.CSFB = 0x01; //设置事件触发器 EPwm2Regs.ETSEL.bit.SOCASEL = 0x01; // TBCTR=TBPRD 上的 ADCSOCB EPwm2Regs.ETSEL.bit.SOCAEN = 1; //启用 SOCA 生成 EPwm2Regs.ETPS.bit.SOCAPRD = 1; //在第一个事件上生成 SOCA }
仅 当 AQCSFRC 在此处不有用时、我才会探讨 Tripzone 子模块的使用。 请告知我们是否预计会出现延迟? 是否有办法减少这种延迟?
谢谢、
Ajay
大家好、
尝试使用软件强制跳闸区域禁用 PWM 信号的结果如下所示。
观察到 PWM 重启中的半周期(PWM 周期)延迟。
在 ECAP ISR 中、我们将同步 PWM、PWM2 -> PWM3->PWM4、可以立即同步和重新启动 PWM4 (未强制禁用)。
跳闸区域代码如下所示:
PWM_Initialization { ... … //TripZone EALLOW; //我们希望任何 TZS 都能做什么? EPwm3Regs.TZCTL.bit.TZA = TZ_FORCE_LO; EPwm3Regs.TZCTL.bit.TSB = TZ_FORCE_LO; //清除 EPwm3Regs.TZCLR.ALL = 0x07; //在任何 TZ 事件上启用 TZ 中断 EPwm3Regs.TZEINT.bit.OST = 0; EDIS; ...} eCAP1_ISR{ … … //Tripzone EALLOW; EPwm2Regs.TZCLR.ALL = 0x07; EDIS; ...} DMA_INT //这在93个 PWM 周期 后得到处理{..... … //Tripzone EALLOW; EPwm2Regs.TZFRC.bit.OST = 0x01; EPwm3Regs.TZFRC.bit.OST = 0x01; EDIS; … …}
让我们知道如何在 PWM 重新启动时消除该半周期延迟。
谢谢、
Ajay
Ajay、
似乎可以通过几种方法来解决这个问题。
AQ 解决方案:由于 AQCSFRC、我预计不会有两个周期的延迟。 这可能是由于您的捕捉中断的长度所致。 为了调试这一点、我建议您在 AQCSFRC 被禁用后立即确认 CMP_INT 切换、一旦我们确认此延迟、只要它看起来是正常的、我们就可以在您愿意的情况下进一步调试。
TZ 解决方案:您似乎非常接近此处的答案。 由于同步方案、您可能缺少比较事件。 请注意、CMPx 寄存器的工作方式是"等于"比较、而不是"等于或大于"比较。 说明了另一种方法、如果您同步到 TBPHS 值10并且 CMPA 值=5、则 CMPA 事件将在下一个周期之前丢失。 另请记住、如果在最后一个周期结束附近将输出设置为高电平、则在 TBCTR 回绕到 PWM 输出保持低电平之前不会发生这种情况。
另一种常见的修复方法是更改 SYNC 上的计数器方向。 我不知道您到底要实现什么、但即使与 TBPHS.PHSDIR 位同步、您也可以让计数器在同步后进行递增或递减计数。
如果您仍在努力解决此问题、我可能会建议采用一种新方法;这听起来很像、通过查看我们的应用手册、可以轻松解决该问题、了解如何实现0%占空比。 https://www.ti.com/lit/pdf/spraai1 请注意、本应用手册仅部分适用于 F2806x。 您仍然可以使用平滑的 DMA 技巧来控制 PWM 何时打开或关闭、但按照应用手册中的说明更新 CMPx 和 AQ 强制位。
(应用手册补充)在诸如 F2806x (任何类型1、2、3或4 PWM)的较新器件上、在 CMPA 与 TBCTR 相比较之前会发生影子负载。 这在设计中是关闭的、并且将始终发生。
AppNote 如何影响较新的器件、如 F2806x? 对于较新的器件、您只需要担心向上/向下计数模式。 如 CMPA =0之前所述、将不会丢失。 但是、当从 CMPA =0切换到 非零 CMPA 时、仍建议使用权变措施。
此致、|
Cody
大家好、
感谢您的建议。
AQ 解决方案:是的,在 ECAP ISR 中,在 ISR 请求时,我们将切换 CMP_INT 并立即禁用 AQCSFRC。 我观察到一些时间一周期延迟和一些时间二周期延迟。 请帮助进一步调试。
_interrupt void eCAP1_ISR (void)// 0x000D70 ECAP1_INT (ECAP1) { if (ECap1Regs.ECFlG.bit.CTR_EQ_PRD) { ... 。} if (ECap1Regs.ECFlG.bit.CTR_EQ_CMP) { tmp_cmc++; DEBUG5_TOGGLE;//CMP_INT 切换 // PWM2和其他 PWM 的强制同步将作为 SYNCOUT -> SYNCIN 与 PWM2同步 EPwm2Regs.TBCTL.bit.SWFSYNC = 1;//同步 EPwm2Regs.AQCSFRC.bit.CSFA = 0x03; EPwm2Regs.AQCSFRC.bit.CSFB = 0x03; ... 。} (笑声) 。}
TZ 解决方案:如果 TBPHS.PHSDIR 位被置位或清零、结果是一样的、我将观察半周期延迟。
这可能是预期的原因
当 TBCTR = 0时、我们希望 EPWMA 和 EPWMB 设置为高电平
EPwm2Regs.AQCTLA.bit.ZRO = 0x02;
EPwm2Regs.AQCTLB.bit.ZRO = 0x02;
但是当同步脉冲生成时、TBPHS 肯定会> 0、因为它不会执行 TBCTR = 0定义的操作、直到下一个翻转并且 PWM 信号保持低电平。 请确认我的理解是否正确。
您是否建议使用其他解决方案来解决此问题? 我的目标是重新启动非常接近 ECap1Regs.ECFlG.bit.CTR_EQ_CMP 位设置的 PWM 信号、并在固定周期数后同步 PWM2、PWM3、PWM4并停止、然后在下一 个 ECap1Regs.ECFlG.bit.CTR_EQ_CMP 事件上重复此操作。
谢谢、
Ajay
Ajay、
我认为您的解决方案非常接近正确。 在开始时有一些边界条件没有被很好地考虑、但我相信它可以被纠正。 让我知道当您在同步 PWM 之前清除强制事件时会发生什么情况。
最后、您可以尝试的另一种解决方案是使用非连续软件强制在第一阶段将 PWM 强制为高电平、我相信这也可以解决您的问题。
此致、
Cody
大家好、
请查看以下我的回答:
AQ 解决方案:
[Ajay]:ECAP 和 PWM 不一定是异步的,因此它可能随时发生,这就是我们在触发 ECAP CMP 事件并重新启动 PWM 信号时同步 PWM 的原因。
2.请清除 AQCSFRC、然后同步 PWM。 这会改变您的结果吗?
[Ajay]:已尝试此操作并查看以下结果,与以前相同,结果无变化。
最后 、您可以尝试的另一种解决方案是使用非连续软件强制在第一个周期将 PWM 强制为高电平。
[Ajay]:也尝试过,但无法解决我的问题。 它只是增加了前半个周期的宽度、使之朝向 ECAP CMP 事件、但这不是意图、我们需要移动完整信号本身。 请查看以下结果:
到目前为止、我已经观察到 TZ 取得了良好的效果、延迟约为8us (半个周期)、请告诉我我们是否可以进一步解决该问题。
谢谢、
Ajay
Ajay、
当您使用操作限定符看到问题时、CMPx 值是多少? 当您未发现问题时、有何价值?
嗯、对于非连续软件强制解决方案、我试图查看是否由于某种原因错过了一个上升事件、但是如果你说的是真的、那么似乎也错过了下降事件。
使用 TZ 解决方案时、您希望发生什么事件将 PWM 输出强制为高电平? 如果它是 CMPx 事件、它的值是多少? 您希望事后将 PWM 强制为低电平的事件是什么?
您能否观察到同步脉冲之后 TBCTR 的值是多少? 是否正确复位? 是递增还是递减计数?
此致、
Cody
大家好、
我们反复提出问题,但没有提出任何解决办法,这一问题已经讨论了很长时间,但似乎你仍然不理解我在这里要做的事情。
我们能否通过快速调用来更好地理解这一点? 如果可能、我将要求当地的 TI 团队安排与您的通话。
谢谢、
Ajay
Ajay、
由于 我们地区的恶劣天气、我们的许多主题专家(Cody 和 Marlyn)目前都没有权力、无法提供支持。 专家将尽快回复您、但可能不会等到下周。
最棒的
Matthew
Ajay、
遗憾的是、PWM 模块中有很多可配置性、因此可能会有很多问题导致类似的延迟。 因此、有时需要提出很多问题、很抱歉给您带来不便。 如果你觉得我再次提出同样的问题,我可以随意提出这些问题,或者我确实提出了重复的问题(完全可能的,或者有一些我在问题中没有很好地表达出来的特殊情况。
问题说明:我认为您正在尝试在事件后重新启动 PWM。 这个事件由 eCAP 模块检测。 在发生上述事件后、您希望 PWM 立即从零开始并开始输出一个"X"周期的 PWM 信号、并且您已经选择使用 DMA 在"X"周期数之后将其关闭 PWM 输出。
如果我对您尝试做的事情的理解不正确、请随意更正。
现在进一步思考 AQ 解决方案:有几个控制何时加载 AQCSFRC 寄存器的位"AQSFCR.RLDSF"。 这可以是周期、零、两者都可以或立即。 由于您的问题与定期事件同步、我认为这是您应该调查的问题。 您将什么价值用于 RLCSF? 当您将其更改为在 TBCTR=0和 TBCTR=PRD 上加载时、行为是否会改变、如果您使用立即加载模式、会怎么样?
如果您在两种解决方案中都看到至少1/2的周期延迟、这可能意味着您在使用 AQ 或 TZ 强制 PWM 值时发生的同步有问题。 这就是为什么我要求您验证 TBCTR 何时以及如何复位的原因。 您能否确认在 eCAP 中断后立即复位此位?
此外、正如 Matt 所说的、我们正在经历断电、这会减慢响应速度并阻止我们运行任何测试。
此致、
Cody
您好、Cody、
问题陈述正确!
AQ 解决方案:我已经探究过"AQSFCR.RLDSF"位的延迟差异不大,如果我立即加载它,即设置 AQSFCR.RLDSF=3,则脉宽将增加,但不会恢复丢失的周期。
关于同步:同步时 ,TBCTR 被正确加载了相位差,但我设置了 PHSDIR = 1,并且观察到有时 TBCTR 会向上计数,有时会向下计数,我希望它在同步后向上计数,因为 PHSDIR = 1。
TZ 解决方案:我能够从 ECAP 事件实现更短的 AS1.3us 延迟,将函数更正为函数调用以清除 TZ。
我们可能会使用 TZ 解决方案、如果我在 TZ 解决方案上遗漏任何要改进的内容、请提出建议。 我将清除 TZ 并仅根据某些条件生成 PWM、因此需要调用其他 函数并做出决策、但它会在 TBCTR =0时增加延迟并缺失第一个事件、并增加前半个周期延迟。 请建议一种处理延迟最小的方法。
谢谢、
Ajay
Ajay、
[引用 user="Ajay Kumar3]AQ 解决方案:我已经探索过"AQSFCR.RLDSF"位与延迟没有太大差异,如果我立即加载它,即设置 AQSFCR.RLDSF=3,则脉宽将增加,但不会恢复丢失的周期。 [/报价]
上述行为听起来像是切换到立即模式是允许在 第一个 PWM 周期中发生上升事件、但下降事件仍会丢失。 您是否更改了下降事件的值? 在第一个周期内、下降事件是否有可能超出范围? 一旦 CSFx 被置为无效、其它电路应该继续、就像没有发生 CSFx 事件一样。 这已经过很好的测试、并且已知可以正常工作。
[引用 user="Ajay Kumar3">关于同步:同步时 ,TBCTR 会正确加载相位差,但我已将 PHSDIR 设置为1,并且观察到 有时 TBCTR 会递增计数,有时会递减计数,我希望在同步后,它会随着 PHSDIR = 1递增计数。 [/报价]
Ajay、这种行为是非常意外的。 众所周知、PHSDIR 是可靠的、因此我怀疑您的代码中的某些内容更改了该值、或者我们看到的行为被误解了。
与注释相关、您有几篇文章回顾了 AQ 解决方案的行为是如何确定的、并且在您消除持续力后、有时会出现高脉冲、有时则没有。 我认为这是因为您在输出高电平或低电平时中断了上一个周期、并且错过了您希望将输出驱动为高电平的第一个事件。 我最初的预期是、这是由于跳过 CMPx、TBCTR=0或 TBCTR=周期事件。
至于跳闸区域延迟、您会看到在 TZ 将其清除之前需要~100个指令周期。 由于这是基于软件的、这听起来很合理、可能有点高。 根据您的系统、可通过调整 TBPHS 寄存器将第一个 PWM 周期提前 x 个周期来计算这个延迟。 这可能会导致您的第一个脉冲缩短、但应使您的 PWM 周期与 eCAP 事件保持最佳一致。 因此、您需要选择最适合您系统的器件。
此致、
Cody
您好、Cody、
谢谢! 现在、我将使用 TZ 解决方案、如果稍后有任何问题、将会返回给您。 感谢您的支持。
谢谢、
Ajay