arm_math.h、arm_const_structs.h 和 arm_common_tables.h

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

    • 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_f32 或 arm_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android: gradient 使用

在 Android 中使用 gradient(渐变) 通常是通过 drawable 文件来设置背景。下面是可以直接用的几种用法汇总,包括线性渐变、径向渐变、扫描渐变(sweep)等: ✅ 1. Linear Gradient(线性渐变&#…

打造AI应用基础设施:Milvus向量数据库部署与运维

目录 打造AI应用基础设施:Milvus向量数据库部署与运维1. Milvus介绍1.1 什么是向量数据库?1.2 Milvus主要特点 2. Milvus部署方案对比2.1 Milvus Lite2.2 Milvus Standalone2.3 Milvus Distributed2.4 部署方案对比表 3. Milvus部署操作命令实战3.1 Milv…

AI Agent 在医疗健康领域的深度应用剖析

引言 随着人工智能技术的迅猛发展,AI Agent 在医疗健康领域展现出了巨大的应用潜力。它犹如一位智能助手,凭借其强大的数据处理和分析能力,渗透到医疗健康的各个环节,从疾病诊断、治疗方案制定到患者康复监控,都发挥着…

树莓派超全系列教程文档--(28)boot文件夹内容

boot文件夹内容 boot 文件夹内容bootcode.binstart*.elffixup*.datcmdline.txtconfig.txtissue.txtinitramfs*ssh 或 ssh.txt设备树blob文件 ( *.dtb )内核文件 ( *.img )overlays 文件夹 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 boot 文件…

SvelteKit 最新中文文档教程(20)—— 最佳实践之性能

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte …

【LangChain核心组件】Memory:让大语言模型拥有持续对话记忆的工程实践

目录 一、Memory架构设计解析 1. 核心组件关系图 2. 代码中的关键实现 二、对话记忆的工程实现 1. 消息结构化存储 2. 动态提示组装机制 三、Memory类型选型指南 四、生产环境优化实践 1. 记忆容量控制 2. 记忆分片策略 3. 记忆检索增强 五、典型问题调试技巧 1. …

适应 AI 时代的软件开发流程:用 AI + TDD 构建可维护项目

🧠 适应 AI 时代的软件开发流程:用 AI + TDD 构建可维护项目 本文面向有系统开发经验的工程师,分享如何结合 Git 管理、AI 协作、YAML 驱动与 TDD 开发方式,高效构建一个可维护、可协作、可交付的嵌入式或通用工程项目。适合 BLE 模块、协议栈组件、物联网控制系统等项目落…

使用 chromedriver 实现网络爬虫【手抄】

1、引用 selenium 包 <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.29.0</version> </dependency> <dependency><groupId>org.seleniumhq.seleniu…

Python项目--基于Python的自然语言处理文本摘要系统

1. 项目概述 自然语言处理(NLP)是人工智能领域中一个重要的研究方向&#xff0c;而文本摘要作为NLP的一个重要应用&#xff0c;在信息爆炸的时代具有重要意义。本项目旨在开发一个基于Python的文本摘要系统&#xff0c;能够自动从长文本中提取关键信息&#xff0c;生成简洁而全…

【Vue #3】指令补充样式绑定

一、指令修饰符 Vue 的指令修饰符&#xff08;Directive Modifiers&#xff09;是 Vue 模板语法中的重要特性&#xff0c;它们以半角句号 . 开头&#xff0c;用于对指令的绑定行为进行特殊处理 修饰符作用如下&#xff1a; 简化事件处理&#xff08;如阻止默认行为、停止冒泡…

Reinforcement Learning强化学习--李宏毅机器学习笔记

个人学习笔记&#xff0c;如有错误欢迎指正&#xff0c;也欢迎交流&#xff0c;其他笔记见个人空间 强化学习 vs 监督学习 监督学习&#xff08;Supervised Learning&#xff09;&#xff1a;你有输入和明确的输出标签&#xff0c;例如图像分类。 强化学习&#xff08;Rein…

Windows VsCode Terminal窗口使用Linux命令

背景描述&#xff1a; 平时开发环境以Linux系统为主&#xff0c;有时又需要使用Windows系统下开发环境&#xff0c;为了能像Linux系统那样用Windows VsCode&#xff0c;Terminal命令行是必不可少内容。 注&#xff1a;Windows11 VsCode 1.99.2 下面介绍&#xff0c;如何在V…

软件测试之测试数据生成(Excel版)

这是Excel生成测试数据的函数使用 1.时间 1.1.时间 例生成2022-05-01之前一年内任意时间点: =TEXT("2022-05-01"-RAND()-RANDBETWEEN(1,365),"yyyy-mm-dd hh:mm:ss")1.2.年月日 yyyy-mm-dd 以当前时间生成10年的日期 =TEXT(NOW()-RAND()-RANDBETWE…

libwebsocket建立服务器需要编写LWS_CALLBACK_ADD_HEADERS事件处理

最近在使用libwebsocket&#xff0c;感觉它搭建Http与websocket服务器比较简单&#xff0c;不像poco库那么庞大&#xff0c;但当我使用它建立websocket服务器后&#xff0c;发现websocket客户端连接一直没有连接成功&#xff0c;不知道什么原因&#xff0c;经过一天的调试&…

从 PyTorch 到 ONNX:深度学习模型导出全解析

在模型训练完毕后&#xff0c;我们通常希望将其部署到推理平台中&#xff0c;比如 TensorRT、ONNX Runtime 或移动端框架。而 ONNX&#xff08;Open Neural Network Exchange&#xff09;正是 PyTorch 与这些平台之间的桥梁。 本文将以一个图像去噪模型 SimpleDenoiser 为例&a…

Hadoop集群部署教程-P6

Hadoop集群部署教程-P6 Hadoop集群部署教程&#xff08;续&#xff09; 第二十一章&#xff1a;监控与告警系统集成 21.1 Prometheus监控体系搭建 Exporter部署&#xff1a; # 部署HDFS Exporter wget https://github.com/prometheus/hdfs_exporter/releases/download/v1.1.…

【Altium】AD-生成PDF文件图纸包含太多的空白怎么解决

1、 文档目标 AD设计文件导出PDF时&#xff0c;图纸模板方向设置问题 2、 问题场景 AD使用Smart PDF导出PDF时&#xff0c;不管你怎么设置页面尺寸&#xff0c;只要从横向转为纵向输出&#xff0c;输出的始终是横向纸张&#xff08;中间保留纵向图纸&#xff0c;两边大量留白…

大厂面试:六大排序

前言 本篇博客集中了冒泡&#xff0c;选择&#xff0c;二分插入&#xff0c;快排&#xff0c;归并&#xff0c;堆排&#xff0c;六大排序算法 如果觉得对你有帮助&#xff0c;可以点点关注&#xff0c;点点赞&#xff0c;谢谢你&#xff01; 1.冒泡排序 //冒泡排序&#xff…

大模型开发:源码分析 Qwen 2.5-VL 视频抽帧模块(附加FFmpeg 性能对比测试)

目录 qwen 视频理解能力 messages 构建 demo qwen 抽帧代码分析 验证两个实际 case 官网介绍图 性能对比&#xff1a;ffmpeg 抽帧、decord 库抽帧 介绍 联系 对比 测试结果 测试明细 ffmpeg 100 qps 测试&#xff08;CPU&#xff09; decord 100 qps 测试&#x…

git的上传流程

好久没使用git 命令上传远程仓库了。。。。。温习了一遍&#xff1b; 几个注意点--单个文件大小不能超过100M~~~ 一步步运行下面的命令&#xff1a; 进入要上传的文件夹内&#xff0c;点击git bash 最终 hbu的小伙伴~有需要nndl实验的可以自形下载哦