平台:STM32F103C8(标准外设库)
执行器:串口协议型无刷电机 / 一体式无刷舵机模组(双电机)
通信:USART2 @ 115200,帧格式0x7A … BCC … 0x7B
接收:DMA + 空闲中断解析位置反馈
演示:多圈位置 + T 型轨迹,0 ↔ 18000 平滑往返,OLED 显示实时位置
本仓库为电赛备赛中的 无刷电机开源工程:MCU 不直接做六步换相,而是通过串口驱动外部无刷驱动器,完成使能、模式、速度、加速度、位置与反馈。
上电后依次完成:
- 初始化 OLED、USART2(115200)与 DMA 接收
- 双电机:使能 → 多圈位置 + T 型轨迹模式 → 设加速度 → 设规划速度
- 主循环在目标位置
0与18000之间周期切换,两台电机同步往返 - 轮询请求位置反馈,在 OLED 上显示 M1 / M2 实时位置
适合作为:
- 串口协议型无刷模组的 驱动层模板
- 电赛中需要「平滑定位 / 双轴齐步」时的 执行机构例程
- 与视觉云台、云台底座等方案对接的底层通信参考
注意:
18000是驱动器内部位置单位,不是角度本身,需按减速比与编码器分辨率实机标定。
┌────────────┐ USART2 115200 ┌──────────────────┐
│ STM32F103 │ PA2 TX ───────► │ 无刷驱动器 M1 │──► 无刷电机 1
│ + OLED │ PA3 RX ◄─────── │ 无刷驱动器 M2 │──► 无刷电机 2
└────────────┘ GND 共地 └──────────────────┘
│
│ 软件 I2C
▼
OLED 0.96"
main 配置:Enable → Mode(T型多圈) → Acc → Speed
│
├─ 周期:BLDC_Set_Position(id, 0 或 18000)
│
└─ 周期:BLDC_Req_Feedback(id)
│
DMA + IDLE 收满一帧
│
解析位置 → Motorx.Current_Position
│
OLED 显示
帧头 0x7A | ID 1B | CMD 1B | 数据区 N 字节 | BCC(XOR) | 帧尾 0x7B
- BCC:从帧头到数据区末字节的 逐字节异或(XOR)
- 发送与接收校验方式一致
| CMD | 含义 |
|---|---|
0x00 |
设置模式 |
0x01 |
设置速度 |
0x02 |
设置位置 |
0x06 |
电机使能 |
0x07 |
设置加速度 |
0x0E |
请求反馈(位置等) |
| 宏 | 含义 |
|---|---|
MOTOR_MODE_SPEED |
速度模式 |
MOTOR_MODE_POS_MULTI_T |
多圈位置 + T 型轨迹(推荐往返定位) |
MOTOR_MODE_POS_SINGLE_T |
单圈位置 + T 型轨迹 |
MOTOR_MODE_POS_MULTI_DIR |
多圈位置(直接,启停偏硬) |
MOTOR_MODE_POS_SINGLE_DIR |
单圈位置(直接) |
演示默认使用 多圈 + T 型轨迹,启停更柔和。
| 功能 | STM32 | 电机驱动侧 |
|---|---|---|
| TX | PA2(USART2_TX) | RX |
| RX | PA3(USART2_RX) | TX |
| GND | GND | 必须共地 |
- 波特率:115200,8N1
- 默认电机 ID:
Motor1.ID = 1,Motor2.ID = 2(须与驱动器拨码/软件地址一致) - 逻辑电平以驱动器手册为准(常见 3.3V TTL;若为 5V 需注意电平兼容)
- OLED:见
OLED.c(软件 I2C,常见 PB8/PB9,以工程配置为准)
User/
main.c # 双机平滑往返演示
stm32f10x_it.c / .h
Hardware/
bldc_motor.c / .h # 串口协议驱动 + DMA/IDLE 接收
OLED.* / Key / LED
System/ Library/ Start/ # 延时、启动文件、标准库
Project.uvprojx # Keil 工程
Project.code-workspace # EIDE / VS Code
void BLDC_Init(uint32_t baudrate); // 初始化 USART2 + DMA 接收
void BLDC_Enable(uint8_t id); // 使能
void BLDC_Set_Mode(uint8_t id, uint8_t mode);
void BLDC_Set_Speed(uint8_t id, int speed);
void BLDC_Set_Position(uint8_t id, int position);
void BLDC_Set_Acceleration(uint8_t id, uint16_t acc);
void BLDC_Req_Feedback(uint8_t id); // 请求反馈;位置写入 Motorx.Current_Position全局对象:Motor1 / Motor2(见 bldc_motor.c 默认 ID 与模式)。
| 参数 | 默认 | 说明 |
|---|---|---|
| 模式 | 多圈 + T 轨迹 | 0x0001 |
| 加速度 | 50 | 越大越“冲”,越小越软 |
| 规划速度 | 40 | 位置模式下的过程速度 |
| 目标 A/B | 0 / 18000 | 务必标定 |
| 换向周期 | time_count >= 150 |
约数秒一级;加速软时应加大 |
- Keil 打开
Project.uvprojx(或 EIDE 打开 workspace) - 确认电机 ID、TX/RX 交叉、共地
- 编译下载,上电观察:
- 电机在两端点间平滑往返
- OLED 上 M1/M2 位置数值变化
- 若行程不对:只改
target_position的两个端点做标定
| 现象 | 排查 |
|---|---|
| 完全不动 | 是否 BLDC_Enable;ID 是否匹配;TX/RX 是否交叉;是否共地 |
| 偶发丢指令 | 上电后 Delay 是否足够;总线是否过载;驱动器是否忙 |
| 往返抢轨迹 | 换向周期太短 / 加速度太软还没到位又改目标 |
| 位置显示不更新 | DMA/IDLE 中断是否进;反馈帧格式是否与手册一致 |
| 冲击大 | 改用 T 型模式,减小速度与加速度 |
18000 转太多/太少 |
位置单位与减速比相关,重新标定端点 |
- 组帧发送:
0x7A + ID + CMD + data + XOR + 0x7B,见bldc_motor.c - DMA 循环接收 + USART 空闲中断:一帧结束再解析,避免主循环堵死等字节
- 双实例结构体:
Target_*与Current_Position分离,便于闭环扩展 - T 型轨迹交给驱动器:MCU 只发位置/速度/加速度,平滑由模组完成
注意:
USART2_IRQHandler在bldc_motor.c中实现,请勿在stm32f10x_it.c再定义同名函数。
| 仓库 | 说明 |
|---|---|
| dual-stepper-trapezoid | 2023 E 题 · 双步进视觉云台(MCU 侧梯形加减速) |
| 2023-dian-sai-visual-gimbal | 2023 E 题 · 舵机视觉云台 |
- 用途:学习、电赛备赛与二次开发
- 协议细节、位置单位、模式编号 以你手中的电机/驱动器手册为准;本仓库按常见一体式串口无刷模组约定实现
- 欢迎 Issue / PR 补充手册型号、实测标定参数与接线照片
STM32F103 + USART 协议型无刷 · 双机 T 型轨迹平滑往返