多个微控制器之间的通信

电器工程 微控制器 沟通 以太网 rs232 紫蜂
2022-01-13 01:51:52

我想开始实现一个由 N 个微控制器(N >= 2 个 MCU)组成的系统,但我想知道让它们相互通信的可能性。

理想情况下,(N-1)个微控制器被放置在房屋内充当客户端,而最后一个(“服务器”)通过 USB 连接到 PC。我现在遇到的问题是如何将这些(N-1)微控制器连接到“服务器”。客户端 MCU 执行非常简单的任务,因此仅仅因为 ARM 提供 CAN / PHY-MAC就使用 ARM 来完成这些简单的工作可能不是一个好的解决方案。

对于大多数设备,通信不会每隔几分钟发生一次以上,而对于其他设备,则根据需要进行。速度不是很关键(消息很短):1 Mbit/s 我认为对于我的目的来说太过分了。

我计划使用的MCU如下。

  • 爱特梅尔 AVR 微型 / 巨型
  • 德州仪器 MSP430
  • ARM 皮质 M3/M4
  • (可能是 Atmel AVR UC3 - 32 位)

如果可能,我想避免使用PIC(个人选择),仅仅是因为对它们进行编程的可能性较小(以上所有工具或多或少都有开源工具以及一些官方工具)。

我知道一些 ARM 提供CAN功能,但对其他的不太确定。

现在我想出了这些可能性:

  1. 用于发送数据的简单 GPIO(例如 > 16 位在 HIGH 表示消息开始,> 16 位在 LOW 表示消息结束)。但是,它必须处于标准频率 << (frequency_client, frequency_server) 才能检测到所有位。每个客户端 MCU 只需要一根电缆。
  2. RS-232:我认为这是迄今为止最常用的通信协议,但我不知道它的扩展性如何。我现在正在考虑多达 64 个客户端 MCU(以后可能会更多)
  3. USB:AFAIK,这主要类似于 RS-232,但我认为在这种情况下它的扩展性不是很好(尽管 USB 支持很多设备 - 如果我没记错的话是 255 - 对于这个应用程序来说可能过于复杂)
  4. RJ45 / 以太网:这是我真正喜欢使用的,因为它可以毫无问题地进行长距离传输(至少使用屏蔽 > Cat 6电缆)。问题在于成本(PHY、MAC、变压器……)。我不知道你是否真的可以在家里很好地焊接它。这样我就不需要客户端 MCU
  5. 无线 / ZigBee:模块非常昂贵,尽管它可能是避免桌子后面的“意大利面条”的方法
  6. RF 模块/收发器:我说的是 300 MHz - 1 GHz 频段的那些,所以它们应该很难在家焊接。这些模块都是内置的,但它们和 ZigBee 一样昂贵(至少 Mouser 的 RF 模块,Sparkfun 的模块似乎更便宜)。
  7. 能够?它似乎非常健壮。尽管我不打算在汽车应用中使用它,但它可能仍然是一个不错的选择。
  8. I²C / SPI / UART ? 再次 - 如果可能的话,最好避免使用电缆“意大利面”
  9. PLC并不是一个真正的选择。随着长度的增加,性能会迅速下降,这取决于电力网络的电容负载。我认为价格方面与以太网大致相同。

此外,在同时传输的情况下哪个协议会“更好”(让我们假设在同一时刻两个设备开始传输的罕见情况:哪个协议提供最好的“冲突管理系统”/“冲突管理系统”?

总结一下:考虑到灵活性(最大设备数量、冲突/冲突管理系统......)、价格,我想听听对于进行非常轻量数据通信的分布式客户端系统来说,什么可能是最佳解决方案,易于在家制作(焊接),......我想避免在通信模块上花费 20 美元,但同时在桌子后面有 30 根电线会很糟糕。

我现在正在想象的解决方案是通过 GPIO 或 RS-232(便宜!)在附近的 MCU 之间进行基本通信,并在每个“区域”的一个 MCU 上使用以太网 / ZigBee / Wi-Fi 与服务器通信(昂贵,但它仍然比每个客户端 MCU 一个以太网模块便宜很多)。

代替电缆,也可以使用光纤/光纤。尽管需要进行额外的转换,但我不确定这是否是这种情况下的最佳解决方案。我想听听有关它们的更多详细信息。

4个回答

CAN 在这种情况下听起来最适用。CAN 可以以 500 kbits/s 的速度处理房屋内的距离,这听起来足以满足您的需求。最后一个节点可以是现成的 USB 到 CAN 接口。这允许计算机中的软件发送 CAN 消息并查看总线上的所有消息。如果您想将其作为 TCP 服务器或其他东西呈现给外界,剩下的就是软件。

CAN是你提到的唯一一种实际上是总线的通信方式,除了你自己的I/O线。所有其他都是点对点的,包括以太网。以太网可以在逻辑上看起来像带有交换机的总线,但单独的连接仍然是点对点的,并且获得逻辑总线拓扑结构会很昂贵。每个处理器上的固件开销也远远超过 CAN。

CAN 的好处是最低的几个协议层是在硬件中处理的。例如,多个节点可以尝试同时传输,但硬件负责检测和处理冲突。硬件负责发送和接收整个数据包,包括 CRC 校验和的生成和验证。

您避免使用图片的原因没有任何意义。有许多设计可供程序员自己构建。一个是我的LProg,原理图可从该页面的底部获得。但是,除非您以几美分/小时的时间来衡量自己的时间,否则自己建造不会具有成本效益。它也不仅仅是程序员。你需要一些有助于调试的东西。Microchip PicKit 2 或 3 是非常低成本的编程器和调试器。虽然我没有使用它们的个人经验,但我听说其他人经常使用它们。

添加:

我看到一些关于 RS-485 的建议,但与 CAN 相比,这不是一个好主意。RS-485 是一种纯电气标准。它是差分总线,因此允许多个节点并具有良好的抗噪性。然而,CAN 也有这一切,还有更多。CAN 通常也被实现为差分总线。一些人认为 RS-485 与电气接口很简单。这是真的,但 CAN 也是如此。无论哪种方式,单个芯片都可以做到。对于 CAN,MCP2551 就是一个很好的例子。

因此 CAN 和 RS-485 在电气方面具有几乎相同的优势。CAN 的一大优势在于该层之上。对于 RS-485,该层之上没有任何东西。你只能靠自己。可以设计一个处理总线仲裁、数据包验证、超时、重试等的协议,但要真正做到这一点比大多数人意识到的要困难得多。

CAN 协议定义了数据包、校验和、冲突处理、重试等。它不仅已经存在并且经过深思熟虑和测试,而且真正的巨大优势在于它直接在许多微控制器上的硅片中实现。固件在发送和接收数据包级别与 CAN 外设接口。对于发送,硬件执行冲突检测、退避、重试和 CRC 校验和生成。对于接收,它会进行数据包检测、时钟偏差调整和 CRC 校验和验证。是的,CAN 外围设备将需要更多的固件来驱动,例如通常与 RS-485 一起使用的 UART,但由于芯片处理了很多低级协议细节,因此总体上需要的代码要少得多。

简而言之,RS-485 来自过去的时代,对今天的新系统毫无意义。主要问题似乎是过去使用 RS-485 的人坚持使用它并认为 CAN 在某种程度上“复杂”。CAN 的低层很复杂,但任何能胜任的 RS-485 实施也是如此。请注意,基于 RS-485 的几个众所周知的协议已被基于 CAN 的较新版本所取代。NMEA2000 就是这种基于 CAN 的较新标准的一个示例。还有另一种汽车标准 J-J1708(基于 RS-485)现在与基于 CAN 的 OBD-II 和 J-1939 相比已经过时了。

我会推荐带有 CAN 的控制器,因为此功能完全用于控制器网络目的。

RS232 可以轻松实现,但如果您尝试实现超过 2 个节点的通信(因为它不是为此目的而构建的),它将变得非常具有挑战性。

以太网也可以是一个不错的选择,因为您提到了一些主机和客户端互连,这对于以太网实现来说是很自然的。

我会选择使用曼彻斯特编码数据的 RS-485 总线。

RS-485 因为:

  • 便宜
  • 易于实施
  • 是使用低功率
  • 允许远距离(最长 1200 米)
  • 高数据速率(高达 10 Mbps)
  • 高抗干扰性
  • 有允许在同一总线上最多 256 个设备的收发器
  • 零件数量少

曼彻斯特编码,因为:

  • 易于实施
  • 可自同步

为了数据完整性,消息可以包括长度和 CRC 字段。

CRC函数示例:

unsigned char crc_calc(unsigned char buffer[], unsigned short size)
{
  unsigned long i;
  unsigned char crc;

  crc = CRC_INIT;

  for (i=0;i<size * 8;i++)
  {
    crc = (crc << 1) | (crc >> (7));

    if (buffer[i/8] & (0x80 >> (i%8)))
    {
      crc ^= CRC_POLY;
    }
  }

  return crc;
}

CRC_INIT并且CRC_POLY是用于计算 CRC 的任意值。

具有长度和 CRC 字段的消息示例:

消息示例

如果有可能将同一条线路连接到所有设备,则使用多条线路的 RS-485 在这里可以很好地工作。

例如,如果它与传统的 5e 类网络电缆一起使用,您可以有两对用于双向数据传输(使用全双工模块),有一对甚至单根线作为公共地线,其余的用于协商哪个设备将在哪个时刻传输。它比 RS-232 稍微复杂一些,但模块比 CAN 和以太网便宜,电缆限制为 1200 m。缺点是您必须制定自己的冲突解决协议。也许让想要传输的设备检查一根专用线,看看它是否高。如果不是,请将其调高并开始通信,如果是,请等待一个随机时间段。我仍然不确定这在长距离上的效果如何。