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:未正确报告估算器 Rs、Ls 和 LQ 等。

Guru**** 2535750 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/901114/tms320f28069f-estimator-rs-ls-and-lq-etc-not-getting-reported-correctly

器件型号:TMS320F28069F

我们的代码源自实验11a。  在某些时候、Rs 和 Ls 等开始报告错误。  我担心估算器设置不正确。

RS_Ohm 应为0.342、LSD_h 和 LSQ_H 均应为0.000399....

我可以运行 RsRecalc、然后它们将正确更新。  

我还可以使用以下代码手动写入它们、并获得正确的值。

   float_t fullScale电 感= USER_IQ_FULL_SCALE_VOLTAGE_V/(USER_IQ_FULL_SCALE_CURRENT_A * USER_VOLTAGE_FILTER_POLE_Rps);

   //在中断之外计算此代码,因为它需要浮点运算
   int16_t Lshift = ceil (log (USER_MOTOR_LS_d/(0.7*fullScale电 感))/log (2.0));
   uint16_t LS_qFmt = 30 - lshift;
   float_t L_max =满量程电感* pow (2.0、Lshift);
   _iq ls_d_d_pu =_IQ30 (USER_MOTOR_LS_d / L_max);
   _IQ Ls_q_pu =_IQ30 (USER_MOTOR_LS_q / L_max);

   //在 ISR 内部调用这些函数、以便在同一 ISR 中更新与电感相关的所有变量
   EST_setLs_d_pu (estHandle、LS_d_pu);
   EST_setLs_q_pu (estHandle、LS_q_pu);
   EST_setLs_qFmt (estHandle、LS_qFmt);

   //这是你更新转子电阻的方法:

   //这些是要写入的值

   //计算一次
   float_t fullScale电 阻= USER_IQ_FULL_SCALE_VOLTAGE_V/USER_IQ_FULL_SCALE_CURRENT_A;

   //在中断之外计算此代码,因为它需要浮点运算
   lshift =(int16_t) ceil (log (USER_MOTOR_Rs/(0.7*fullScale电 阻))/log (2.0));
   uint16_t Rs_qFmt = 30 - lshift;
   float_t Rs_max =满量程电阻* pow (2.0、Lshift);
   _iq Rs_pu =_IQ30 (USER_MOTOR_Rs / Rs_max);

   //在 ISR 内部调用这些函数,以便在同一 ISR 中更新所有变量
   EST_setRs_pu (estHandle、Rs_pu);
   EST_setRsOnLine_pu (estHandle、Rs_pu);
   EST_setRs_qFmt (estHandle、Rs_qFmt);
   EST_setRsOnLine_qFmt (estHandle、Rs_qFmt);

   //努力使其保持稳定
   EST_setRsOnLineAngleDelta_pu (estHandle、_IQmpy (gRsOnLineFreq_Hz、_IQ (1.0/USER_EST_FREQ_Hz)));
   //EST_setRsOnLine_delta_dec (estHandle、_IQ30 (0.00001));
   //EST_setRsOnLine_delta_inc_pu (estHandle、_IQ30 (0.00001));
   EST_setRsOnLineId_mag_pu (estHandle、_IQmpy (gRsOnLineId_mag_A、_IQ (1.0/USER_IQ_FULL_SCALE_CURRENT_A)));
   //EST_setRsOnLineId_mag_pu (estHandle、_IQmpy (gMotorVars.RsOnLineCurrent_A、_IQ (1.0/USER_IQ_FULL_SCALE_CURRENT_A)));

   //计算所有滤波器的系数
   {
     _iq b0 =_IQmpy (gRsOnLinePole_Hz、_IQ (1.0/USER_EST_FREQ_Hz));
     _IQ A1 = b0 -_IQ (1.0);
     EST_setRsOnLineFilterParams (estHandle、EST_RsOnLineFilterType_Current、b0、A1、_IQ (0.0)、b0、A1、_IQ (0.0));
     EST_setRsOnLineFilterParams (estHandle、EST_RsOnLineFilterType_Voltage、b0、A1、_IQ (0.0)、b0、A1、_IQ (0.0));
   }

我在这个代码之后直接检查这些值、这些值已经不正确。

ifdef FAST_ROM_V1p6

 {
   CTRL_Handle ctrlHandle = CTRL_init ((void *) USER_CTRL_Handle_address、0x200);
   CTRL_Obj * obj =(CTRL_Obj *) ctrlHandle;
   obj->estHandle = estHandle;

   //通过控制器初始化估算器
   CTRL_setParams (ctrlHandle、&gUserParams);
   CTRL_setUserMotorParams (ctrlHandle);
   CTRL_setupEstIdleState (ctrlHandle);
 }

 //获取转子电阻
 tmp = EST_getRr_Ohm (句柄);
 gMotorVars.rr_Ohm =*((float_t *)&tmp);

 //获得定子电阻
 tmp = EST_getRs_Ohm (句柄);
 gMotorVars.Rs_Ohm =*((float_t *)&tmp);

 //获取在线定子电阻
 tmp = EST_getRsOnLine_Ohm (句柄);
 gMotorVars.RsOnLine_Ohm =*((float_t *)&tmp);

 //获得直接坐标方向的定子电感
 tmp = EST_getLs_d_h (handle);
 gMotorVars.LSD_H =*((float_t *)&tmp);

 //获得正交坐标方向的定子电感
 tmp = EST_getLs_q_H (句柄);
 gMotorVars.LSQ_H =*((float_t *)&tmp);

 //以浮点方式获得以 V/Hz 为单位的磁通
 tmp = EST_getFlux_VpHz (句柄);
 gFlux_VpHz =(_IQ) tmp;
 gMotorVars.Flux_VpHz =*((float_t *)&tmp);

我已逐步完成代码、并检查了 gUserParams、所有内容似乎都正常工作。  我无法查看 CTRL_setUserMotorParams (ctrlHandle)或 estHandle、因此我猜测那里出现了问题。  如何知道估算器是否实际具有正确的值?

我不确定这在什么时候停止工作、但在我们开始实施飞行启动功能之前、它工作正常。

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

    由于某种原因、我的屏幕截图未包含在内。 是报告的内容、不正确。

    几个月来,它一直在正常工作。

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

    您是否更改了"user_Params"结构并在此结构中添加了任何变量? 如果没有、我认为 lab11a 中没有任何运行电机的问题。 您不需要像您提到的那样添加和更改代码。  

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

    我将其添加到 user.c 中

     pUserParams->numCtrlTicksPerDatalogTick = USER_NUM_CTRL_TICKS_PER_DATALOG_TICK;


    userParams.h 中提供了这一信息

    typedef struct _user_Params_

     float_t      iqFullScaleCurrent_a;        //!<定义 IQ 变量 a 的满量程电流
     float_t      iqFullScaleVoltage_V;        //!<定义 IQ 变量的满量程电压、V
     float_t      iqFullScaleFreq_Hz;          //!<定义 IQ 变量的满量程频率、Hz

     uint_least16_t numIsrTicksPerCtrlTick;      //!<定义每个控制器时钟节拍的中断服务程序(ISR)时钟节拍数
     uint_least16_t numCtrlTicksPerCurrentTick;  //!<定义每个电流控制器时钟节拍的控制器时钟节拍数
     uint_least16_t numCtrlTicksPerEstTick;      //!<定义每个估算器时钟节拍的控制器时钟节拍数
     uint_least16_t numCtrlTicksPerSpeedTick;    //!<定义每个速度控制器时钟节拍的控制器时钟节拍数
     uint_least16_t numCtrlTicksPerTrajTick;     //!<定义每个轨迹时钟节拍的控制器时钟节拍数
     uint_least16_t numCtrlTicksPerDatalogTick;  //!<定义每个数据记录时钟节拍的控制器时钟节拍数

    尽管如果我删除该加法、会发生此问题。

    我不理解估算器如何返回 Rs、Ls 和 LQ 的错误值、以及如何仍然正常运行。  它似乎没有通过正确设置

       CTRL_setParams (ctrlHandle、&gUserParams);
       CTRL_setUserMotorParams (ctrlHandle);

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

    这已经解决了。  我向 TRAJ_Obj 结构添加了一个成员。  然后、这会影响 CTRL_Obj、最终影响估算器。  已删除成员、所有内容均正常。