合宙Air780EHV模组RS485设计指南:电平匹配、TVS防护与Modbus开发实战
合宙 Air780EHV 系列模组 集成 4G 通信与音频功能(语音通话/录音/TTS),配备 LCD 屏、摄像头、RS485、CAN、以太网等丰富外设接口,支持 TCP/UDP、MQTT、HTTP、Modbus 等主流网络协议,为工业物联网和智能终端提供一站式解决方案。
今天来聊聊工业通信中非常经典的485总线,梳理一下硬件设计中需要注意的细节,并简要介绍其“搭档”—— Modbus协议在LuatOS开发中的应用。
一、 485总线接口与UART的关系
485总线接口本质上是UART总线接口的一种应用,需要搭配485收发器芯片实现。
下图为典型的参考设计:


二、电平匹配问题
在UART与485收发器芯片的搭配中,最常见需要注意的一个问题是电平匹配。
-
由于上一章节参考设计中Air780EHV和SP3485都是3.3V的IO电平,所以不再需要分立元器件电平转换电路或电平转换芯片。
-
当双方电平不一致时,则需要分立元器件电平转换电路或电平转换芯片。
常见的分立元器件电平转换电路如下:

三、485总线接口的TVS防护
工业现场环境复杂,485总线经常面临静电、浪涌等威胁,因此接口保护必不可少。
485接口用TVS,常用的型号有SM712系列,如果防护等级要求较高,也可以选择如下推荐的型号。
-
ESD等级防护:适用于一般静电防护场景。推荐型号:应能微ASM712
-
TVS等级防护:具备2KV 1.2/50uS浪涌能力。推荐型号:应能微SMBJ7.0CAW
-
TSS等级防护:具备4KV 10/700uS浪涌能力。推荐型号:应能微P0080SA
四、Modbus通信协议
与485总线接口强相关的通信协议是Modbus。此前我们发布过一版LuatOS的modbus核心库,但使用难度较高。为此,我们特别设计了exmodbus扩展库——在核心库的基础上封装了更简洁易用的API,大大降低了开发难度,让开发者可以快速集成Modbus通信。
exmodbus最新API文档详见合宙资料中心
核心示例持续更新中,敬请关注!
`PROJECT = "RTU_MASTER"
VERSION = "001.000.000"
-- 在日志中打印项目名和项目版本号
log.info("main", PROJECT, VERSION)
local exmodbus = require("exmodbus")
-- 使用 Air8000 开发板测试打开这两个
gpio.setup(16, 1) -- RS485 芯片供电引脚
local rs485_dir_gpio = 17 -- RS485 方向引脚
-- 使用 Air780EPM 开发板测试打开这三个;
-- gpio.setup(1, 1) -- Air780EPM RS485 芯片供电引脚
-- gpio.setup(23, 1) -- Air780EPM vref 脚拉高
-- local rs485_dir_gpio = 24 -- Air780EPM RS485 方向引脚(V1.2 是 25,V1.3 是 24)
-- 创建 RTU 主站配置参数;
-- 说明:创建 RTU 主站时只需要配置如下参数即可;
local create_config = {
-- 串口配置参数;
mode = exmodbus.RTU_MASTER, -- 通信模式
uart_id = 1, -- UART 端口号
baud_rate = 115200, -- 波特率
data_bits = 8, -- 数据位
stop_bits = 1, -- 停止位
parity_bits = uart.None, -- 校验位
byte_order = uart.LSB, -- 字节顺序
rs485_dir_gpio = rs485_dir_gpio, -- RS485 方向引脚
rs485_dir_rx_level = 0, -- RS485 接收方向电平
}
-- 初始化从站 1 数据结构
-- 用于记录从站 1 保持寄存器 0-1 的值;
local slave1_data = {}
-- 配置读取从站 1 保持寄存器 0-1 的值;
local read_config = {
raw_request = string.char(
0x01, -- 从站地址
0x03, -- 功能码:读取保持寄存器
0x00, 0x00, -- 寄存器起始地址
0x00, 0x02, -- 寄存器数量
0xC4, 0x0B -- CRC16校验码
),
timeout = 1000 -- 超时时间 1000 ms
}
-- 创建 RTU 主站实例
local rtu_master = exmodbus.create(create_config)
-- 判断主站是否创建成功并记录日志
if not rtu_master then
log.info("exmodbus_test", "rtu_master 创建失败")
else
log.info("exmodbus_test", "rtu_master 创建成功")
end
-- 读取从站 1 保持寄存器数据的函数
local function read_slave1_holding_registers()
log.info("exmodbus_test", "开始读取从站 1 保持寄存器 0-1 的值")
-- 定时任务函数:每 2 秒调用一次读取函数
local function task()
while true do
if rtu_master then
-- 每 2 秒调用一次读取函数
read_slave1_holding_registers()
else
log.info("exmodbus_test", "rtu_master 未创建,无法执行 read_slave1_holding_registers()")
end
sys.wait(2000)
end
end
-- 初始化任务
sys.taskInit(task)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!`
今天就分享到这了,想要了解更多内容请关注合宙资料中心
合宙LuatOS提供一站式物联网高效解决方案,集成高速通信、外设驱动、UI交互及视觉处理,助力行业客户快速落地产品,同时实现极致低功耗一一相较于传统的“串口屏+DTU方案”或安卓方案,功耗减半,成本不足三分之一。

浙公网安备 33010602011771号