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.

[参考译文] TMS320F280049C:PRDLDSYNC 位无效

Guru**** 2422790 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1516964/tms320f280049c-prdldsync-bits-are-ineffective

器件型号:TMS320F280049C
主题:SysConfig 中讨论的其他器件

工具/软件:

您好:

对于我的项目、我配置了 4 个 HRPWM 通道、并希望通过同步脉冲更改这四个通道的公共周期。

为了尝试同步脉冲的有效性、我提供一次 SW 脉冲来启动 PWM。

我的预期是在单个 SW 脉冲后、PWM 将启动 、但随后任何更改 TBPRD 和 TBPRDHR 的尝试都将无效。

不过、当我尝试   从调试视图表达式选项卡中更改 TBPRD 和 TBPRDHR 寄存器时。 我能够做到这一点、并且 PWM 的频率针对 TBPRD 和 TBPRDHR 进行了更改。

我的相关 PWM 配置如下所示:




另外、当我看到 TRM 时、我认为有一个关于这一点的合同描述。 例如:

对于 TBCTL 寄存器的 PRDLD 位、写入以下内容:
从影子选择中加载活动周期寄存器
0:周期寄存器 (TBPRD) 从其影子寄存器中加载
时基计数器 TBCTR 等于零和/或同步时
由 TBCTL2[PRDLDSYNC]位确定的事件。
对 TBPRD 寄存器的写入/读取可访问影子寄存器。
1:立即模式(旁路影子寄存器):对进行写入或读取
TBPRD 寄存器访问活动寄存器。
复位类型:SYSRSn

但对于 TBPRD 寄存器、说明如下:
时基周期寄存器
这些位确定时基计数器的周期。 减少
设置 PWM 频率。 启用该寄存器隐藏
并由 TBCTL[PRDLD]位禁用。 默认情况下、该寄存器为
影子化。
-如果 TBCTL[PRDLD]= 0 ,则启用影子并进行任何写入
否则读取将自动进入影子寄存器。 在这种情况下、
当时、活动寄存器将从影子寄存器加载
时基计数器等于零。  

(表明更新将是 CTR = 0、而不是根据 PRDLDSYNC 位)


-如果 TBCTL[PRDLD]= 1、则影子化被禁用并进行任何写入或
读取将直接进入活动寄存器、即主动寄存器
控制硬件。
-活动寄存器和影子寄存器共享相同的存储器映射
存储器地址。
复位类型:SYSRSn

最后、在 View Expression 选项卡中、我能够看到 PRDLD = 0 和 PRDLDSYNC = 2  

任何帮助都将非常感谢。

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

    尊敬的 Gokhan:

    TBCTL[PRDLD]和 TBCTL2[PRDLDSYNC]将确定配置的负载模式。 如果 TBPRD 寄存器说明设置为非默认值、则不提及 TBCTL2。

    但是的、一旦配置了 TBCTL2[PRDLDSYNC]、您就可以使用 SYNC 来加载 TBPRD

    此致、

    Ryan Ma

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

    感谢您的答复。

    İf 我理解正确、您说 İ 只使用同步脉冲即可更改周期。

    但是、我将每个 PWM 周期影子到活动传输都配置为使用同步脉冲。 然后在运行时、我触发了一次 SW 脉冲、不再调用同步脉冲。

    但每次第一次同步后、我都可以使用调试屏幕更改周期。

    İ 正常情况下、示波器屏幕上没有观察到任何脉冲。 这意味着没有同步脉冲。

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

    尊敬的 Gokhan:

    SYNCIN 源是什么?

    您能否读取以下寄存器并在第一个 SYNC 脉冲到来后将其清零?

    此致、

    Ryan Ma

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

    您好、Ryan、

    其实这很有趣。

    除 PWM1 外、其他 PWM SYNCI 位为 1。 (PWM5 是用于生成 ADC SOC 触发器的虚拟 PWM)。

    我清除了这些内容、但仍然能够更改 PWM 的周期。 我的代码是:


    EPWM_forceSyncPulse (myEPWM1_BASE);
    HRPWM_setSyncOutPulseMode (myEPWM1_BASE、EPWM_SYNC_OUT_PULSE_DISABLE);
    EPwm2Regs.TBSTS.bit.SYNCI = 1;
    EPwm3Regs.TBSTS.bit.SYNCI = 1;
    EPwm4Regs.TBSTS.bit.SYNCI = 1;
    EPwm5Regs.TBSTS.bit.SYNCI = 1;

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

    尊敬的 Gokhan:

    清除这些位后、它们是否会再次置位? 您是否在开始时仅通过软件发出一次时间同步事件?

    此致、

    Ryan Ma

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

    尊敬的 Gokhan:

    我刚记得。 您可以看到的是调试器视图中影子寄存器的 TBPRD。

    写入新的 TBPRD 值时、您是否可以看到 PWM 输出的变化? 如果不是、则这将仅确认看到影子寄存器值。

    此致、

    Ryan Ma

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

    您好、Ryan、

    不会、清除这些位后、它们不会再次设置。

    是的、据我所知、我称之为此行一次:

    EPWM_forceSyncPulse (myEPWM1_BASE);

    则软件不会进入该器件。 此外、我在示波器中看不到将其设置为触发信号的任何同步脉冲。  首先、我可以 看到同步脉冲为 fallow:



    调试时刻表示我从调试屏幕更改周期值的时刻。 这张图片是开始。 在此之后、当更改周期时、不会出现同步值、但频率会发生变化:



    调试更改后运行的代码如下:

    void updatePWMModule(void)
    {
    
    //1. According to the PWM_DEBUG_TEST macro, either the debug test code or the normal operation code will be run
    
    #if PWM_DEBUG_TEST
    // PWM variables from debugging tool
    
        if(PWM_update_debug)
        {
            GpioDataRegs.GPBSET.bit.GPIO57 = 1;
            final_phase_shift_12_deg  = pShift12_test;
            final_phase_shift_34_deg  = pShift34_test;
            Fsw_Hz = FREKANS_test;
            PWM_update_debug = 0;
            PWM_register_changed = 1;
            GpioDataRegs.GPBCLEAR.bit.GPIO57 = 1;
        }
    
    
    #endif
    
    //-------------------------------------------------------------------
    
    // 2. Period counter calculation
    //    Compute HRPWM period in timer counts:
    //  - Fsw_Hz        : switching frequency (Hz)
    //  - HRPWM resolution: 1 count = 78.125 ps
    //  - Period (s)    = 1.0 / Fsw_Hz
    //  - Period (ps)   = 1e12 / Fsw_Hz
    //  - period_cnt    = period_ps / 78.125 ps
    //                 = (1e12 / 78.125) / Fsw_Hz
    //                 = 1.28e10 / Fsw_Hz
        period_cnt = (uint32_t)(12800000000ULL / Fsw_Hz);
        duty_cnt   = (period_cnt >> 1);
    
    
    //-------------------------------------------------------------------
    
    // 3. Phase shift counter calculation
        // HRPWM phase shift has 2x resolution compared to period count (F280049C). (not exactly but we can go with this explanation)
        // So (degrees * period_cnt * 2) / 360 simplifies to (degrees * period_cnt) / 180
    
        // Phase shift between the legs of LLC1 (between High side mosfets)
        phase_shift_pwm1_to_pwm2 = (uint32_t)(((uint64_t)final_phase_shift_12_deg * period_cnt) / 180);
    
    
        // Phase shift between LLC phase 1 and 2 (between High side mosfets)
        phase_shift_pwm1_to_pwm3 = duty_cnt;   // 90° phase shift between PWM1 and PWM3: (duty_cnt = period_cnt / 2). Each count equals 39 ps in phase shift context (78 ps in period calculation).
    
        // Phase shift between two legs of LLC Phase 2
        phase_shift_pwm1_to_pwm4 = (uint32_t) ( ((uint64_t)final_phase_shift_34_deg * period_cnt) / 180 );
        phase_shift_pwm1_to_pwm4 = phase_shift_pwm1_to_pwm4 + phase_shift_pwm1_to_pwm3;  // final_phase_shift_34_deg + 90° ( 90° due to phase shift between LLC phase 1 & 2)
    
    //-------------------------------------------------------------------
    
    // 4. PWM4 T1 AQ qualifier settings based on the value of phase_shift_pwm1_to_pwm4.
        // If the value equals period/2 (i.e., duty_count), the T1 event must drive the output LOW
        // to avoid a missing pulse exactly at the synchronization moment.
        if (phase_shift_pwm1_to_pwm4 <= phase_shift_pwm1_to_pwm3 + 256) // Force LOW at T1 to avoid missing pulse
        {
            HRPWM_setActionQualifierAction(myEPWM4_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_T1_COUNT_DOWN);
        }
        else
        {
            HRPWM_setActionQualifierAction(myEPWM4_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T1_COUNT_DOWN);
        }
    
    //-------------------------------------------------------------------
    
    // 5.Phase shift variable assignment
    HRPWM_setPhaseShift(myEPWM2_BASE, phase_shift_pwm1_to_pwm2); // 1 count is 39 ps, -- for t ns delay argument should be 25.6*t. Also, the argument should not be greater than CMP value which are period/2
    HRPWM_setPhaseShift(myEPWM3_BASE, phase_shift_pwm1_to_pwm3);
    HRPWM_setPhaseShift(myEPWM4_BASE, phase_shift_pwm1_to_pwm4);
    //HRPWM_setPhaseShift(myEPWM1_BASE, 256); // for the 10ns offset we need to have 256 (1 count of TBPHS should be inserted for ePWM1)
    
    //-------------------------------------------------------------------
    
    // 6.Period and Duty Cycle variable assignment
    HRPWM_setTimeBasePeriod(myEPWM1_BASE, period_cnt);
    HRPWM_setCounterCompareValue(myEPWM1_BASE, HRPWM_COUNTER_COMPARE_A, duty_cnt);
    HRPWM_setCounterCompareValue(myEPWM1_BASE, HRPWM_COUNTER_COMPARE_B, duty_cnt); // Due to Using HRPWM and Active-high complementary dead band we need insert same CMP value for CMPB as CMPA
    
    //-------------------------------------------------------------------
    
    if(!Operation_start_flag)
        {
        // need to activate dead time here due to prevent PWM's to be high at the beginning
        HRPWM_setDeadBandDelayMode(myEPWM1_BASE, EPWM_DB_RED, true);
        HRPWM_setDeadBandDelayMode(myEPWM1_BASE, EPWM_DB_FED, true);
    
        HRPWM_setDeadBandDelayMode(myEPWM2_BASE, EPWM_DB_RED, true);
        HRPWM_setDeadBandDelayMode(myEPWM2_BASE, EPWM_DB_FED, true);
    
        HRPWM_setDeadBandDelayMode(myEPWM3_BASE, EPWM_DB_RED, true);
        HRPWM_setDeadBandDelayMode(myEPWM3_BASE, EPWM_DB_FED, true);
    
        HRPWM_setDeadBandDelayMode(myEPWM4_BASE, EPWM_DB_RED, true);
        HRPWM_setDeadBandDelayMode(myEPWM4_BASE, EPWM_DB_FED, true);
    
        HRPWM_setActionQualifierContSWForceAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
        HRPWM_setActionQualifierContSWForceAction(myEPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_SW_DISABLED);
    
        HRPWM_setActionQualifierContSWForceAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
        HRPWM_setActionQualifierContSWForceAction(myEPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_SW_DISABLED);
    
        HRPWM_setActionQualifierContSWForceAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
        HRPWM_setActionQualifierContSWForceAction(myEPWM3_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_SW_DISABLED);
    
        HRPWM_setActionQualifierContSWForceAction(myEPWM4_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_DISABLED);
        HRPWM_setActionQualifierContSWForceAction(myEPWM4_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_SW_DISABLED);
    
        HRPWM_setTimeBasePeriod(myEPWM1_BASE, period_cnt);
        HRPWM_setCounterCompareValue(myEPWM1_BASE, HRPWM_COUNTER_COMPARE_A, duty_cnt);
        HRPWM_setCounterCompareValue(myEPWM1_BASE, HRPWM_COUNTER_COMPARE_B, duty_cnt); // Due to Using HRPWM and Active-high complementary dead band we need insert same CMP value for CMPB as CMPA
    
        HRPWM_setPhaseShift(myEPWM1_BASE, 256); // for the 10ns offset we need to have 256 (1 count of TBPHS should be inserted for ePWM1)
    
    //    Interrupt_register(INT_myEPWM1, &INT_myEPWM1_ISR);
    //    Interrupt_enable(INT_myEPWM1);
        EPWM_forceSyncPulse(myEPWM1_BASE);
        HRPWM_setSyncOutPulseMode(myEPWM1_BASE, EPWM_SYNC_OUT_PULSE_DISABLED);
        EPwm2Regs.TBSTS.bit.SYNCI = 1;
        EPwm3Regs.TBSTS.bit.SYNCI = 1;
        EPwm4Regs.TBSTS.bit.SYNCI = 1;
        EPwm5Regs.TBSTS.bit.SYNCI = 1;
    
    //    EPWM_setSyncOutPulseMode(myEPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    
        Operation_start_flag = 1;
    
        }
    
    //-------------------------------------------------------------------
    
    // 8. Sync pulse and interrupt enable with INT event counter reset
    
    
    //    EPWM_setSyncOutPulseMode(myEPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
    //    sync_enabled = 1;
    //    HRPWM_enableInterruptEventCountInit(myEPWM1_BASE);
    //    HRPWM_forceInterruptEventCountInit(myEPWM1_BASE);
    //    HRPWM_setSyncOutPulseMode(myEPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_C);
    
    
    //    HRPWM_enableInterrupt(myEPWM1_BASE);
    
    //    HRPWM_selectPeriodLoadEvent(myEPWM1_BASE, EPWM_SHADOW_LOAD_MODE_SYNC);
    
    }

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

    是的、就像我之前说的、我正在观察示波器的 PWM。 他们的频率变化

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

    尊敬的 Gokhan:

    抱歉、我明天必须同步此问题。 坚持了、但将会研究这个问题。

    此致、

    Ryan Ma

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

    您好、Ryan、  
    是否有关于此问题的任何更新?

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

    尊敬的 Gokhan:

    很遗憾、我无法重现此问题。

    您能否确保按照以下配置设置主 PWM 来实现单次触发同步?

    OSHTSYNCMODE = 0x1、确保 启用单触发同步模式。

    只有在设置 OSHTSYNC 时、软件同步才会传播到更新 TBPRD 寄存器。

    在寄存器视图中依赖于 TBPRD 可能会带来误导、因为这将显示影子寄存器值。  

    为了验证加载是否仅发生在 SW Sync 脉冲上、您能否向 TBBPRD 写入一个很大的数字、看看输出 PWM 波形呢?

    此外、还要确保从 PWM 启用相移、并且 TBPRD 加载寄存器配置为仅在发生 SYNC 事件时加载。

    此致、

    Ryan Ma

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

    尊敬的 Gokhan:

    下面是一个测试用例、您可以使用它来查看预期行为。

    e2e.ti.com/.../empty_5F00_driverlib_5F00_project.7z

    此致、

    Ryan Ma

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

    您好、Ryan、

    我运行了 Ex、没有 HRPWM、它按预期工作。 我的意思是没有同步脉冲、PWM2 周期未更新。 但是、当我添加 HRPWM 时、问题再次发生

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

    尊敬的 Gokhan:

    我明天必须查看启用 HRPWM 的情况。  

    此致、

    Ryan Ma

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

    尊敬的 Gokhan:

    启用和未启用 HR 时、除非我设置 ePWM1 的 OSHTSYNC 以将同步信号传播到 ePWM2、否则我看不到 ePWM2 会更新。

    您能否为 ePWM1 和 ePWM2 验证以下 TBCTL + TBCTL2? 请忽略不影响该行为的 EPWM1REGS.TBCTL2.SYNCOSELX。

    此致、

    Ryan Ma

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

    尊敬的 Gokhan:

    请参阅此使用向上/向下计数模式的示例。

    e2e.ti.com/.../hrpwm_5F00_ex2_5F00_slider.7z

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

    您好、Ryan、

    本示例的问题是、ePWM2 HRPWM 实际上未启用。 我需要 为 EWPM2 启用“高分辨率周期启用“。
    选择它后、由于需要在 HRPWM 中进行设置、会弹出各种错误。  
    因此、当我使用这种方法设置 HRPWM 时、SysConfig 会提示问题仍然发生。
    我在这里分享了软件。

    e2e.ti.com/.../hrpwm_5F00_ex2_5F00_slider_5F00_GB_5F00_edited.rar

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

    尊敬的 Gokhan:

    感谢您的更新。 抱歉、我以为我已经为 ePWM2 启用了 HRPE。

    我现在看到了这个问题。 我必须对这个值进行仿真和复制、看看启用 HRPE 会导致在每个 SYNC 事件(而不是单次同步)上加载 TBPRD 寄存器的原因。 我会与我们的设计团队一起更新此主题的最新发现。

    此致、

    Ryan Ma

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

    尊敬的 Gokhan:

    我们的设计团队仍在等待得到这个仿真结果、为延迟深表歉意。  

    此致、

    Ryan Ma

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

    尊敬的 Gokhan:

    我们今天有一个电话,将更新这个帖子,一旦我们得到一些更多的信息。 再次为这次延迟深表歉意。

    此致、

    Ryan Ma

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

    您好、Ryan、
    感谢您的努力。
    仍然没有进展?

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

    尊敬的 Gokhan:

    我还在努力让这种情况继续下去。 对延误表示歉意、但仍未取得任何进展。 该团队拥有测试用例、并正在尝试运行测试。

    感谢您的耐心。

    此致、

    Ryan Ma

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

    尊敬的 Gokhan:

    明天我应该得到一个更新。 将在发布该主题时发布可能的解决方法。 再次为这次延迟深表歉意。

    此致、

    Ryan Ma

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

    尊敬的 Gokhan:

    快速更新、我们能够与设计团队重现此问题。 导致此问题的根时间仍需多一点。 感谢您的耐心。

    谢谢您、

    Ryan Ma

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

    尊敬的 Gokhan:

    我们已经将其记录为一个错误、如果您想在启用 HRPE 时使用 SYNC 来加载 TBPRD 寄存器、则没有解决方法。

    唯一的解决方法是禁用 HRPE、使用 SYNC 从影子寄存器加载到活动寄存器时、只有没有 HR 的 TBPRD。

    您仍然可以使用 CMPA/BHR 来获得高分辨率。  

    此致、

    Ryan Ma