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.

[参考译文] TMS320F28386S:粗计数变化时发生 HRPWM 跳转-未解决

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1370708/tms320f28386s-hrpwm-jump-when-coarse-count-changes---not-solved

器件型号:TMS320F28386S

工具与软件:

您好!

我之前已将同一查询的主题标记为已关闭。 但问题似乎没有了。 为了清晰起见、我在这里提供了一些示波器截图。 我正在尝试用一个斜坡来演示它... 请注意、如果没有 HRPWM、则输出明显缺乏分辨率、如果设置 HRPWM、两个主要计数之间的空间就变成了一个表明正在发生 HR 计数的斜坡、但当主要计数发生变化时、它们似乎并不满足...

此处理器的 MEP 比例因子约为33、我还尝试了连续运行 SOF 函数。 根据我之前的响应中提到的线程、我创建了 CMPA 影子加载、这是加减计数器的要求。

通过将分数 PWM 计数标准化为255、可生成占空比。 获取一些支持非常好。 我很长时间都不知道该怎么说了。  

谢谢

桑托什

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

    您好、Santhosh:

    您能进一步解释一下主要的计数变化吗? 这是否意味着您要从499的 CMPA 值转换为某个值800?

    我们有一个 有关什么可能导致常见 HRPWM 问题的常见问题解答、请参阅此处的设置。

    此致!

    马瑞安

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

    谢谢回复、... 对于主要计数、我指的是 CMPA 值的变化。 而次计数为 CMPAHR。 对于整个共享波形、我的整体 CMPA 变化仅为4-5个计数。 我们采用了 HRPWM 来提高分辨率。 我希望 HRPWM 能够在两个 CMPA 值之间建立桥接、从而使输出的步进类型实现平滑的斜坡。  

    根据数据表、HRPWM 在两个 CMPA 值内应提供 MEP 比例因子步进数。 所以当派系部分从0到1时,输出应该已经在两个 CMPA 值之间的区域之间进行了桥接,对吗? 这不是我看到的。 我的初始化代码与此类似...

    HRPWM_setEmulationMode(base, EPWM_EMULATION_FREE_RUN);
        EPWM_setTimeBasePeriod(base, INIT_mPRD_VAL);
        HRPWM_setTimeBaseCounter(base, 0);
    
        EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_A, INIT_mPRD_VAL >> 1);
        EPWM_setCounterCompareValue(base, EPWM_COUNTER_COMPARE_B, INIT_mPRD_VAL >> 1);
    
        HRPWM_setTimeBaseCounterMode(base, EPWM_COUNTER_MODE_UP_DOWN);
        HRPWM_disablePhaseShiftLoad(base);
        HRPWM_setClockPrescaler(base, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
        HRPWM_setPhaseShift(base, (uint32_t)phaseCount << 8U);
        EPWM_enablePhaseShiftLoad(base);
        HRPWM_enablePhaseShiftLoad(base);
        EPWM_enableSyncOutPulseSource(base, EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);
        EPWM_setSyncInPulseSource(base, syncInSource);
    
        HRPWM_setCounterCompareShadowLoadMode(base, EPWM_COUNTER_COMPARE_A,
                                              EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD);
        HRPWM_setCounterCompareShadowLoadMode(base, EPWM_COUNTER_COMPARE_B,
                                              EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD);
    
        HRPWM_setActionQualifierAction(base, EPWM_AQ_OUTPUT_A,
                                       EPWM_AQ_OUTPUT_LOW,
                                       EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
        HRPWM_setActionQualifierAction(base, EPWM_AQ_OUTPUT_A,
                                       EPWM_AQ_OUTPUT_HIGH,
                                       EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
    
        HRPWM_disableRisingEdgeDelayCountShadowLoadMode(base);
        HRPWM_disableFallingEdgeDelayCountShadowLoadMode(base);
        EPWM_disableDeadBandControlShadowLoadMode(base);
    
        HRPWM_setRisingEdgeDeadBandDelayInput(base,
                                              EPWM_DB_INPUT_EPWMA);
        HRPWM_setFallingEdgeDeadBandDelayInput(base,
                                               EPWM_DB_INPUT_EPWMA);
    
        HRPWM_setRisingEdgeDelayCountShadowLoadMode(base,
                                                    EPWM_RED_LOAD_ON_CNTR_ZERO_PERIOD);
        HRPWM_setFallingEdgeDelayCountShadowLoadMode(base,
                                                    EPWM_FED_LOAD_ON_CNTR_ZERO_PERIOD);
    
        EPWM_setDeadBandDelayPolarity(base, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);
        EPWM_setDeadBandDelayMode(base, EPWM_DB_RED, true);
        EPWM_setRisingEdgeDelayCount(base, INIT_mDEAD_BAND_VAL_RED);
        EPWM_setDeadBandDelayMode(base, EPWM_DB_FED, true);
        EPWM_setFallingEdgeDelayCount(base, INIT_mDEAD_BAND_VAL_FED);
    
        HRPWM_setMEPEdgeSelect(base, HRPWM_CHANNEL_A,
                               HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
        HRPWM_setMEPControlMode(base,HRPWM_CHANNEL_A,HRPWM_MEP_DUTY_PERIOD_CTRL);
    
        HRPWM_setMEPEdgeSelect(base, HRPWM_CHANNEL_B,
                               HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
        HRPWM_setMEPControlMode(base,HRPWM_CHANNEL_B,HRPWM_MEP_DUTY_PERIOD_CTRL);
    
        HRPWM_setCounterCompareShadowLoadEvent(base, HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
        HRPWM_setCounterCompareShadowLoadEvent(base, HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
    
        HRPWM_enableAutoConversion(base);
        HRPWM_enablePeriodControl(base);

    并将 CMPA/CMPAHR 值更新为  

    HRPWM_setCounterCompareValue(EPWM3_BASE, HRPWM_COUNTER_COMPARE_A, (uint32_t)(fS1Ch3 * 256.0F));

    fS1Ch3是 CMP 寄存器的浮点值。 这依照了 HRPWM_ex1_DUTY_SFO 示例。

    我还分别尝试了 CMPA 和 CMPAHR 的加载。 相同的结果。

    谢谢

    桑托什

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

    您好、Santhosh:  

    您是否仅设置 CMPA 和 CMPAHR?

    您是否遵守在 TBPRD/ZRO 上达到3时钟周期边界的限制?

    此致!

    马瑞安

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

    您好!

    我的职责从50%开始、然后上升或下降。 我没有像数据表中提到的那样接近3个计数问题。 我还没有找到任何其他解决方案。 因此任何其他线索都应该有用。

    谢谢。

    桑托什

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

    如果不使用 CMPB/CMPBHR、我仍然建议 CMPBHR 寄存器中写入至少为1的值。  

    您能否确认您编写的人力资源部分扫描了完整的人力资源、即50.0 -> 50.99%、然后达到了60%?

    SYNC 信号是否在每个周期都来自另一个 PWM? 如果是这种情况、请不要在每个周期或 zro 事件中同步、因为这会导致您可能看到的抖动。 相反、您只需要经常同步一次。

    此致!

    马瑞安

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

    您好!

    使用非零值加载 CMPB 和 CMPBHR

    是的、HR 部分会以相同的阶跃检查整个值范围。 我在 CMPA 转换期间读回比较值。 此处显示

    CMPA_FULL 是结合 CMPA 和 CMPA HR 来手动计算的。 CMPA 和 CMPA_FULL 位于左 Y 轴上、CMPAHR 位于右侧 Y 轴上。 我将检查同步

    谢谢

    桑托什

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

    对于同步相关点.. 是的,在我的例子中这两个脉冲是同步的,所以我使用第一个 PWM 作为参考(1A)并使第二个 PWM 的相位为零(2A).... 第一个未与任何外部源同步。 我从 EPWM1启用 SyncOut、并将其用作 EPWM2的同步源

    ePWM_enableSyncOutPulseSource (EPWM1_BASE、EPWM_SYNC_OUT_PULSE_ON_CNTR_ZERO);//in epwm1 init

    EPWM_setSyncInPulseSource (EPWM2_base、EPWM_SYNC_IN_pulse_SRC_SYNCOUT_EPWM1);//在 epwm2初始化中。

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

    您好、...  

    我有一个帖子的更新。 问题似乎已解决。 问题出现在我的硬件上、因为有3个并行通道连接、但它们位于不同的 ePWM 模块上。 最后一个是 EPWM9和 EPWM11。 意识到这两者没有人力资源能力。 这些因素的平行组合导致了这一问题。  

    左侧的一个来自前两个硬件、右侧的一个来自最后一个硬件。  

    当我隔离该通道时、我得到了良好的波形。 非常感谢您在这个问题中与我交谈。  

    谢谢

    桑托什