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.

电机库SVGEN_run函数的原理

Other Parts Discussed in Thread: C2000WARE

看不懂电机库这个static inline void SVGEN_run(SVGEN_Handle handle, const MATH_Vec2 *pVab_V, MATH_Vec3 *pVabc_pu)函数的原理,有没有相关资料可以分享参考一下,谢谢~

该函数位于 C2000Ware_MotorControl_SDK_4_00_00_00\libraries\transforms\svgen\include\svgen.h

//*****************************************************************************
//
//! \brief  Implements a SVM that saturates at the level of MaxModulation.
//!
//! \param[in] handle    The space vector generator (SVGEN) handle
//!
//! \param[in] pVab_V    The pointer to the alpha/beta voltages, V
//!
//! \param[in] pVabc_pu  The pointer to the three phase voltages, pu
//!
//! \return    None
//
//*****************************************************************************
static inline void
SVGEN_run(SVGEN_Handle handle, const MATH_Vec2 *pVab_V, MATH_Vec3 *pVabc_pu)
{
    float32_t Vmax_pu = 0,Vmin_pu = 0,Vcom_pu;
    float32_t oneOverDcBus_invV = SVGEN_getOneOverDcBus_invV(handle);
    SVM_Mode_e svmMode = SVGEN_getMode(handle);

    float32_t Valpha_pu = pVab_V->value[0] * oneOverDcBus_invV;
    float32_t Vbeta_pu = pVab_V->value[1] * oneOverDcBus_invV;

    float32_t Va_tmp = (float32_t)(0.5f) * Valpha_pu;
    float32_t Vb_tmp = MATH_SQRTTHREE_OVER_TWO * Vbeta_pu;

    float32_t Va_pu = Valpha_pu;

    //
    // -0.5*Valpha + sqrt(3)/2 * Vbeta
    //
    float32_t Vb_pu = -Va_tmp + Vb_tmp;

    //
    // -0.5*Valpha - sqrt(3)/2 * Vbeta
    float32_t Vc_pu = -Va_tmp - Vb_tmp;

    //
    // Find Vmax and Vmin
    //
    if(Va_pu > Vb_pu)
    {
        Vmax_pu = Va_pu;
        Vmin_pu = Vb_pu;
    }
    else
    {
        Vmax_pu = Vb_pu;
        Vmin_pu = Va_pu;
    }

    if(Vc_pu > Vmax_pu)
    {
        Vmax_pu = Vc_pu;
    }
    else if(Vc_pu < Vmin_pu)
    {
        Vmin_pu = Vc_pu;
    }

    // Compute Vcom = 0.5*(Vmax+Vmin)
    Vcom_pu = 0.5f * (Vmax_pu + Vmin_pu);

    if(svmMode == SVM_COM_C)
    {
        // Subtract common-mode term to achieve SV modulation
        pVabc_pu->value[0] = (Va_pu - Vcom_pu);
        pVabc_pu->value[1] = (Vb_pu - Vcom_pu);
        pVabc_pu->value[2] = (Vc_pu - Vcom_pu);
    }
    else if(svmMode == SVM_MIN_C)
    {
        pVabc_pu->value[0] = (Va_pu - Vmin_pu) - 0.5f;
        pVabc_pu->value[1] = (Vb_pu - Vmin_pu) - 0.5f;
        pVabc_pu->value[2] = (Vc_pu - Vmin_pu) - 0.5f;
    }
    else if(svmMode == SVM_MAX_C)
    {
        pVabc_pu->value[0] = (Va_pu - Vmax_pu) + 0.5f;
        pVabc_pu->value[1] = (Vb_pu - Vmax_pu) + 0.5f;
        pVabc_pu->value[2] = (Vc_pu - Vmax_pu) + 0.5f;
    }

    return;
} // end of SVGEN_run() function