【stm32-FOC】初步认识 CMSIS-DSP

news/2025/9/25 1:33:06/文章来源:https://www.cnblogs.com/FBsharl/p/19110406

目录

  • 导入CMSIS-DSP库
  • 使用CMSIS-DSP

 

点击查看本文开源的完整FOC工程https://gitee.com/best_pureer/stm32_foc
CMSIS-DSP库是ARM开源的、对ARM处理器优化的数学库,

官方对其的介绍是一个针对Cortex-M和Cortex-A内核优化的嵌入式系统计算库

(此处的DSP不是指的硬件,对于没有DSP硬件的CM-3/CM-0 的MCU也可以调用该库)

本文使用了其提供的

  • 三角函数、
  • 反park变换函数、park变换函数、
  • clarke变换函数、
  • PID控制器

源码:https://github.com/ARM-software/CMSIS-DSP

教程:https://arm-software.github.io/CMSIS-DSP/latest/dsppp_guidelines.html

image

 

 


导入CMSIS-DSP库

本文使用stm32cube编译好的CMSIS-DSP二进制文件:

  1. 首先在Middleware and Software Packs中选择X-CUBE-ALGOBUILD。
  2. 选择安装DSP Library,并且勾选Selection,
  3. 勾选DSP Library Library:

到此,工程代码里就能够使用CMSIS-DSP库了,只需在要使用DSP库的C源文件加上

#include "arm_math.h"

使用CMSIS-DSP

三角函数:
单独计算sin和cos三角函数,输入弧度制rad:

  float32_t arm_sin_f32(float32_t x);float32_t arm_cos_f32(float32_t x);

单个函数完成计算sin和cos三角函数,输入角度制deg:

  /*** @brief  Floating-point sin_cos function.* @param[in]  theta   input value in degrees* @param[out] pSinVal  points to the processed sine output.* @param[out] pCosVal  points to the processed cos output.*/void arm_sin_cos_f32(float32_t theta,float32_t * pSinVal,float32_t * pCosVal);

clarke变换:

  /**** @brief  Floating-point Clarke transform* @param[in]  Ia       input three-phase coordinate <code>a</code>* @param[in]  Ib       input three-phase coordinate <code>b</code>* @param[out] pIalpha  points to output two-phase orthogonal vector axis alpha* @param[out] pIbeta   points to output two-phase orthogonal vector axis beta* @return        none*/__STATIC_FORCEINLINE void arm_clarke_f32(float32_t Ia,float32_t Ib,float32_t * pIalpha,float32_t * pIbeta)

clarke变换是将三个相线电流投影到α \alphaαβ \betaβ轴,由于三个相线电流相加等于0,因此只需要输入两个相线电流IaIb到clarke变换函数中,输出到pIalphapIbeta

park变换:

  /*** @brief Floating-point Park transform* @param[in]  Ialpha  input two-phase vector coordinate alpha* @param[in]  Ibeta   input two-phase vector coordinate beta* @param[out] pId     points to output   rotor reference frame d* @param[out] pIq     points to output   rotor reference frame q* @param[in]  sinVal  sine value of rotation angle theta* @param[in]  cosVal  cosine value of rotation angle theta* @return     none** The function implements the forward Park transform.**/__STATIC_FORCEINLINE void arm_park_f32(float32_t Ialpha,float32_t Ibeta,float32_t * pId,float32_t * pIq,float32_t sinVal,float32_t cosVal)

park变换是将α \alphaαβ \betaβ轴投影到dq轴,此处的sinValcosVal为转子角度的sin和cos值。

反park变换:

   /*** @brief  Floating-point Inverse Park transform* @param[in]  Id       input coordinate of rotor reference frame d* @param[in]  Iq       input coordinate of rotor reference frame q* @param[out] pIalpha  points to output two-phase orthogonal vector axis alpha* @param[out] pIbeta   points to output two-phase orthogonal vector axis beta* @param[in]  sinVal   sine value of rotation angle theta* @param[in]  cosVal   cosine value of rotation angle theta* @return     none*/__STATIC_FORCEINLINE void arm_inv_park_f32(float32_t Id,float32_t Iq,float32_t * pIalpha,float32_t * pIbeta,float32_t sinVal,float32_t cosVal)

反park变换是将dq轴投影到α \alphaαβ \betaβ轴,此处的sinValcosVal为转子角度的sin和cos值。

PID控制器:
CMSIS-DSP库中的PID控制器是增量式PID计算累加到上一次的PID总输出。
位置式PID就是直观地分别将P、I、D控制器的各自输出加起来:
u ( t ) = K p e ( t ) + K i ∑ i = 0 t ( e ( i ) ∗ Δ T ) + K d [ e ( t ) − e ( t − 1 ) ] Δ T u(t) = K_p e(t) + K_i \sum_{i=0}^{t} (e(i)*\Delta T) + K_d \frac{[e(t) - e(t-1)]} {\Delta T}u(t)=Kpe(t)+Kii=0t(e(i)ΔT)+KdΔT[e(t)e(t1)]
为了方便计算,这里将Δ T \Delta TΔT当作为1,在K i K_iKiK d K_dKd系数上缩放回去就好了。
增量式PID理念是将PID的输出是上次PID输出的基础上加上之前两次的累计误差:
u ( t ) = u ( t − 1 ) + Δ u ( t ) u(t) =u(t-1) +\Delta u(t)u(t)=u(t1)+Δu(t)
Δ u ( t ) = K p e ( t ) + K i ∑ i = 0 t e ( i ) + K d [ e ( t ) − e ( t − 1 ) ] − ( K p e ( t − 1 ) + K i ∑ i = 0 t − 1 e ( i ) + K d [ e ( t − 1 ) − e ( t − 2 ) ] ) = K p [ e ( t ) − e ( t − 1 ) ] + K i e ( t ) + K d [ e ( t ) − 2 e ( t − 1 ) + e ( t − 2 ) ] = A 0 ⋅ e [ t ] + A 1 ⋅ e [ t − 1 ] + A 2 ⋅ e [ t − 2 ] 其 中 { A 0 = K p + K i + K d A 1 = − K p − 2 K d A 2 = K d \Delta u(t) = K_p e(t) + K_i \sum_{i=0}^{t} e(i) + K_d [e(t) - e(t-1)]\\ -(K_p e(t-1) + K_i \sum_{i=0}^{t-1} e(i) + K_d [e(t-1) - e(t-2)])\\ = K_p [e(t) - e(t-1)] + K_i e(t) + K_d [e(t) - 2e(t-1) + e(t-2)]\\ = A_0⋅e[t]+A_1⋅e[t−1]+A_2⋅e[t−2]\\ 其中 \begin{cases} A_0=K_p+K_i+K_d\\ A_1=-K_p-2K_d\\ A_2=K_d \end{cases}Δu(t)=Kpe(t)+Kii=0te(i)+Kd[e(t)e(t1)](Kpe(t1)+Kii=0t1e(i)+Kd[e(t1)e(t2)])=Kp[e(t)e(t1)]+Kie(t)+Kd[e(t)2e(t1)+e(t2)]=A0e[t]+A1e[t1]+A2e[t2]A0=Kp+Ki+KdA1=Kp2KdA2=Kd
A 0 , A 1 , A 2 , 本 次 误 差 e [ t ] , 上 次 误 差 e [ t − 1 ] , 上 上 次 误 差 e [ t − 2 ] , 上 一 次 的 P I D 输 出 u ( t − 1 ) A_0,A_1,A_2,本次误差e[t],上次误差e[t-1],上上次误差e[t-2],上一次的PID输出u(t-1)A0A1A2e[t]e[t1]e[t2]PIDu(t1)均为已知数,增量式PID的输出u ( t ) u(t)u(t)也就能够计算出来了。
从增量式PID公式Δ u ( t ) = K p [ e ( t ) − e ( t − 1 ) ] + K i e ( t ) + K d [ e ( t ) − 2 e ( t − 1 ) + e ( t − 2 ) ] \Delta u(t) = K_p [e(t) - e(t-1)] + K_i e(t) + K_d [e(t) - 2e(t-1) + e(t-2)]Δu(t)=Kp[e(t)e(t1)]+Kie(t)+Kd[e(t)2e(t1)+e(t2)]可以看出,当被控参数突然受到大的扰动时,不像位置式PID的P项K p ∗ e ( t ) K_p*e(t)Kpe(t)会产生一个大的输出,增量式PID的K p [ e ( t ) − e ( t − 1 ) ] K_p [e(t) - e(t-1)]Kp[e(t)e(t1)]输出是不大的,因此增量式PID对被控参数变化的输出比较平滑,不会突变,当然响应没有位置式PID快。
在代码上,首先需要创建一个PID控制器:

arm_pid_instance_f32 pid_position;

然后设置PID控制器的PID参数:

pid_position.Kp = 1.2;
pid_position.Ki = 0.01;
pid_position.Kd = 2.1;

然后调用函数初始化PID控制器:

/*** @brief  Initialization function for the floating-point PID Control.* @param[in,out] *S points to an instance of the PID structure.* @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state & 1 = reset the state.* @return none.* \par Description:* \par* The <code>resetStateFlag</code> specifies whether to set state to zero or not. \n* The function computes the structure fields: <code>A0</code>, <code>A1</code> <code>A2</code>* using the proportional gain( \c Kp), integral gain( \c Ki) and derivative gain( \c Kd)* also sets the state variables to all zeros.*/void arm_pid_init_f32(arm_pid_instance_f32 * S,int32_t resetStateFlag)

其中参数resetStateFlag为0时,会清空PID控制器内部保存的增量式数据:e [ n ] , e [ n − 1 ] , e [ n − 2 ] e[n],e[n-1],e[n-2]e[n],e[n1],e[n2]
一般初始化的用法是:

arm_pid_init_f32(&pid_position, false);

此时就能够调用函数计算PID输出值了:

  /*** @brief         Process function for the floating-point PID Control.* @param[in,out] S   is an instance of the floating-point PID Control structure* @param[in]     in  input sample to process* @return        processed output sample.*/__STATIC_FORCEINLINE float32_t arm_pid_f32(arm_pid_instance_f32 * S,float32_t in)

其中参数S是PID控制器,参数in是被控参数的差值,返回PID控制器的输出值。

 

 

参考资料:

1. 转载自:https://blog.csdn.net/qq570437459/article/details/140478449?spm=1001.2014.3001.5502

 

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

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

相关文章

网站建设 淘宝客末班做导购网站如何获利

文章目录 单次调用进程池调用伪造和断言断言和判断的区别 前面我已经简单介绍了一点process facades&#xff0c;这里再进行一个补充的介绍。 可以也看看前面的介绍。 单次调用 use Illuminate\Support\Facades\Process;$result Process::run(ls -la);return $result->ou…

手机商店app下载湛江百度seo公司

基于springboot实现旅游路线规划系统演示 摘要 随着互联网的飞速发展以及旅游产业的逐渐升温&#xff0c;越来越多人通过互联网获取更多的旅游信息&#xff0c;包括参考旅游文纪等内容。通过参考旅游博主推荐的旅游景点和规划线路&#xff0c;参考计划着自己的旅行&#xff0c…

山西省建设厅网站官网wordpress调用当前分类描述

专利权人 广东电网有限责任公司摘要&#xff1a;本实用新型实施例公开了一种光储型虚拟同步机&#xff0c;包括逆变器、光伏列、储能装置、本地负荷、开关和电网&#xff0c;所述光伏阵列通过第一DC/DC转换器连接在所述逆变器的直流母线上&#xff0c;所述储能装置通过第二DC/D…

手机网站建设的影响网络广告投放渠道有哪些

1.前言 在12.0的系统rom开发中,在对某些特殊模块中关于数据的存储方面等需要新增分区来保存, 所以就需要在系统分区新增分区,接下来就来实现这个功能,看第四部分的新增分区的实现过程 2.mt6771新增分区功能实现四的核心类 device/mediatek/mt6771/ueventd.mt6771.rcdevice…

广州做网站 信科网络个人网站制作wordpress

电脑上资料多了之后&#xff0c;每次找资料很麻烦。因此&#xff0c;匠人写了这个批处理文件。1、把这个批处理文件放在资料目录。2、执行它&#xff0c;输入关键字。它回自动搜索整个目录以及下属目录中的所有文件名中包含该关键字的文件&#xff0c;并生成一个带超级连接的网…

US$368 Lonsdor K518ISE SKE-IT Smart Key Emulator 5 in 1 Set

Lonsdor K518ISE SKE-IT Smart Key Emulator 5 in 1 SetSKE-LT Introduction:Product name: SKE-LT Smart Key EmulatorBattery standard: CR2032=3V(Please install battery)SKE-LT Smart Key Emulator Functions:Bin…

做淘宝美工需要知道的网站双八网站建设

大家好&#xff0c;我是Workfine黄坤&#xff0c;很高兴能够再次为大家进行分享。衷心感谢大家一直以来对我们的厚爱和支持。新的一年&#xff0c;祝愿大家财源滚滚&#xff0c;身体健康&#xff0c;阖家幸福。 这是我们创业的第七个年头&#xff0c;进入这一行也有整整十年。…

馆陶网站建设云建站自动建站系统源码

参考 http://www.cnblogs.com/honpey/p/4575928.html kprobe是linux内核的一个重要特性&#xff0c;是一个轻量级的内核调试工具&#xff0c;同时它又是其他一些更高级的内核调试工具&#xff08;比如perf和systemtap&#xff09;的“基础设施”&#xff0c;4.0版本的内核中&a…

全球50个大网站开发语言什么是百度竞价排名服务

101向日葵远程向日葵软件相对来说&#xff0c;可以实现Windows、Mac、Linux、Android&#xff0c;IOS之间的跨平台互连&#xff0c;对于个人版本除开网络的连接速度和其他部分付费功能的限制&#xff0c;基本上针对个人&#xff0c;相关的功能也满足了个人的使用。‖正‖文‖1、…

US$1090 VVDI2 AUDI VW 4th amp; 5th IMMO Functions Authorization Service

VVDI2 AUDI 4th & 5th IMMO Functions Authorization ServiceIf you just buy VVDI2 basic function(SV86-C) andwant to get the functions for Audi 4th and 5th IMMO authorization, you can buy this service.…

提示词工程与上下文工程核心洞察总结报告

提示词工程与上下文工程核心洞察总结报告Posted on 2025-09-25 01:07 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:提示词工程与上下文工程核心洞察总结报告提示词工程与上下文工程核心洞察总结报告 报告来源…

数据来源验证Prompt

数据来源验证PromptPosted on 2025-09-25 01:07 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:数据来源验证Prompt数据来源验证Prompt 核心目标 数据质量 > 数据数量 - 通过自动化脚本验证数据来源的有效性…

# ️ 注册中心原理与选型指南

# ️ 注册中心原理与选型指南Posted on 2025-09-25 01:07 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:# ️ 注册中心原理与选型指南️ 注册中心原理与选型指南 基础概念 什么是注册中心? 注册中心是分布式系…

# 程序员如何避免面向监狱编程

# 程序员如何避免面向监狱编程Posted on 2025-09-25 01:07 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:# 程序员如何避免面向监狱编程程序员如何避免面向监狱编程原文:程序员如何避免面向监狱编程? 作者…

Anthropic —— Security First

Anthropic —— Security FirstPosted on 2025-09-25 01:07 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:Anthropic —— Security First好的,当然可以。这是一份关于 Anthropic 公司的详细介绍。 Anthropic…

Python-Conda技术指南

Conda 是一个开源的包管理系统和环境管理系统,主要用于Python项目,但也支持其他编程语言。Python Conda 技术指南 1. Conda 概述 1.1 什么是 Conda Conda 是一个开源的包管理系统和环境管理系统,主要用于Python项目…

US$78 Yanhua Mini ACDP Module5 Fujitsu CPU MB91FXX Read amp; Write

Yanhua Mini ACDP Module 5 Fujitsu CPU MB91FXX Read & WriteSupports Honda FIT, Vezel, Fifth generation Hyundai Sonata, Kia K3/K5 etc Fujitsu CPU MB91F series read & write function. Yanhua Mini A…

千博企业网站管理系统 下载十大开源商城系统

一、变量概述 1、什么是变量 变量是用于存放数据的容器。通过变量名 获取数据&#xff0c;甚至数据可以修改。 变量的本质&#xff1a;变量是程序在内存中申请的一块用来存放数据的空间。 二、变量的使用 变量在使用时分两步&#xff1a;1、声明变量 2、赋值 三、变量语法…

网站网页设计公司falsh网站模板下载

Burnout Drift Multiplayer是一个完整的项目,已在PC、Android、iOS和WebGL上发布的Burnout Drift系列中使用。 [包括最新版本的Realistic Car Controller Pro] PC、WebGL和Android演示 包括Burnout Drift系列的所有功能。您只需几分钟即可轻松添加自己的车辆、场景和配乐。 警…