在 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