布瑞特单圈绝对值旋转编码器串口数据读取

news2024/11/13 15:18:10

布瑞特单圈绝对值旋转编码器串口数据读取

数据手册:http://briter.net/col.jsp?id=109 (2.1版本RS485说明书通信协议 单圈.pdf)

绝对式编码器为布瑞特BRT38-ROM16384-RT1,采用RS485通信。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WymwNSfZ-1690888823352)(C:/Users/Fengzhen/AppData/Roaming/Typora/typora-user-images/image-20230801142219392.png)]
该绝对式编码器共有5根线:红、黄、黑、绿、白
在这里插入图片描述

由于需要通过绝对是编码器采集数据,并通过串口上传至上位机。因此,需要使用RS485转USB模块进行转接。

1.2 MODBUS-RTU 帧格式

本编码器支持 MODBUS 的 0x03(读保持寄存器)、0x06(写单个寄存器)。

1.2.1 0x03 读保持寄存器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dwNaHDsv-1690888823354)(C:/Users/Fengzhen/AppData/Roaming/Typora/typora-user-images/image-20230801145531134.png)]

1.2.2 0x06 写单个寄存器

在这里插入图片描述

1.3 寄存器定义

1.3.1 编码器寄存器

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

如上表可知,该编码器共有13个寄存器,每个寄存器对应着一种功能,可通过对这13个寄存器进行设置,实现特定的功能。

由1.2可知,寄存器有两种模式:读和写。支持功能码为0x03为读保持寄存器,支持功能码为0x06为写保持寄存器。

编码器通信设置:

1、 读取编码器虚拟多圈值

Tx:01 03 00 00 00 02 (C4 0B)
Rx:01 03 04 00 01 76 3B (CC 40)

主站发送:

Tx寄存器字节1(ADR)2(读)3(起始寄存器高字节)4(起始寄存器低字节)5(寄存器低字节)6(寄存器低字节)7(CRC高字节)8(CRC低字节)
内容010300000002C40B

寄存器的第3和4个字节构成寄存器的地址即0x0000

从站回送:

Rx寄存器字节1(ADR)2(读)3(字节总数)4、5(寄存器数据1)6、7(寄存器数据2)M-1、M(寄存器数据M)M+1(CRC高字节)M+2(CRC低字节)
内容01030400 0176 3BCC40

注:括号内为 CRC 校验位,编码器值返回数据是 00 01 76 3B (十进制:95803)

2、设置编码器波特率

Tx:01 06 00 05 00 02 (18 0A)
Rx:01 06 00 05 00 02 (18 0A)
注:括号内为 CRC 校验位,设置的波特率为 38400 (0x02)

主站发送:

Tx寄存器字节1(ADR)2(写)3(寄存器高字节)4(寄存器低字节)5(寄存器数高字节)6(寄存器数低字节)7(CRC高字节)8(CRC低字节)
内容010600050002180A

寄存器的第3和4个字节构成寄存器的地址即0x0005,第5和6个字节构成要发送的数据为0x0002。

当从站接收正确,从站回送:

Rx寄存器字节1(ADR)2(读)3(寄存器高字节)4(寄存器低字节)5(寄存器数高字节)6(寄存器数低字节)7(CRC高字节)8(CRC低字节)
内容010600050002180A

寄存器的第3和4个字节构成寄存器的地址即0x0005,第5和6个字节构成要发送的数据为0x0002。

3、设置编码器数据模式

Tx: 01 06 00 06 00 01 (A8 0B)
Rx: 01 06 00 06 00 01 (A8 0B)
注:括号内为 CRC 校验位,设置当前编码器数据模式为自动回传(默认查询)

4、设置编码器自动回传时间(毫秒)

Tx: 01 06 00 07 00 64 (39 E0)
Rx: 01 06 00 07 00 64 (39 E0)
注:括号内为 CRC 校验位,设定自动回传时间为 100 毫秒(HEX:0x0064)
千万注意:一旦设置自动回传时间小于 20 毫秒,编码器将无法再设置其他参数,谨慎使用!!

5、设置编码器零点

Tx:01 06 00 08 00 01 (C9 C8)
Rx:01 06 00 08 00 01 (C9 C8)
注:括号内为 CRC 校验位,设置当前编码器当前点为零点

6、设置编码器数值递增方向

Tx:01 06 00 09 00 01 (98 08)
Rx:01 06 00 09 00 01 (98 08)
注:括号内为 CRC 校验位,设置当前编码器逆时针数值增加(默认顺时针)

7、设置编码器当前位置值

Tx 01 06 00 0B 03 E8 (F8 B6)
Rx: 01 06 00 0B 03 E8 (F8 B6)
注:括号内为 CRC 校验位,设置的位置为 1000 (HEX:0x3E8)

8、编码器转速计算:

编码器旋转速度 = 编码器角速度值 / 单圈精度 / 转速计算时间(单位:转/分钟)
例如:编码器角速度值回传为 1000,单圈精度为 32768,转速采样时间为
100ms(0.1/60min)
编码器旋转速度 = 1000/32768/(0.1/60) = 1000*0.0183 = 18.31 转/分钟

完整代码如下:

**串口设置:**串口号为COM15(根据实际情况设置);波特率:115200;数据位:8;停止位:1;超时时间:None

#模式切换   转换成16进制
modecmd1 = bytes([0x01, 0x06, 0x00, 0x06, 0x00, 0x01, 0xA8, 0x0B])                 #自动回传
modecmd2 = bytes([0x01, 0x06, 0x00, 0x06, 0x00, 0x00, 0x69, 0xCB])                 #查询
modecmd3 = bytes([0x01, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x0B])                 #读取编码器虚拟多圈值
BUF_SIZE = 10
buf = bytearray([0x01, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
c = c1 = c2 = ib = flag = 0

def CRC16(data, length): # CRC校验函数代码:使用参考手册提供的代码。
    CRC = 0xFFFF
    for i in range(length):
        CRC ^= data[i]
        for _ in range(8):
            if CRC & 0x0001:
                CRC = (CRC >> 1) ^ 0xA001
            else:
                CRC >>= 1
    return CRC

if __name__ == '__main__':
    ser = serial.Serial(port="COM15",
                        baudrate=115200,
                        bytesize=8,
                        parity=serial.PARITY_NONE,
                        stopbits=1,
                        timeout=None)

    if ser.isOpen():
        print("Open Successfully ", end='')
        print(ser.name)
    else:
        print("Open Fail")

    # write_len = ser.write(modecmd1) #  写指令:切换模式,设置参数

    while True:
        R = ser.read(1) # 读取一个字节
        if R == b'': # 接收字符串为空
            print("Read Fail")
            ser.close()
            break
        c = int.from_bytes(R, byteorder='big') # 将十六进制转换为整数

        if flag > 0:
            if ib < BUF_SIZE - 1:
                buf[ib] = c
                ib += 1
            else:
                CRC = CRC16(buf, BUF_SIZE - 3) # 校验位,数据手册有提供
                if (CRC & 0xFF) == buf[7] and ((CRC >> 8) & 0xFF) == buf[8]:
                    A = (buf[5] << 8) + buf[6] # 将buf[5]左移8位后与buf[6]相加,结果赋值给A。
                    print(A)
                else:
                    print("CRC Fail")
                flag = 0
        if flag == 0:
            if c2 == 0x01 and c1 == 0x03 and c == 0x04: # 判断帧头,且帧头要连续,即为0x01、0x03、0x04
                flag = 1
                ib = 3
        c2 = c1
        c1 = c

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

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

相关文章

解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

计算机网络期末复习要点(谢希仁第8版)抱佛脚通用

熬夜苦肝4天&#xff0c;拿下&#xff01; 课本是谢希仁的计算机网络&#xff0c;第8版。 本文原创&#xff01;禁止转载。 复习建议&#xff1a;本博客不一定能涵盖你们考试的重点&#xff0c;所以不是走到穷途末路的同学还是应该多多回归课本&#xff0c;课本每章后面都有…

DRM几个重要的结构体及panel开发

一、DRM Linux下的DRM框架内容众多&#xff0c;结构复杂。本文将简单介绍下开发过程中用到的几个结构体。这几个结构体都在之前文章里面开发DRM驱动时用到的&#xff0c;未用到的暂不介绍。 DRM中的KMS包含Framebuffer、CRTC&#xff0c;ENCODER&#xff0c;CONNECTOR&#xff…

ARM处理器 指令(读写内存、状态寄存器、软中断、协处理器……)

一、数据处理指令1&#xff09;数学运算数据运算指令的格式数据搬移指令立即数伪指令加法指令带进位的加法指令减法指令带借位的减法指令逆向加法指令乘法指令数据运算指令的扩展 2&#xff09;逻辑运算按位与指令按位或指令按位异或指令左移指令右移指令位清零指令 3&#xff…

弱监督语义分割伪标签可视化(把单通道灰度图转为voc格式语义分割标签的彩色形式)

一、目的 以图片2007_001960为例&#xff0c;voc数据集中的原图和对应的语义分割标签分别如下&#xff1a; 图1 图2 图像级标签WSSS任务第一阶段最后生成的pseudo mask如下&#xff1a; 图3 我们的…

【100天精通python】Day22:字符串常用操作大全

目录 专栏导读 一、 字符串常用操作 1 拼接字符串 2 计算字符串长度 3 截取字符串 4 分割合并字符串 5 检索字符串 6 字母的大小写转换 7 去除字符串的空格和特殊字符 8 格式化字符串 二 、字符串编码转换 2.1 使用encode()方法编码 2.2 使用decoder()方法编码 专栏…

深度学习笔记-暂退法(Drop out)

背景 在机器学习的模型中&#xff0c;如果模型的参数太多&#xff0c;而训练样本又太少&#xff0c;训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题&#xff0c;过拟合具体表现在&#xff1a;模型在训练数据上损失函数较小&#xff0c;预…

Grandle安装配置(8.2.1)-windows环境

一、官网地址 https://gradle.org/releases/ 下载链接&#xff1a; https://downloads.gradle.org/distributions/gradle-8.2.1-bin.zip 下载后解压到指定文件夹,实例安装目录为&#xff1a; D:\ProgramFiles\gradle-8.2.1 二、配置环境变量 示例中配置的目录为&#xff1a…

二十一章:PUZZLE-CAM:通过匹配局部和全局特征来改进定位

0.摘要 弱监督语义分割&#xff08;WSSS&#xff09;被引入来缩小从像素级监督到图像级监督的语义分割性能差距。大多数先进的方法是基于类激活图&#xff08;CAM&#xff09;来生成伪标签以训练分割网络。WSSS的主要局限性在于从使用图像分类器的CAM生成伪标签的过程主要集中在…

【测试设计】基于正交法的测试用例设计工具--PICT

目录 前言 下载安装 用例生成 使用示例 具体操作&#xff1a; 资料获取方法 前言 我们都知道成对组合覆盖是一种非常有效的测试用例设计方法&#xff0c;但是实际工作过程中当成对组合量太大&#xff0c;我们往往很难做到有效的用例覆盖。 PICT是微软公司出品的一款成对…

spark-sql数据重复之File Output Committer问题

前言 我们先来回顾下之前介绍过的三种Committer&#xff1a;FileOutputCommitter V1、FileOutputCommitter V2、S3A Committer&#xff0c;其基本代表了整体的演进趋势。 核心代码讲解详细参照&#xff1a;Spark CommitCoordinator 保证数据一致性 OutputCommitter commitTask…

集群部署dolphinscheduler踩坑

本文主要总结一下最新版dolphinscheduler3.1.5的安装过程中遇到的坑。 dolphinscheduler启动报错 Exception in thread "Master-Server" org.springframework.beans.factory.BeanCreationException: Error creating bean with name masterServer: Invocation of in…

先进先出法与加权平均法的比较

加权平均法 加权平均的成本核算方法在计算销货成本和期末库存价值时使用每个库存物料的平均成本。企业将使用以下公式计算每个库存单位&#xff08;在特定会计期间内&#xff09;的平均成本&#xff1a; 平均库存成本 &#xff08;所有采购商品的总成本&#xff09;/&#xff…

Matlab Optimization Toolbox中的遗传算法工具包(GA)

matlab optimization 中使用了GA求解器 默认的是小于等于 找到GA 工具包 找到 APP选择 Optimization Tool 选择Solver ga - Genetic Algorithm 应用GA solver 定义适应度函数(Fitness function)与问题约束(Constraints) example one 优化函数 sin(x) 2 * cos(x)极其重要的…

【原创】IPTVC2实现方案(文末有demo)

前言: 名词解释: IPTVC2, 全称: 央视国际节目定价发布接口规范,标准版本当前最新为2.7.12 附赠资源链接&#xff0c;侵删:规范 规范中提供的样例&#xff0c;实现基于axis1.4(2006的时代宠物) 基于axis1版本的实现参考: Spring boot 集成Axis1.4 &#xff0c;使用wsdd文件发…

C语言每日一题:12《数据结构》相交链表。

题目&#xff1a; 题目链接 思路一&#xff1a; 1.如果最后一个节点相同说明一定有交点。 2.使用两个循环获取一下长度&#xff0c;同时可以获取到尾节点。 3。注意初始化lenA和lenB为1&#xff0c;判断下一个节点是空是可以保留尾节点的。长度会少一个&#xff0c;尾节点没有…

【C++修炼之路】多态

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、概念二、定义和实现1、虚函数2、虚函数的重写3、多态的构成条件4、重写的例外5、C11 override 和 final6、不能被继承的类7…

RxJava异步编程初探

RxJava 其实就是提供一套异步编程的 API&#xff0c;这套 API 是基于观察者模式的&#xff0c;而且是链式调用的&#xff0c;所以使用 RxJava 编写的代码的逻辑会非常简洁。 RxJava 有以下三个基本的元素&#xff1a; 被观察者&#xff08;Observable&#xff09;观察者&…

prometheus+grafana进行服务器资源监控

在性能测试中&#xff0c;服务器资源是值得关注一项内容&#xff0c;目前&#xff0c;市面上已经有很多的服务器资 源监控方法和各种不同的监控工具&#xff0c;方便在各个项目中使用。 但是&#xff0c;在性能测试中&#xff0c;究竟哪些指标值得被关注呢&#xff1f; 监控有…

SqlSugar、Freesql、Dos.ORM、EF、四种ORM框架的对比

SqlSugar、Freesql、Dos.ORM、EF、四种ORM框架的对比 一、默认情况下,导航属性是延迟查询; 答:ORM(Object-relational mapping)即对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。也就是说,ORM是通过使用描述对象和数据库之间映射的元数据…