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.

[参考译文] TIDA-01606:PWM 调制器实现

Guru**** 2591760 points
Other Parts Discussed in Thread: TIDM-1000, TIDA-01606

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

https://e2e.ti.com/support/tools/simulation-hardware-system-design-tools-group/sim-hw-system-design/f/simulation-hardware-system-design-tools-forum/1395071/tida-01606-pwm-modulator-implementation

器件型号:TIDA-01606
Thread 中讨论的其他器件:TIDM-1000

工具与软件:

大家好、团队成员:

我已经介绍了单向 Vienna 整流器的控制和固件部分。 我无法理解 PWM 调制器的实施。 它是 SVPWM、迟滞还是任何其他基于高级载波的调制? 我已经看完了设计指南和所有东西、但是没有用。  如果对 PWM 调制器的实施进行了说明、将会非常有帮助。  

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

    您好!

    TIDA-01616是 T 型转换器、而不是 Vienna 整流器。

    我认为您参考的 Vienna 整流器也是 TIDM-1000。

    这两个设计均 实施了 SVPWM。

    在 T 型中实现了 DQ 控制

    中采用了单轴控制电流。

    谢谢

    BR

    Riccardo

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

    Ricardo、您好!

    非常感谢您的答复。 我真的很抱歉标题中的混乱。 我引用的代码是 TIDM1000。 我了解了 T 型中的 DQ 控制实现。 但是、我遇到的问题在函数"TINV_HAL_updatePWMDuty ()"中。 如果有人解释此功能、这将对我非常有帮助。 我无法遵循此特定功能中涉及的流程。

    为方便起见、我已添加了代码片段。

    static inline void TINV_HAL_updatePWMDuty(float32_t dutyA,
                                         float32_t dutyB,
                                         float32_t dutyC)
    {
        uint32_t dutyA_ticks, dutyB_ticks, dutyC_ticks;
        dutyA_ticks = (uint32_t)((float32_t)(TINV_PWM_PERIOD_TICKS / 2.0)
                                * fabsf(dutyA));
        dutyB_ticks = (uint32_t)((float32_t)(TINV_PWM_PERIOD_TICKS / 2.0)
                                * fabsf(dutyB));
        dutyC_ticks = (uint32_t)((float32_t)(TINV_PWM_PERIOD_TICKS / 2.0)
                                * fabsf(dutyC));
    
        //
        // Set PWM outputs
        //
        if(dutyA > 0.0f)
        {
    
    
            TINV_HAL_AQ_SW_FORCE_PWMXA_LOW_PWMxB_HIGH(TINV_Q2_Q4_A_PWM_BASE);
            TINV_HAL_AQ_SW_FORCE_PWMXA_DISABLE_PWMxB_DISABLE(TINV_Q1_Q3_A_PWM_BASE);
        }
        else
        {
            TINV_HAL_AQ_SW_FORCE_PWMXA_LOW_PWMxB_HIGH(TINV_Q1_Q3_A_PWM_BASE);
            TINV_HAL_AQ_SW_FORCE_PWMXA_DISABLE_PWMxB_DISABLE(TINV_Q2_Q4_A_PWM_BASE);
        }
    
        if(dutyB > 0.0f)
        {
            TINV_HAL_AQ_SW_FORCE_PWMXA_LOW_PWMxB_HIGH(TINV_Q2_Q4_B_PWM_BASE);
            TINV_HAL_AQ_SW_FORCE_PWMXA_DISABLE_PWMxB_DISABLE(TINV_Q1_Q3_B_PWM_BASE);
        }
        else
        {
            TINV_HAL_AQ_SW_FORCE_PWMXA_LOW_PWMxB_HIGH(TINV_Q1_Q3_B_PWM_BASE);
            TINV_HAL_AQ_SW_FORCE_PWMXA_DISABLE_PWMxB_DISABLE(TINV_Q2_Q4_B_PWM_BASE);
        }
    
        if(dutyC > 0.0f)
        {
            TINV_HAL_AQ_SW_FORCE_PWMXA_LOW_PWMxB_HIGH(TINV_Q2_Q4_C_PWM_BASE);
            TINV_HAL_AQ_SW_FORCE_PWMXA_DISABLE_PWMxB_DISABLE(TINV_Q1_Q3_C_PWM_BASE);
        }
        else
        {
            TINV_HAL_AQ_SW_FORCE_PWMXA_LOW_PWMxB_HIGH(TINV_Q1_Q3_C_PWM_BASE);
            TINV_HAL_AQ_SW_FORCE_PWMXA_DISABLE_PWMxB_DISABLE(TINV_Q2_Q4_C_PWM_BASE);
        }
    
    
        EPWM_setCounterCompareValue(TINV_Q1_Q3_A_PWM_BASE,
                                    EPWM_COUNTER_COMPARE_A,
                                    dutyA_ticks);
        EPWM_setCounterCompareValue(TINV_Q2_Q4_A_PWM_BASE,
                                    EPWM_COUNTER_COMPARE_A,
                                    dutyA_ticks);
    
        EPWM_setCounterCompareValue(TINV_Q1_Q3_B_PWM_BASE,
                                    EPWM_COUNTER_COMPARE_A,
                                    dutyB_ticks);
        EPWM_setCounterCompareValue(TINV_Q2_Q4_B_PWM_BASE,
                                    EPWM_COUNTER_COMPARE_A,
                                    dutyB_ticks);
    
        EPWM_setCounterCompareValue(TINV_Q1_Q3_C_PWM_BASE,
                                   EPWM_COUNTER_COMPARE_A,
                                   dutyC_ticks);
        EPWM_setCounterCompareValue(TINV_Q2_Q4_C_PWM_BASE,
                                   EPWM_COUNTER_COMPARE_A,
                                   dutyC_ticks);
    }

    此致

    Sayandev

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

    尊敬的 Riccardo:

    我已尝试了解函数'TINV_HAL_updatePWMDuty()'。 我现在了解了 TIDA-01606的第2.3.1.1节架构概述。

    如果我没有错、那么基本操作涉及2组切换:

    1. 两个电流方向的 DC+到 N 和 N 到 DC+都有一组开关。

    2.两个电流方向的 N 到直流和直流到 N 之间有另一组开关。

    但我有一个疑问-在代码中,它可以看到,对于 da>0 MOSFET Q4永久打开,Q1和 Q3被赋予 PWM 信号。 但这可能会导致对 Q3和 Q4的高压开关要求。

    在本例中、TIDA 01606文档第18页中提到的优势将为空。

    "这种调制方案的另一个好处是 Q3和 Q4绝不会同时开关。 这一优势可降低器件上的电压应力以及偏置电源的额定功率、从而有效驱动这些器件"

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

    尊敬的 Sayandev:

    我不明白为什么 Q3和 Q4器件需要具有高电压击穿。 它们之间可以看到的最大电压始终是直流链路的一半。

    基本上、在正常运行期间、Q3和 Q4将始终感应到直流链路半电压。

    谢谢

    BR

    Riccardo

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

    感谢 Riccardo 纠正我!

    但是、我还想问您一件事。 您说过他们实现了 SVPWM。 但我没有看到任何停留时间计算或扇区计算。 我观察到的是、从 DQ 控制中以 PU 计算得出的 va、vb、vc  被视为占空比、然后转换为 Duty.tick、用于馈入 ePWM 外设的 CMPA。 它与 SPWM 是否相似? 唯一的区别是、它采用了两种基于正占空比和负占空比的不同开关方案。

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

    我们实际上并不应用 SVPWM、而是应用第三谐波注入。

    基本来说、它是等效的。

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

    谢谢 Riccardo!  是的、现在已经很清楚了。  

    此致

    Sayandev