ODrive移植keil(五)—— 开环控制和电流变换
目录
- 一、开环控制
- 1.1、控制原理
- 1.2、硬件接线
- 1.3、代码说明
- 1.4、程序演示
- 1.5、程序架构的体现
- 二、电流变换
- 2.1、理论说明
- 2.2、代码说明
ODrive、VESC和SimpleFOC 教程链接汇总:请点击
一、开环控制
在SimpleFOC系列中有开环控制的教程,SimpleFOC移植STM32(二)—— 开环控制,可以对比参考。
1.1、控制原理

1、开环控制,只能使用电压模式,电流模式需要采样电流,那就是闭环了,
2、一般设置Ud=0,所以只需设置Uq。在SimpleFOC中 voltage_limit最终赋值Uq,在ODrive中 target_voltage_最终赋值Uq,
3、Uq设置太大,电机发热严重,Uq设置太小,电机没劲转不动或者转不快,所以一定要根据电机相电阻设置大小,
4、θ不是当前的角度,是目标角度,就是下次计算时的角度。
1.2、硬件接线

驱动板购买链接:某宝购买
电机 购买链接:某宝购买
1.3、代码说明
1、开环控制在TIM1更新中断中调用,下图:

2、开环控制代码,下图:
相比simpleFOC的开环运算,增加电流、电压和速度的爬升率设置,启停阶段电机转动更平稳,

3、Park逆变换,
由dq变为αβ,最终送入SVPWM,

1.4、程序演示
注意,本节示例中的速度单位是电角度(rad/s),不是闭环控制中的速度单位(圈/秒),也不是SimpleFOC中的机械角度(rad/s)。



如果转速设置太大,电机会振动,可以调高 target_voltage_ 以达到更大的转速,但是注意电机电流,注意发热。
- 电压爬升率和速度爬升率如果设置的小一点,可以看到电机逐渐加速的过程,
- 云台电机的target_voltage_设置可以更大一点,能更清楚的看到扭矩逐渐增大的过程,
- 开环控制虽然简单,却是入门第一关,
- 对于电机新手,可以先用云台电机,因为电机相电阻更大,不容易烧坏,
- 开环控制主要用于电机上电校准和无刷电机的启动阶段,不是控制常态,不用深入研究。
1.5、程序架构的体现
ODrive代码开源但却难以看懂,我觉得原因有以下几个:
- 1、采用FreeRTOS系统,没用大家习惯的裸奔,
- 2、C++编程,单片机代码C是主流,即使有嵌入式工程师善长C++,但却不懂硬件,代码看起来一样云里雾里,
- 3、程序架构与众不同。
ODrive的程序架构,也是我在基本移植完代码后才焕然大悟的,如果事先有架构意识,不至于看代码的时候那么痛苦。
下面以开环控制为例,说明其架构特点,
- openloop_controller_update()函数运算后的变量赋给FOC_voltage()函数,这是常用的代码写作方式,下图:

- 为了说明程序架构,我又做了一个开环控制代码,

- 第二个代码,仿照官方架构,openloop_controller_update()函数运算后的变量没有直接赋给FOC_voltage()函数,下图:

而是在准备开环控制的时候,指针指向开环变量,下图:

然后再将指针传递给FOC_voltage()函数的变量,下图:

总结来说:
- 第一个代码中,openloop_controller_update()函数变量给FOC_voltage()函数用,整个代码只有一套变量,
- 第二个代码中,openloop_controller_update()函数有自己的变量,FOC_voltage()也有自己的变量,两个变量通过指针链接。
相当于多了一个二传手,这样做肯定降低了效率,甚至觉得完全就是多此一举,但为什么要这么做,大概是方便功能拓展和多人合作。我觉得这个差别有点像个体户和大型跨国公司,个体户理解不了ERP系统一样。
最初移植代码的时候我是打算采用第一种方案的,但是考虑到代码移植后大家的认可度,我还是决定和官方的保持一致。
文笔有限,还不懂的请认真对比两个代码。
二、电流变换
电流变换实际上要到第七篇教程编码器校准时才会涉及到,此处提前讲解,以满足你们那渴望的心,
2.1、理论说明
1、几乎所有讲FOC的文章,都会有这样的框图,所以此处不再多讲。


2、重点:“θ”这个参数,框图中看起来像是一个参数两处调用,实际上这是两个角度,
Park变换的θ是当前读出的角度,而Park逆变换是下次FOC计算时的角度(当前角度+估算的下次转过的角度),
- 在simpleFOC中,没有估算下次转过的角度,只是简单的加了_PI_2,我觉得这也是限制了SimpleFOC最大转速的一个原因,因为转速足够快的话,一个电周期完全有可能转过_PI_2个电角度。

- 在ODrive中则经过了精确的计算,

2.2、代码说明
- 电流变换部分移植v0.5.1,因为v0.5.6的变换被分开写入了多个不同的函数,没有0.5.1的简单清晰,
- 本节只为方便观看代码,稍后代码中的变换仍采用v0.5.6版本,
- 0.5.1和0.5.6都是好代码,版本升级只能说明创作者有不同的目标,并不是代码就一定越来越好。


- ODrive的力矩模式非常稳定,对比SimpleFOC的电流环就非常拉垮,几乎没有实用价值。
- 我试图把ODrive的电流环移植到SimpleFOC中,但是移植了一些后就写不下去了,因为涉及到了程序架构。SimpleFOC是Arduino环境,设计的目标是跨平台运行,几乎不用中断,代码是流水线式的执行,强行移植就不再是SimpleFOC了。
(完)
相关文章:
ODrive移植keil(五)—— 开环控制和电流变换
目录 一、开环控制1.1、控制原理1.2、硬件接线1.3、代码说明1.4、程序演示1.5、程序架构的体现 二、电流变换2.1、理论说明2.2、代码说明 ODrive、VESC和SimpleFOC 教程链接汇总:请点击 一、开环控制 在SimpleFOC系列中有开环控制的教程,SimpleFOC移植S…...
【Java学习之道】日期与时间处理类
引言 在前面的章节中,我们介绍了Java语言的基础知识和核心技能,现在我们将进一步探讨Java中的常用类库和工具。这些工具和类库将帮助我们更高效地进行Java程序开发。在本节中,我们将一起学习日期与时间处理类的使用。 一、为什么需要日期和…...
信息系统项目管理师第四版学习笔记——高级项目管理
项目集管理 项目集管理角色和职责 在项目集管理中涉及的相关角色主要包括:项目集发起人、项目集指导委员会、项目集经理、其他影响项目集的干系人。 项目集发起人和收益人是负责承诺将组织的资源应用于项目集,并致力于使项目集取得成功的人。 项目集…...
MySQL建表操作和用户权限
1.创建数据库school,字符集为utf8 mysql> create database school character set utf8; 2.在school数据库中创建Student和Score表 mysql> create table school.student( -> Id int(10) primary key, -> Stu_id int(10) not null, -> C_n…...
TCP/IP(十一)TCP的连接管理(八)socket网络编程
一 socket网络编程 socket 基本操作函数 bind、listen、connect、accept、recv、send、select、close 说明: 本文需要C语言、syscall系统调用、OS 操作系统基础理论,如果不了解可以暂时跳过目标: 知道对应库函数的更底层机制思考: socket函数与FIN、A…...
第五章 图
第五章 图 图的基本概念图的应用背景图的定义和术语 图的存储结构邻接矩阵邻接表 图的遍历连通图的深度优先搜索连通图的广度优先搜索 图的应用最小生成树拓扑排序 小试牛刀 图的基本概念 图结构中,任意两个结点之间都可能相关;而在树中,结点…...
深度学习实战:用Keras搭建深度学习网络做手写数字识别
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。 🐴欢迎小伙伴们点赞👍🏻、收藏⭐️、…...
算法解析:LeetCode——机器人碰撞和最低票价
摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 机器人碰撞 问题: 现有 n 个机器人,编号从 1 开始,每个…...
LeetCode刷题总结 - LeetCode 热题 100 - 持续更新
LeetCode 热题 100 其他系列哈希1. 两数之和49. 字母异位词分组128. 最长连续序列 双指针27. 移除元素283. 移动零11. 盛最多水的容器剑指 Offer II 007. 数组中和为 0 的三个数42. 接雨水 滑动窗口438. 找到字符串中所有字母异位词3. 无重复字符的最长子串 字串560. 和为 K 的…...
Spring是什么?为什么要使用Spring?
目录 前言 一、Spring是什么? 1.1 轻量级 1.2 JavaEE的解决方案 二、为什么要使用Spring 2.1 传统方式完成业务逻辑 2.2 使用Spring模式完成业务逻辑 三、为什么使用Spring? 前言 本文主要介绍Spring是什么,并且解释为何要去使用Spring&…...
自我监督学习日志
学习日志 10.12 一天学不了一分钟,不知道为什么也就是了 今天一定要学一个小时! 机器学习就是机器帮我们找一个函数 语音辨识,语音,声音讯号 转化为文字 帮我们找一个人类写不出来的复杂函数 类神经网络 输入 一张图片用一个矩…...
配置CA证书
前置条件 配置Java环境变量。 具体操作 windows环境 以管理员方式执行CMD窗口,输入命令; cd /d %JAVA_HOME%\jre\lib\securitycurl -kv https://xxx/artifactory/CMC-Release/certificates/xxxRootCA.cer -o xxxRootCA.cercurl -kv https://xxx/art…...
计算机毕业设计选什么题目好?springboot 高校就业管理系统
✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…...
上海-华为全联接大会|竹云受邀参加华为云ROMAConnect行业生态联盟成立联合发布会
2023年9月22日,在上海举办的华为全联接大会上,竹云作为华为云全方位合作伙伴代表,受邀参加华为云ROMAConnect行业生态联盟成立联合发布会。华为云PaaS服务产品部副部长张甲磊以及联盟主要成员企业出席发布仪式,共同见证华为云ROMA…...
走进GraalVM
是什么 GraalVM是一个高性能的JDK,旨在加速用Java和其他JVM语言编写的应用程序的执行,同时还为JavaScript,Python,Ruby和许多其他流行语言提供运行特点 GraalVM可以代替JDK、JVM之前的工作。 GraalVM除了支持Java,也支…...
spark读取hive表字段,区分大小写问题
背景 spark任务读取hive表,查询字段为小写,但Hive表字段为大写,无法读取数据 问题错误: 如何解决呢? In version 2.3 and earlier, when reading from a Parquet data source table, Spark always returns null for any column …...
UE4和C++ 开发-头文件(.h) 和实现文件(.cpp)区别
.h文件和.cpp文件是C程序中的两种不同类型的文件。 .h文件通常包含类、函数和变量的声明, 而.cpp文件包含这些声明的实现。 .h文件中的声明通常是公共的,可以被其他文件包含和使用。.cpp文件中的实现通常是私有的,只能在该文件中使用。 在…...
git介绍和安装、(git,github,gitlab,gitee介绍)、git工作流程、git常用命令、git忽略文件
1 git介绍和安装 2 git,github,gitlab,gitee介绍 3 git工作流程 4 git常用命令 5 git忽略文件 1 git介绍和安装 首页功能写完了---》正常应该提交到版本仓库---》大家都能看到这个---》 运维应该把现在这个项目部署到测试环境中---》测试…...
go cpu、内存监控、性能分析:PProf
PProf PProf 是什么 PProf是 golang 官方提供的性能调优分析工具,用于分析和优化Go程序的性能。 PProf通过收集和分析程序的运行时数据来生成性能分析报告。它使用Go语言的运行时特性,如代码注释和特殊的程序运行标记,来收集性能数据。PPr…...
计算机网络传输层知识总结·
传输层提供的服务 传输层的功能 ●传输层提供进程之间的逻辑通信,即端到端的通信 ●复用和分用 ●差错检测(首部和数据部分) ●面向连接的TCP和无连接的UDP 端口的作用 ●端口标识的是主机中的进程 ●硬件端口是不同…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
