STM32上跑SimpleFOC,电流环、速度环、位置环、棘轮软硬件全开源
引入
我之前写过不少SVPWM、FOC的介绍文章,比如:
SVPWM算法原理及详解
从电机本质到park变换再到SVPWM,SVPWM代码实现
电机FOC算法的解释
FOC和SVPWM的C语言代码实现
simple foc可以看成是他们的简化版本。本来simple foc是跑在arduino上的,为了方便网上有人把它移植到了STM32上,我这里也只是拿过来介绍并讲解下,方便大家使用。
simple foc学习可以去看灯哥的视频,一行一行代码教你写出来。
灯哥手把手教你写FOC算法 系列课程
硬件、软件例程下载地址:
链接: https://pan.baidu.com/s/1OGqoYWYTxoRtALSN4BOnpA 提取码: 24kv
包含4个例程和硬件板子:

硬件
硬件使用立创EDA:


电路很简单,主控STM32F103C8T6,电机驱动DRV8313PWPR(最大电压60V,最大电流2.5A),
电流采集芯片INA199A1,12位磁编AS5600。

把板子做好后,需要如下配件来组装:
1个3205b无刷电机 带径向磁环(最好买去除限位的,这样可以一直转,不然只能转1圈。电机要带径向磁环配合磁编,不然就需要自己贴磁钢。参考购买链接)
3根8mm长M2尼龙铜柱
3个M2尼龙螺丝
除了以上 3205B,还建议选用以下较为常见的云台电机:

电流环
框图如下,通过电流传感器读取电流后做clarke、park变换,然后做PID

框图如下,通过电流传感器读取电流后做clarke、park变换,然后做PID,最后输出给SVPWM。
//电流闭环 shaft_velocity = shaftVelocity(); //电机转速shaft_angle = shaftAngle(); //转子电角度electrical_angle = electricalAngle(); //转子电角度减去零位current_ADC.a=-((float)Get_Adc_Average(ADC_Channel_3,1)*(3.3/4096)-1.65)*0.4; //电机相电流 1÷0.05÷50=0.4current_ADC.b=-((float)Get_Adc_Average(ADC_Channel_4,1)*(3.3/4096)-1.65)*0.4; current_cal = getFOCCurrents(_normalizeAngle(electrical_angle)); //相电流做clarke、park变换// filter values
// current.q = LPFoperator(&LPF_current_q,current.q); //低通滤波
// current.d = LPFoperator(&LPF_current_d,current.d);// calculate the phase voltagesvoltage.d = PID_current_my_d( current_tar.d-current_cal.d); //当前电流和目前电流做PID计算voltage.q = PID_current_my(current_tar.q- current_cal.q); setPhaseVoltage(voltage.q, voltage.d , electrical_angle); //SVPWM//电流闭环
程序下载后,电机就会转动。
速度环
目标速度和当前速度做PID,然后输出给SVPWM。
//速度环******************************** shaft_velocity = shaftVelocity();// calculate the torque commandcurrent_sp = PID_velocity(shaft_velocity_sp - shaft_velocity); // if current/foc_current torque control// if torque controlled through voltage control voltage.q = current_sp; // use voltage if phase-resistance not providedvoltage.d = 0;shaft_angle = shaftAngle();// shaft angleelectrical_angle = electricalAngle();// electrical angle - need shaftAngle to be called firstsetPhaseVoltage(voltage.q, voltage.d, electrical_angle);//速度环
程序下载后,电机就会以shaft_velocity_sp 速度转动。
位置环
目标位置和当前位置做PID,然后输出给SVPWM。
//位置环********************************//shaft_angle_sp=2;//在这里设置shaft_angle = shaftAngle();// calculate the torque commandcurrent_sp = PID_angle(shaft_angle_sp - shaft_angle); // if current/foc_current torque control// if torque controlled through voltage control voltage.q = current_sp; // use voltage if phase-resistance not providedvoltage.d = 0;electrical_angle = electricalAngle();// electrical angle - need shaftAngle to be called firstsetPhaseVoltage(voltage.q, voltage.d, electrical_angle);//位置环
程序下载后,电机会锁定在shaft_angle_sp 位置,shaft_angle_sp会隔1s自增。
棘轮旋钮
实现棘轮旋钮的效果
shaft_angle = shaftAngle();// shaft angle electrical_angle = electricalAngle();// electrical angle - need shaftAngle to be called first//棘轮旋钮:给不同位置施加不同的电流(转矩)//棘轮模式,中点无输出0,边界给力矩1,2,超过了阈值切换中点3,4if (shaft_angle >= ratchet_center_angle - ratchet_center_dead_angle && shaft_angle <= ratchet_center_angle + ratchet_center_dead_angle) {setPhaseVoltage(0,0, electrical_angle);flag=0;}else if (shaft_angle <= ratchet_center_angle-ratchet_boundary_angle) {ratchet_center_angle=shaft_angle-ratchet_step_angle;}else if (shaft_angle >= ratchet_center_angle+ratchet_boundary_angle) {ratchet_center_angle=shaft_angle+ratchet_step_angle;}else{if (shaft_angle <= ratchet_center_angle){force=(shaft_angle-ratchet_center_angle+ratchet_center_dead_angle)*force_MAX/ratchet_boundary_angle*4;force=-force;if(force>force_MAX)force=force_MAX;setPhaseVoltage(force,0, electrical_angle);//为正的力flag=1;}if (shaft_angle >= ratchet_center_angle){force=(shaft_angle-ratchet_center_angle-ratchet_center_dead_angle)*force_MAX/ratchet_boundary_angle*4;force=-force;if(force<-force_MAX)force=-force_MAX;setPhaseVoltage(force,0, electrical_angle);//为负的力flag=2;}}
程序下载后,扭动电机会有棘轮的手感。
相关文章:
STM32上跑SimpleFOC,电流环、速度环、位置环、棘轮软硬件全开源
引入 我之前写过不少SVPWM、FOC的介绍文章,比如: SVPWM算法原理及详解 从电机本质到park变换再到SVPWM,SVPWM代码实现 电机FOC算法的解释 FOC和SVPWM的C语言代码实现 simple foc可以看成是他们的简化版本。本来simple foc是跑在arduino上的…...
智慧锂电:开启能源新时代的钥匙
在科技日新月异的今天,智慧锂电正以其独特的魅力,引领着能源领域的新变革。智慧锂电不仅革新了传统电池技术,更以其智能化、高效化的特性,成为推动能源管理现代化的重要力量。 智慧锂电项目:点亮绿色转型之路 智慧锂电…...
密码学 网络安全 科普 网络安全密码技术
网络加密包括密码技术和网络加密方法两个方面。 一、 密码技术 密码技术一般分为常规密码和公钥密码。 常规密码是指收信方和发信方使用相同的密钥,即加密密钥和解密密钥是相同或等价的。比较著名的常规密码算法有DES及其各种变形、IDEA、FEAL、Skipjack…...
C# BlockingCollection
什么是 BlockingCollection<T>主要特点构造函数常用方法生产者操作消费者操作 示例代码注意事项串口接收底层存储的类型线程安全和并发访问串口数据接收的顺序性关键点 BlockingCollection<T> 是 C# 中一个非常有用的线程安全集合类,位于 System.Coll…...
学习笔记11——并发编程之并发关键字
并发关键字 synchronized关键字 在应用Sychronized关键字时需要把握如下注意点: 1.一把锁只能同时被一个线程获取,没有获得锁的线程只能等待; 2.每个实例都对应有自己的一把锁(this),不同实例之间互不影响;例外:锁…...
2.2 Windows本地部署DeepSeek模型 --- Ollama篇(下)
2.3Ollama加载已下载Deepseek模型 无网络连接,直接通过Ollama本地已经本地已经下载好的的Deepseek模型。 2.3.1 查看已安装模型 PS C:\Users\Administrator> ollama list NAME ID SIZE MODIFIED deepseek-r1:8…...
DeepSeek R1-32B医疗大模型的完整微调实战分析(全码版)
DeepSeek R1-32B微调实战指南 ├── 1. 环境准备 │ ├── 1.1 硬件配置 │ │ ├─ 全参数微调:4*A100 80GB │ │ └─ LoRA微调:单卡24GB │ ├── 1.2 软件依赖 │ │ ├─ PyTorch 2.1.2+CUDA │ │ └─ Unsloth/ColossalAI │ └── 1.3 模…...
mysql的锁--一篇读懂所有锁机制
目录 mysql的锁 概述:根据mysql锁的大类型可以分为 我们先来讲一下范围最大的全局锁 使用 为什么要使用全局锁? 使用全局锁进行备份的缺点 表级锁 表锁 1.共享读表锁的语法 2.排斥写表锁 元数据锁 意向锁 什么是意向锁 怎么产生意向锁 意向…...
LTC6804、LTC6811、LTC6813的使用
FSEC自制BMS第一步:从零开发使用LTC6804采集电池电压 LTC6811特性 LTC6811 是 LTC6804 的引脚兼容型升级器件,LTC6804官方已经不推荐选用 可测量多达 12 节串联电池 1.2mV 最大总测量误差 可堆叠式架构能支持几百个电池 内置 isoSPI™ 接口 可在 290μ…...
linux内存页块划分及位图存储机制
page_alloc.c - mm/page_alloc.c - Linux source code v5.4.285 - Bootlin Elixir Cross Referencer 一. 什么是页块(Pageblock)? 定义:页块是物理内存中的一个连续区域,由 2^pageblock_order 个物理页(Pag…...
Vue 文件下载功能的跨域处理与前后端实现详解
在 Web 应用开发中,文件下载功能是常见需求。但由于跨域限制和认证机制的复杂性,实际开发中常遇到下载失败或权限错误等问题。本文将结合 Vue 前端和 Spring Boot 后端,详细介绍文件下载功能的实现与跨域问题的解决方案。 一、问题背景 在某…...
boost::beast websocket 实例
环境:ubuntu 1. 安装boost sudo apt install -y libboost-all-dev 2. Server端 #include <boost/asio.hpp> #include <boost/beast.hpp> #include <iostream> #include <thread>namespace beast boost::beast; // 从 Boost.Beast 中导…...
复试难度,西电卓越工程师学院(杭研院)考研录取情况
01、卓越工程师学院各个方向 02、24卓越工程师学院(杭研院)近三年复试分数线对比 PS:卓越工程师学院分为广研院、杭研院 分别有新一代电子信息技术、通信工程、集成电路工程、计算机技术、光学信息工程、网络信息安全、机械,这些…...
Rabbitmq--延迟消息
13.延迟消息 延迟消息:生产者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才会收到消息 延迟任务:一定时间之后才会执行的任务 1.死信交换机 当一个队列中的某条消息满足下列情况之一时,就会…...
cocos creator使用mesh修改图片为圆形,减少使用mask,j减少drawcall,优化性能
cocos creator版本2.4.11 一个mask占用drawcall 3个以上,针对游戏中技能图标,cd,以及多玩家头像,是有很大优化空间 1.上代码,只适合单独图片的,不适合在图集中的图片 const { ccclass, property } cc._decorator;c…...
C++ Qt开发成长之路,从入门到企业级实战项目,保姆级学习路线
Qt 介绍 Qt是一个跨平台的C图形用户界面应用程序开发框架,最初由挪威的Trolltech公司开发,后来被诺基亚收购,现在由Qt公司维护。它提供了丰富的工具和类库,使开发者能够轻松地创建各种类型的应用程序,包括桌面应用、移…...
JavaWeb后端基础(7)AOP
AOP是Spring框架的核心之一,那什么是AOP?AOP:Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。AOP是一种思想,而在Spring框…...
Uniapp实现地图获取定位功能
摘要:本文将手把手教你如何在Uniapp项目中集成地图功能、实现定位获取,并解决微信小程序、APP、H5三端的兼容性问题🚀🚀🚀 一、环境准备 地图平台选择 微信小程序:腾讯地图(强制使用)…...
批量将 Excel 转换 PDF/Word/CSV以及图片等其它格式
Excel 格式转换是我们工作过程当中非常常见的一个需求,我们通常需要将 Excel 转换为其他各种各样的格式。比如将 Excel 转换为 PDF、比如说将 Excel 转换为 Word、再比如说将 Excel文档转换为图片等等。 这些操作对我们来讲都不难,因为我们通过 Office 都…...
Flutter:StatelessWidget vs StatefulWidget 深度解析
目录 1. 引言 2. StatelessWidget(无状态组件) 2.1 定义与特点 2.2 代码示例 3. StatefulWidget(有状态组件) 3.1 定义与特点 3.2 代码示例 4. StatelessWidget vs StatefulWidget 对比 5. StatefulWidget 生命周期 5.1…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
