在 ??FOC(Field-Oriented Control,磁場定向控制)?? 中,arm_math.h
、arm_const_structs.h
?和?arm_common_tables.h
?是 CMSIS-DSP 庫的核心組件,用于實現高效的數學運算、預定義結構和查表操作。以下是它們在 FOC 控制中的具體應用場景:
以下的的函數名稱可能不一致,但.H文件中可以找到;
?1.?arm_math.h
?的核心作用??
這是 CMSIS-DSP 的核心數學函數庫,提供了 FOC 控制所需的關鍵算法:
-
??坐標變換??:
- ??Clarke 變換??:將三相電流(
Ia, Ib, Ic
)轉換為兩相靜止坐標系(Iα, Iβ
) - // 使用向量運算實現 Clarke 變換
arm_clarke_f32(Ia, Ib, &Iα, &Iβ); - ?Park 變換??:將靜止坐標系(
Iα, Iβ
)轉換為旋轉坐標系(Id, Iq
)。 - // 使用三角函數(依賴 `arm_sin_f32` 或查表)
arm_park_f32(Iα, Iβ, &Id, &Iq, angle); - 逆 Park 變換??:將旋轉坐標系(
Vd, Vq
)轉換回靜止坐標系(Valpha, Vbeta
)。
- ??Clarke 變換??:將三相電流(
-
??三角函數計算??:
- Park/逆 Park 變換依賴正弦/余弦函數,可通過?
arm_sin_f32
?或查表(arm_common_tables.h
)實現。
- Park/逆 Park 變換依賴正弦/余弦函數,可通過?
-
??濾波算法??:
- 電流環或速度環的低通濾波器(如?
arm_biquad_cascade_df2T_f32
)。
- 電流環或速度環的低通濾波器(如?
-
??PID 控制器??:
- 使用?
arm_pid_f32
?結構體實現電流環和速度環的 PID 調節。
- 使用?
?2.?arm_const_structs.h
?的預定義結構體??
該頭文件定義了復數、濾波器結構體等,簡化了 FOC 中復雜數據結構的初始化:
- ??復數運算??:
- // 定義復數類型(用于 Park/逆 Park 變換中的復數乘法)
typedef struct {
? float32_t real;
? float32_t imag;
} complex32_t; - 濾波器配置??:
- 如二階帶通/帶阻濾波器的預定義結構體,用于電流諧波抑制。
?3.?arm_common_tables.h
?的查表加速??
該頭文件包含預計算的查找表(Lookup Tables),用于減少實時計算開銷:
??正弦/余弦表??:
// 預先生成的正弦表(例如 1024 點)
extern const float32_t sin_table[1024];
extern const float32_t cos_table[1024];
- 在 Park 變換中直接查表代替?
arm_sin_f32
?或?arm_cos_f32
,提升效率。 - 適用于資源受限的 Cortex-M4/M7 微控制器。
??坐標旋轉表??:
預先計算的角度到旋轉矩陣的映射,減少實時三角函數計算。
FOC 控制流程中的典型應用??
-
??電流采樣與 Clarke 變換??:
// 三相電流 → 兩相靜止坐標系 arm_vector2d_f32(Ia, Ib, &Iα, &Iβ);
-
??Park 變換(使用查表或數學函數)??:
// 使用查表加速正弦/余弦計算 float32_t sin_theta = sin_table[(int)(angle * 1024 / (2*PI))]; arm_park_f32(Iα, Iβ, &Id, &Iq, angle);
-
??PID 調節(
arm_pid_f32
)??:// 初始化 PID 結構體 arm_pid_instance_f32 pid; arm_pid_init_f32(&pid);// 計算電流環輸出 arm_pid_f32(&pid, error, &output);
-
??逆 Park 變換與 PWM 生成??:
// 旋轉坐標系 → 靜止坐標系 arm_unpark_f32(Vd, Vq, &Valpha, &Vbeta, angle);// 逆Clark變換 → 三相電壓 arm_vector3d_f32(Valpha, Vbeta, &Va, &Vb, &Vc);// 空間矢量調制(SVPWM)生成 PWM 信號
??優化建議??
-
??定點 vs 浮點??:
- 若使用定點運算(如?
q31_t
),需調用?arm_math_q31.h
?中的定點函數。 - 浮點運算(
float32_t
)更易調試,但需確保 Cortex-M4/M7 的 FPU 支持。
- 若使用定點運算(如?
-
??查表 vs 實時計算??:
- 查表法(
arm_common_tables.h
)可減少計算量,但需權衡內存占用。 - 對于動態調整角度的應用(如無感 FOC),需實時更新查表索引。
- 查表法(
-
??性能關鍵路徑??:
- 將 Park/逆 Park 變換、PWM 更新等關鍵代碼放在 DMA 中斷服務例程(ISR)中,確保實時性。
通過合理組合這些組件,可以高效實現 FOC 控制的核心算法,同時充分利用 ARM Cortex-M 處理器的 DSP 擴展能力。
庫arm_cortexM4lf_math.lib包含以下文件:打包成了一個庫:
添加到MDK:
只要添加1和2就在初始化時添加了FPU浮點數,
__FPU_PRESENT == 1在第二張圖中已經自動添加;
__FPU_USED == 1在第三張圖中添加;
添加DSP
c++選項中添加:宏定義中添加3,4,5