STM32 电机 PID 调速系统(一)环境搭建,我踩过的 3 个致命大坑
2026/9/7 21:40:51 网站建设 项目流程

STM32 电机 PID 调速系统(一)环境搭建,我踩过的 3 个致命大坑

从 0 到 1 打磨一份可以写进简历的嵌入式实战项目|系列第一篇

硬件环境:STM32F103C8T6 蓝板 + ST‑LINK V2 + PlatformIO(Arduino 框架)


前言

大二暑假,我决定动手做电机 PID嵌入式软件驱动项目。大学课内实验大多停留在点灯、串口打印这类简单例程;网上不少网课为了引流,直接封装好底层、提供现成库文件,配套专属开发板。这种高度封装的教学商业化很重,跟着做完,也很难独立完整落地一套驱动,最终只能得到一个玩具 Demo,放到嵌入式软件面试里很难有说服力。
所以这一系列文章,我打算从底层一步步记录,电机驱动、正交编码器测速、PID 算法调参全部自己捋一遍,不直接套用封装好的库,完整记录踩坑过程,方便自己复盘,也希望能给正在学习 STM32 驱动开发的同学一点参考。

我手上另一个项目是 ESP32 水质监测,偏向物联网传感、云边协同;我想再补齐单片机底层驱动、实时闭环控制这块能力,两个项目技术栈互补,简历内容不会重复。

做这个项目我的目标很明确:

  1. 丰富简历竞赛素材:不是玩具 demo,分层架构,完整可实物运行,竞赛、秋招面试都可以讲
  2. 练习工程化思维:严格按照驱动层‑算法层‑应用层分层开发,贴近工业项目的编写思路,不能写成一锅粥的 main 函数
  3. 循序渐进学 STM32:先用 Arduino 框架快速跑通全部功能,拿到正向反馈;后续再下沉学习 HAL 库、寄存器,降低上手挫败感

💡核心思路:先跑通实物,再深挖底层原理,不要一上来死磕寄存器打击信心。


硬件选型

部件型号 & 说明
主控STM32F103C8T6 蓝板 (Blue Pill)
下载调试器ST‑LINK V2
电机带 AB 相正交编码器直流减速电机
电机驱动TB6612FNG H 桥驱动模块
外设显示0.96 寸 OLED 屏幕 SSD1306(I2C)

为什么选择 STM32F103C8T6?

  • 行业普及度高:市面上大量产品还在使用 F1 系列,面试高频芯片,学会可以迁移到 F4/F103 其他型号
  • 内核Cortex‑M3,主频 72MHz,Flash 64KB,RAM 20KB,资源做电机闭环控制完全够用
  • 性价比极高,价格便宜,网上教程、踩坑案例海量,遇到 bug 很容易找到参考

⚠️ 注意区分:72MHz 是芯片系统主频,不是外设通信频率;RAM 只有 20KB,写代码要注意内存开销。

为什么选用 PlatformIO?

  • 完全免费开源,Windows、Mac、Linux 工程文件通用,不用来回换 IDE
  • 编译、烧录、串口监视器集成一体,不需要来回切换软件
  • 库依赖管理简单,一行配置自动拉取第三方库,省去手动复制 .h/.c 文件的麻烦

为什么用 Arduino 框架起步?

  • STM32duino 把底层寄存器初始化做了封装,不用一开始就啃复杂寄存器配置,可以快速把电机、编码器、OLED 跑起来
  • 我的学习路线:Arduino 快速实现闭环 → 回过头研读底层 HAL、定时器寄存器
  • 避免一上来直接寄存器开发,调试几天看不到现象直接摆烂

PlatformIO 完整工程配置

直接复制这份platformio.ini就可以编译使用:

[env:bluepill_f103c8] platform = ststm32 board = bluepill_f103c8 framework = arduino upload_protocol = stlink monitor_speed = 115200 lib_deps = adafruit/Adafruit SSD1306@^2.5.0 ; OLED屏幕驱动 adafruit/Adafruit GFX Library@^1.11.0 ; OLED绘图库 2093 ; STM32duino FreeRTOS库ID

编译命令:

pio run

补充说明:lib_deps会联网自动下载依赖库。FreeRTOS 这里直接填数字 ID2093,可以规避库名空格带来的找不到包问题。


⚠️ 血泪踩坑,新手 90% 都会中招

🔥 坑 1:工程放在中文路径,直接链接报错

报错信息:

ld.exe: cannot open map file ... Illegal byte sequence
  • 现象:代码本身没有错误,编译到链接阶段直接失败。
  • 原因:ARM 交叉编译工具链arm‑none‑eabi‑gcc不识别中文、特殊字符路径。

解决:工程整体迁移到纯英文路径

D:\项目\电机PID ❌错误,含中文 E:\stm32_motor_pid ✅正确全英文路径

💡经验:嵌入式开发,工程路径、文件名、头文件全部尽量只用英文 + 下划线。

🔥 坑 2:STM32duino 不会自带 FreeRTOS,和 ESP32 不一样

报错:

src\main.cpp:16:10: fatal error: FreeRTOS.h: No such file or directory

很多人会混淆 ESP32 与 STM32duino:

ESP32STM32 (stm32duino)
FreeRTOSSDK 内置,直接#include <FreeRTOS.h>没有内置,必须手动安装第三方库
调度器系统自动启动需要手动调用vTaskStartScheduler()

解决platformio.ini引入 ID=2093 的库,代码头文件写:

#include<STM32FreeRTOS.h>

💡教训:同样是 Arduino 框架,不同芯片内核差异巨大,不要把 ESP32 的经验直接套到 STM32。

🔥 坑 3:库名带空格,凭记忆导入直接报找不到包

报错:

UnknownPackageError: Could not find the package with 'stm32duino/STM32FreeRTOS'
  • 原因:这个库完整名字叫STM32duino FreeRTOS,名字中间带空格。手动写名字很容易出错。

最优方案:直接写库数字 ID2093,零歧义。

💡技巧:找库的时候优先执行pio lib search查询官方注册表,不要靠脑子回忆库名。


编译成功验证输出

RAM: [=] 10.3% (used 2100 bytes from 20480 bytes) Flash: [===] 68.5% (used 44892 bytes from 65536 bytes) ======================== [SUCCESS] ========================

看到上面输出,代表工具链、依赖库、配置全部搞定。


本篇小结 & 下一篇预告

读完本文你掌握:

  1. STM32F103 + PlatformIO + Arduino 选型思路,适合大二做项目的学习路径
  2. 一份开箱即用的platformio.ini配置
  3. 3 个高频坑:中文路径、FreeRTOS 库差异、库名空格 bug

下一篇预告:电机驱动 + 正交编码器测速

讲解 TB6612 的 H 桥驱动原理;定时器 PWM 底层参数 PSC、ARR;正交编码器方向判断;为什么测速读取变量一定要加volatile关键字。


*我大二暑假从零开始做嵌入式实战项目,持续更新完整 STM32 电机 PID 系列,项目全部实物调试验证,欢迎一起交流踩坑。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询