前言
这个文章的题目有点骗眼球的感觉,其实是自己踩过大坑,很是痛恨这个电路,希望大家以后不要踩了。工程师要画这个电路时,网上一搜,不经深入分析就拿来用,给项目埋了炸弹。
👇👇👇更多技术资料👇👇👇
RS485自动收发电路
因为RS485采用叉分信号,只支持半双工。正常的RS485芯片驱动电路是需要GPIO来切换发送和接收模式。如下图所示,一般的RS485电平转换芯片都有RE/DE脚,用来切换收发模式。
嵌入式行业,特别是MCU相关的都比较爱抠成本,便宜的MCU往往就是GPIO数量不够。如果是上Linux系统的方案,一般串口支持RS485就还得改GPIO驱动,会有软件工作量。于是有大聪明发明了自动切换的电路,省掉了那个GPIO。下图是网上找的一个自动收发电路图,收发原理直接看图中文字描述。
3. 发送数据1时,接收模式,外围A,B由上下拉电路控制,输出1,问题出在这里。
由于自己示波器测量的图片丢失,网上找别的测试图来说明,引用文章链接:
https://zhuanlan.zhihu.com/p/48018717
三极管的关断时间较长(主要是由于三极管关断时的存储时间较长),因此若TXD发送低电平,DE&RE引脚较长时间后才会升至高电平,才会切到发送模式,发送低电平的延时时间较长,如下图所示为1.204 μs。
二是自动收发电路发送高电平是通过外部上下拉电阻驱动的,上升沿较缓慢,波形如下图所示,可以看出,发送高电平的上升沿较为缓慢,限制了高速通信的应用。
RS485自动收发电路风险
如下图所示,TXD变为高电平,DE&RE引脚降为低电平,AB差分电压缓慢上升,由于此时RS-485收发器已经处于接收状态,在AB差分电压上升至RS-485收发器门限电平前RXD引脚会出现到一段时间的低电平信号,例如门限电平为-200mV~-50mV的收发器,AB差分电压上升至-50mV前RS-485收发器均可输出低电平,此低电平信号的时间与AB差分电压上升时间和RS-485收发器的接收延时有关。由于串口一般是将每个位分成16份,检测中间的3份的电平信号从而确定此位的信号高低,因此若此低电平信号保持至每个位的信号检测时,则会使MCU接收到一个起始位,从而接收到错误的数据,因此这个问题同样限制了高速通信的应用并且降低了通信的可靠性。
我们在实际应用中就是遇到这个问题,概率收到错误数据,导致丢包(数据校验不通过而丢弃)。在研发的环境中,连接的终端设备少,距离近,这个丢包概率比较低,不容易发现。在Modbus应用中,概率丢包只会影响数值更新速度慢,影响不大。但是我们在现场做升级操作时,几乎很难成功,因为在研发环境没问题,我们优先排查现场环境信号干扰等问题,浪费了很多时间。这个电路有两个缺点:
三极管有电容效应,导致关断时间较长,导致RE/DE从低到高电平变化出现比较大的斜坡.同时485输出高电平,是依靠上下拉来完成的,会导致上升沿不够迅速,因此上下拉的阻值选择也是影响速度的关键。
由于当tx为高,485电平是由其上拉电阻完成的,因此弱提高驱动能力,就要减小电阻,由于485芯片驱动能力有限,电阻太小会导致tx为低的时候,485芯片无法将485总线拉低,因此总线上所有上拉电阻的并联值不应该小于375欧。还用当接入120欧的终端电阻的时候,AB两相的电压差由终端电阻和上下拉分压得到,会导致AB两相的电压差变小,因此自动收发串口转RS485设计不太适合添加终端电阻。
终端电阻的问题
终端电阻主要是为了匹配通信线的特性阻抗,防止信号反射,提高信号质量。在组建RS-485总线网络时,通常使用特性阻抗为120Ω的屏蔽双绞线,由于RS-485收发器输入阻抗一般较高(例如RSM485ECHT输入阻抗为96kΩ,最多可连接256个节点),在信号传输到总线末端时会由于受到的瞬时阻抗发生突变(以RSM485ECHT为例,阻抗由120Ω变为96kΩ),导致信号发生反射,影响信号的质量。
实际上只有距离+高速率的环境需要添加终端电阻,例如长度>500米 + 波特率超过500kbps。
总结和建议
RS485总线和电路看似简单,但是要看应用场景,对稳定性有要求的不建议使用自动收发驱动电路。
在没有遇到信号反射问题时,尽量不要使用终端电阻;硬件设计时,可以预留外挂或焊接120Ω电阻的位置。
要查看RS485驱动芯片的输入阻抗参数,和支持外挂设备数。上、下拉电阻与收发器输入阻抗的并联值应大于375Ω;
如果是现场做工程项目,建议带上万用表和示波器,测一下空闲状态下的电压值,收发的信号质量,这样才安心。
|