ZHCU083I January 2013 – October 2021 TMS320F2802-Q1 , TMS320F28026-Q1 , TMS320F28026F , TMS320F28027-Q1 , TMS320F28027F , TMS320F28027F-Q1 , TMS320F28052-Q1 , TMS320F28052F , TMS320F28052F-Q1 , TMS320F28052M , TMS320F28052M-Q1 , TMS320F28054-Q1 , TMS320F28054F , TMS320F28054F-Q1 , TMS320F28054M , TMS320F28054M-Q1 , TMS320F2806-Q1 , TMS320F28062-Q1 , TMS320F28062F , TMS320F28062F-Q1 , TMS320F28068F , TMS320F28068M , TMS320F28069-Q1 , TMS320F28069F , TMS320F28069F-Q1 , TMS320F28069M , TMS320F28069M-Q1
执行 R/L 测量时要考虑的第三个参数就是执行此测量所花费的时间。该参数在 user.c 中配置如下,尽管默认设置适用于大多数情况,但仍可按需对该参数进行更改:
pUserParams->estWaitTime[EST_State_RoverL] = (uint_least32_t)(5.0 * USER_EST_FREQ_Hz);
图 7-12 显示了如何注入该电流。配置的参数用红色突出显示:5s 持续时间、1.0A / 2 = 0.5A 电流幅值和 100Hz 频率。
可通过调用以下函数返回 RoverL 比的方式从估算器中读取 R/L 状态生成的值。
// Code example to get RoverL into a variable
float_t RoverL = CTRL_getRoverL(ctrlHandle);
检查 RoverL 状态生成的估算值的另一种方法是调用两个函数,一个函数用于高频电阻估算值 (Rhf),另一个函数用于高频电感估算值 (Lhf)。以下代码示例使用这两个函数获取 RoverL 状态期间生成值的本地副本:
// Code example to get high frequency R (Rhf) and high frequency inductance
// (Lhf) to variables
float_t Rhf = CTRL_getRhf(ctrlHandle);
float_t Lhf = CTRL_getLhf(ctrlHandle);
float_t RoverL = Rhf/Lhf;
上述代码示例中计算得出的 RoverL 生成值与函数 CTRL_getRoverL() 返回的值完全相同。
如果不进行电机识别,用户可使用以下代码示例基于 user.h 文件中提供的参数来计算 RoverL 常量:
// Code example to get RoverL into a variable based on user.h parameters
#define USER_MOTOR_Rs (4.0)
#define USER_MOTOR_Ls_d (0.03)
float_t RoverL = USER_MOTOR_Rs/USER_MOTOR_Ls_d;
最后,控制器对象 (CTRL_Obj) 使用 RoverL 比率来根据该比率初始化电流控制器增益。图 7-13 显示了控制器对象 (CTRL_Obj) 如何在内部设置电流控制器增益。此处列出的代码仅用于说明电流控制器初始设置背后的运算过程。由于代码在控制器内部执行,因此用户无需执行代码。
// get the full scale current and voltage values from #defines in user.h
#define USER_IQ_FULL_SCALE_CURRENT_A (10.0)
#define USER_IQ_FULL_SCALE_VOLTAGE_V (48.0)
// deriving controller period in seconds from #defines in user.h
#define USER_NUM_ISR_TICKS_PER_CTRL_TICK (1)
#define USER_PWM_FREQ_kHz (15.0)
#define USER_PWM_PERIOD_usec (1000.0/USER_PWM_FREQ_kHz)
#define USER_ISR_PERIOD_usec USER_PWM_PERIOD_usec
#define USER_CTRL_PERIOD_usec (USER_ISR_PERIOD_usec*USER_NUM_ISR_TICKS_PER_CTRL_TICK)
#define USER_CTRL_PERIOD_sec ((float_t)USER_CTRL_PERIOD_usec/(float_t)1000000.0)
// get Lhf and RoverL from the controller object
float_t RoverL = CTRL_getRoverL(ctrlHandle);
float_t Lhf = CTRL_getLhf(ctrlHandle);
// get full scale current and voltage values in local variables
float_t fullScaleCurrent = USER_IQ_FULL_SCALE_CURRENT_A;
float_t fullScaleVoltage = USER_IQ_FULL_SCALE_VOLTAGE_V;
// get the controller period in seconds in a local variable
float_t ctrlPeriod_sec = USER_CTRL_PERIOD_sec;
// get the controller object handle
CTRL_Obj *obj = (CTRL_Obj *)ctrlHandle;
// set the Id controller gains
Kp = _IQ((0.25*Lhf*fullScaleCurrent)/(ctrlPeriod_sec*fullScaleVoltage));
Ki = _IQ(RoverL*ctrlPeriod_sec);
Kd = _IQ(0.0);
PID_setGains(obj->pidHandle_Id,Kp,Ki,Kd);
PID_setUi(obj->pidHandle_Id,_IQ(0.0));
CTRL_setGains(ctrlHandle,CTRL_Type_PID_Id,Kp,Ki,Kd);
// set the Iq controller gains
Kp = _IQ((0.25*Lhf*fullScaleCurrent)/(ctrlPeriod_sec*fullScaleVoltage));
Ki = _IQ(RoverL*ctrlPeriod_sec);
Kd = _IQ(0.0);
PID_setGains(obj->pidHandle_Iq,Kp,Ki,Kd);
PID_setUi(obj->pidHandle_Iq,_IQ(0.0));
CTRL_setGains(ctrlHandle,CTRL_Type_PID_Iq,Kp,Ki,Kd);