arm_math.h、arm_const_structs.h 和 arm_common_tables.h

在 ​​FOC(Field-Oriented Control,磁场定向控制)​ ​ 中,arm_math.harm_const_structs.harm_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)。
  • ​三角函数计算​​:

    • Park/逆 Park 变换依赖正弦/余弦函数,可通过 arm_sin_f32 或查表(arm_common_tables.h)实现。
  • ​滤波算法​​:

    • 电流环或速度环的低通滤波器(如 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_f32arm_cos_f32,提升效率。
  • 适用于资源受限的 Cortex-M4/M7 微控制器。

​坐标旋转表​​:

预先计算的角度到旋转矩阵的映射,减少实时三角函数计算。

FOC 控制流程中的典型应用​

  1. ​电流采样与 Clarke 变换​​:

    复制代码
    // 三相电流 → 两相静止坐标系
    arm_vector2d_f32(Ia, Ib, &Iα, &Iβ);
  2. ​Park 变换(使用查表或数学函数)​​:

    复制代码
    // 使用查表加速正弦/余弦计算
    float32_t sin_theta = sin_table[(int)(angle * 1024 / (2*PI))];
    arm_park_f32(Iα, Iβ, &Id, &Iq, angle);
  3. ​PID 调节(arm_pid_f32)​​:

    复制代码
    // 初始化 PID 结构体
    arm_pid_instance_f32 pid;
    arm_pid_init_f32(&pid);
    
    // 计算电流环输出
    arm_pid_f32(&pid, error, &output);
  4. ​逆 Park 变换与 PWM 生成​​:

    复制代码
    // 旋转坐标系 → 静止坐标系
    arm_unpark_f32(Vd, Vq, &Valpha, &Vbeta, angle);
    
    // 逆Clark变换 → 三相电压
    arm_vector3d_f32(Valpha, Vbeta, &Va, &Vb, &Vc);
    
    // 空间矢量调制(SVPWM)生成 PWM 信号

​优化建议​

  1. ​定点 vs 浮点​​:

    • 若使用定点运算(如 q31_t),需调用 arm_math_q31.h 中的定点函数。
    • 浮点运算(float32_t)更易调试,但需确保 Cortex-M4/M7 的 FPU 支持。
  2. ​查表 vs 实时计算​​:

    • 查表法(arm_common_tables.h)可减少计算量,但需权衡内存占用。
    • 对于动态调整角度的应用(如无感 FOC),需实时更新查表索引。
  3. ​性能关键路径​​:

    • 将 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

相关推荐
欢乐熊嵌入式编程1 小时前
欢乐熊大话蓝牙知识14:用 STM32 或 EFR32 实现 BLE 通信模块:从0到蓝牙,你也能搞!
stm32·单片机·嵌入式硬件
傍晚冰川2 小时前
FreeRTOS任务调度过程vTaskStartScheduler()&任务设计和划分
开发语言·笔记·stm32·单片机·嵌入式硬件·学习
SY师弟4 小时前
51单片机基础部分——矩阵按键检测
嵌入式硬件·矩阵·51单片机
Lester_11015 小时前
嵌入式学习笔记 - freeRTOS xTaskResumeAll( )函数解析
笔记·stm32·单片机·学习·freertos
阿超爱嵌入式6 小时前
STM32学习之I2C(理论篇)
stm32·嵌入式硬件·学习
三月雪落无痕8 小时前
altium designer2024绘制stm32过程笔记x`
笔记·嵌入式硬件
天天爱吃肉821810 小时前
新能源汽车热管理核心技术解析:冬季续航提升40%的行业方案
android·python·嵌入式硬件·汽车
章鱼哥嵌入式开发10 小时前
# STM32F103 SD卡读写程序
stm32·单片机
广药门徒11 小时前
定时器时钟来源可以从输入捕获引脚输入
单片机·嵌入式硬件
爱睡觉的王宇昊15 小时前
二、【ESP32开发全栈指南:ESP32 GPIO深度使用】
单片机·嵌入式硬件