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.

[参考译文] MSP430G2553:在使用加/减计数器生成互补 PWM 期间出现不规则脉冲。

Guru**** 2422790 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1537658/msp430g2553-irregular-pulse-during-complementary-pwm-generation-using-up-down-counter

器件型号:MSP430G2553


工具/软件:

我在捕获比较模式下使用计时器 A 来生成死区为 2us 的互补 PWM。

我附上了 示例代码;我编写了相同的示例代码。 当我快速对 MCU 进行下电上电时、我会看到 PWM_L 存在异常延迟、如图所示。

 

我尝试了多种解决方案、例如同时启用 PWM_H 和 PWM_L。 反转 PWM_H 和 PWM_L 的计数、但问题仍然存在。  

任何帮助指出问题所在以及如何解决问题的建议都是非常感谢的。

e2e.ti.com/.../05543.main.c

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

    > uint16_t gBusVoltage = 0;

    ADC10SA 应指向一个数组。 当 DTC1=4 时、至少应该有 4 个条目:

    > uint16_t gBusVoltage[4]={0、}; // DTC 输出缓冲器 (DTC1=0x04)

    我不太确定 DTC 覆盖的内容(或其影响)、因此请先修复。

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

    更常见的情况是:由于峰值 ISR 需要很长时间才能做出决策(并采取措施)、因此该脉冲放置错误。  我建议您管理 ADC 并在 main() 中做出决策;生成的 OUTMOD(可能还有 CCR)值可以存储在全局变量中、这样 ISR 就可以直接存储它们而不做任何决策。

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

    尊敬的 Chandana:

    Bruce 对您的代码提供了一些很好的反馈。

    1. 您正在使用 CONSEQ_1(通道序列)、但 gBusVoltage 只有 1 个值、但ADC10DTC1 = 0x04设置 4 次转换。 如果只需要一次转换、则应使用 CONSEQ_0。
    2. Bruce 的第二条评论也是有效的。 如果转换在下一个中断之前未完成、则在计时器中断内启动 ADC 转换可能会导致丢失样本。  对于中断处理程序、遵循“移入、移出“原则通常是一种基本的最佳实践。

    如果您需要任何进一步的帮助、请进行必要的更改并回复。

    此致、

    Owen

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

    你好欧文和布鲁斯  

    感谢您的宝贵反馈。

    1.是的,变量 gBusVoltage 需要为 4 的大小,这是一个监督错误,当我在发布到论坛之前调整  了一些代码掩蔽敏感数据,这删除了 gBusVoltage 后的变量,并给人的印象是 ADC 会覆盖后续变量。 所以,这从来都不是问题。  

    2.就 ADC 采样而言、如果我们错过了几次 ADC 转换、并且 ADC 数据对应用不是很重要、那么我仍然会修复转换触发器。  

    2.根据 Bruce 给出的第二个建议,我确实认为 ISR 峰值可能会延迟/执行时间更长,这就是 PWM_L 也延迟的原因。 我尝试 同时启用两个 PWM。   达到峰值/谷值。 但这仍然没有解决问题、而是只是使 PWM_L 超前或滞后 PWM_H 的第一个脉冲->仍然导致第一个脉冲重叠。

    3.我知道 ISR 应该很小、但我确实希望在这些 ISR 内部运行一些关键功能。 我还注意到、即使 ISR 中有很小的代码、或者即使我增加 PWM 周期、为了确保 ISR 不会溢出、问题仍然发生。

    4.需要注意的另一点是,这个问题并不总是发生->大多数情况下的脉冲是正确的。 在 MCU 快速下电上电期间、我一次只能看到 PWM_L 的第一个脉冲延迟并与 PWM_H 重叠  

    5.我试图弄清楚,如果有一种方法在 TACCR1 和 TACCR2 之间进行同步,以确保它们始终是互补的??

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

    尊敬的 Chandana:

    感谢您的澄清。 我有几个建议。 您遇到的随机延迟很可能是由计时器初始化和时钟不稳定造成的。

    1. 我注意到在您的代码中 、您将 TA1CCTL1 和 TA1CCTL2 设置为 OUTMOD_0、然后对其进行复位。 如果要将它们设置为设置/复位和复位/设置、则需要使用 OUTMOD_3 和 OUTMOD_7。 不确定您的注释是否与实际在代码中编写的内容一致。
    2. 您还可以在配置 PWM 后、启用输出之前尝试添加启动延迟(如果时序不是很关键)。
    3. 您也可以尝试同步计时器启动、方法是:  TA1CTL = TASSEL_2 + MC_0 + TAIE; // SMCLK source, stopped mode
      然后在复位 TA1.1 和 TA1.2 后启动计时器:  TA1CTL |= MC_3; // Start in Up/Down mode

    如果这些建议中有任何一项阻止了偶尔出现的问题、请告诉我。

    此致、

    Owen

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

    我认为你在战斗的是 OUTMOD 的“切换“部分,所以它使高峰 ISR 赢还是输了比赛有很大的不同。

    我想知道您是否需要 (a) 在开始时组合 PWM_H 和 PWM_L 设置(正如您已经尝试过的)、但 (b) 将 PWM_L 处于空闲状态高电平 (out=1)。

    理想情况下、正如 Owen 建议的那样、您希望在计时器停止 (MC=0) 时执行两个 CCTL 设置、因此您可以确保它们是协调的。 这对于转换是否可行?

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

    Owen 和 Bruce、感谢您的修复。

    我尝试了欧文提出的#3 的建议,这是有效的。 我不再看到不匹配的 PWM 脉冲。 到目前为止、我只对台式设置进行了测试、问题似乎已得到解决。  

    我还没有在系统上尝试此操作、如果发现任何异常、我将返回。  

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

    尊敬的 Chandana:

    很高兴听到这个问题似乎已得到解决。 如果您遇到系统问题、请告诉我。

    此致、

    Owen