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…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
Java多线程实现之Runnable接口深度解析
Java多线程实现之Runnable接口深度解析 一、Runnable接口概述1.1 接口定义1.2 与Thread类的关系1.3 使用Runnable接口的优势 二、Runnable接口的基本实现方式2.1 传统方式实现Runnable接口2.2 使用匿名内部类实现Runnable接口2.3 使用Lambda表达式实现Runnable接口 三、Runnabl…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...
