如何计算CAN通信波特率

2024-01-07 03:44
文章标签 计算 通信 波特率

本文主要是介绍如何计算CAN通信波特率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1、理论

2、实践

3、注意事项


在CAN总线系统中,波特率的计算是一个关键步骤,它确保网络上的所有设备能够以相同的速率进行通信。

1、理论

波特率的计算涉及到几个关键参数,包括CAN控制器的时钟频率、分频因子、以及位时间的不同部分。

时钟频率(Fclk)

  • CAN控制器的时钟频率。这是CAN模块的输入时钟,通常来自于微控制器的主时钟。

分频因子(Prescaler)

  • 用于从主时钟频率中分频得到位时间计数器的时钟频率。分频因子可以增大位时间,使得CAN总线能够在较低的波特率下工作。

位时间(Bit Time)

  • 位时间由几个部分组成,总共需要满足规定的时间量子(Time Quanta,TQ)数:
    • 同步段(Sync Seg):用于同步不同节点上的数据边缘,固定为1 TQ。
    • 传播时间段(Prop Seg):用于补偿网络中的物理延迟,长度可以调整。
    • 相位缓冲段1(Phase Seg1)和相位缓冲段2(Phase Seg2):用于对抗信号抖动和网络延迟,长度可调。

基于上述参数,CAN波特率的计算公式如下:

波特率 = Fclk / (Prescaler * Bit Time)

其中,Bit Time = Sync Seg + Prop Seg + Phase Seg1 + Phase Seg2。

假设一个CAN控制器有如下参数:

  • Fclk = 16 MHz
  • Prescaler = 8
  • Sync Seg = 1 TQ
  • Prop Seg = 2 TQ
  • Phase Seg1 = 3 TQ
  • Phase Seg2 = 2 TQ

Bit Time = 1 + 2 + 3 + 2 = 8 TQ

则波特率为:

波特率 = 16 MHz / (8 * 8 TQ) = 16,000,000 / 64 = 250,000 bps (或250 kbps)

2、实践

以AT32F413这款MCU为例,CAN波特率计算公式如下所示:

CAN 总线的额定位时间由 3 部分组成:

1、同步段(SYNC_SEG),该段占用 1 时间单元,即公式中的1 x t𝑞。

2、位段 1(BIT SEGMENT 1),包括 CAN 标准里的 PROP_SEG 和 PHASE_SEG1,记为 BSEG1, 该段占用 1 至 16 时间单元,时间单元个数由 BTS1[3: 0]位定义,即公式中的t𝐵𝑆𝐸𝐺1 = (1 + BTS1[3: 0]) x t𝑞。

3、位段 2(BIT SEGMENT 2),包括 CAN 标准里的 PHASE_SEG2,记为 BSEG2,该段占用 1 至 8 时间单元,时间单元个数由 BTS2[2: 0]位定义,即公式中的t𝐵𝑆𝐸𝐺2 = (1 + BTS2[2: 0]) x t𝑞。

时间单元的长度由 CAN 位时序寄存器(CAN_BTMG) 的 BRDIV[11: 0]位及 PCLK 定义,即公式中的t𝑞。

按照公式继续推导如下:

其中, BRDIV[11: 0]、 BTS1[3: 0]和 BTS2[2: 0]为 CAN 位时序寄存器 (CAN_BTMG)中参数,在 AT32F413的 BSP 程序中对应结构体对照表如下:

举个例子,设定f𝑆𝑌𝑆𝐶𝐿𝐾=192MHz, f𝐴𝑃𝐵1𝐶𝐿𝐾 = f𝑃𝐶𝐿𝐾=24MHz 时, 1M 波特率的软件设置如下:

3、注意事项

  • 确保总的Bit Time在CAN控制器的可配置范围内。
  • 不同的CAN控制器可能有不同的最大和最小TQ限制。
  • 适当设置波特率可以减少误差,提高网络的稳定性和可靠性。
  • 高波特率适用于短距离通信,而长距离通信则需要降低波特率以减少误差。

这篇关于如何计算CAN通信波特率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/578620

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

基于C#实现MQTT通信实战

《基于C#实现MQTT通信实战》MQTT消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点,下面我们就来看看C#实现... 目录1、连接主机2、订阅消息3、发布消息MQTT(Message Queueing Telemetr

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2