当前位置: 首页 > news >正文

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的介绍文章&#xff0c;比如&#xff1a; SVPWM算法原理及详解 从电机本质到park变换再到SVPWM&#xff0c;SVPWM代码实现 电机FOC算法的解释 FOC和SVPWM的C语言代码实现 simple foc可以看成是他们的简化版本。本来simple foc是跑在arduino上的…...

智慧锂电:开启能源新时代的钥匙

在科技日新月异的今天&#xff0c;智慧锂电正以其独特的魅力&#xff0c;引领着能源领域的新变革。智慧锂电不仅革新了传统电池技术&#xff0c;更以其智能化、高效化的特性&#xff0c;成为推动能源管理现代化的重要力量。 智慧锂电项目&#xff1a;点亮绿色转型之路 智慧锂电…...

密码学 网络安全 科普 网络安全密码技术

网络加密包括密码技术和网络加密方法两个方面。 一、 密码技术   密码技术一般分为常规密码和公钥密码。   常规密码是指收信方和发信方使用相同的密钥&#xff0c;即加密密钥和解密密钥是相同或等价的。比较著名的常规密码算法有DES及其各种变形、IDEA、FEAL、Skipjack…...

C# BlockingCollection

什么是 BlockingCollection<T>主要特点构造函数常用方法生产者操作消费者操作 示例代码注意事项串口接收底层存储的类型线程安全和并发访问串口数据接收的顺序性关键点 BlockingCollection<T> 是 C# 中一个非常有用的线程安全集合类&#xff0c;位于 System.Coll…...

学习笔记11——并发编程之并发关键字

并发关键字 synchronized关键字 在应用Sychronized关键字时需要把握如下注意点&#xff1a; 1.一把锁只能同时被一个线程获取&#xff0c;没有获得锁的线程只能等待&#xff1b; 2.每个实例都对应有自己的一把锁(this),不同实例之间互不影响&#xff1b;例外&#xff1a;锁…...

2.2 Windows本地部署DeepSeek模型 --- Ollama篇(下)

2.3Ollama加载已下载Deepseek模型 无网络连接&#xff0c;直接通过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的锁 概述&#xff1a;根据mysql锁的大类型可以分为 我们先来讲一下范围最大的全局锁 使用 为什么要使用全局锁&#xff1f; 使用全局锁进行备份的缺点 表级锁 表锁 1.共享读表锁的语法 2.排斥写表锁 元数据锁 意向锁 什么是意向锁 怎么产生意向锁 意向…...

LTC6804、LTC6811、LTC6813的使用

FSEC自制BMS第一步&#xff1a;从零开发使用LTC6804采集电池电压 LTC6811特性 LTC6811 是 LTC6804 的引脚兼容型升级器件&#xff0c;LTC6804官方已经不推荐选用 可测量多达 12 节串联电池 1.2mV 最大总测量误差 可堆叠式架构能支持几百个电池 内置 isoSPI™ 接口 可在 290μ…...

linux内存页块划分及位图存储机制

page_alloc.c - mm/page_alloc.c - Linux source code v5.4.285 - Bootlin Elixir Cross Referencer 一. 什么是页块&#xff08;Pageblock&#xff09;&#xff1f; 定义&#xff1a;页块是物理内存中的一个连续区域&#xff0c;由 2^pageblock_order 个物理页&#xff08;Pag…...

Vue 文件下载功能的跨域处理与前后端实现详解

在 Web 应用开发中&#xff0c;文件下载功能是常见需求。但由于跨域限制和认证机制的复杂性&#xff0c;实际开发中常遇到下载失败或权限错误等问题。本文将结合 Vue 前端和 Spring Boot 后端&#xff0c;详细介绍文件下载功能的实现与跨域问题的解决方案。 一、问题背景 在某…...

boost::beast websocket 实例

环境&#xff1a;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卓越工程师学院&#xff08;杭研院&#xff09;近三年复试分数线对比 PS&#xff1a;卓越工程师学院分为广研院、杭研院 分别有新一代电子信息技术、通信工程、集成电路工程、计算机技术、光学信息工程、网络信息安全、机械&#xff0c;这些…...

Rabbitmq--延迟消息

13.延迟消息 延迟消息&#xff1a;生产者发送消息时指定一个时间&#xff0c;消费者不会立刻收到消息&#xff0c;而是在指定时间之后才会收到消息 延迟任务&#xff1a;一定时间之后才会执行的任务 1.死信交换机 当一个队列中的某条消息满足下列情况之一时&#xff0c;就会…...

cocos creator使用mesh修改图片为圆形,减少使用mask,j减少drawcall,优化性能

cocos creator版本2.4.11 一个mask占用drawcall 3个以上&#xff0c;针对游戏中技能图标&#xff0c;cd,以及多玩家头像&#xff0c;是有很大优化空间 1.上代码&#xff0c;只适合单独图片的&#xff0c;不适合在图集中的图片 const { ccclass, property } cc._decorator;c…...

C++ Qt开发成长之路,从入门到企业级实战项目,保姆级学习路线

Qt 介绍 Qt是一个跨平台的C图形用户界面应用程序开发框架&#xff0c;最初由挪威的Trolltech公司开发&#xff0c;后来被诺基亚收购&#xff0c;现在由Qt公司维护。它提供了丰富的工具和类库&#xff0c;使开发者能够轻松地创建各种类型的应用程序&#xff0c;包括桌面应用、移…...

JavaWeb后端基础(7)AOP

AOP是Spring框架的核心之一&#xff0c;那什么是AOP&#xff1f;AOP&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实说白了&#xff0c;面向切面编程就是面向特定方法编程。AOP是一种思想&#xff0c;而在Spring框…...

Uniapp实现地图获取定位功能

摘要&#xff1a;本文将手把手教你如何在Uniapp项目中集成地图功能、实现定位获取&#xff0c;并解决微信小程序、APP、H5三端的兼容性问题&#x1f680;&#x1f680;&#x1f680; 一、环境准备 地图平台选择 微信小程序&#xff1a;腾讯地图&#xff08;强制使用&#xff09…...

批量将 Excel 转换 PDF/Word/CSV以及图片等其它格式

Excel 格式转换是我们工作过程当中非常常见的一个需求&#xff0c;我们通常需要将 Excel 转换为其他各种各样的格式。比如将 Excel 转换为 PDF、比如说将 Excel 转换为 Word、再比如说将 Excel文档转换为图片等等。 这些操作对我们来讲都不难&#xff0c;因为我们通过 Office 都…...

Flutter:StatelessWidget vs StatefulWidget 深度解析

目录 1. 引言 2. StatelessWidget&#xff08;无状态组件&#xff09; 2.1 定义与特点 2.2 代码示例 3. StatefulWidget&#xff08;有状态组件&#xff09; 3.1 定义与特点 3.2 代码示例 4. StatelessWidget vs StatefulWidget 对比 5. StatefulWidget 生命周期 5.1…...

Apache SeaTunnel 4 月有何新动作?连接器增强与 Zeta 稳定性提升等亮点速览

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

别再重复画框了!用AutoCAD 2019/2023的DWG to PDF,一次搞定所有非标图纸尺寸

高效图纸输出&#xff1a;AutoCAD自定义纸张尺寸的终极管理方案 在工程设计领域&#xff0c;图纸输出是工作流程中不可或缺的一环。无论是建筑平面图、机械零件图还是电气布线图&#xff0c;专业设计人员经常面临各种非标准尺寸图纸的输出需求。传统解决方案往往需要反复创建相…...

爱普生SG-8201CJ石英可编程振荡器:精准频率控制专家首选

在电子设计中&#xff0c;晶振的选择往往是决定系统性能的关键因素之一。特别是在需要高精度和稳定性的应用中&#xff0c;选择一款合适的晶振尤为重要。今天&#xff0c;我们就来聊聊爱普生&#xff08;Epson&#xff09;的SG-8201CJ石英可编程振荡器&#xff0c;看看它如何成…...

硬件电路设计|钡特电源 VB10-24D15MD 与 URA2415YMD-10WR3 封装兼容互通,工业 DC-DC 方案适配指南

在工控硬件研发、嵌入式电路设计工作中&#xff0c;工业 DC-DC 的选型直接决定整机供电稳定性与长期运行寿命&#xff0c;国产化直流电源模块如今已全面覆盖小功率隔离供电场景&#xff0c;成为工程师方案优化的核心选择。VB10-24D15MD 和 URA2415YMD-10WR3 作为 10W 等级高频使…...

Unitree GO2 ROS2 SDK完整指南:5步实现四足机器人智能控制与自主导航

Unitree GO2 ROS2 SDK完整指南&#xff1a;5步实现四足机器人智能控制与自主导航 【免费下载链接】go2_ros2_sdk Unofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU 项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk Unitree GO2 ROS2 SDK为四足机器人…...

Honey Select 2终极汉化补丁:一站式解决语言障碍与功能扩展难题

Honey Select 2终极汉化补丁&#xff1a;一站式解决语言障碍与功能扩展难题 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 想象一下&#xff0c;你刚刚下载了备…...

别再硬编码数据了!用QAbstractTableModel+QTableView打造你的第一个Qt桌面表格应用(附完整源码)

从零构建Qt桌面表格应用&#xff1a;实战学生信息管理系统 在桌面应用开发领域&#xff0c;数据展示与交互一直是核心需求。无论是企业内部的员工管理系统&#xff0c;还是学校里的成绩统计工具&#xff0c;一个高效、美观的表格界面往往能极大提升工作效率。对于C开发者而言&a…...

娱乐圈天降紫微星承载使命,海棠山铁哥扛起原创影视复兴大旗

一、乱世先声每一个时代的乱象&#xff0c;都需要一位天命者终结。 每一次行业的沉沦&#xff0c;都需要一束紫微星光破暗。当下影视行业&#xff0c;早已偏离创作初心&#xff0c;走入本末倒置的绝境。 翻拍泛滥成灾IP套皮横行情怀反复透支流水线作品扎堆 资本只求快速变现&am…...

从Apple TV与Fire TV拆解看硬件成本、供应链策略与商业逻辑差异

1. 项目概述&#xff1a;一场跨越两年的硬件成本对决作为一名长期关注消费电子硬件设计与供应链的从业者&#xff0c;我始终对设备背后的物料成本&#xff08;BOM&#xff09;分析抱有浓厚兴趣。这不单单是看热闹&#xff0c;更是理解厂商商业策略、产品定位乃至未来迭代方向的…...

打造高效愉悦的开发环境:从工具选型到实战配置全指南

1. 项目概述与核心价值最近在整理自己的开发工具箱时&#xff0c;发现了一个非常有意思的GitHub仓库&#xff0c;叫做awesome-vibe-coding-tools。这个标题本身就充满了吸引力——“Awesome”系列通常意味着精选和高质量&#xff0c;“Vibe”这个词则暗示着一种氛围、感觉或体验…...