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.

[参考译文] TMS320F28069F:InstaSPIN-FOC Lab11a 项目

Guru**** 2524460 points
Other Parts Discussed in Thread: MOTORWARE, TMS320F28069F

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/994181/tms320f28069f-instaspin-foc-lab11a-project

器件型号:TMS320F28069F
主题中讨论的其他器件:MOTORWARE

罗燕明、您好!

我对 motorware 中的 InstaSPIN-FOC 实验项目有疑问。

尤其是在 Lab11a 上。

我们目前正在尝试在 Lab11a 上实现可变 PWM 频率的功能。

对于这项工作,我们需要将 mainISR()中的源代码拆分为两个固定频率和可变频率的 ISR 函数,如 MotorControl_SDK 中的 is12_variable_pwm_frequency 实验中所示。

同时在 我的上一篇文章中,您建议了如何将 mainISR()中的源代码拆分为两个 ISR 函数;它是运行 estISR()中的所有速度、ID 和 IQ 控制器。

但是, 关于 MotorControl_SDK 中的 is12_variable_pwm_frequency 实验,我发现 estISR()运行速度控制器,而 mainISR()运行 ID 和 IQ 控制器。

请对此意见发表评论。

感谢您的指导。

此致、

JS Yoo

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

     是的、可以在  estISR 或 mainISR 中调用 Id 和 Iq PI 控制器。 最好在 mainISR()中调用。 如果您需要良好的电流控制性能、最好使用 PWM 频率更改 KP 和 KI。

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

    罗燕明、您好!

    感谢您的评论。

    首先、我们使用 TMS320F28069F 构建的逆变器在 Lab11a 环境中运行良好。

    为了在 Lab11a 上实现可变 PWM 频率的函数,我已经完成了将 mainISR()中的源代码拆分为两个 estISR()和 mainISR() ISR 函数的工作,类似于 MotorControl_SDK 中的 is12_variable _pwm_frequency 实验。

    与读取 ADC 结果、写入 PWM 比较寄存器、过调制和电流重构以及 ID 和 IQ 控件相关的所有函数  驻留在 mainISR()中,而与速度控制和 ESTrun()相关的其他函数驻留在 estISR()中。

    现在、当我尝试使用此修改后的 Lab11a 项目运行电机时、电机会产生噪声。 似乎没有适当地产生磁通量。

    因此,我将 is12_variable_pwm_frequency 项目的 estISR()中的源代码与 Lab11a 的 mainISR()中的源代码进行了比较。

    首先, is12_variable_pwm_frequency 项目的 estISR()中的源代码如下:

           //
           //将输入数据存储到缓冲区中
           //
           estInputData.DCBus_V = adcData.DCBus_V;
           estInputData.speed_ref_Hz = motorVars.speedTraj_Hz;
           estInputData.speed_int_Hz = motorVars.speedTraj_Hz;

           //
           //运行估算器
           //
           EST_run (estHandle、&estInputData、&estOutputData);

    EST_run()的输入参数在调用 EST_run()函数之前提供。

    其次,Lab11a 的 mainISR()中的源代码如下:

     //对电流运行 Clarke 变换
     Clarke_run (clarkeHandle_I、&gAdcData.I、&IAB_pu);

     //对电压运行 Clarke 变换
     Clarke_run (clarkeHandle_V、&gAdcData.V、&VAB_pu);

     //运行 Id 参考的轨迹、因此参考变化时使用斜坡而不是步进
     TRAJ_RUN (trajHandle_ID);

     //运行估算器
     EST_run (estHandle、
             IAB_pu、
             VAB_pu、(&V)
             gAdcData.DCBus、
             TRAJ_getIntValue (trajHandle_SPD);

    两个 Clarke_run()函数需要驻留在 mainISR()中,而 EST_run()函数需要驻留在 estISR()中。

    此 EST_run()的参数似乎是输入参数,但 estHandle 除外。

    总之 、EST_run ()函数在 is12_variable_pwm_frequency 项目 和 Lab11a 中的使用方式是完全不同的。

    请告知我们 、是否无法使用 Motorware FAST 估算器库实现可变 PWM 频率的功能。

    我们可以使用 TMS320F28004xC 器件和 MotorControl_SDK FAST 估算器库随时构建新的逆变器。

    否则,请向我们提供修改后的 Lab11a 项目 ,该项目具有可变 PWM 频率的功能。

    感谢您的指导。

    此致、

    JS Yoo

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

    您可以尝试对  mainISR()和 EST_run()使用相同的频率,而无需在线更改 PWM 频率,以查看发生了什么情况。

    您使用哪个频率来计算估算器参数?

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

    罗燕明、您好!

    感谢您的评论。

    我所做的是如下。

    (1)相对于原始 Lab11a、PWM 频率为8kHz、逆变器运行电机非常好。

    (2)关于修改后的 Lab11a,首先,estISR()的执行频率设置为20kHz,mainISR()的执行频率设置为8kHz。 电机不运行并产生噪音。

    (3)关于修改后的 Lab11a,第二,estISR()和 mainISR()的执行频率都设置为8kHz。 电机不运行并产生噪音。

    "计算估算器参数"是什么意思?

    估算器参数是什么?

    感谢您的指导。

    此致、

    JS Yoo

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

    请发布您 使用的 user.h 和实验主文件。

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

    罗燕明、您好!

    感谢您的评论。

    请在此附上 estISR()和 mainISR()的源代码。

    我只是将 Lab11a 中原始 mainISR()的源代码拆分为 两个 estISR()和新的 mainISR() ISR 函数。

    --------------------------------------------------------------------

    _iq angle_pu =_IQ (0.0);
    _iq speed_pu =_IQ (0.0);
    MATH_vec2 IAB_pu;
    MATH_vec2 VAB_pu;
    MATH_vec2相量;

    //
    // CPU timer0中断作为 FAST 估算器 ISR
    //
    中断空 estISR (空)

       //确认为估算器设置的中断
       HAL_acqTimer0Int (halHandle);

    //   if (gTrjCnt >= gUserParams.numCtrlTicksPerTrajTick)
    //   {
    //       //清除计数器
    //       gTrjCnt = 0;

           //运行速度基准的轨迹,因此基准以斜坡而不是步进的方式变化
           TRAJ_RUN (trajHandle_SPD);
    //   }

           //运行估算器
           EST_run (estHandle、
                   IAB_pu、
                   VAB_pu、(&V)
                   gAdcData.DCBus、
                   TRAJ_getIntValue (trajHandle_SPD);

           //生成电机电角
           Angle_pu = EST_getAngle_pu (estHandle);
           SPEED_PU = EST_getFm_PU (estHandle);

           //从估算器获取 idq 以避免正弦和余弦
           EST_getIdq_pu (estHandle、&gIdq_pu);

           //运行相应的控制器
           if ((gMotorVars.Flag_Run_Identify)||(gMotorVars.Flag_enableRsRecalc))
             {
               //适当时运行 PID 速度控制器
               if ((pidCntSpeed++>= gUserVars.numCtrlTicksPerSpeedTick)&&(!gMotorVars.Flag_enableRsRecalc))
                 {
                   //计算 Id 参考平方
                   _iq Id_ref_squared_pu =_IQmpy (PID_getRefValue (pidHandle[1])、PID_getRefValue (pidHandle[1]));

                   //考虑 IQ^2+ID^2 =为^2
                   _iq IQ_Max_pu =_IQsqrt (GIS _Max_squared_pu - ID_ref_squared_pu);

                   //清除计数器
                   PidCntSpeed = 0;

                   //为速度控制器输出设置新的最小值和最大值
                   PID_setMinMax (pidHandle[0]、-IQ_Max_pu、IQ_Max_pu);

                   //运行速度控制器
                   PID_RUN_SPD (pidHandle[0]、TRAJ_getIntValue (trajHandle_SPD)、SPED_PU、&(gIdq_ref_pu。value[1]));
                 }
             }


    //! 简要介绍    实现电机控制的主 ISR。
    中断空 mainISR (空)

     _iq oneOverDcBus;

     //确认 ADC 中断
     HAL_acqAdcInt (halHandle、ADC_IntNumber_1);

     //转换 ADC 数据
     HAL_readAdcDataWithOffsets (halHandle、&gAdcData);

     //删除偏移
     gAdcData.I.value[0]= gAdcData.I.value[0]- gOffsets_I_PU.value[0];
     gAdcData.I.value[1]= gAdcData.I.value[1]- gOffsets_I_PU.value[1];
     gAdcData.I.value[2]= gAdcData.I.value[2]- gOffsets_I_PU.value[2];
     gAdcData.V.value[0]= gAdcData.V.value[0]- gOffsets_V_PU.value[0];
     gAdcData.V.value[1]= gAdcData.V.value[1]- gOffsets_V_pu.value[1];
     gAdcData.V.value[2]= gAdcData.V.value[2]- gOffsets_V_pu.value[2];

     //运行当前重建算法
     runCurrentReconstruction();

     //对电流运行 Clarke 变换
     Clarke_run (clarkeHandle_I、&gAdcData.I、&IAB_pu);

     //对电压运行 Clarke 变换
     Clarke_run (clarkeHandle_V、&gAdcData.V、&VAB_pu);

     //运行 Id 参考的轨迹、因此参考变化时使用斜坡而不是步进
     TRAJ_RUN (trajHandle_ID);

     //运行相应的控制器
     if ((gMotorVars.Flag_Run_Identify)||(gMotorVars.Flag_enableRsRecalc))
       {
         _iq refValue;
         _iq fbaValue;
         _iq outMax_pu;

         //从轨迹模块获取参考值
         refValue = TRAJ_getIntValue (trajHandle_ID)+ EST_getRsOnLineId_pu (estHandle);

         //获取反馈值
         fbackValue = gIdq_pu.value[0];

         //运行 ID PID 控制器
         PID_run (pidHandle[1]、refValue、fbackValue、&(gVdq_out_pu.value[0]));

         //在执行 Rs 重新计算时将 IQ 引用设置为零
         if (gMotorVars.Flag_enableRsRecalc) gIdq_ref_pu.value[1]=_IQ (0.0);

         //获取 IQ 参考值
         refValue = gIdq_ref_pu.value[1];

         //获取反馈值
         fbackValue = gIdq_pu.value[1];

         //计算 IQ 控制器限制,并运行 IQ 控制器
         _iq max_vs =_IQmpy (gMotorVars.OverModulation、EST_getDcBus_pu (estHandle));
         outMax_pu =_IQsqrt (_IQmpy (max_vs、max_vs)-_IQmpy (gVdq_out_pu.value[0]、gVdq_out_pu.value[0]));
         PID_setMinMax (pidHandle[2]、-outMax_pu、outMax_pu);
         PID_run (pidHandle[2]、refValue、fbackValue、&(gVdq_out_pu.value[1]));

         //补偿 PWM 延迟的角度
         angle_pu = angleDelayComp (speed_pu、angle_pu);

         //计算正弦/余弦相量
         Phasor.value[0]=_IQcosPU (angle_pu);
         Phasor.value[1]=_IQsinPU (angle_pu);

         //在逆向 Park 变换中设置相量
         IPark_setPhasor (iparkHandle、和相量);

         //运行逆向 Park 模块
         IPark_run (iparkHandle、&gVdq_out_pu、&Vab_pu);

         //运行空间矢量发生器(SVGEN)模块
         oneOverDcBus = EST_getOneOverDcBus_pu (estHandle);
         vab_pu.value[0]=_IQmpy (vab_pu.value[0]、oneOverDcBus);
         vab_pu.value[1]=_IQmpy (vab_pu.value[1]、oneOverDcBus);
         SVGEN_run (svgenHandle、&VAB_pu、&(gPwmData.tABC));

         //运行 PWM 补偿和电流忽略算法
         SVGENCURRENT_COMPPwmData (svgencurentHandle、&(gPwmData.tABC)、&gPwmData_prev);

    //     gTrjCnt++;
       }
     否则、如果(gMotorVars.Flag_enableOffsetcalc = true)
       {
         runOffsetsCalculation ();
       }
     其他
       {
         //禁用 PWM
         HAL_disablePwm (halHandle);

         //将 PWM 设置为50%占空比
         gPwmData.TBC.value[0]=_IQ (0.0);
         gPwmData.TBC.value[1]=_IQ (0.0);
         gPwmData.TBC.value[2]=_IQ (0.0);
       }

     //写入 PWM 比较值
     HAL_writePwmData (halHandle、&gPwmData);

     //运行函数以设置下一个触发器
     if (!gMotorVars.Flag_enableRsRecalc) runSetTrigger ();

     返回;
    }// mainISR()函数结束


    //! \brief    确认来自计时器0的中断,以便确认另一个计时器0中断
    //!            可能会再次发生。
    //! \param[in]处理    硬件抽象层(HAL)句柄
    静态内联空 HAL_acqTimer0Int (HAL_Handle handle)

       HAL_Obj * obj =(HAL_Obj *)句柄;

       //清除计时器0中断标志
       Timer_clearFlag (obj->timerHandle[0]);

       //确认 PIE 组1的中断
       PI_clearInt (obj->压 电筒、PI_GroupNumber_1);

       返回;
    }// HAL_acqTimer0Int()函数结束

    ------------------------------------------------------------------

    更多说明如下:

    (1) Timer0中断生成 estISR()。 我已经确认 estISR()以8kHz 的周期执行。

    (2) mainISR()也以8kHz 的周期执行。

    (3)以上就是全部。 我只是拼接了两个 ISR。

    (4)您可能需要检查我的拆分工作是否正确。

    感谢您的指导。

    此致、

    JS Yoo

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

    请上传 user.h 和 proj_x.c 文件、以便我们了解如何计算 instaspin focus 和 FAST 估算器的参数。 不要直接粘贴代码。

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

    罗燕明、您好!

    感谢您的评论。

    我上传了四个文件、包括 hal.c 和 hal.h

    (我刚刚将文件拖动到该窗口中。 是这样吗?)

    我还没有实现可变 PWM 频率的功能。

    我只是将原来的 mainISR()拆分为两个 estISR()和 mainISR() ISR,以确认我们的电机在采用两个 ISR 时是否运行良好。

    使用原始的 mainISR(),我们的电机运行得非常好。

    两个 ISR 以8kHz 的频率执行。

    感谢您的指导。

    此致、

    JS Yoo

    e2e.ti.com/.../14607.user.he2e.ti.com/.../8838.hal.c

    e2e.ti.com/.../lab11a_5F00_VariablePWM.ce2e.ti.com/.../1460.hal.h

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

    如上所述,在  estISR()中运行除 HAL_readAdcDataWithOffset()和 HAL_writePwmData()之外的所有函数,并禁用所有其他功能,如过调制和 Rs 在线校准。 确保 estISR 频率正确设置为 USER_ISR_FREQ_Hz。

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

    罗燕明、您好!

    感谢您的评论。

    我需要空间矢量过调制和电流重构函数。

    如果必须  为 F28069F DSP 以及 Motorware 中的 estmator 库实现可变 PWM 频率的函数、是否意味着应放弃空间矢量过调制和电流重构函数?

    同时 、MotorControl_SDK 中的 is12_variable_pwm_frequency 实验支持空间矢量过调制和电流重构函数 、以实现 F280049C DSP 的可变 PWM 频率函数以及 MotorControl_SDK 中的 estmator 库。

    感谢您的指导。

    此致、

    JS Yoo

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

    您只需要验证 ISR 频率是否正确、并且估算器参数设置是否正确。  不建议对可变频率使用过调制和电流重构。

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

    罗燕明、您好!

    感谢您的评论。

    您的意思是不建议对可变频率使用过调制和电流重构。

    这是否与 F280049C 和 F28069F 都相关?

    您知道 、MotorControl_SDK 中的 is12_variable _pwm_frequency 实验支持 F280049C 上可变 PWM 频率的空间矢量过调制和电流重构。

    感谢您的指导。

    此致、

    JS Yoo

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

    是的、尽管示例工程使用了过调制、但性能不佳。