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.

SFRA phase measurement

Other Parts Discussed in Thread: SFRA, PMP23126

Hi ,

Is there any issue with SFRA phase measurement. I have attached SFRA plant response I obtained for PSFB using Vienna rectifier TIDM 1000 code. I edited the code for PSFB requirement for plotting SFRA. I am sensing output voltage single sample only per ISR and not averaging. 

Injection amplitude is 0.01

The dc gain of 40db is correct as per theoretical calculations.

However why phase keeps on decreasing after 1kHz ( I understand that after -180, it is decreasing further and therefore jumping to 179 as tan value is same).  It can be seen that phase is decreasing at a faster rate even though magnitude is constant after 200 kHz. A double pole would reduce the phase to -180 degree and will keep the phase same thereafter. But here magnitude is remaining same with no decrease indication transfer function zero, but phase starts decreasing at a faster rate. Is the phase measurement correct in SFRA.

I added a digital low pass filter with cut off frequency 10 kHz in the voltage measurement and I am getting following plot.

The addition of know pole at 10 kHz is slowing down the decrease in phase.

Hence, my doubt about phase measurement.

ISR frequency is 50 kHz.

Plant response is being plotted  for perturbation around steady state duty of 0.8.

Will averaging four samples of voltage ADC value in a ISR will improve the result. 

  • Hi,

    Would you please share the configuration of 'SFRA_F32_config()' function and how are you using the 'SFRA_F32_inject()' & 'SFRA_F32_collect()' functions? Improper inputs these functions can cause erroneous results. If possible, can you please add a picture of the control loop indicating the points where are you collecting the data from? This may be happening because of too high injection amplitude. You try running the same by reducing the injection amplitude to 0.001

    Regards,

    Shamik

  • Thanks for your reply.

    I am using  Vienna rectifier code TID1000 . Configured the same for PSFB. Switching frequency 50 kHz.

    With 0.001 I got the following. I am using actual bus voltage value for SFRA measurement. 

    With 0.1 I got the following.

    .

    ===========================================================

    Code is shown below:

    ============================================================

    VIENNA_readCurrVolADCSignals();
    VIENNA_dutyPU_DC = 0.8f;

    VIENNA_duty4PU = VIENNA_SFRA_INJECT(VIENNA_dutyPU_DC);

    VIENNA_duty5PU = 1.0f - (VIENNA_duty4PU);

    VIENNA_HAL_updatePSFB_PWM(VIENNA_HIGH_FREQ_PWM4_BASE,
    VIENNA_HIGH_FREQ_PWM5_BASE,
    VIENNA_HIGH_FREQ_PWM6_BASE, VIENNA_HIGH_FREQ_PWM7_BASE,
    VIENNA_duty4PU,
    VIENNA_duty5PU,
    VIENNA_duty6PU,VIENNA_duty7PU);


    VIENNA_guiVbusPM_Volts = VIENNA_vBusPMMeas_pu * VIENNA_V_MAX_SENSE_VOLTS;
    IL1_Amps = VIENNA_iL1Meas_pu * VIENNA_I_MAX_SENSE_AMPS;

    VIENNA_SFRA_COLLECT((float32_t *)&VIENNA_duty4PU,
    (float32_t *)&VIENNA_guiVbusPM_Volts);

    Regards,

    Neeraja

  • Hi,

    Thanks for trying the above.

    Can you help me understand few more things? Are you using PSFB hardware and trying to run the SFRA code portion of TIDM 1000 design as reference? If you are doing so, it's better to refer 'pmp23126' solution. It is the PSFB reference design and uses SFRA functionalities also.

    Regards,

    Shamik

  • Thankyou. I will refer pmp23126.

    For SFRA measurement is per unit value is required for both duty and output voltage.

    I am using actual output voltage. Will that make any difference.

  • Also yes I am using PSFB hardware and running Vienna code for SFRA. I have configured the PWMs for PSFB and it giving correct output in steady state. Also in SFRA for low frequencies the 40 dB output correctly matches the SFRA measurement. 

  • Hi Neeraja,

    Both inputs to the function VIENNA_SFRA_COLLECT() must be less than 1 i.e, they have to be converted to pu values. Else it will not work as expected. 

    Regards,

    Shamik 

  • When I am forcing the output value as below,

    VIENNA_dutyPU_DC = 0.8f;

    VIENNA_duty4PU = VIENNA_SFRA_INJECT(VIENNA_dutyPU_DC);


    var1.Ref =1;

    VIENNA_SFRA_COLLECT((float32_t *)&VIENNA_duty4PU,
    (float32_t *)&var1.Ref);

    I am getting the following response. 

    ======================================================================================

    When I force as below , output as a factor of duty I am getting below response, which is correct.

    var1.Ref = VIENNA_duty4PU;

    VIENNA_SFRA_COLLECT((float32_t *)&VIENNA_duty4PU,
    (float32_t *)&var1.Ref);

    What could be the issue in the first method ?