Files
StepMotorCtrl/.trae/skills/create-project/references/command.md
T

5.7 KiB
Raw Blame History

指令说明

Modbus 通讯参数

参数
物理层 RS485 半双工
串口 UART1 (USART1)
波特率 115200
数据位 8
校验位
停止位 1
主站地址 0xFE
从站地址 0x40 + ID,ID 由 4 个 GPIO 引脚组合(范围 0~15),见 ID 指示器定义
协议 Modbus RTU

Modbus 功能码

功能 码值 说明
读保持寄存器 0x03 读取 1~125 个连续寄存器
写单个寄存器 0x06 写入 1 个寄存器

寄存器映射

地址 名称 读写 数据类型 说明
0x0000 MOTOR_CURRENT R uint16 电机电流值
0x0001 MOTOR_POSITION R int16 当前位置(步数)
0x0002 MOTOR_TARGET R/W int16 目标位置(步数)
0x0003 MOTOR_SPEED R uint16 当前速度
0x0004 MOTOR_STATE R uint16 步进电机状态(0=空闲,1=加速,2=匀速,3=减速,4=停止,5=标定中)
0x0005 AS5600_ANGLE R uint16 AS5600 角度值(0.1°精度,0~3599
0x0006 AS5600_RAW R uint16 AS5600 原始值
0x0007 DI_MAX_STATE R uint16 最大值到位开关(0=未触发,1=触发)
0x0008 DI_MIN_STATE R uint16 最小值到位开关(0=未触发,1=触发)
0x0009 CALIBRATED_STEPS R uint16 标定的总步数
0x000A ORIGIN_STEPS R int16 原点步数(最小值位置)
0x000B MAX_STEPS R int16 最大步数(最大值位置)
0x000C IS_CALIBRATED R uint16 是否已标定(0=未标定,1=已标定)
0x000D IS_DI_MAX_INSTALLED R uint16 DI_MAX 是否安装(0=未安装,1=已安装)
0x000E MODBUS_SLAVE_ADDR R uint16 当前 Modbus 从站地址(如 0x40~0x4F
0x000F DEVICE_ID R uint16 设备 ID0~15
0x0020 MOTOR_POSITION_H R int16 当前位置高 16 位
0x0021 MOTOR_TARGET_H R/W int16 目标位置高 16 位
0x0022 CALIBRATED_STEPS_H R uint16 标定总步数高 16 位
0x0023 ORIGIN_STEPS_H R int16 原点步数高 16 位
0x0024 MAX_STEPS_H R int16 最大步数高 16 位
0x0042 CMD W uint16 指令寄存器(写入指令码触发动作)
0x0043 STATUS R uint16 整机状态(读寄存器)
0x0044 ANGLE_TARGET R/W uint16 角度目标值(单位 0.1°,范围 0~3600)

注:32 位数据(如位置、步数)拆分到两个 16 位寄存器中:

  • 低 16 位在主地址(如 0x0001
  • 高 16 位在主地址 + 0x0020(如 0x0021
  • 读写时需分别操作两个寄存器。

指令码(CMD 寄存器 0x0042

写入 0x0042 寄存器触发动作,写完后硬件自动清零:

指令码 名称 说明
0x0001 GO_MAX 运行到最大值位置
0x0002 GO_MIN 运行到最小值位置(原点)
0x0003 STOP 立即停止运行
0x0004 GO_POSITION 运行到指定步数(需先写入 MOTOR_TARGET
0x0005 GO_ANGLE 运行到指定角度(需先写入 ANGLE_TARGET
0x0006 CALIBRATE 开始标定
0x0007 CALIB_END 结束标定
0x0008 READ_STATUS 读取当前状态(读 STATUS 寄存器即可)

整机状态(STATUS 寄存器 0x0043

读取 0x0043 寄存器获取整机运行状态:

状态码 名称 说明
0x0000 IDLE 待机模式,等待指令
0x0001 RUNNING 正在运行(移动到目标位置中)
0x0002 CALIB 正在标定
0x0003 STOPPED 已停止(执行停止指令后)
0x0004 ERROR 错误状态

通信示例

读当前位置

请求:  FE 03 00 01 00 01 CRC_LO CRC_HI
响应:  40+ID 03 02 POS_HI POS_LO CRC_LO CRC_HI

读整机状态

请求:  FE 03 00 43 00 01 CRC_LO CRC_HI
响应:  40+ID 03 02 00 01 CRC_LO CRC_HI        <- 状态 = RUNNING

运行到最大值

请求:  FE 06 00 42 00 01 CRC_LO CRC_HI
响应:  40+ID 06 00 42 00 01 CRC_LO CRC_HI

运行到指定步数(1000 步)

请求:  FE 06 00 02 03 E8 CRC_LO CRC_HI         <- 写 MOTOR_TARGET = 1000
响应:  40+ID 06 00 02 03 E8 CRC_LO CRC_HI
请求:  FE 06 00 42 00 04 CRC_LO CRC_HI         <- 写 CMD = GO_POSITION
响应:  40+ID 06 00 42 00 04 CRC_LO CRC_HI

运行到指定角度(45.0°)

请求:  FE 06 00 44 01 C2 CRC_LO CRC_HI         <- 写 ANGLE_TARGET = 450(45.0°)
响应:  40+ID 06 00 44 01 C2 CRC_LO CRC_HI
请求:  FE 06 00 42 00 05 CRC_LO CRC_HI         <- 写 CMD = GO_ANGLE
响应:  40+ID 06 00 42 00 05 CRC_LO CRC_HI

读取多个寄存器(当前位置+速度+状态)

请求:  FE 03 00 01 00 04 CRC_LO CRC_HI
响应:  40+ID 03 08 POS_HI POS_LO TGT_HI TGT_LO SPD_HI SPD_LO STA_HI STA_LO CRC_LO CRC_HI

标定流程

请求:  FE 06 00 42 00 06 CRC_LO CRC_HI         <- 开始标定
响应:  40+ID 06 00 42 00 06 CRC_LO CRC_HI
(标定执行中...)
请求:  FE 03 00 43 00 01 CRC_LO CRC_HI         <- 查询状态
响应:  40+ID 03 02 00 02 CRC_LO CRC_HI         <- 状态 = CALIB
...
请求:  FE 06 00 42 00 07 CRC_LO CRC_HI         <- 结束标定
响应:  40+ID 06 00 42 00 07 CRC_LO CRC_HI

停止运行

请求:  FE 06 00 42 00 03 CRC_LO CRC_HI
响应:  40+ID 06 00 42 00 03 CRC_LO CRC_HI

从站地址计算

设备 ID 由 4 个 GPIO 引脚 (PB5~PB8) 读取:

PB8 PB7 PB6 PB5 ID 从站地址
0 0 0 0 0 0x40
0 0 0 1 1 0x41
0 0 1 0 2 0x42
... ... ... ... ... ...
1 1 1 1 15 0x4F

从站地址计算公式:0x40 + ID