永磁同步電機采用FOC算法實現電機控制,FOC算法的控制框圖如下:
軟件實現,ADC采樣觸發實現算法的軟件流程圖如下:
PARK變換模塊宏定義代碼如下:
typedef struct {
_iq Alpha; // Input: stationary d-axis stator variable
_iq Beta; // Input: stationary q-axis stator variable
_iq Angle; // Input: rotating angle (pu)
_iq Ds; // Output: rotating d-axis stator variable
_iq Qs; // Output: rotating q-axis stator variable
_iq Sine;
_iq Cosine;
} PARK;
/*-----------------------------------------------------------------------------
Default initalizer for the PARK object.
-----------------------------------------------------------------------------*/
#define PARK_DEFAULTS {
0, \
0, \
0, \
0, \
0, \
0, \
0, \
}
/*------------------------------------------------------------------------------
PARK Transformation Macro Definition
------------------------------------------------------------------------------*/
#define PARK_MACRO(v) \
\
v.Ds = _IQmpy(v.Alpha,v.Cosine) + _IQmpy(v.Beta,v.Sine); \
v.Qs = _IQmpy(v.Beta,v.Cosine) - _IQmpy(v.Alpha,v.Sine);
#endif // __PARK_H__
CLARKE變換模塊宏定義代碼如下:
typedef struct {
_iq As; // Input: phase-a stator variable
_iq Bs;// Input: phase-b stator variable
_iq Cs;// Input: phase-c stator variable
_iq Alpha;// Output: stationary d-axis stator variable
_iq Beta;// Output: stationary q-axis stator variable
} CLARKE;
/*-----------------------------------------------------------------------------
Default initalizer for the CLARKE object.
-----------------------------------------------------------------------------*/
#define CLARKE_DEFAULTS {
0, \
0, \
0, \
0, \
0, \
}
/*------------------------------------------------------------------------------
CLARKE Transformation Macro Definition
------------------------------------------------------------------------------*/
#define CLARKE_MACRO(v)\
\
v.Alpha = v.As;\
v.Beta = _IQmpy((v.As +_IQmpy2(v.Bs)),_IQ(0.57735026918963));\
// 1/sqrt(3) = 0.57735026918963
#endif // __CLARKE_H__
IPARK變換模塊宏定義代碼如下:
typedef struct {
_iq Alpha; // Output: stationary d-axis stator variable
_iq Beta; // Output: stationary q-axis stator variable
_iq Angle; // Input: rotating angle (pu)
_iq Ds; // Input: rotating d-axis stator variable
_iq Qs; // Input: rotating q-axis stator variable
_iq Sine; // Input: Sine term
_iq Cosine; // Input: Cosine term
} IPARK;
/*-----------------------------------------------------------------------------
Default initalizer for the IPARK object.
-----------------------------------------------------------------------------*/
#define IPARK_DEFAULTS {
0, \
0, \
0, \
0, \
0, \
0, \
0, \
}
/*------------------------------------------------------------------------------
Inverse PARK Transformation Macro Definition
------------------------------------------------------------------------------*/
#define IPARK_MACRO(v) \
\
v.Alpha = _IQmpy(v.Ds,v.Cosine) - _IQmpy(v.Qs,v.Sine); \
v.Beta = _IQmpy(v.Qs,v.Cosine) + _IQmpy(v.Ds,v.Sine);
#endif // __IPARK_H__
滑模觀測器參考代碼如下:
// 定義系統參數
R = 1.0; // 電機內阻
L = 0.1; // 電機電感
Ke = 0.01; // 電機電動勢常數
Kt = 0.02 ; // 電機轉矩常數
/ /定義控制器參數
Kp = 0.5 ; //比例增益
Ki = 0.1 ; // 積分增益
// 定義變量
theta_hat = 0.0; // 轉子位置估計值
theta_dot_hat = 0.0 ; // 轉子速度估計值
theta_ref = 0.0 ; //目標轉子位置
theta_dot_ref = 0.0 ; // 目標轉子速度
u = 0.0 ; // 控制輸入
e_int = 0.0 ; // 積分誤差
//定義滑模觀測器參數
lambda1 = 1.0;
lambda2 = 1.0;
#define SMO_MACRO(v) \
\
Te = Kt * (i_a * sin(theta_hat) - i_b * cos(theta_hat));\ //計算電機電磁轉矩
s1 = theta_dot_hat - lambda1 * Te;\ // 計算滑模觀測器誤差
s2 = theta_hat - theta_ref;\
u = -Kp * s1 - Ki * e_int ;\ // 計算控制器輸出
theta_dot_hat += (R / L) * i_a - (Ke / L) * sin(theta_hat) * u theta_hat += theta_dot_hat;\ //更新狀態估計
e_int += s2;\ //更新積分誤差
#endif // __SMO_H__
申明:由于本人水平一般,分享的知識有誤,或者采用的方案不夠好的,歡迎各路大神指正批評,給大家帶來的不便,敬請諒解,本文觀點僅供參考。