电赛备赛开源:STM32 双步进视觉云台 + 无刷电机串口驱动(附 GitHub)
本文对应两个已开源工程,适合 全国大学生电子设计竞赛备赛 / STM32 电机控制 / 视觉云台 学习与二次开发。 文末附仓库地址,代码可直接克隆。
写在前面
备赛电赛时,电机控制与视觉闭环是高频考点。很多同学卡在:
- 步进电机高速就抖、失步,不会做梯形加减速
- 视觉坐标来了,电机却「跟不住」或「来回抖」
- 买了串口协议型无刷模组,协议组帧、反馈解析不会写
最近把两套备赛工程整理后开源到 GitHub,本文做 整体介绍 + 关键设计点,方便对照仓库阅读。
| 双步进视觉云台 | 2023 电赛 E 题《运动目标控制系统》步进方案 | dual-stepper-trapezoid |
| 无刷电机串口驱动 | 双机 T 型轨迹平滑往返 + DMA 反馈 | brushless-motor |
平台均为 STM32F103C8 + 标准外设库(SPL),Keil / EIDE 可直接打开。
一、2023 电赛 E 题:双步进视觉云台
1.1 题目在考什么
2023 年全国大学生电子设计竞赛 E 题《运动目标控制系统》,核心可以概括成一句话:
看见目标 → 控制二维云台 → 让激光/指示点跟上运动目标
能力拆解大致是:
| 目标感知 | 摄像头识别色块/激光/路径点 | K230 视觉 + UART 定长帧 |
| 二维控制 | 水平 + 俯仰 | 双路步进电机 |
| 动态跟随 | 误差收敛、少抖、少丢步 | 像素 PID → 步/帧 → 可打断加减速 |
| 稳态 | 对准后微抖小 | 像素死区 + 输出限幅 + 平滑停 |
题目不强制舵机或步进。舵机上手快;步进精度高、可开环累计位置、便于做显式加减速。本仓库是 步进版闭环云台。
1.2 系统数据流(主线)
K230 视觉 –UART 115200–> 帧状态机 –> actual / target 像素
|
err = target – actual
|
PID(输出:步/帧)
|
Motor_Move / Motor_Stop(可打断)
MOTOR1=水平 MOTOR2=俯仰
|
OLED 调试
协议语义(与常见 2023 视觉脚本一致):
- (x1,y1) = Actual 实际点
- (x2,y2) = Target 目标点
- 闭环目标:err → 0
帧格式(12 字节):
0xAA | x1 | y1 | x2 | y2 | z | 0x55
多字节为大端有符号 int16。解析用状态机在串口中断里逐字节喂入,抗干扰、无动态内存。
1.3 硬件接线摘要
| 水平 STEP/DIR | PA0 / PA3 | TIM2_CH1 PWM |
| 俯仰 STEP/DIR | PA6 / PA7 | TIM3_CH1 PWM |
| K230 TX | → PA10 | USART1_RX,115200 |
| OLED | PB8 / PB9 | 软件 I2C |
| 驱动板 | A4988 / DRV8825 / TMC 等 | STEP/DIR,VMOT 常见 12V,共地 |
细分拨码必须与软件一致(例如 32 细分 → 6400 步/圈),否则 PID 等效增益全错。
1.4 五个值得讲的技术点(S 级)
(1)PWM 硬件发脉冲,中断只数步调速
不要主循环 bit-bang 步进脉冲。用定时器 PWM 出 STEP,更新中断里:
- 步数 +1
- 按相位改速度
- 写 ARR
CPU 才能腾出来跑视觉 PID。
(2)1 MHz 时基,ARR ≈ 每步微秒数
72 MHz 下 PSC=71 → 1 MHz,速度与周期换算直观:
ARR ≈ 1_000_000 / v (v 单位:步/秒)
(3)灵魂公式:逐步更新速度
加速/减速段每步:
v = √(v² ± 2a)
再限幅到 v0~vMax。短距离自动退化为 三角曲线(无匀速段),长距离为 梯形。
(4)运动可打断(视觉闭环刚需)
Motor_Move 在电机还在跑时再次调用,会 停当前规划并按新步数重规划,绝对位置保留。
- Demo 往返:「忙则丢指令」还能凑合
- E 题跟踪:「每帧新误差必须能生效」→ 必须可打断
(5)PID 单位是「步/帧」,不是「度」
// 输入:像素误差;输出:本帧希望再走的相对步数
steps = DIR * PID_Calc(&pid, target_px, actual_px);
- max_output 限制单帧最大步数,防猛甩丢步
- 像素死区(如 3)内强制 0 步并 Motor_Stop,抑抖
- 方向反了改 PAN_DIR / TILT_DIR,不必先改接线
1.5 联调建议
仓库内还有 连线说明书.md,上电顺序、EN、共地都写了。
仓库地址: https://github.com/kaka12331/dual-stepper-trapezoid
(同账号还有舵机版云台:2023-dian-sai-visual-gimbal,可对比「度/帧」与「步/帧」。)
二、无刷电机:串口协议 + 双机 T 型轨迹往返
2.1 工程定位
很多市售「一体式无刷舵机/模组」不需要你在 STM32 里做六步换相,而是:
MCU 按固定帧格式发串口指令 → 驱动器内部完成换相、电流环、轨迹规划
本工程演示:
2.2 帧格式
帧头 0x7A | ID 1B | CMD 1B | 数据 N 字节 | BCC(XOR) | 帧尾 0x7B
BCC = 从帧头到数据末字节的逐字节异或。
常用指令(以本仓库代码为准,最终以手册为准):
| 0x00 | 设模式 |
| 0x01 | 设速度 |
| 0x02 | 设位置 |
| 0x06 | 使能 |
| 0x07 | 设加速度 |
| 0x0E | 请求反馈 |
模式上推荐演示用:
- MOTOR_MODE_POS_MULTI_T:多圈位置 + T 型轨迹(启停更柔)
2.3 接线
| PA2 USART2_TX | RX |
| PA3 USART2_RX | TX |
| GND | 必须共地 |
默认 Motor1.ID=1,Motor2.ID=2,须与驱动器地址一致。
2.4 API 一览
BLDC_Init(115200);
BLDC_Enable(id);
BLDC_Set_Mode(id, mode);
BLDC_Set_Acceleration(id, acc);
BLDC_Set_Speed(id, speed);
BLDC_Set_Position(id, position);
BLDC_Req_Feedback(id); // 解析后写入 Motorx.Current_Position
2.5 标定提醒(很重要)
18000 是 驱动器内部位置单位,不是角度。换电机/减速比后务必重标定两端点,否则「转太少/转飞了」都正常。
换向周期、加速度、规划速度要匹配:加速设得很软时,周期太短会「还没到位又改目标」。
仓库地址: https://github.com/kaka12331/brushless-motor
三、两套工程怎么选型
| 2023 E 题视觉跟踪、开环步进云台 | dual-stepper-trapezoid |
| 已有串口无刷模组,要平滑定位/双机同步 | brushless-motor |
| 想对比舵机 vs 步进云台 | 步进仓 + 舵机仓 |
共同点:
- STM32F103 + 标准库,注释按「讲解/答辩」写得比较细
- 重视 通信协议、单位(步/帧 vs 度/帧 vs 驱动器内部位置) 和 联调顺序
四、克隆与编译
git clone https://github.com/kaka12331/dual-stepper-trapezoid.git
git clone https://github.com/kaka12331/brushless-motor.git
- Keil:打开各自 Project.uvprojx
- 或 EIDE / VS Code:打开 Project.code-workspace
建议先通电看 Demo,再改 PID / 端点位置 / 视觉宏。
五、小结
如果本文对你备赛有帮助,欢迎 Star 仓库;有手册型号、标定参数或接线改进,也欢迎提 Issue / PR。
相关链接
- 步进视觉云台:https://github.com/kaka12331/dual-stepper-trapezoid
- 无刷串口驱动:https://github.com/kaka12331/brushless-motor
- 舵机视觉云台:https://github.com/kaka12331/2023-dian-sai-visual-gimbal
网硕互联帮助中心






评论前必须登录!
注册