单片机UART一对多:同时读取多个传感器基于modbus协议

发布于:2024-04-20 ⋅ 阅读:(23) ⋅ 点赞:(0)

背景

很多传感器现在都做成了串口模块,如激光测距传感器TOF050,在开发时使用串口功能模块不仅大大加快了我们的开发进度,还能降低功能模块直接的耦合度,专业是功能交给专业的模块做,也能保证质量。
在这里插入图片描述图:TOF050激光测距模块

以TOF050模块为例,当我们同时需要接4个激光测距模块时,显然需要使用4个UART串口,分别读取距离值,这限制了我们可以外接的模块数量。
基于modbus协议,对UART串口进行改造,就可以实现单个串口同时外接多个UART设备,互不干扰。

MODBUS协议介绍

modbus介绍可以参考如下:https://cloud.tencent.com/developer/article/1540241
简而言之,在串口中使用modbus协议,主机需要先发送要读取的设备编号,相应设备编号的设备回传主机要读取的数据,而不符合该设备编号的设备保持静默状态。在主设备读取从设备时,遵循下面的通信协议:
在这里插入图片描述

UART接口改一对多

参考如下链接:https://blog.csdn.net/Ajisa_i/article/details/124731439
UART为点对点通信,直接将多个从机的TX线接到主机的RX上,是不能通信的。原因如下:

  • 主机发送信息: 当主机发送信息时,由于主机TX上接了多个从机RX,每个RX都处于接收状态,因此都可以正常接收到TX发送的信息。
  • 从机发送信息: 当从机发送信息时,由于多个从机的TX连在了一起,当其中一个从机TX发送信息时,另一个从机的TX没发送信息,没发送信息的从机TX为空闲状态处于高电平,会影响发送信息的从机,导致从机TX无法发送信息到主机的RX。

因此需要做如下改造:
在这里插入图片描述

这样改造后的原理是:

  • 当从机都不发送信息时,从机的TX端都为高电平,主机的RX端为弱上拉,因此主机RX处于等待接收状态。
  • 当从机1的TX发送信息时,从机1的TX会首先发送一个低电平起始位,由于从机1的二极管上端RX为高电平,下端从机1的TX发送了一个低电平的起始位,因此二极管导通,TX端电压为0V,则主机RX端收到的电压为0V加二极管压降0.26V。因此主机RX可以正确收到低电平信号。当从机1的TX发送高电平时,由于主机RX存在弱上拉,因此二极管不导通时,RX端会收到高电平。
    注意注意注意:
    上拉电阻1K必不可少,如果不上拉,115200波特率时RX总线上波形如下:
    在这里插入图片描述
    加上1K上拉电阻之后,115200波特率时,总线上电平如下:
    在这里插入图片描述

这样,结合MODBUS协议,从机同时只会有1个在发送数据,不会互相干扰。

其中,二极管的选型较为关键,如果选择的二极管压降较大,如为1.4V,则从机TX发送低电平时,主机RX收到的电压为1.4V,因此不能正常通信。二极管的速度也应当足够快,才能满足通信要求。
结合以上要求,二极管可以选用肖特基二极管SS14,其压降只有0.26V,响应速度10ns,实际测试,可以支持2Mbps的串口波特率。

参考链接

MODBUS协议介绍
UART改一对多