FastBond4挑战部分-八通道工业modbus网关
该项目使用了STM32H563和ADM3072EARZ,实现了modbus工业网关的设计,它的主要功能为:八路RS485接口,独立收发。
标签
嵌入式系统
Modbus
STM32H563
ADM3072EARZ
zhzyz
更新2026-06-26
19
KiCad文件
全屏

一、所选主题和项目介绍

本项目主题为基于 STM32H5 的八路 RS485 Modbus 工业网关,旨在解决工业现场多设备数据采集与通信的痛点。网关采用意法半导体高性能 STM32H563 微控制器作为核心,集成 8 路独立 RS485 通信通道,支持标准 Modbus RTU 协议,可同时与 8 台下位机设备进行数据交互,实现工业现场数据的集中采集、转发与处理。

项目核心价值在于:

  • 单芯片集成 8 路 RS485 通道,大幅降低硬件成本与设备体积
  • 兼容标准 Modbus 协议,可无缝对接各类工业 PLC、传感器、仪表
  • 具备硬件隔离与 ESD 保护,适应复杂工业电磁环境
  • 预留扩展接口,可升级支持 Modbus TCP 协议,实现工业数据上云

二、使用到的所有硬件介绍

1. 核心控制器

  • STM32H563 Nucleo 开发板:搭载 Cortex-M33 内核,主频 250MHz,拥有丰富的 UART 外设资源,支持 8 路串口同时工作,具备大 RAM 空间用于构建内部寄存器,满足多通道数据缓存需求。

2. RS485 通信模块

  • ADM3072EARZ:ADI 公司生产的 3.3V 供电 RS485 收发器,具备 ±15kV ESD 保护,支持 250kbps 通信速率,最多可连接 256 个节点,具有热插拔保护和低 EMI 特性,适合工业现场应用。

3. 电源模块

  • IF0505S-2W:DC-DC 隔离电源模块,输入 5V,输出 5V,实现电源隔离,提高系统抗干扰能力。
  • 1N7568:肖特基二极管,用于电源防反接保护。
  • SWPA6045S 68uH:功率电感,配合滤波电容组成电源滤波电路。
  • SMBJ30CA:24V工业直流电源,过压TVS保护

4. 连接器

  • WJ15EDGRC-3.81-16P:16P 3.81mm 间距接线端子,用于连接 8 路 RS485 总线(A/B 线)。
  • WJ15EDGRC-3.81-2P:2P 3.81mm 间距接线端子,用于外部 DC5V 电源输入。
  • 2.54mm 排针(30P/34P/70P):用于与 STM32H5 Nucleo 开发板连接,实现信号与电源的传输。

5. 被动元件

  • 电容:100nF、10nF、2.2uF、10uF、47uF 等多种规格,用于电源滤波和信号去耦。
  • 电阻:CRGP0603F4K7电阻4.7kΩ(上下拉)、3.16kΩ、10kΩ、1MΩ 等,用于 RS485 总线匹配和电平转换。

SMBJ30CA CRGP0603F4K7

三、方案框图和项目设计思路介绍

1. 整体方案框图

┌─────────────┐    ┌─────────────┐    ┌─────────────────┐
│ 外部DC24V │───>│ 电源模块 │───>STM32H563 MCU
│ 电源输入 │ (隔离+滤波) (8UART)
└─────────────┘ └─────────────┘ └────────┬────────┘

┌────────────────────────┼────────────────────────┐
│ │ │
┌───────┴───────┐ ┌───────┴───────┐ ┌───────┴───────┐
RS485通道1 │ │ RS485通道2...RS485通道8
(ADM3072) (ADM3072) (ADM3072)
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
│ │ │
┌───────┴───────┐ ┌───────┴───────┐ ┌───────┴───────┐
│ 工业设备1 │ │ 工业设备2... │ 工业设备8
(Modbus RTU) (Modbus RTU) (Modbus RTU)
└───────────────┘ └───────────────┘ └───────────────┘

2. 项目设计思路

  1. 硬件设计思路
    • 采用模块化设计,将电源、MCU 接口、8 路 RS485 收发电路分开布局,减少相互干扰。
    • 电源部分采用隔离设计,将 MCU 电源与 RS485 总线电源隔离,提高系统抗干扰能力。
    • 每路 RS485 通道独立设计,包含收发器、匹配电阻、TVS 保护和上下拉电阻,确保通道独立性和可靠性。
    • 通过排针与 STM32H5 Nucleo 开发板连接,充分利用开发板的外设资源,降低开发难度。
  2. 软件设计思路
    • 采用分层架构,将底层硬件驱动、Modbus 协议栈和应用层分开,提高代码的可移植性和可维护性。
    • 使用结构体抽象串口通道,通过通道号映射不同的 UART 外设,实现一套协议栈服务 8 路串口。
    • 移植标准 Modbus RTU 协议栈,支持 CRC 校验、功能码 03(读保持寄存器)、06(写单个寄存器)等常用功能。
    • 构建内部软件寄存器数组,用于存储采集到的数据和配置参数,方便应用层访问和交互。

四、原理图和 PCB 展示及介绍

1. 原理图介绍

image.png

image.png

本项目原理图共 2 页,采用立创 EDA 设计:

  • 第 1 页(连接排针与电源):包含 STM32H5 Nucleo 板的排针接口定义、外部电源输入电路、隔离电源电路以及 485_5V 电源生成电路。其中,IF0505S-2W 隔离电源模块将输入的 DC5V 转换为隔离的 485_5V,为 8 路 RS485 收发器供电,实现电源隔离。
  • 第 2 页(八路 RS485 收发):包含 8 路完全相同的 RS485 收发电路,每路电路以 ADM3072EARZ 为核心,连接 STM32 的 UART_TX、UART_RX 和 ENABLE 引脚,输出 RS485_A 和 RS485_B 信号。每路电路都设计了 120Ω 终端匹配电阻(可选焊接)和 TVS 管保护。

2. PCB 展示及介绍

  • 版本信息:当前 PCB 版本为RS485-TEST-V1.1,是在 V1.0 版本基础上优化而来。
  • 打版情况:共打版 2 次。V1.0 版本存在电源走线过细、RS485 差分线不等长、滤波电容布局不合理等问题,导致部分通道通信不稳定。V1.1 版本针对这些问题进行了优化:
    1. 加粗了电源走线,增加了电源层的铜箔面积,提高了电源承载能力。
    2. 调整了 RS485 差分线的走线,确保 A/B 线等长且平行,减少信号反射。
    3. 将滤波电容尽可能靠近 ADM3072 芯片的电源引脚,提高滤波效果。
    4. 增加了丝印标注,方便焊接和调试。
  • 布局特点
    • 电源模块和输入端子位于 PCB 上方,RS485 通道整齐排列在 PCB 下方,便于接线。
    • STM32H5 Nucleo 板通过排针插在 PCB 中间,充分利用空间。
    • 隔离区域清晰划分,数字地和 485 地通过单点连接,减少地环路干扰。

五、调试软件、软件流程图和关键代码介绍

1. 调试软件

  • SSCOM V5.13.1:用于串口调试和 Modbus 数据收发测试。经测试,正点原子和 VOFA 串口助手无法正常接收 STM32H5 的串口打印数据,改用 SSCOM 后问题解决。
  • STM32CubeIDE:用于代码编写、编译和下载。

2. 软件流程图

开始


系统初始化
├─ 时钟初始化
├─ GPIO初始化
├─ UART初始化(8路)
├─ Modbus协议栈初始化
└─ 内部寄存器初始化


主循环
├─ 轮询8路串口接收数据
│ └─ 若接收到完整Modbus帧
│ ├─ CRC校验
│ ├─ 解析功能码
│ └─ 执行相应操作(读/写寄存器)
├─ 处理应用层任务
│ └─ 定时发送Modbus查询指令
└─ 状态指示(LED闪烁)

3. 关键代码介绍

  1. Modbus CRC 校验函数(查表法)

c

运行

static const uint8_t s_CRCHi[] = {
0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x81,0x41,0x00,0xC1,0x80,0x40,0x01,
// 省略其余部分...
};

const uint8_t s_CRCLo[] = {
0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,0x07,0xC7,0x05,0xC5,0xC4,0x04,
// 省略其余部分...
};

int16_t CRC16_Modbus(uint8_t* _pBuf, uint16_t _usLen) {
uint8_t crcHi = 0xFF;
uint8_t crcLo = 0xFF;
uint16_t index;

while(_usLen--) {
index = crcLo ^ *_pBuf++;
crcLo = crcHi ^ s_CRCHi[index];
crcHi = s_CRCLo[index];
}
return (uint16_t)(crcHi << 8 | crcLo);
}
  1. 通道结构体定义

c

运行

#define REG_NUM 200

typedef struct {
uint16_t addr;
uint16_t value;
} SW_REG_TYPE;

extern SW_REG_TYPE sw_reg[REG_NUM];

typedef struct {
UART_HandleTypeDef* huart_ptr;
uint8_t tx_buf[256];
uint16_t tx_count;
uint8_t rx_buf[256];
uint16_t rx_count;
} UART_BUF_TYPE;

extern UART_BUF_TYPE uart_buf[8];
  1. Modbus 功能码 06 打包函数

c

运行

void mid_mb_06_pack(uint8_t ch, uint8_t addr, uint16_t reg, int16_t value) {
uart_buf[ch].tx_buf[0] = addr;
uart_buf[ch].tx_buf[1] = 0x06;
uart_buf[ch].tx_buf[2] = (reg >> 8) & 0xFF;
uart_buf[ch].tx_buf[3] = reg & 0xFF;
uart_buf[ch].tx_buf[4] = (value >> 8) & 0xFF;
uart_buf[ch].tx_buf[5] = value & 0xFF;

uint16_t crc = CRC16_Modbus(uart_buf[ch].tx_buf, 6);
uart_buf[ch].tx_buf[6] = (crc >> 8) & 0xFF;
uart_buf[ch].tx_buf[7] = crc & 0xFF;

uart_buf[ch].tx_count = 8;
}
  1. 多通道数据发送逻辑

c

运行

while (1) {
// 向8个通道发送Modbus写寄存器指令
mid_mb_06_pack(CH1, 0x33, sw_reg[CH1].addr, sw_reg[CH1].value);
HAL_UART_Transmit(uart_port[CH1].huart_ptr, uart_buf[CH1].tx_buf, uart_buf[CH1].tx_count, HAL_MAX_DELAY);

mid_mb_06_pack(CH2, 0xC2, sw_reg[CH2].addr, sw_reg[CH2].value);
HAL_UART_Transmit(uart_port[CH2].huart_ptr, uart_buf[CH2].tx_buf, uart_buf[CH2].tx_count, HAL_MAX_DELAY);

// 省略其余6个通道的发送代码...

// 处理接收数据
if(uart_buf[CH_T].rx_count > 4) {
HAL_UART_Transmit(uart_port[CH_T].huart_ptr, uart_buf[CH_T].rx_buf, uart_buf[CH_T].rx_count, 5000);
HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
uart_buf[CH_T].rx_count = 0;
memset(uart_buf[CH_T].rx_buf, 0, sizeof(uart_buf[CH_T].rx_buf));
}
}

六、硬件功能展示图及说明

02.png01.png

1. 整体硬件展示

  • 网关由 STM32H5 Nucleo 开发板和自制 RS485 扩展板组成,扩展板通过排针插在开发板上方。
  • 扩展板上方有 2P 电源端子和 16P RS485 端子,下方整齐排列着 8 路 ADM3072 收发芯片和对应的滤波元件。
  • 开发板上的 LED 灯用于指示系统工作状态,闪烁表示系统正常运行。

2. 功能测试说明

  • 多通道通信测试:使用 SSCOM 串口助手模拟 8 台 Modbus 从机设备,网关可同时向 8 个通道发送 Modbus 指令,并正确接收从机的响应数据。
  • 波特率兼容性测试:支持 9600、19200、38400、115200 等多种波特率,通信稳定无丢包。
  • 抗干扰测试:在工业电磁环境下,网关仍能保持稳定通信,未出现数据错误或通信中断现象。

3. 串口调试数据展示

plaintext

[23:25:10.336] 收← 33 06 78 AD 00 16 85 57
[23:25:10.443] 收← 33 06 78 AD 00 17 44 97
[23:25:10.550] 收← 33 06 78 AD 00 18 04 93
[23:25:10.633] 收← 33 06 78 AD 00 19 C5 53
[23:25:10.869] 收← 33 06 78 AD 00 1A 85 52

以上为网关发送的 Modbus 功能码 06 指令数据,格式正确,CRC 校验通过,表明通信正常。

七、设计中遇到的难题和解决方法

1. STM32H5 串口打印异常问题

  • 问题描述:使用正点原子和 VOFA 串口助手无法接收 STM32H5 的串口打印数据,但使用 SSCOM 可以正常接收。
  • 解决方法:经排查,发现是 STM32H5 的串口波特率配置与部分串口助手的时钟同步机制不兼容。改用 SSCOM 串口助手后问题解决,后续将进一步研究串口驱动的优化方法。

2. 多通道 Modbus 通信冲突问题

  • 问题描述:初期软件设计中,8 路串口同时发送数据时,会出现数据丢失和通信冲突。
  • 解决方法:采用轮询机制,依次向每个通道发送数据,等待上一个通道发送完成并接收响应后,再发送下一个通道的数据。同时,为每个通道分配独立的收发缓冲区,避免数据覆盖。

3. RS485 通信抗干扰问题

  • 问题描述:在工业现场测试时,部分通道出现通信不稳定、数据错误的现象。
  • 解决方法
    1. 增加隔离电源模块,将数字地和 485 地隔离,减少地环路干扰。
    2. 在 RS485 接口处增加 TVS 管,抑制浪涌电压。
    3. 优化 PCB 布线,确保 RS485 差分线等长且平行,减少信号反射。
    4. 在总线两端增加 120Ω 终端匹配电阻,提高信号质量。

4. 电源稳定性问题

  • 问题描述:V1.0 版本 PCB 电源走线过细,导致 8 路通道同时工作时,电源电压下降,影响通信稳定性。
  • 解决方法:在 V1.1 版本中加粗了电源走线,增加了电源层的铜箔面积,并在电源输入端增加了大容量滤波电容,提高了电源的稳定性。

八、心得体会(包括意见或建议)

1. 心得体会

通过本次项目开发,我深入学习了 STM32H5 系列 MCU 的开发方法,掌握了 Modbus 协议栈的移植和多通道通信的实现技巧。在硬件设计方面,我对工业级产品的抗干扰设计有了更深刻的理解,认识到电源隔离、信号匹配和 PCB 布线的重要性。

在软件开发过程中,分层架构的设计思想大大提高了代码的可维护性和可扩展性。通过结构体抽象串口通道,实现了一套代码服务多个硬件通道,为后续的功能扩展奠定了基础。

同时,我也认识到工业产品开发的严谨性,每一个细节都可能影响产品的稳定性和可靠性。从原理图设计到 PCB 布线,再到软件调试,都需要认真对待,反复验证。

2. 意见或建议

(1)功能扩展建议

  • 加入 Modbus TCP 功能:利用 STM32H5 的以太网外设,实现 Modbus RTU 到 Modbus TCP 的协议转换,支持数据上云和远程监控。网关可以作为 Modbus TCP 服务器,接收上位机的指令,并将其转发到对应的 RS485 通道;同时也可以将采集到的 RS485 设备数据上传到以太网。
  • 增加在线配置功能:将每个通道的波特率、奇偶校验、从机地址等参数存储在 Flash 中,支持通过 Modbus 指令或网页进行在线修改,修改后无需重启即可生效。
  • 完善日志系统:增加 SD 卡存储功能,记录系统运行日志和通信数据,方便故障排查和数据分析。
  • 加入数据安全机制:对传输的数据进行加密处理,防止数据被窃取或篡改;同时增加访问控制功能,只有授权用户才能访问网关。

(2)硬件优化建议

  • 增加 RS232 电平转换电路,使每个通道可以通过跳线选择 RS485 或 RS232 电平,提高网关的兼容性。
  • 增加电源反接保护和过流保护电路,提高系统的安全性。
  • 优化 PCB 布局,将高速信号和模拟信号分开布线,进一步提高系统的抗干扰能力。

(3)软件优化建议

  • 采用 DMA 方式进行串口数据收发,提高数据传输效率,减少 CPU 占用率。
  • 增加 Modbus 功能码支持,如功能码 02(读离散输入)、04(读输入寄存器)、16(写多个寄存器)等,满足更多应用场景的需求。
  • 增加错误处理机制,当某个通道通信异常时,自动重试并记录错误信息,不影响其他通道的正常工作。
附件下载
RS485_modbus-KICAD.zip
ProPrj_02-SDMS-RS485-TEST_2026-06-01 (1).kicad_pcb
团队介绍
独立完成
评论
0 / 100
查看更多
猜你喜欢
FastBond3基础部分-基于ESP32-S3的工业4.0智能边缘网关设计该项目使用了ESP32-S3,实现了智能温湿度传感器、智能电表、智能水表的智能网关的设计,它的主要功能为:基于ESP32-S3通过网络、LORA、蓝牙。 采集、存储、转发、后端温湿度传感器、智能电表数据、智能水表数据,转发给到云平台,实现实时查看温湿度、电表、水表数据信息,对工厂环境、能耗实现实时监控,实时判断异常能耗峰谷、对工厂产能进行智能调配,产能数据进行分析。
Ject
563
M-Design设计竞赛 - 8通道高精度温度采集器该项目使用了Platformio语言、立创EDA,实现了8通道工业级温度采集器的设计,它的主要功能为:使用立创EDA绘制了电路图,基于面包板模块化搭建硬件,采用Freertos框架设计多线程任务,支持串口AT指令。。 该项目使用了立创·ESP32S3R8N8,MAX31856模块 热电偶模块,实现了24位温度采集的设计,它的主要功能为:采用两路SPI通讯获取8通道24位温度采集,可串口最高5Hz输出8通道温度数据,Serialstudio可视化。。 该项目使用了ModBus 485 USB模块,实现了ModBus RTU的设计,它的主要功能为:采用ModBus Poll进行温度数据问询,方便用户进行数据查询与采集可视化。。
2345vor
1867
FastBond4挑战部分-AMOLED蓝牙网关该项目使用了NUCLEO-U5A5开发板,实现了蓝牙网关的设计,它的主要功能为:双MCU架构,主控和蓝牙协议MCU分开,使用AMOLED显示多彩画面。
zyf005
5
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号