Files
StepMotorCtrl/README.md
T

156 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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