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等第三方依赖,可参考在OSX上: 使用brew安装nginx 后,在通过编译安装第三方模块 - 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 编辑 背景: makefile小技巧: 二、Linux第一个小程序-进度条 先导: 1.如何利用/r,fflush(stdout)来实现我们想要的效果; 2.写一个倒计时: 进度条…...
华为云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:何时及为何成为首选? 在RESTful API的设计过程中,HTTP方法(GET、POST、PUT、DELETE等)作为资源的操作标识,扮演着至关重要的角色。然而,在实际开发中,…...
秋招自我介绍
1min 尊敬的面试官您好,感谢您百忙之中参加我的面试。我是来自北京大学的王峰。 在实习经历方面,我曾在美团和小米公司实习。在美团主要负责核身、质检、词云项目。 在核身项目中,完整的经历从0-1的项目上线过程 在质检项目中,进…...
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如何引入、教学数据存放与图层加载的教程,可以浏览我之前发的一篇文…...
WEB攻防-JavaWweb项目JWT身份攻击组件安全访问控制
知识点: 1、JavaWeb常见安全及代码逻辑; 2、目录遍历&身份验证&逻辑&JWT; 3、访问控制&安全组件&越权&三方组件; 演示案例: 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.非类型模版参数 模版参数分类类型形参与非类型形参。 ① 类型形参:出现在在模板参数列表中,跟在class或者typename之类的参数类型名称。 ② 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当…...
vue2与vue3的区别
1.v-if与v-for的优先级不同 2.vue2中存在数据更新以后视频不更新的问题,故存在$set来解决这一问题,而vue3中数据双向绑定不存在数据更新视图不更新的问题,所以也就没有this.$set...
借助大模型将文档转换为视频
利用传统手段将文档内容转换为视频,比如根据文档内容录制一个视频,不仅需要投入大量的时间和精力,而且往往需要具备专业的视频编辑技能。使用大模型技术可以更加有效且智能化地解决上述问题。本实践方案旨在依托大语言模型(Large …...
UE5安卓项目打包安装
Android studio安装 参考:https://docs.unrealengine.com/5.2/zh-CN/how-to-set-up-android-sdk-and-ndk-for-your-unreal-engine-development-environment/ 打开android studio的官网:Download Android Studio & App Tools - Android Developers …...
MSF的使用学习
一、更新MSF apt update # 更新安装包信息;只检查,不更新(已安装的软件包是否有可用的更新,给出汇总报告) apt upgrade # 更新已安装的软件包,不删除旧包; 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 并不支持流插入与流提取,但是可以自己设计,更…...
设计模式——对象池模式
对象池模式 1. 概述2. 适用场景3. 原理4. 优点5. 缺点 示例代码示例代码使用示例 Java 标准库中的例子Apache Commons Pool 示例 1. 概述 对象池模式(Object Pool Pattern) 是一种用于管理和复用一组预先创建的对象的设计模式。它的主要目的是为了提高性…...
【VitualBox】VitualBox的网络模式+网络配置
VirtualBox 1. 简介 VirtualBox 是一款开源虚拟机软件,使用者可以在VirtualBox上安装并且执行Solaris、Windows、DOS、Linux、OS/2 Warp、BSD等系统作为客户端操作系统。 2. 六种网络接入模式 VirtualBox提供了多种网络接入模式,他们各有优缺点…...
「Netmarble 小镇」活动来了:踏上穿越标志性世界的旅程!
欢迎来到 Netmarble 小镇!本次活动从 9 月 13 日持续到 10 月 11 日,是你们体验 Netmarble 著名游戏世界最精彩内容的入口。在为期一个月的庆祝活动中,你们将体验到独家内容、惊险刺激的挑战和全新人物化身的发布! 探索 Netmarble…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...
【题解-洛谷】P10480 可达性统计
题目:P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M,接下来 M M M 行每行两个整数 x , y x,y x,y,表示从 …...
