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、程序演示

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

如果转速设置太大,电机会振动,可以调高 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了。






(完)


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

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

相关文章

linux修改docker容器时间

1.查看宿主机系统时间 date -R 2.进入docker容器查看时间 docker exec -it -u root 容器id /bin/bash cat /etc/timezone (容器内部系统时区显示Etc/UTC即会造成时间错误) 3.创建容器时间 echo Asia/Shanghai >/etc/timezone 4.退出容器 exit 5.复…

【C进阶】内存函数

strcpy拷贝的仅仅是字符串,但是内存中的数据不仅仅是字符,所以就有了memcpy函数 1. memcpy void *memcpy (void * destination ,const void * source , size_t num) 函数memcpy从source的位置开始向后拷贝num个字节的数据到desti…

基于nodejs+vue驾校预约管理系统

通过科技手段提高自身的优势;对于驾校预约管理系统当然也不能排除在外,随着网络技术的不断成熟,带动了驾校预约管理系统, 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,驾校预约管理系统&am…

1.go web之gin框架

Gin框架 一、准备 1.下载依赖 go get -u github.com/gin-gonic/gin2.引入依赖 import "github.com/gin-gonic/gin"3. (可选)如果使用诸如 http.StatusOK 之类的常量,则需要引入 net/http 包 import "net/http"二、基…

python之K线模式识别

1、晨星 晨星也称作早晨之星,它是一种三日形态的K线组合,第一日是阴线,第二日价格振幅较小,第三日出现阳线,它的一般形态如下图所示。晨星的K线组合形态一般出现在下跌的趋势之后,预示着价格的上升回调。其…

matlab 2ask 4ask 信号调制

1 matlab 2ask close all clear all clcL =1000;Rb=2822400;%码元速率 Fs =Rb*8; Fc=Rb*30;%载波频率 Ld =L*Fs/Rb;%产生载波信号 t =0:1/Fs:L/Rb;carrier&

Java架构师缓存架构设计

目录 1 导学2 高性能概述2.1 高性能的定义和衡量指标2.2 如何实现高性能的计算机系统或软件程序2.3 木桶理论2.4 如何实现计算机系统或软件程序的高性能3 多级缓存设计3.1 浏览器缓存3.2 CDN缓存3.3 负载均衡的缓存3.4 进程内缓存3.5 分布式缓存4 缓存技术方案5 如何进行缓存拆…

C++学习day5

目录 作业&#xff1a; 1> 思维导图 2> 多继承代码实现沙发床 1>思维导图 2> 多继承代码实现沙发床 #include <iostream>using namespace std; //创建沙发类 class sofa { private:string sitting; public:sofa(){cout << "sofa的无参构造函数…

luffy项目之后台项目搭建、目录调整、封装日志、全局异常、Response、数据库连接

luffy后台项目创建 在虚拟环境中创建luffy项目安装django&#xff1a;pip install django3.1.12命令创建项目django-admin startproject luffy_api也可以pycharm创建项目&#xff0c;创建项目时选则已经创建好的虚拟环境即可 luffy项目目录调整 """ ├── …

Docker系列--网络的配置

原文网址&#xff1a;Docker系列--网络的配置_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Docker的网络的配置。 官网网址 https://docs.docker.com/engine/reference/commandline/network/ 网络的默认设置 Docker启动之后&#xff0c;系统中会产生一个名为docker0的…

如何调整 Kubernetes StatefulSet 卷的大小

Kubernetes StatefulSet用于在集群内部署有状态应用程序。StatefulSet 中的每个 Pod 都可以访问即使在重新调度后仍坚持使用的本地持久卷。这使得 Pod 能够维护与其集合中的邻居不同的单独状态。 不幸的是,这些卷有一个很大的限制:Kubernetes 没有提供从 StatefulSet 对象调整…

【AI】Interesting Applications

文章目录 【盘古】【嗜睡检测】【3D AI 生成】多模态——指哪打哪【AlphaDev&#xff1a;汇编版 AlphaZero】【ChatExcel】 【盘古】 2023年7月&#xff0c;华为正式发布盘古大模型3.0&#xff0c;并提出3层模型架构。 L0&#xff1a;基础大模型&#xff0c;包括自然语言、视觉…

塑胶材料检测对激光焊机的作用

塑胶材料的激光焊接已经普遍用于各种零配件&#xff0c;而塑料的透光率是焊接工艺质量的一个重要指标。针对这类塑胶材料推出这款专门检测塑胶材料近红外透光率特性的透光率检测仪&#xff0c;对注塑件的透光率进行全画面扫描。 全球工业致力于贯彻绿色环保、节能减排发展理念&…

Selenium+Pytest自动化测试框架

前言 selenium自动化 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象&#xff0c;封装继承 一定的selenium基础——本篇不讲selenium&#xff0c;不会的可以自己去看selenium中文翻译网 测试框架简介 测试框架有什么优点呢&#xff1a; 代码复用率高&…

CocosCreator 面试题(八)Cocos Creator 中如何做资源管理

在 Cocos Creator 中&#xff0c;可以采取以下方法来进行良好的资源管理&#xff1a; 加载远程资源 使用 Cocos Creator 提供的 cc.assetManager.loadRemote 方法加载远程服务器上的资源。 cc.assetManager.loadRemote(http://example.com/images/image.png, (err, texture) &g…

Shell 脚本面试指南

包含 20 多个中级到高级 Linux shell 脚本面试问题的主题&#xff0c;并附有示例和答案&#xff1a; 1、问题&#xff1a;shell 脚本开头的 “#!” 的用途是什么&#xff1f;举个例子。 答案&#xff1a;是shebang 指定脚本的解释器。 示例&#xff1a;#!/bin/bash 表示脚本正…

16+sci,多重免疫组织化学+CIBERSORTx 鉴定成纤维细胞亚群。

今天给同学们分享一篇单细胞多重免疫组织化学数字细胞学&#xff08;CIBERSORTx&#xff09;的生信文章“Single-cell analysis reveals prognostic fibroblast subpopulations linked to molecular and immunological subtypes of lung cancer”&#xff0c;这篇文章于2023年1…

springboot就业信息管理系统springboot32

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

nodejs+vue宠物店管理系统

例如&#xff1a;如何在工作琐碎,记录繁多的情况下将宠物店管理的当前情况反应给管理员决策,等等。在此情况下开发一款宠物店管理系统小程序&#xff0c; 困扰管理层的许多问题当中,宠物店管理也是不敢忽视的一块。但是管理好宠物店又面临很多麻烦需要解决,于是乎变得非常合乎时…

STM32使用ThreadX示例以及tx_thread_create解析

示例代码 以下是一些基本示例代码&#xff0c;用于STM32F4 Discovery板和ThreadX库。 #include "stm32f4xx.h" #include "tx_api.h"/* 定义任务堆栈大小 */ #define TASK_STACK_SIZE 1024/* 定义任务优先级 */ #define TASK_PRI 16/* 定义两个任务的ID *…