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.

[参考译文] CCS/TMS320F28035:HFI 频率

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/741118/ccs-tms320f28035-hfi-frequency

器件型号:TMS320F28035

工具/软件:Code Composer Studio

您好, 罗燕明

   我会尝试您对 HFI 频率的建议。  它看起来工作正常。  在构建级别8,我在 q 轴上施加恒定电压,就像 bulid 级别2一样,转子以大约350rpm 的速度旋转。

但转子无法在构建级别9的电流环路下旋转。  我在其他培训视频()中发现它需要低通滤波 器,但我想知道哪种数字滤波器算法是合适的。

期待您的回复、提前感谢您的回复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HFI 仅用于低速和 IPM 电机。 如果电机在无负载的转矩模式下旋转、电机速度可能会超过 HFI 的转换值。 HFI 在算法中包含一些滤波器、无需添加任何额外的滤波器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。  但我有点困惑。

    在 bulid 9方框图中  ,d 轴和 q 轴电流环路中没有滤波器块,如下所示

    在火车视频中、 有带滤波器块。 如下所示

    低通滤波器之后的信号进入 d 轴和 q 轴电流调节器。 信号经过 hign pass 滤波器后进入 HFI 以获取零速或低速位置信息。  您是说 我们不需要过滤电流调节器的 d&q 轴电流反馈吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没错。 它包含在 HFI 库中并在其中实现、在大多数情况下、您无需添加额外的滤波器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回复。 但我在   示例项目中找不到任何与低通滤波器相关的代码,如下所示

    //================================================ 级别9 ================================================
    //    9级使用低速时的高频注入进行识别
    //   转子位置、并在更高速度下使用 Level7中讨论的 eSMO、
    //   在整个范围内提供速度控制
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    // lsw = 0:控制器处于复位状态、不为电机供电
    // ls=1:识别初始转子位置、如果成功、则将 lsw 更改为2、否则更改为0
    // lsw = 2:电机运行在速度环路中

       /*************
        *注:-                                                               *
        *用于初始位置检测(IPD)和              *的可执行文件
        *高频注入(HFI)位于 HFI.lib 文件中、而不    是*
        *控制套件可下载版本的一部分。                    *
        *任何构建 LEVEL9代码的尝试都会导致错误。                *
        *要访问库和/或源代码、建议用户    *
        *联系最近的 TI 销售办事处。                               *
        ****
        *

    #if (BUILDLEVEL = LEVEL9)

    //----------------------------------
    // 连接 RMP 模块的输入并调用斜坡控制宏
    //----------------------------------
       if (lsw!= run_State){
          RC1.targetValue = 0;
          RC1.SetpointValue = 0;
       }
       其他
          RC1.targetValue = SpeedRef;
       RC_MACRO (RC1)

    //----------------------------------
    // 连接斜坡生成模块的输入并调用斜坡生成器宏
    //----------------------------------
       rg1.Freq = RC1.SetpointValue;
       RG_MACRO (rg1)
       angle_wrap(rg1.out);

    //----------------------------------
    //   连接 SPEED_EST 模块的输入并调用估算速度宏
    //----------------------------------
       Transition1.SPD     = RC1.SetpointValue;
       Transition1.angleHFI = hfi1.thetaEst;
       Transition1.angleSMO = esmo1.Theta;
       角度_传输(&Transition1);

       speed3.EstimatedTheta = transition1.angle;

       if (lsw!= run_State)
          speed3.Old估算 Theta = speed3.估算 Theta;
       SE_MACRO (speed3)

    //----------------------------------
    // 以_IQ 格式测量直流总线电压
    //----------------------------------
       volt1.DcBusVolt =_IQ12toIQ (AdcResult.ADCRESULT7);

    //----------------------------------
    // 测量相电流、减去偏移并将其从(-0.5、+0.5)标准化为(-1、+1)。
    //   连接 Clarke 模块的输入并调用 Clarke 变换宏
    //----------------------------------
       clarke1.As =_IQmpy2 (_IQ12toIQ (AdcResult.ADCRESULT1)-offsetA);//相位 A 电流。
       clarke1.bs =_IQmpy2 (_IQ12toIQ (AdcResult.ADCRESULT2)-offsetB);// B 相电流。
       Clarke_macro (clarke1)
    //   clarke1.cs =_IQmpy2 (_IQ12toIQ (AdcResult.ADCRESULT3)-offsetC);//相位 C 电流。
    //   CLARKE1_MACRO (clarke1)

    //----------------------------------
    // 连接驻车模块的输入并调用驻车变速器。 宏
    //----------------------------------
       park1.Alpha = clarke1.Alpha;
       park1.Beta  = clarke1.Beta;
       park1.Angle = speed3.EstimatedTheta;
       park1.sine  =_IQsincu (park1.Angle);
       park1.Cosine =_IQcosPU (park1.Angle);
       PARK_MACRO (park1)

       HPF_IQ.IN1 = park1.Qs;

    //----------------------------------
    //用于电机控制的状态机
    //----------------------------------
       if (lsw = RESET_STATE)
       {
        //重置所有 PI 稳压器
        RESET_PI (PI_SPD);
        RESET_PI (pi_id);
        RESET_PI (PI_IQ);

        HFI_RESET (&hfi1);         //重置 HFI 模块
        HPF_RESET (&hpf_IQ);       //重置 HPF
        HPF_init (&hpf_coeff1);    //可选-在调试期间更改 HPF 角频率

        dbc1.gain = 0;
       }

       否则、如果(lsw = IPD_State)
       {
        ZLSPD (&hpf_iq、&hpf_coeff1、&hfi1、&ns_id1、&clarke1、&clarke1、 volt1);
        pi_id.out = hfi1.Duty;
        pi_iq.out = 0;
        if (hfi1.hfi_Status = hfi_run_State)
        {
           lsw =运行状态;
           pi_id.out = 0;
        }
        否则、如果(hfi1.hfi_Status = hfi_reset_State)
        {
           lsw = RESET_STATE;
        }
       }

       否则、如果(lsw = run_State)
       {
        //----------------------------------
        //   连接 PI 模块的输入并调用 PID 速度控制器宏
        //----------------------------------
        如果(+SpeedLoopCount >= SpeedLoopPrescaler)
        {
          pi_spd.Ref = RC1.SetpointValue;
          pi_spd.fbk = speed3.EstimatedSpeed;
          pi_macro (pi_spd);
          SpeedLoopCount=0;
        }

        //----------------------------------
        //   连接 PI 模块的输入并调用 PID IQ 控制器宏
        //----------------------------------
        pi_iq.Ref = pi_spd.out;
        pi_iq.fbk = park1.qs;
        pi_macro (pi_iq);

        //----------------------------------
        //   连接 PI 模块的输入并调用 PID ID 控制器宏
        //----------------------------------
        pi_id.Ref = 0;
        pi_id.fbk = park1.ds;
        pi_macro (pi_id);

        //零速和低速位置检测
        if (_IQabs (RC1.SetpointValue)<= Transition1.spdHi)
        {
          ZLSPD (&hpf_iq、&hpf_coeff1、&hfi1、&ns_id1、&clarke1、&clarke1、 volt1);
          pi_id.out += hfi1.Duty;
        }

    //    dbc1.gain =_IQ (0.5);            //注释以在调试环境中进行调整
       }

    //----------------------------------
    // 连接 INV_PARK 模块的输入并调用逆向 Park 转换。 宏
    //----------------------------------
       ipark1.ds    = pi_id.out;
       ipark1.qs    = pi_iq.out;
       ipark1.sine  = park1.sine;
       ipark1.Cosine = park1.Cosine;
       IPark_MACRO (ipark1)

    //----------------------------------
    //   连接 VOLT_CALC 模块的输入并调用相电压宏
    //----------------------------------
    //   volt1.DcBusVolt =_IQ12toIQ (AdcResult.ADCRESULT7);
       volt1.MfuncV1 = svgen1.Ta;
       volt1.MfuncV2 = svgen1.tb;
       volt1.MfuncV3 = svgen1.tc;
       PHASEVOLT_MACRO (volt1)

    //----------------------------------
    //   连接 ESMO_POS 模块的输入并调用 ESMO 模块
    //----------------------------------
       如果((lsw = run_State)&&(esmo1.kslide < smok_set))
        esmo1.kslide +=_IQ (0.00001);
       esmo1.Ialpha  = clarke1.Alpha;
       esmo1.Isbeta   = clarke1.Beta;
       esmo1.Valpha  = volt1.Valpha;
       esmo1.vbeta   = volt1.vbeta;
       esmo1.runSpeed = speed3.EstimatedSpeed;
       esmo1.cmdSpeed = RC1.SetpointValue;
       eSMO_MODULE (&esmo1);

       /********
       *用于从 eSMO 估算角度移除抖动的补充滤波器
       * /
    //   esmo1.Theta = angleFilter (π_SMO、&esmo1); //取消注释以包括

    //----------------------------------
    // 连接 SVGEN_DQ 模块的输入并调用空间矢量发生器。 宏
    //----------------------------------
       svgen1.Ualpha = ipark1.Alpha;
       svgen1.Ubeta = ipark1.Beta;
       SVGENDQ_MACRO (svgen1)

    //----------------------------------
    // 连接 PWM_DRV 模块的输入并调用 PWM 信号生成宏
    //----------------------------------
       如果(lsw!= run_State)   dbc1.gain = 0;
    //   否则       dbc1.gain =_IQ (0.5);        //注释行以在调试中进行调整
       pwm1.Mfunc1 = svgen1.Ta;
       pwm1.MfuncC2 = svgen1.tb;
       pwm1.MfuncC3 = svgen1.tc;

       if (hfi1.hfi_Status!= hfi_nsid_state)      //非 nsid 状态
       {
          /*********
          *具有死区补偿宏的 PWM 生成器
          *    如果 cura >0  Ta = Ta + Tdt
          *    否则         Ta = Ta - TDT
          (小部分 /
          dbc1.scale =_IQdiv (_IQdiv2 (pwm1.Deadband)、dbc1.ith); //取消注释以进行调试
          dbc1.Kdtc =_IQmpy (dbc1.scale、dbc1.gain);            //取消注释以调整 “ ”
          PWMwDBC_MACRO (1、2、3、pwm1、clarke1、dbc1);
       }

    //----------------------------------
    //   连接 PWMDAC 模块的输入
    //----------------------------------
       pwmdac1.Mfunc1 = speed3.EstimatedTheta;
       pwmdac1.MfuncC2 = pi_id.out;
       PWMDAC_MACRO (6、pwmdac1)                       // PWMDAC 6A、6B

       pwmdac1.Mfunc1 = rg1.out;
       pwmdac1.MfuncC2 = pi_iq.out;
       PWMDAC_MACRO (7、pwmdac1)                       // PWMDAC 7A、7B

    //----------------------------------
    //   连接数据记录模块的输入
    //----------------------------------
       DlogCh1 =(Int16)_IQtoIQ15 (rg1.out);
       DlogCh2 =(Int16)_IQtoIQ15 (clarke1.Bs);
       DlogCh3 =(Int16)_IQtoIQ15 (volt1.VphaseA);
       DlogCh4 =(Int16)_IQtoIQ15 (qep1.ElecTheta);

    #endif //(BUILDLEVEL = LEVEL9)

    如突出显示部分所示, d&q 轴电流反馈只是来自未过滤的停止转换后的信号。

    HFI 库文档中没有提到低通滤波器。   我从 FAE 获得的库版本 是 V13.1。  它是最新版本吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如您所回答的那样、有一个用于 ID 和 IQ 的高通滤波器用于提取 HF 组件、还有一个只用于速度估算的可选低通滤波器、这两个滤波器都在 HFI .lib 中定义和调用、而不是在示例项目文件中。
    您可以在示例项目文件中按如下方式调整 HFP 参数、但不能更改项目文件中速度的滤波器参数。
    //初始化 HPF 参数
    hpf_coeff1.freq =_IQ (18.0);// Hz
    HPF_coeff1.pit =_IQ (PI*T);
    HPF_init (&hpf_coeff1);

    顺便说一下、由于您创建了一个关于同一主题的新主题、我们希望关闭此主题。
x 出现错误。请重试或与管理员联系。