# StepMotorCtrl - 步进电机控制系统 基于 **PY32MD530H28U7TR** 单片机的步进电机控制系统,适用于 claw machine(抓娃娃机)等场景,提供精准的电机位置控制、角度控制和标定功能。 ## 硬件平台 | 项目 | 说明 | |------|------| | 主控芯片 | PY32MD530H28U7TR (Cortex-M0+) | | 电机驱动 | TIM1 高分辨率 PWM,正弦/余弦微步进控制 | | 角度传感器 | AS5600 (I2C1, 地址 0x36) | | 存储器 | AT24C02 (I2C1, 地址 0x50) | | 电流检测 | PGA + 内部 ADC | | 通讯接口 | RS485 (USART1, Modbus RTU)、UART1 (调试)、LPUART1 (备份) | | 到位开关 | DI_MIN (原点)、DI_MAX (最大值) | | ID 指示器 | 4 位 GPIO (PB5~PB8),支持 0~15 共 16 个地址 | ### 引脚分配 详见 [PinConfig.md](.trae/skills/create-project/references/PinConfig.md) ## 软件架构 ``` StepMotorCtrl/ ├── app/ # 应用层 │ ├── main.c # 主程序入口 │ ├── stepper/ # 步进电机控制 │ └── tasks/ # 任务模块(work_task, monitor_task) ├── bsp/ # 板级支持包 │ ├── device/ # 外设驱动 │ │ ├── as5600/ # 角度传感器 │ │ ├── eeprom/ # 存储器 │ │ ├── id/ # ID 指示器 │ │ ├── key/ # 按键 │ │ ├── led/ # LED │ │ └── limit_switch/ # 到位开关 │ ├── modbus/ # Modbus RTU 从站 │ └── hardware_init.c/h # 硬件初始化 ├── config/ # 配置文件 │ └── config.h # 引脚定义与参数配置 ├── drv/ # 驱动层 │ ├── adc/ # ADC + PGA │ ├── gpio/ # GPIO │ ├── i2c/ # I2C │ ├── log/ # 日志 │ ├── system/ # 系统时钟 + 数据总线 │ ├── timer/ # 定时器 PWM │ └── uart/ # UART └── libs/ # MCU 官方库 ├── CMSIS/ # Cortex-M 内核头文件 └── device/ # PY32MD530 设备文件 + 链接脚本 ``` ## 构建 ### 环境要求 - **编译器**: arm-none-eabi-gcc (含 newlib-nano) - **构建工具**: CMake + MinGW Make (Windows) / make (Linux) - **烧录工具**: 建议使用 PyOCD 或 J-Link ### 构建步骤 ```bash mkdir build && cd build cmake .. -G "MinGW Makefiles" mingw32-make -j4 ``` 生成文件: - `StepMotorCtrl.elf` — ELF 可执行文件 - `StepMotorCtrl.hex` — HEX 烧录文件 - `StepMotorCtrl.bin` — BIN 烧录文件 ## Modbus 通讯协议 | 参数 | 值 | |------|-----| | 物理层 | RS485 半双工 | | 波特率 | 115200, 8N1 | | 协议 | Modbus RTU | | 主站地址 | 0xFE | | 从站地址 | 0x40 + ID (ID 由 PB5~PB8 引脚读取) | ### 主要寄存器 | 地址 | 名称 | 说明 | |------|------|------| | 0x0001 | MOTOR_POSITION | 当前位置 (步数) | | 0x0002 | MOTOR_TARGET | 目标位置 (步数) | | 0x0005 | AS5600_ANGLE | 角度值 (0.1°, 0~3599) | | 0x000F | DEVICE_ID | 设备 ID (0~15) | | 0x0042 | CMD | 指令寄存器 | | 0x0043 | STATUS | 整机状态 | | 0x0044 | ANGLE_TARGET | 角度目标 (0.1°, 0~3600) | ### 指令码 | 码值 | 指令 | 说明 | |------|------|------| | 0x01 | GO_MAX | 运行到最大值 | | 0x02 | GO_MIN | 运行到最小值 (原点) | | 0x03 | STOP | 停止运行 | | 0x04 | GO_POSITION | 运行到指定步数 | | 0x05 | GO_ANGLE | 运行到指定角度 | | 0x06 | CALIBRATE | 开始标定 | | 0x07 | CALIB_END | 结束标定 | ### 通讯示例 ```hex # 读当前位置 请求: FE 03 00 01 00 01 CRC_LO CRC_HI 响应: 40+ID 03 02 POS_HI POS_LO CRC_LO CRC_HI # 运行到最大值 请求: FE 06 00 42 00 01 CRC_LO CRC_HI 响应: 40+ID 06 00 42 00 01 CRC_LO CRC_HI # 运行到指定角度 (45.0°) 请求: FE 06 00 44 01 C2 CRC_LO CRC_HI <- ANGLE_TARGET = 450 请求: FE 06 00 42 00 05 CRC_LO CRC_HI <- CMD = GO_ANGLE ``` 详见 [command.md](.trae/skills/create-project/references/command.md) ## 功能说明 ### 步进电机控制 - S 型加减速算法,支持加速、匀速、减速三个阶段 - 正弦/余弦微步进驱动,每电周期 1024 个微步 - 支持绝对位置移动和相对位置移动 - 到位自动停止,支持紧急停止 ### 标定功能 - 自动标定:运行到 DI_MIN 和 DI_MAX 开关位置,记录步数 - 无 DI_MAX 时:根据原点开关和标定步数计算导轨长度 ### 整机逻辑 - 上电初始化后进入待机模式,等待 Modbus 指令 - 支持指令队列和状态上报 - LED 指示灯反馈:待机 (500ms 闪烁)、运行 (100ms 闪烁)、标定 (80ms 闪烁) ## 功能文档 | 文档 | 说明 | |------|------| | [function.md](.trae/skills/create-project/references/function.md) | 功能规格与运行逻辑 | | [command.md](.trae/skills/create-project/references/command.md) | Modbus 指令集与通讯协议 | | [PinConfig.md](.trae/skills/create-project/references/PinConfig.md) | 引脚配置表 | ## License Proprietary