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

ODrive学习——添加485编码器支持

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、端口处理
  • 二、在Encoder中引入新的类型
    • 1.增加485类型
    • 2.增加串口的初始化操作
    • 3.数据处理
  • 总结


前言

尝试在ODrive中添加485型的编码器的支持


一、端口处理

计划使用PA2及PA3作为485通信的端口。这样首先要把外部温度传感器的I/O口给改掉。
找到外部温度传感器配置初始化的地方改掉,改成GPIO5,也就是PC4。

class OffboardThermistorCurrentLimiter : public ThermistorCurrentLimiter, public ODriveIntf::OffboardThermistorCurrentLimiterIntf {
public:static const size_t num_coeffs_ = 4;struct Config_t {float thermistor_poly_coeffs[num_coeffs_];//0716 Change GPIO PIN TO 5  PC4
#if HW_VERSION_MAJOR == 3//uint16_t gpio_pin = 4;uint16_t gpio_pin = 5;
#elif HW_VERSION_MAJOR == 4uint16_t gpio_pin = 2;
#endif

串口2 默认打开配置

            case ODriveIntf::GPIO_MODE_UART_B: {GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = (i == 0) ? GPIO_PULLDOWN : GPIO_PULLUP; // this is probably swapped but imitates old behaviorGPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;//if (!odrv.config_.enable_uart_b) {odrv.misconfigured_ = true;// }

此外还需要进行I/O的配置,485使用串口的配置。如果想保持原风格的话,需要添加对应枚举类型,在原有的初始化硬件体系下进行。也可以自己定义一个I/O及外设初始化的函数,在所有外设初始化完成以后调用。

二、在Encoder中引入新的类型

1.增加485类型

Encoder的类型是工程通过Odrive-interface.yaml生成的。包括其他的一些枚举类型,所以从工程里直接去链接类型定义是找不到的。

ODrive.Encoder.Mode:values:INCREMENTAL:HALL:SINCOS:SPI_ABS_CUI:value: 0x100doc: Compatible with CUI AMT23xxSPI_ABS_AMS:value: 0x101doc: Compatible with AMS AS5047P, AS5048A/AS5048B (no daisy chain support)SPI_ABS_AEAT:value: 0x102doc: Supports AEAT-8800SPI_ABS_RLS:value: 0x103doc: Supports RLS Orbis EncodersSPI_ABS_MA732:value: 0x104doc: MagAlpha MA732 magnetic encoderU485_SRMA34:value: 0x400doc: SRMA34-M16S17Bit-SY-C-5V encoder

这里增加一个U485_SRMA34的类型,注意开头不要数字开头,编译会有错误。

class Encoder : public ODriveIntf::EncoderIntf {
public:static constexpr uint32_t MODE_FLAG_ABS = 0x100;// 0717static constexpr uint32_t MODE_FLAG_SRMA = 1024;static constexpr std::array<float, 6> hall_edge_defaults = {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f};struct Config_t {//0717 Mode mode = MODE_U485_SRMA34; //Mode mode = MODE_INCREMENTAL;

在Encoder类型中,把对应的编码器类型给修改一下。

2.增加串口的初始化操作

这部分可以从系统串口初始化那边扒下来,直接启用串口2。
但是0.5.6版本不支持双串口同时使用,所以不能直接在odrive_main.h中启用uart_b。
所以还是再重新定义一个新的变量和新的处理任务。
这样的话永远不要再用原来的使能来启用uart_b了。

UART_HandleTypeDef* uart_a = &huart4;
UART_HandleTypeDef* uart_b = &huart2; // TODO: this could be supported in ODrive v3.6 (or similar) using STM32's USART2
UART_HandleTypeDef* uart_c = nullptr;
UART_HandleTypeDef* uart_485_a = &huart2; // TODO: this could be supported in ODrive v3.6 (or similar) using STM32's USART2struct BoardConfig_t {ODriveIntf::GpioMode gpio_modes[GPIO_COUNT] = {DEFAULT_GPIO_MODES};bool enable_uart_a = true;bool enable_uart_b = false;bool enable_uart_c = false;bool enable_uart_485_a = true;uint32_t uart_485_a_baudrate = 115200;uint32_t uart_a_baudrate = 115200;uint32_t uart_b_baudrate = 115200;uint32_t uart_c_baudrate = 115200;

做戏也做全套,新增一个uart_485_a的变量,也指向huart2。这样后面不再引用uart_b的变量了。
在 boardInit里面增加初始化操作

    //0717if (odrv.config_.enable_uart_485_a) {uart_485_a->Init.BaudRate = odrv.config_.uart_485_a_baudrate;MX_USART2_UART_Init();}

当然这样只是初始化完成了外设。还需要把数据处理和数据关联加上。

波特率根据自己用的编码器外设来配置哦。

3.数据处理

在对应的头文件中,添加这些接口的说明。

在main函数的inti_communication函数中,调用此函数。

void init_communication(void) {//printf("hi!\r\n");// Dual UART operation not supported yetif (odrv.config_.enable_uart_a && odrv.config_.enable_uart_b) {odrv.misconfigured_ = true;}if (odrv.config_.enable_uart_a && uart_a) {start_uart_server(uart_a);} else if (odrv.config_.enable_uart_b && uart_b) {start_uart_server(uart_b);}// 0903 start 485 data handleif (odrv.config_.enable_uart_485_a && uart_485_a) {start_u485_server(uart_485_a);}

之后我们再完善 这个处理数据的任务。先进入到编码器定时采集的接口,sample_now,添加上我们的485编码器类别,。
获取数据的方式还是用DMA的方式,在回调中处理数据到相应的变量。
试了几种方法都不太行,不知道是不是HAL库内部配置的太多了。这样倒是也省了一些额外的任务开支。

        case MODE_U485_SRMA34:{// Send 485 order to Encoder// Send 485 order to Encoder 0912get_gpio(6).write(true);HAL_UART_AbortReceive(&huart2);HAL_UART_Receive_DMA(&huart2, u485_rx_buffer, 6);ucTemp = 0x02;HAL_UART_Transmit(&huart2, &ucTemp, 1, 10);get_gpio(6).write(false);}break;

再来回想一下,SPI类型的编码器的处理,在其回调中得到一个位置的绝对值,并传递给pos_abs_参数。
数据的处理,可以放到Task任务中去,结合串口中断来实现。
所以直接在Update中来继续剩下的部分。

        case MODE_U485_SRMA34:{abs_485_pos_updated_ = false;delta_enc = pos_abs_latched - count_in_cpr_; //LATCHdelta_enc = mod(delta_enc, config_.cpr);if (delta_enc > config_.cpr/2) {delta_enc -= config_.cpr;}} break;

关于这套计算的逻辑,需要参考SPI 编码器的参数进行参考。

临时先弄这些。目前只是获取到了编码器的数值,这一套到底能不能运行起来待测试。


总结

提示:这里对文章进行总结:

相关文章:

ODrive学习——添加485编码器支持

系列文章目录 文章目录 系列文章目录前言一、端口处理二、在Encoder中引入新的类型1.增加485类型2.增加串口的初始化操作3.数据处理 总结 前言 尝试在ODrive中添加485型的编码器的支持 一、端口处理 计划使用PA2及PA3作为485通信的端口。这样首先要把外部温度传感器的I/O口给…...

在OSX上: 使用brew安装nginx 后,在通过编译安装第三方模块

1. 下载nginx安装包nginx: download 2. mac环境编译源码需要安装pcre、openssl等第三方依赖&#xff0c;可参考在OSX上: 使用brew安装nginx 后&#xff0c;在通过编译安装第三方模块 - ZhYQ_note - 博客园 3. nginx可支持的配置参考Building nginx from Sources 4. 执行 ./…...

C++初阶学习第六弹------标准库中的string类

目录 一.标准库中的string类 二.string的常用接口函数 2.1string类对象的构造 2.2 string的容量操作 2.3 string类的访问与遍历 2.4 string类对象的修改 2.5 string类常用的非成员函数 三、总结 一.标准库中的string类 可以简单理解成把string类理解为变长的字符数组&#x…...

Linux基础-Makefile的编写、以及编写第一个Linux程序:进度条(模拟在 方便下载的同时,更新图形化界面)

目录 一、Linux项目自动化构建工具-make/Makefile ​编辑 背景&#xff1a; makefile小技巧&#xff1a; 二、Linux第一个小程序&#xff0d;进度条 先导&#xff1a; 1.如何利用/r,fflush(stdout)来实现我们想要的效果&#xff1b; 2.写一个倒计时&#xff1a; 进度条…...

华为云DevSecOps和DevOps

目录 1.华为云DevSecOps和DevOps 1.1 DevSecOps 1.1.1 核心功能 1.1.2 优势 1.2 DevOps 1.2.1 核心功能 1.2.2 优势 1.3 DevOps和DevSecOps的区别 1.3.1 安全性集成 1.3.2 自动化的安全工具 1.3.3 团队协作 1.3.4 质量与合规性 1.3.5 成本与风险管理 1.3.5 总结 …...

RESTful API设计中的GET与POST:何时及为何成为首选?

RESTful API设计中的GET与POST&#xff1a;何时及为何成为首选&#xff1f; 在RESTful API的设计过程中&#xff0c;HTTP方法&#xff08;GET、POST、PUT、DELETE等&#xff09;作为资源的操作标识&#xff0c;扮演着至关重要的角色。然而&#xff0c;在实际开发中&#xff0c…...

秋招自我介绍

1min 尊敬的面试官您好&#xff0c;感谢您百忙之中参加我的面试。我是来自北京大学的王峰。 在实习经历方面&#xff0c;我曾在美团和小米公司实习。在美团主要负责核身、质检、词云项目。 在核身项目中&#xff0c;完整的经历从0-1的项目上线过程 在质检项目中&#xff0c;进…...

html加载页面

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>算数模一体化</title> </head><b…...

【数据可视化】Arcgis api4.x 热力图、时间动态热力图、timeSlider时间滑块控件应用 (超详细、附免费教学数据、收藏!)

1.效果 目录 1.效果 2.安装配置 3.热力图 4.TimeSlider滑块应用 4.1 时间滑块控件 4.2 添加控件 5.时间动态热力图 2.安装配置 这里不教大家如何在前端框架使用arcgis api。不过npm安装、css如何引入、教学数据存放与图层加载的教程&#xff0c;可以浏览我之前发的一篇文…...

WEB攻防-JavaWweb项目JWT身份攻击组件安全访问控制

知识点&#xff1a; 1、JavaWeb常见安全及代码逻辑&#xff1b; 2、目录遍历&身份验证&逻辑&JWT&#xff1b; 3、访问控制&安全组件&越权&三方组件&#xff1b; 演示案例&#xff1a; JavaWeb-WebGoat8靶场搭建使用 安全问题-目录遍历&身份认…...

【C++算法】模拟算法

替换所有的问号 题目链接 替换所有的问号https://leetcode.cn/problems/replace-all-s-to-avoid-consecutive-repeating-characters/description/ 算法原理 代码步骤 class Solution { public:string modifyString(string s) {int n s.size();for(int i 0; i < n; i){…...

模版进阶(template)

1.非类型模版参数 模版参数分类类型形参与非类型形参。 ① 类型形参&#xff1a;出现在在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 ② 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当…...

vue2与vue3的区别

1.v-if与v-for的优先级不同 2.vue2中存在数据更新以后视频不更新的问题&#xff0c;故存在$set来解决这一问题&#xff0c;而vue3中数据双向绑定不存在数据更新视图不更新的问题&#xff0c;所以也就没有this.$set...

借助大模型将文档转换为视频

利用传统手段将文档内容转换为视频&#xff0c;比如根据文档内容录制一个视频&#xff0c;不仅需要投入大量的时间和精力&#xff0c;而且往往需要具备专业的视频编辑技能。使用大模型技术可以更加有效且智能化地解决上述问题。本实践方案旨在依托大语言模型&#xff08;Large …...

UE5安卓项目打包安装

Android studio安装 参考&#xff1a;https://docs.unrealengine.com/5.2/zh-CN/how-to-set-up-android-sdk-and-ndk-for-your-unreal-engine-development-environment/ 打开android studio的官网&#xff1a;Download Android Studio & App Tools - Android Developers …...

MSF的使用学习

一、更新MSF apt update # 更新安装包信息&#xff1b;只检查&#xff0c;不更新&#xff08;已安装的软件包是否有可用的更新&#xff0c;给出汇总报告&#xff09; apt upgrade # 更新已安装的软件包&#xff0c;不删除旧包&#xff1b; apt full-upgrade # 升级包&#x…...

C++ —— 关于vector

目录 链接 1. vector的定义 2. vector的构造 3. vector 的遍历 4. vector 的扩容机制 5. vector 的空间接口 5.1 resize 接口 5.2 push_back 5.3 insert 5.4 erase 5.5 流插入与流提取 vector 并不支持流插入与流提取&#xff0c;但是可以自己设计&#xff0c;更…...

设计模式——对象池模式

对象池模式 1. 概述2. 适用场景3. 原理4. 优点5. 缺点 示例代码示例代码使用示例 Java 标准库中的例子Apache Commons Pool 示例 1. 概述 对象池模式&#xff08;Object Pool Pattern&#xff09; 是一种用于管理和复用一组预先创建的对象的设计模式。它的主要目的是为了提高性…...

【VitualBox】VitualBox的网络模式+网络配置

VirtualBox 1. 简介 VirtualBox 是一款开源虚拟机软件&#xff0c;使用者可以在VirtualBox上安装并且执行Solaris、Windows、DOS、Linux、OS/2 Warp、BSD等系统作为客户端操作系统。 2. 六种网络接入模式 VirtualBox提供了多种网络接入模式&#xff0c;他们各有优缺点&#xf…...

「Netmarble 小镇」活动来了:踏上穿越标志性世界的旅程!

欢迎来到 Netmarble 小镇&#xff01;本次活动从 9 月 13 日持续到 10 月 11 日&#xff0c;是你们体验 Netmarble 著名游戏世界最精彩内容的入口。在为期一个月的庆祝活动中&#xff0c;你们将体验到独家内容、惊险刺激的挑战和全新人物化身的发布&#xff01; 探索 Netmarble…...

MySQL 中的索引覆盖扫描:加速查询的秘密武器

在 MySQL 数据库的使用中&#xff0c;索引是提高查询性能的重要工具。而索引覆盖扫描&#xff08;Index Covering Scan&#xff09;更是一种能显著提升查询效率的技术。本篇文章我们就来深入了解一下 MySQL 中的索引覆盖扫描是什么。 一、什么是索引覆盖扫描 在 MySQL 中&…...

【机器学习】经典数据集鸢尾花的分类识别

【机器学习】经典数据集鸢尾花的分类识别 1、数据集介绍1.1 数据集详情 2、实验内容2.1 准备数据集2.2 创建颜色映射对象2.3 绘制特征散点图2.4 数据的归一化2.5 数据的标准化 3、实验截图提取萼片长度与萼片宽度分类提取萼片长度与花瓣长度分类提取萼片长度与花瓣宽度分类提取…...

Oracle从入门到放弃

Oracle从入门到放弃 左连接和右连接Where子查询单行子查询多行子查询 from子句的子查询select子句的子查询oracle分页序列序列的应用 索引PL/SQL变量声明与赋值select into 赋值变量属性类型 异常循环游标存储函数存储过程不带传出参数的存储过程带传出参数的存储过程 左连接和…...

学习笔记 - 知识图谱的符号表示方法

学习笔记 - 知识图谱的符号表示方法 说明&#xff1a; 首次发表日期&#xff1a;2024-09-13个人阅读学习并摘录成笔记 知识表示的相关名词定义 以下内容摘录自 Knowledge Graphs Applied 2.3小节&#xff0c;然后AI翻译人工润色。 实体&#xff08;Entities&#xff09;—表…...

探索RESTful风格的网络请求:构建高效、可维护的API接口【后端 20】

探索RESTful风格的网络请求&#xff1a;构建高效、可维护的API接口 在当今的软件开发领域&#xff0c;RESTful&#xff08;Representational State Transfer&#xff09;风格的网络请求已经成为构建Web服务和API接口的标配。RESTful风格以其简洁、无状态、可缓存以及分层系统等…...

【深度智能】:迈向高级时代的人工智能全景指南

​ ​ 前几天偶然发现了一个超棒的人工智能学习网站&#xff0c;内容通俗易懂&#xff0c;讲解风趣幽默&#xff0c;简直让人欲罢不能。忍不住分享给大家&#xff0c;人工智能立刻跳转&#xff0c;开启你的AI学习之旅吧&#xff01; 第一阶段&#xff1a;基础知识 1. 计算机科…...

unity3d入门教程七

unity3d入门教程七 17.1物理系统17.2静态刚体17.3刚体的碰撞17.4刚体的反弹18.1运动学刚体18.2碰撞检测18.3碰撞事件回调18.4目标的识别18.5碰撞的规避 17.1物理系统 在物理系统中的物体具有质量和速度的是刚体 不用写代码就会自由落体运动了 17.2静态刚体 给 ‘地面’ 添…...

python植物大战僵尸项目源码【免费】

植物大战僵尸是一款经典的塔防游戏&#xff0c;玩家通过种植各种植物来抵御僵尸的进攻。 源码下载地址&#xff1a; 植物大战僵尸项目源码 提取码: 8muq...

目前人工智能时代,程序员如何保持核心竞争力?

随着AIGC&#xff08;如chatgpt、midjourney、claude等&#xff09;大语言模型接二连三的涌现&#xff0c;AI辅助编程工具日益普及&#xff0c;程序员的工作方式正在发生深刻变革。有人担心AI可能取代部分编程工作&#xff0c;也有人认为AI是提高效率的得力助手。面对这一趋势,…...

golang学习笔记20——golang微服务负载均衡的问题与解决方案

推荐学习文档 golang应用级os框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...