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

慈云数据 2024-04-23 技术支持 51 0

文章目录

  • 背景
  • MODBUS协议介绍
  • UART接口改一对多
  • 参考链接

    背景

    很多传感器现在都做成了串口模块,如激光测距传感器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改一对多

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon