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.

[参考译文] TMS320F28377D:-

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1426322/tms320f28377d--

器件型号:TMS320F28377D
主题中讨论的其他器件:TIDA-01606

工具与软件:

无法实现 PLL 运行时遇到问题。

我主要考察 TIDA-01606的逆变器运行。

我的目标是运行连接到电网的逆变器操作。 (380Vrms 线路间电压、60Hz)

 // Read ADC results
    VA = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER0);
    VB = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER1);
    VC = ADC_readResult(ADCBRESULT_BASE, ADC_SOC_NUMBER2);

    // DATA should be centered at 0 while having peak of 1 or -1.
    // SInce the ABC to DQ0 transformation is going to happen. sine-wave
    VA_pu = ((float32_t)VA - Vgrid_Sense_Offset_A) / Vgrid_Sense_peak2peak_A;  // 변수 변경 가능
    VB_pu = ((float32_t)VB - Vgrid_Sense_Offset_B) / Vgrid_Sense_peak2peak_B;
    VC_pu = ((float32_t)VC - Vgrid_Sense_Offset_C) / Vgrid_Sense_peak2peak_C;

使用上述代码和 ADCSOC。

void initADCSOC(void)
{
    uint16_t acqps = 14; // Acquisition window size

    // Configure SOCs to be triggered by CPU Timer 0 interrupt
    ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER0, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN0, acqps);    // Pin B0
    ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER1, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN14, acqps);   // Pin B14
    ADC_setupSOC(ADCB_BASE, ADC_SOC_NUMBER2, ADC_TRIGGER_EPWM1_SOCA,
                 ADC_CH_ADCIN15, acqps);   // Pin B15

    // Configure interrupt to occur after SOC2 conversion
    ADC_setInterruptSource(ADCB_BASE, ADC_INT_NUMBER1, ADC_SOC_NUMBER2);
    ADC_enableInterrupt(ADCB_BASE, ADC_INT_NUMBER1);
    ADC_clearInterruptStatus(ADCB_BASE, ADC_INT_NUMBER1);
}

感测到的值与正弦波非常相似。 如下所示。

与 TIDA-01606的 LAB1-4类似、

使用 ABC 至 DQ0 POS.h (来自 TI 库)函数将检测值转换为 DQ0形式。

    // Perform ABC to DQ0 transformation
    ABC_DQ0_POS_run(&Vgrid_abc2dq0_pos,
                    VA_pu, VB_pu, VC_pu,
                    sine_VAL, cosine_VAL);

并使用 spll_3ph_srf.h 运行 SPLL  

    // Run the SPLL algorithm
    SPLL_3PH_SRF_run(Vgrid_abc2dq0_pos.q, &grid_SPLL);

    // Update the angle from SPLL
    angleSPLL_radians = grid_SPLL.theta[0];
    sine_VAL = sinf(angleSPLL_radians);
    cosine_VAL = cosf(angleSPLL_radians);

最后、运行 dq0到 abc、为 A 相、B 相、C 相生成占空比

 // Perform DQ0 to ABC transformation to get inverter voltage references
    DQ0_ABC_run(&Vgrid_dq02abc,
                Vd_pu, Vq_pu, Vz_pu,
                sine_VAL, cosine_VAL);

    //DQ0 to ABC 
    duty_A = (Vgrid_dq02abc.a * 0.5f) + 0.5f;
    duty_B = (Vgrid_dq02abc.b * 0.5f) + 0.5f;
    duty_C = (Vgrid_dq02abc.c * 0.5f) + 0.5f;

    // 12. Clip duty cycles to [0, 1]
    duty_A = fminf(fmaxf(duty_A, 0.1f), 0.9f);
    duty_B = fminf(fmaxf(duty_B, 0.1f), 0.9f);
    duty_C = fminf(fmaxf(duty_C, 0.1f), 0.9f);

    //sine values to DUTY
    uint16_t cmpValueA = (uint16_t)(EPWM_TIMER_TBPRD * duty_A);
    uint16_t cmpValueB = (uint16_t)(EPWM_TIMER_TBPRD * duty_B);
    uint16_t cmpValueC = (uint16_t)(EPWM_TIMER_TBPRD * duty_C);

嗯、我认为 PLL 运行和流程是正确的、但这一操作的结果不会生成正弦波。 相反、它产生了 失真波。

我将系数设置为与示例部分相同  

 // Adjust coeffiecients. TI's library follow.
    grid_SPLL.lpf_coeff.b0 = 333.807f;
    grid_SPLL.lpf_coeff.b1 = -333.674f;

以及 d.q.z 值。

//DQ0 to ABC
const float32_t Vd_pu = 0.835f;
const float32_t Vq_pu = 0.0f;
const float32_t Vz_pu = 0.0f;

有什么建议可使用并网逆变器实现 PLL 运行?

谢谢。

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

    失真波形是什么意思? 上面显示的波形看起来是相似的。

    此致、

    PAWAN

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

    很抱歉未发布有关错误的足够信息。

    1、检测代码与上述相同。 使用 ADC 检测电网电压、然后对其进行归一化。

    2.接下来使用 ABC 至 DQ0转换=>运行 SPLL =>将 DQ0转换为 ABC "这是使用 TI 库完成的"

    3.延迟10秒以确保 PLL 正常运行,然后更新栅极信号的 CMPA 值,以便生成正弦波。

    在1步进(正在感应和标准化)过程中、结果如我所预期的那样良好。 如下图所示。

    此结果是使用 CCS 的图形工具通过以下代码实现的。

        if(Result_idx<BUF_LENGTH){
            CHECK[Result_idx] = VA_pu;
            CHECK2[Result_idx] =duty_A;
            CHECK3[Result_idx] =cmpValueA;
            Result_idx++;
        }

    所以我认为传感和标准化似乎不是问题。

    接下来、为了看看变换和分离器是否发生故障、我查看了分离器的 θ 值。

        // Initialize SPLL
        duty_A = 0.5f;
        duty_B = 0.5f;
        duty_C = 0.5f;
        sine_VAL =  0.0f;
        cosine_VAL = 1.0f;
        delta_t = 1.0f / ISR_FREQUENCY;
        SPLL_3PH_SRF_init (RAMP_FREQUENCY, delta_t, &grid_SPLL);

    SPLL 使用此值初始化、图中的 theta 等于此代码。

    // Update the angle from SPLL
        angleSPLL_radians = grid_SPLL.theta[1];
        sine_VAL = sinf(angleSPLL_radians);
        cosine_VAL = cosf(angleSPLL_radians);
    

    从这个序列来看、我认为相电压的输出应该跟随正弦波。 但其结果会某种程度上失真。

    蓝色(CH.2)是感测到的电网电压(220Vrms、60Hz)、黄色(CH.1)是我使用逆变器和公布代码生成的相电压。

    有什么建议可使用并网逆变器实现 PLL 运行?

    感谢您阅读发布的问题。

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

    感谢您的澄清。 与 TIDA-01606示例相比、对代码进行了哪些更新? 您是否还可以尝试使用50Hz 电网信号、看看该问题是否再次发生?

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

    我无法生成50Hz、因为电网电压固定为60Hz。  

    与 TIDA-01606相比、  

    static inline void TINV_runISR1_lab4(void)
    {
    
        TINV_readCurrentAndVoltageSignals();
    
        TINV_runTransformOnSensedSignals();
    
        if(TINV_clearPWMTrip == 1)
        {
           TINV_clearPWMTrip = 0;
           TINV_closeGiLoop = 1;
           TINV_HAL_enableGateRST();
           TINV_HAL_clearPWMTripFlags(TINV_Q1_Q3_A_PWM_BASE);
           TINV_HAL_clearPWMTripFlags(TINV_Q2_Q4_A_PWM_BASE);
           TINV_HAL_clearPWMTripFlags(TINV_Q1_Q3_B_PWM_BASE);
           TINV_HAL_clearPWMTripFlags(TINV_Q2_Q4_B_PWM_BASE);
           TINV_HAL_clearPWMTripFlags(TINV_Q1_Q3_C_PWM_BASE);
           TINV_HAL_clearPWMTripFlags(TINV_Q2_Q4_C_PWM_BASE);
        }
    
        TINV_runCurrentLoop();
    
        DQ0_ABC_run(&TINV_vInv_dq0,
                    TINV_vdInv_pu, TINV_vqInv_pu, TINV_vzInv_pu,
                    TINV_sine, TINV_cosine);
    
        TINV_duty_A_pu = TINV_vInv_dq0.a;
        TINV_duty_B_pu = TINV_vInv_dq0.b;
        TINV_duty_C_pu = TINV_vInv_dq0.c;
    
        if(TINV_closeGiLoop == 1)
        {
            TINV_HAL_updatePWMDuty(TINV_duty_A_pu, TINV_duty_B_pu, TINV_duty_C_pu);
        }
        else
        {
            TINV_deadBand = TINV_deadBandMin;
            TINV_HAL_updatePWMDuty(0.5, 0.5, 0.5);
            TINV_HAL_updatePWMDeadBand(TINV_deadBand);
        }
    
        TINV_runSPLL(TINV_vGrid_dq0_pos.d,
                    TINV_vGrid_dq0_neg.d,
                    TINV_vGrid_dq0_pos.q,
                    TINV_vGrid_dq0_neg.q);
    
        TINV_sine = sinf(TINV_angleSPLL_radians);
        TINV_cosine = cosf(TINV_angleSPLL_radians);
    
        if(TINV_startPowerStage == 1)
        {
            if(TINV_vGrid_A_sensed_pu > 0.0f && TINV_vGrid_A_sensed_prev_pu < 0.0f)
            {
                TINV_startPowerStage = 0;
                TINV_closeGiLoop = 1;
                TINV_clearPWMTrip = 1;
            }
        }

    上面的代码是我通常使用的代码。 即 Lab4。

    由于 i;m 不使用电流环路控制、因此不包括电流控制环路。

    不过、格式是相同的  

    ABC 到 DQ0变换和 SPLL (TIDA-01606使用 DDSRF 或 SPLL)、然后 DQ0到 ABC 变换。

    谢谢

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

    请检查是否正确计算了系数。 您可以参考 适用于三相并网应用并使用 C2000微控制器的软件锁相环设计(修订版 A)