master
StepMotorCtrl - 步进电机控制系统
基于 PY32MD530H28U7TR 单片机的步进电机控制系统,适用于 claw machine(抓娃娃机)等场景,提供精准的电机位置控制、角度控制和标定功能。
硬件平台
| 项目 | 说明 |
|---|---|
| 主控芯片 | PY32MD530H28U7TR (Cortex-M0+) |
| 电机驱动 | TIM1 高分辨率 PWM,正弦/余弦微步进控制 |
| 角度传感器 | AS5600 (I2C1, 地址 0x36) |
| 存储器 | AT24C02 (I2C1, 地址 0xA0) |
| 电流检测 | PGA + 内部 ADC |
| 通讯接口 | RS485 (USART1, Modbus RTU)、UART1 (调试)、LPUART1 (备份) |
| 到位开关 | DI_MIN (原点)、DI_MAX (最大值) |
| ID 指示器 | 4 位 GPIO (PB5 |
引脚分配
详见 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
构建步骤
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 | 结束标定 |
通讯示例
# 读当前位置
请求: 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
功能说明
步进电机控制
- S 型加减速算法,支持加速、匀速、减速三个阶段
- 正弦/余弦微步进驱动,每电周期 1024 个微步
- 支持绝对位置移动和相对位置移动
- 到位自动停止,支持紧急停止
标定功能
- 自动标定:运行到 DI_MIN 和 DI_MAX 开关位置,记录步数
- 无 DI_MAX 时:根据原点开关和标定步数计算导轨长度
整机逻辑
- 上电初始化后进入待机模式,等待 Modbus 指令
- 支持指令队列和状态上报
- LED 指示灯反馈:待机 (500ms 闪烁)、运行 (100ms 闪烁)、标定 (80ms 闪烁)
功能文档
| 文档 | 说明 |
|---|---|
| function.md | 功能规格与运行逻辑 |
| command.md | Modbus 指令集与通讯协议 |
| PinConfig.md | 引脚配置表 |
License
Proprietary
Description
Languages
C
93.2%
Assembly
3.1%
CMake
1.9%
Shell
0.9%
Linker Script
0.9%