通讯接口应用笔记1:RS485通讯上下拉电阻的选择

RS485是一种常见的通讯接口方式,在我们的实际产品中也是多次使用。但我们平常并不会去过多考虑某一实现的细节问题,不过最近我们遇到了一个因如上下拉电阻的选择问题而造成的通讯故障,所以在这一片中我们来讨论一下RS485总线上下拉电阻的选择问题。

1、出现的问题

前段时间在调试多个站点的Modbus通讯的时候出现了一个问题。在拥有6个节点的RS485总线上,主站发送给从站的报文能够成功接收,从站返回的报文主站却是接收不到。后来额外添加了上拉下拉电阻后,通讯恢复正常。这让我们注意到,上下拉电阻的选择对RS485总线通讯的影响问题。

首先,我们来看看为什么会有接收不到报文的情况。根据RS485总线的相关标准,当RS485总线差分电压大于+200mV时,RS485收发器输出高电平;当RS485总线差分电压小于-200mV时,RS485收发器输出低电平;当RS485总线上的电压在-200mV~+200mV之间时,RS485收发器可能输出高电平也可能输出低电平,但对于某一特定的节点总是处于一种电平状态,若RS485收发器的输出处于低电平,这对于UART通信来说是一个起始位,此时通信会不正常,自然我们就接收不到正确的报文了。

既然是因为RS485总线上A端和B端的电压差处于-200mV~+200mV之间而造成的错误,那么有没有办法防止它处于-200mV~+200mV之间呢?当然是有办法的,那就是利用上拉下拉电阻来钳位这一电压差值。这就引出了另一个问题,我们该如何选择适合的上拉下拉电阻呢?接下来我们将讨论这个问题。

2、分析问题

既然我们确认是上拉下拉电阻的匹配问题,那接下来我们就来讨论一下上拉下拉电阻的选择问题。我们先从简单的的情况入手,逐步的讨论更复杂的网络情况。首先我们来看一下只有两个节点的RS485网络,如下图所示:

在上图的两个节点的网络中,我们规定两端都有终端电阻,两个节点所采用的收发器的输入电阻相同,在总线中只有一个节点配置有上拉下拉电阻。我们根据电路中流入流出同一节点的电流是相同的原理,可以得到如下的两个等式:

在我们设计RS485总线电路时,如果添加有上拉和下拉电阻,我们一般会选择相同的阻值,我们记为R。那么我们根据上面两个等式可以推导出下的算式:

有了这个式子我们可以计算出上拉下拉电阻的大小。因为我们加上拉下拉电阻的目的就是保证总线A端和B端的电压差能够符合不小于200mA的要求。所以我们以总线A、B的电压差200mA来计算就可以得到上拉下拉电阻的值。

上面我们推导了两个节点的计算公式,但两个节点只是最简单的情况,而总线上往往存在多个节点。所以接下来我们来讨论总线上存在n个节点,总线两端存在终端电阻,每一个节点都拥有相同的输入电阻,只有主节点存在上拉下拉电阻,如下图所示:

我们根据前面的推导过程可知,不同的只是因为增加节点而增加的输入电阻,所以我们根据上述电路可以推导出如下的公式:

这一公式与两个节点的公式相比仅仅只是输入电阻部分并联引起的变化。同样的,我们可以依据总线A端和B端的电压差不小于200mA的要求来计算上拉下拉电阻的阻值。

我们虽然推导了总线上有多个节点的计算公式,但我们只考虑了一个节点拥有上拉下拉电阻的情况。实际应用中,可能存在总线上有多个节点存在上拉下拉电阻的情况,所以我们来讨论一下所有节点均存在上拉下拉电阻的极限情况,如下图所示:

从上图,我们不难看出与前一种多节点通讯的区别只是上拉下拉电阻的数量出现了变化。为了简化推导过程,我们同样假设每个节点拥有相同的上拉下拉电阻,以及同样的上拉电源和地。采用相同的电路原理我们可得到如下的计算公式:

在这个公式中,n为节点的数量,总线A端和B端的差值我们定义为最小的200mA,这样我们就可以将这个公式简化为:

到这里,我们就得到了比较具有使用价值的上拉下拉电阻阻值的计算公式了。我们只需要根据实际的总线使用情况选择n的值和电源的值就可以得到我们想要的上下拉电阻值。不过有一个问题需要注意,上下拉电阻的数量可能与节点的数量不同,但输入电阻的数量与节点数量相同,所以计算时要注意n的取值问题。

3、求解思路

我们已经推导了一个具有应用价值的上下拉电阻计算公式。接下来我们就来使用这一公式计算我们前面遇到的实际问题。

在第1节中,我们提到了一个实际问题,是一个具有6个节点的RS485总线,我们来计算一下这个实际事例中上拉下拉电阻该如何选择。我们的主站采用的收发器是MAX3485,上拉下拉电阻选择了普遍的4.7K欧姆电阻,上拉电源采用了3.3V电源。从节点为其他厂商产品,所采用的收发器为SP3485和SP485,我们只考虑主节点有上拉下拉电阻的情况。

从MAX3485和SP3485以及SP485的数据手册我们可以查到输入电阻均为12K欧姆。而在主站这边添加了终端电阻,而总线上的其他从站均为添加终端电阻。所以我们就可以将这些数据带入到上面的公式计算上拉下拉电阻:

于是我们很容易得到上拉下拉电阻的阻值约为903欧姆。这是在只有主节点有上拉下拉电阻的情况下,如果每个节点都有上拉下拉电阻呢?在这一情况下,所需的上拉下拉电阻要大得多,6个节点的话,约为5417欧姆。如果两个终端都采用了终端电阻,则上拉下拉电阻需要更小一些,约为458欧姆左右。同样如果6个节点均采用上拉下拉电阻,则上拉下拉电阻的值约为2749欧姆。一般在设计电路时,我们均默认所有节点均有上拉下拉电阻,在不能确认最远端的距离及终端电阻时,选用5K欧姆左右的电阻是合适的。

我们似乎解决了我们前面所遇到的问题,但还有一种情形我们需要考虑,那就是总线上拥有最多节点的情况。一般来说,总线上能够挂载多少个节点与采用的RS485收发器有关。同样以我们常用的MAX3485和SP3485为例,其理论上可以挂载包括自己在内的32个节点,所以我们就以32个节点、所有节点均有上拉下拉电阻,两端均有终端电阻为例来计算上拉下拉电阻的值。

我们可得到上拉下拉电阻的值约为13778欧姆,但这个值是一个极限值,我们并不能选用它,因为我们不能保证所挂载的每个节点都配有上拉下拉电阻。所以我们再拉计算一下只有我们设计的主节点具有上拉下拉电阻的情况。这种情况下,上拉下拉电阻的值约为431欧姆。那是不是我们选用这个最小值就可以适应总线挂载2到32个节点的所有情况了呢?很遗憾,并不是这样的,还有其它的要求需要我们考虑。

前述只考虑了上下拉电阻对RS485通讯的积极影响,而没有考虑上下拉电阻的选择对RS485通讯的消极影响。这个消极影响就是上下拉电阻以及终端电阻会影响RS485收发器的带载能力。因为根据RS485标准,收发器需要能够提供不低于1.5V的差分输出,此时对总线上A端与B端的差分负载要求为54欧姆。

我们一如前面的推导过程来归纳差模负载的计算公式。我们依然按所有节点的输入电阻相同,上拉下拉电阻相同,终端电阻为两端都有的极限情况来推导公式。首先我们推导总线A端和B端的共模负载,得到公式如下:

有了这个共模负载的计算公式,我们就可以推导出总线A端和B端差模负载的计算公式:

根据这个差模公式我们可以来核算一下总线对上拉下拉电阻的要求。我们以32个节点,每个节点都使用了上拉下拉电阻,两端均有终端电阻,差模负载为54欧姆。我们依然以MAX3485和SP3485为例,其输入电阻为为12K欧姆,计算可得共模负载为270欧姆,而上拉下拉电阻约为30857欧姆。这是在假设32个节点均有上拉下拉电阻的情况下得到的,而我们能够确保有上拉下拉电阻的只有主节点,所以我们可以得到只有主节点有上拉下拉电阻时,电阻值约为964欧姆。

所以综合上述计算过程,为了MAX3485和SP3485在2到32个节点的情况下均可用,理论上我们需要选择上拉下拉电阻的值大于964欧姆即可,但实际情况却不见得如此,因为其他节点也可能会采用上拉下拉电阻,所以上拉下拉电阻需要适当的选择大一点,才能保证通讯的可靠性。

4、不是结论

至此我们已经完成RS485总线中上拉下拉电阻选择的计算过程。但在实际使用中上下拉电阻的选择要复杂的多,因为它不但与所采用的收发器有关,还与总线上的节点数量有关。收发器的输入阻抗也决定了总线所能挂载节点的数量。如我们前述的MAX3485和SP3485两种收发器,其输入阻抗为12K欧姆,挂载32个节点时,共模电阻只有375欧姆,这时候如果我们想要利用上拉下拉电阻来保证通讯可靠,已经不会有太大效果了。所以象MAX3485和SP3485这种拥有单位负载阻抗的收发器,在电路设计时就需要考虑其挂载节点的数量。

我们在前面的讨论中,有些条件是我们假定的,如我们默认所有节点的输入阻抗均为单位负载,但实际情况不一定如此,不同节点的输入电阻可能不一定相等。在RS485标准中规定了单位负载,输入电阻与节点的关系:

所以我们选择输入电阻为12K欧姆来计算实际上是极小值,所以不同节点的输入电阻不相同也没关系,更大的输入电阻反而降低了驱动要求。

在前面的讨论中我们都是按两端有终端电阻来计算的,在实际使用中可能并非两端都存在终端电阻,甚至没有终端电阻的情况。根据前面的公式,我们不难发现如果只有1端有终端电阻或者没有终端电阻的情况下,对上下拉电阻的要求更低一些,上下拉电阻可以适当增大,所以只要符合两端带终端电阻的情况,其它情形自然也可满足。

还有在总线上,不同节点采用的上下拉电阻以及上拉电源并不一定相同。我们假定上拉电源为3.3V,实际已经是很低的情况,如果用更高的上拉电源,对上拉电阻的要求反而更低,所以用3.3V计算是能符合所有使用情况的。而至于上下拉电阻不同节点可能不同的问题,我们考虑的是最低情况,如果某一个或几个节点采用更大的电阻,由于电阻的并联作用,不会造成电阻更大的问题,即可保证压差限制,也能保证差分负载的要求。

欢迎关注:

 

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

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

相关文章

外设驱动库开发笔记18:MS5837压力变送器驱动

绝对压力的检测是常见的需求。在我们的系统中也常常会遇到。而MS5837压力传感器也是我们进场会采用的方案。在这篇里我们将讨论并实现MS5837压力传感器的驱动。 1、功能概述 MS5837压力传感器是一种可用于电路板上,适用于检测10-1200mbar压力范围的传感器&#xf…

外设驱动库开发笔记19:BMP280压力温度传感器驱动

压力和温度监测在嵌入式系统开发中是非常常见的需求,特别是对环境大气压力和温度的检测需求就更常见了。我们一般都会选择一些封装较小操作比较方便的压力传感器。BMP280就是满足这一要求的器件。在这一篇中我们将设计并实现BMP280的驱动。 1、功能概述 BMP280是一…

一个简单的空气质量数据监测站项目

大气质量数据监测站用于测试空气质量监测及数据采集,实现野外或者室内空气质量的检测。并通过网络将数据上传到OneNet​显示。​ 1、项目概述 本项目是一个定制项目,要求采集大气的压力、温度、湿度、PM25、位置等数据并上传到指定的后台服务器。但有时…

一个基于STM32实现的多组分气体分析仪项目

本篇将简要的总结一下一个基于STM32F412ZG实现的多组分气体分析仪的项目。简要描述该项目的软硬件设计及其验证。 一、项目概述 多组分气体分析仪是我公司近期研发的三个主要产品之一。采用模块化设计,可增减配置,可分析混合气体中的氧气、氢气、甲烷、…

外设驱动库开发笔记20:BME280压力湿度温度传感器驱动

嵌入式产品开发中,我们常常会有检测环境温度、压力、湿度的需求。如果有一个集成有这3个传感器的元件,无疑将是很方便的。博世的BME280就能实现这一要求。在这一篇中我们将讨论BME280的驱动设计与实现。 1、功能概述 BME280是一款专为移动应用而开发的…

外设驱动库开发笔记21:BME680环境传感器驱动

环境传感器是一类我们很常用的传感器。它可以方便我们获取压力、温度、湿度以及空气质量等数据。在这一篇中,我们将分析BME680环境传感器的功能,并设计和实现BME680环境传感器的驱动。 1、功能概述 BME680是一款专为移动应用和可穿戴设备开发的集成环境…

外设驱动库开发笔记22:ADXL345三轴数字加速度计驱动

移动设备的广泛应用增加对移动过程中各种参数的检测需求。ADXL345三轴数字加速度计可以用来检测加速度、进而测量倾斜角度等。在这一篇中,我们将讨论ADXL345三轴数字加速度计驱动程序的设计与实现。 1、功能概述 ADXL345是一款小而薄的超低功耗3轴加速度计&#x…

外设驱动库开发笔记23:AT24Cxx外部存储器驱动

在我们的应用开发过程中,经常会使用到外部的EEPROM外部存储器来保存一些参数和配置数据等。而比较常用的就是AT24Cxx系列产品,这一节我们来开发用于操作AT24Cxx系列产品的驱动。 1、功能概述 AT24Cxx系列EEPROM包括从1Kbit到2Mbit的各种容量。AT24Cxx系…

外设驱动库开发笔记24:FM24xxx系列FRAM存储器驱动

虽然说使用EEPROM保存参数很有效,但操作及使用次数均有一下限制。当我们的一些参数需要不定时修改或存储时,使用FRAM就更为方便一点。这一节我们就来设计并实现FM24xxx系列FRAM的驱动。 1、功能概述 我们首先说一下铁电随机存取存储器,F-RA…

外设驱动库开发笔记25:FM25xxx FRAM存储器驱动

在我们的项目中,时常会有参数或数据需要保存。铁电存储器的优良性能和操作方便常常被我们选用。FM25xxx FRAM存储器就是我们经常使用到的一系列铁电存储器,这一篇我们将讨论FM25xxx FRAM存储器的驱动设计、实现及使用。 1、功能概述 FM25xxx FRAM存储器…

步进电机驱动技术1:基于TMC2660的步进电机驱动

步进电机的应用非常广泛,在各种设备中经常会遇到,而步进电机的驱动则是使用步进电机必不可少的部分,可以有多种方式来实现步进电机的驱动,在这里我们来考虑一下基于TMC2660驱动芯片的步进电机驱动。 1、功能概述 TMC2660是德国T…

外设驱动库开发笔记26:nRF24L01无线通讯驱动

现在无线在我们的生活中无处不在。而我们开发的物联网产品也大量使用无线通讯。在这一篇文章中,我们将讨论nRF24L01无线通讯模块驱动程序的开发与实现。 1、功能概述 nRF24L01是一款工作在2.4~2.5GHz世界通用ISM 频段的单片无线收发器芯片无线收发器包括&#xff…

外设驱动库开发笔记27:ESP8266无线通讯驱动

我们的物联网产品所使用的平台都支持无线通讯,而且无线通讯本身更的成本较低,受到大家的欢迎。在本篇文章中,我们将详细讨论并实现ESP8266无线通讯模块的驱动。 1、功能概述 ESP8266是由乐鑫公司出品的一款物联网芯片,因为价格较…

外设驱动库开发笔记28:W5500以太网控制器

以太网通讯是一种被广泛使用的数据通讯方式。在嵌入式应用中也经常使用,但协议栈的实现并不是一件容易的事。不过有些以太网控制器就带有协议栈,如W5500。在本篇中我们将讨论如何设计并实现W5500以太网控制器的驱动。 1、功能概述 W5500是WIZnet开发的…

外设驱动库开发笔记29:DS17887实时时钟驱动

一些时候,在我们的嵌入式产品中需要记录时间,所以我们就需要获取时钟,当然实现的方式多种多样,有的MCU本身就有这一功能,不过精度较低。当我们的应用要求较高时就需要使用专门的实时时钟芯片,如DS17887。在…

外设驱动库开发笔记30:宇电AI-BUS通讯驱动

嵌入式系统通常都会与外部设备进行通讯,这就涉及到通讯协议的问题。这些通讯协议有的是标准协议有的厂家自定义的协议,如宇电的AI-BUS。在本篇中,我们将讨论AI-BUS的驱动,以便于与宇电设备的通讯。 1、功能概述 宇电的设备使用基…

步进电机驱动技术3:基于ULN2003的步进电机驱动

在我们的项目中,经常使用到低电压小功率的步进电机,此类步进电机若采用驱动器控制不断成本高也过于复杂,我们可以直接使用场效应管或者达林顿管来实现对其的驱动。在本篇中,我们就来讨论一下基于ULN2003A达林顿管实现对步进电机的…

通讯接口应用笔记2:MAX3160实现多协议通讯

在一些应用需求中,我们需要对外部提供串行通讯端口,但这些端口所通讯的目标设备各有不同,接口协议也有RS232以及RS485和RS422多种。面对这种情况,我们当然可以同时设计多个串口以适应不同需要,但无疑对硬件资源是一种浪…

电机速度曲线规划1:梯形速度曲线设计与实现

电机驱动是很常见的应用,在很多系统中我们都会碰到需要改变电机的速度以实现相应的控制功能,这就涉及到电机速度曲线规划的问题。在这篇中我们就来简单讨论一下电机的梯形曲线规划的问题。 1、基本原理 梯形速度曲线控制算法是工业控制领域应用最为广泛…

文件系统应用笔记之一:FatFS在STM32F4上的移植

在实现如U盘文件读写,SD卡的文件读写等工作时,我们往往需要一个文件系统来支持我们的工作。特别在一些MCU应用中,文件系统的加入能明显改善系统交互的友好性。在这一篇中,我们就来讨论FatFS文件系统在STM32F4上的移植和应用。 1、…