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.

[参考译文] MSPM0C1103:PWM 在更新通道上失败

Guru**** 2526700 points
Other Parts Discussed in Thread: MSPM0C1104, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1542455/mspm0c1103-pwm-failed-at-update-channels

器件型号:MSPM0C1103
主题中讨论的其他器件:MSPM0C1104SysConfig

工具/软件:

我将在双开关推挽式拓扑上使用 PWM 调制将 STM32 M0 内核迁移到 MSPM0C1104 以实现 SMPS 控制。

我需要在控制采样时间相应地更新占空比、它远大于 PWM 周期。
最初、我手动控制两个 PWM 通道的占空比。

它运行得很好、但有时 Counter Compare 似乎在寄存器上加载了错误的值或没有值
而且 PWM 有失真的脉冲、有时会重叠其输出、导致 SMPS 出现故障。


是否有办法强制安全加载比较寄存器、使其始终正确更新? 来实现这一应用的更好方法。

到目前为止、我已经测试了几个替代方案、但没有成功:
大量增加控制采样时间、以避免任何中断优先级问题或计算时间。

已测试死区模式、加载死区以获得所需的占空比、并显示相同的零星问题。

没有中断或控制的测试代码、仅更新占空比、它显示与移植的代码相同的问题。

.syscfg 文件有一个选择通道更新模式的选项、但它只允许我使用“Capture Compare Value Has Immediate Effect“选项、表明它仅在 TIMA0 上工作、但我已经将 TIMA0 用于该代码。

下面是 PWM 行为的一些图片。

感谢您的支持

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

    是的、听起来好像您需要影子寄存器。 是的、根据数据表 (SLASF90B) 表 8-9、TIMA0 具有影子寄存器。

    这听起来像是 SysConfig 问题。

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

    在 Advanced Config 中、我选择了 Enable Shadow Load、问题仍然存在。

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

    选中该复选框是否会更改信道更新模式中的选项? (我看到所有的选择都是这样的,所以这里有一些不同的地方。)

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

    请参阅下面的、SysConfig“DL_TIMER_CC_UPDATE_METHOD_IMMEDIATE"中“中的设置始终不会更改。 我尝试了您所说的内容、但在运行 build 时、会返回到下面定义的相同内容。

    SysConfig_weak void SYSCFG_DL_PWM_0_init (void){

    DL_TimerA_setClockConfig (
    PWM_0_INST、(DL_TimerA_ClockConfig *)&gPWM_0ClockConfig);

    DL_TimerA_initPWMMode (
    PWM_0_INST、(DL_TimerA_PWMConfig *)&gPWM_0Config);

    //将 Counter 控件设置为正在使用的最小 CC 索引
    DL_TimerA_setCounterControl (PWM_0_INST、DL_TIMER_CZC_CCCTL0_ZCOND、DL_TIMER_CAC_CCCTL0_ACOND、DL_TIMER_CLC_CCCTL0_LCOND);

    DL_TimerA_setCaptureCompareOutCtl (PWM_0_INST、DL_TIMER_CC_OCTL_INIT_VAL_LOW、
    DL_TIMER_CC_OCTL_INV_OUT_DISABLED、DL_TIMER_CC_OCTL_SRC_DEAD_BAND、
    DL_TIMERA_CAPTURE_COMPARE_0_INDEX);

    DL_TimerA_setCaptCompUpdateMethod (PWM_0_INST、DL_TIMER_CC_UPDATE_METHOD_IMMEDIT、DL_TIMERA_CAPTURE_COMPARE_0_INDEX);
    DL_TimerA_setCaptureCompareValue (PWM_0_INST、500、DL_TIMER_CC_0_INDEX);

    DL_TimerA_setDeadBand (PWM_0_INST、500,500、DL_TIMER_DEAD_BAND_MODE_0);
    DL_TimerA_enableClock (PWM_0_INST);



    DL_TimerA_setCCPDirection(PWM_0_INST , DL_TIMER_CC0_OUTPUT );


    }

    以下是用于测试的主文件:

    e2e.ti.com/.../tima_5F00_timer_5F00_mode_5F00_pwm_5F00_dead_5F00_band_5F00_LP_5F00_MSPM0C1104_5F00_nortos_5F00_ticlang.zip:

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

    当我将“Channel Update Mode“设置为零(“Capture Compare Value 在计时器计数器达到 0 后使一个 TIMCLK 周期生效“)时、我得到

        DL_TimerA_setCaptCompUpdateMethod(PWM_0_INST, DL_TIMER_CC_UPDATE_METHOD_ZERO_EVT, DL_TIMERA_CAPTURE_COMPARE_0_INDEX);

    这正是我所期望的。 我没有尝试过代码、因为我实际上没有测试用例。

    [编辑:我使用的是 SysConfig 1.19.0]

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

    在工程中、如果尝试将 Update Mode 设置为零、则会将 SysConfig(如您所述)对象设置为零。 它也不会生成.h 文件。 我不知道我的工程有什么不同、但 SysConfig 似乎出了问题。

    您可以尝试将上面的代码行(根据需要调整)插入 main()。

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

    您可以参考此演示代码、它在 G3507 的 Launchpad 上使用计时器 A 进行了测试

    尽管它基于旧的 SDK、但您仍然可以参考其配置。

    e2e.ti.com/.../Example_5F00_pwm_5F00_shadowCC_5F00_G3507_5F00_nortos_5F00_tic.zip

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

    我们的更新速率为 1ms。 在 100ms 时、n´t 不会出现问题。

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

    在另一台计算机上、SysConfig 可以将 Mode 更新为 DL_TIMER_CC_UPDATE_METHOD_ZERO_EVT。 但问题最终仍会出现。

    问题似乎取决于更新速率。

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

    您发布的代码通过调整死区来控制占空比、即将 DBCTL 中的 RISEDELAY 和 FALLDELAY 更改为“剃除“占空比。

    我在 TRM 中没有看到任何内容表明影子 CC 机制对 DBCTL 有任何影响。 同时、由于死区是在(各种)上升沿和下降沿之间进行测量[参考 TRM 表 15-18]、因此就像 CC 更新可能错过比较匹配一样、它容易出现“丢失“边沿。

    我对 SMPS 设计不是很熟悉、但我有这样的想法、死区(通常)或多或少是固定的--一种安全机制、而不是调整的一部分--但我推迟到你们那里。

    如果您想使用此方法、影子 CC 机制似乎对您没有帮助。 您可能必须回退到与非影子 CC 寄存器一起使用的方法、例如在软件中更新 DBCTL(中断)、仅在例如零或加载事件时更新。

    【编辑:轻微澄清】

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

    对于死区更新、没有影子寄存器、您需要自行处理。

    推荐的方法如下:

    由于 TimerA0 具有 CC0/1/2/3/4/5、因此您可以使用 CC4 或 CC5 来生成适合死区更新的中断(时间点)。

    (在 PWM 周期的中间、不会影响 PWM 的工作)。

    当占空比从小切换到大时、需要使用更好的值来调整该 CC4/5 时间点。

    只需确保您的死区值更新不在 PWM 计时器重新加载期间或死区检测阶段。

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

    好的。 使用分离的通道时、工作原理为´s。 谢谢你。