4、网关硬件架构:主流MCU选型(STM32F4/ESP32)、双CAN与串口电路设计要点

好,咱们进入网关硬件设计的核心环节。说白了,网关就是个翻译官,一边要跟Modbus设备唠嗑,一边要跟CANopen设备对线。翻译官脑子不行,或者嘴巴不利索,那活儿就干砸了。所以MCU选型和接口电路设计,是决定网关成败的关键。

4.1 主流MCU选型:STM32F4 vs ESP32

我个人习惯,做工业网关首选STM32F4系列。为什么?稳定、皮实、生态好。ESP32虽然这两年很火,但在我做过的几个项目里,它更适合做Wi-Fi网关或者数据采集节点,真正要跑双CAN+串口实时协议栈,我还是倾向于STM32F4。

先看一张对比表,大家心里有个数:

对比项 STM32F407 ESP32
内核 Cortex-M4F (带FPU) Xtensa LX6双核
主频 168 MHz 240 MHz
CAN接口 2路(bxCAN) 0路(需外扩)
串口数量 6路UART 3路UART
工业级温度 -40~85℃(有125℃型号) -40~85℃
调试工具链 JLink/ST-Link + Keil/IAR ESP-IDF + 串口下载
典型功耗 约200mA@168MHz 约80mA@240MHz
价格(批量) 约25-35元 约15-20元

你看,STM32F4自带两路CAN控制器,这是天然优势。ESP32虽然主频高、价格低,但你要做CAN网关,必须外挂CAN控制器芯片,比如MCP2515或者SN65HVD230。这就增加了BOM成本和PCB面积,而且SPI接口的CAN控制器在实时性上,跟芯片原生的CAN控制器没法比。

我的建议:

  • 如果做纯工业现场网关,要求高可靠、低延迟、双CAN实时转发,选STM32F4系列。
  • 如果做物联网边缘网关,需要Wi-Fi/蓝牙上云,且CAN负载不重(比如只有一路CAN),可以考虑ESP32+外挂CAN。
  • 如果预算敏感且对实时性要求不高,ESP32也能凑合,但要做好丢帧的心理准备。

我记得有一次给一个矿山项目做网关,现场环境温度高、振动大,客户非要省钱用ESP32。结果调试了三天,CAN总线老是丢帧,最后发现是SPI接口的CAN控制器在高温下时序不稳定。换回STM32F4,一次搞定。嗯,有些坑,踩过才知道。

4.2 双CAN电路设计要点

双CAN电路,说白了就是两路独立的CAN收发器加上隔离电路。很多新手以为只要把MCU的CAN_TX和CAN_RX接到收发器上就行了,其实不然。

先看一个典型的双CAN电路框图:

+--------+     +----------+     +---------+
|        |     |          |     |         |
| STM32  |---->| CAN1_TX  |---->| CAN收发器|----> CAN1总线
| F407   |<----| CAN1_RX  |<----| (ISO1050)|<----
|        |     |          |     |         |
|        |     | CAN2_TX  |     | CAN收发器|
|        |---->| CAN2_RX  |---->| (TJA1050)|----> CAN2总线
+--------+     +----------+     +---------+

设计要点我归纳了三条:

  1. 隔离是必须的:工业现场,CAN总线经常有共模干扰、浪涌、地环路。我建议用带隔离的CAN收发器,比如ISO1050或者CTM1050。别省那十几块钱,不隔离的话,一个雷击浪涌就能把MCU烧了。我曾经见过一个客户,没做隔离,结果现场电焊机一开,网关就死机。
  2. 终端电阻要可控:CAN总线两端需要120欧姆终端电阻。但网关作为中间节点,有时候需要接入总线中间,有时候需要接在末端。我习惯在电路板上预留跳线或者用MOS管开关控制终端电阻的接入。这样现场调试时,不用拆机焊电阻。
  3. 共模扼流圈别省:在CAN_H和CAN_L线上串一个共模扼流圈(比如ACT45B),可以有效抑制高频共模干扰。这个元件很小,但效果很明显。

小技巧: 双CAN设计时,两个CAN通道的电源最好独立供电。比如CAN1用5V1,CAN2用5V2,中间用DC-DC隔离。这样即使一路CAN短路,也不会影响另一路。我在一个电力项目里就是这么干的,后来现场有一路CAN线被老鼠咬断了,另一路还能正常工作。

4.3 串口电路设计要点

串口电路,看起来简单,但坑也不少。网关通常需要至少两路串口:一路RS232用于调试,一路RS485用于Modbus RTU通信。

先看一个典型的串口电路设计:

+--------+     +----------+     +---------+
|        |     |          |     |         |
| STM32  |---->| UART1_TX |---->| MAX3232 |----> RS232接口
| F407   |<----| UART1_RX |<----|         |<----
|        |     |          |     |         |
|        |     | UART2_TX |     | MAX3485 |
|        |---->| UART2_RX |---->|         |----> RS485接口
|        |     |          |     |         |
|        |     | UART3_TX |     |         |
|        |---->| UART3_RX |---->| 光耦隔离|----> 扩展串口
+--------+     +----------+     +---------+

设计要点:

  • RS232电路:用MAX3232或者SP3232,注意要加ESD保护管。我习惯在TX和RX线上各串一个22欧姆电阻,可以抑制信号反射。
  • RS485电路:用MAX3485或者SN65HVD3082,注意A/B线要加上下拉电阻(通常4.7kΩ到10kΩ)。终端电阻同样要可控。还有一个容易被忽略的点:RE和DE引脚的控制。我建议用MCU的一个GPIO同时控制RE和DE,实现收发切换。但要注意,切换时要有一定的延时,否则会丢数据。
  • 隔离问题:RS485建议用隔离型收发器,比如ADM2483或者ISO3082。如果成本敏感,至少要在UART的TX/RX线上加光耦隔离。我见过一个项目,没做隔离,结果RS485线上感应到的雷击电压直接打穿了MCU的串口引脚。

警告: 串口电路设计时,一定要注意电平匹配。STM32F4的IO口是3.3V电平,而MAX3232是5V供电,但它的逻辑电平是3.3V兼容的,可以直接连接。但有些老款的RS232芯片是5V逻辑,直接连会烧MCU。选型时一定要看数据手册的Vih和Vil参数。

4.4 电源与PCB布局要点

电源设计是网关的命脉。我一般这样分配电源:

  • 主电源:24V DC输入,通过隔离DC-DC模块(比如B2405S)转成5V。
  • MCU电源:5V通过LDO(比如AMS1117-3.3)转成3.3V,给STM32供电。
  • CAN收发器电源:5V隔离电源,每个CAN通道独立供电。
  • RS485电源:5V隔离电源,与MCU电源隔离。

PCB布局上,我习惯把数字电路和模拟电路分开,电源走线要粗,地线要铺铜。CAN和RS485的走线要远离时钟线和高速信号线,避免串扰。

嗯,说到这里,我想起一个案例。有一次做样机,CAN通信老是间歇性出错,用示波器一看,CAN_H和CAN_L上的噪声很大。查了半天,发现是CAN收发器的电源走线太细,而且跟一个PWM信号线并行走了一段。后来把电源线加粗到20mil,并远离PWM线,问题就解决了。细节决定成败啊。

4.5 总结

网关硬件架构,说白了就是选对MCU,设计好接口电路。STM32F4+双CAN+双串口,是我个人最推荐的组合。ESP32虽然便宜,但做工业网关还是有点勉强。电路设计上,隔离、终端电阻、电源分配,这三个点一定要重视。

下一章,我们会讲如何搭建开发环境,以及如何让CAN和串口先跑起来。到时候我会分享一些调试的小技巧,比如用逻辑分析仪抓CAN波形,用串口助手模拟Modbus主站等等。敬请期待。