Training / Docs

电控暑期学习路线

从开发环境、C 语言和 STM32 基础一路走到控制算法、FreeRTOS 与综合项目。

电控组学习路线

这份学习路线面向暑假想学习嵌入式相关知识的同学

嵌入式学习并不是把几个视频看完、把例程复制到开发板上就算完成。真正需要逐步建立的是一套完整的工程能力:

整体学习顺序建议为:

前置工具与环境 → C 语言基础 → 单片机基础 → 常见模块与电机控制 → 工程化开发 → FreeRTOS → 综合项目

本文档与进阶训练的关系

这份文档定位为电控组基础学习路线,目标是让新成员建立完整的嵌入式基础能力,并能够独立完成常见外设、传感器、电机和简单闭环控制。

完成基础训练后,再进入专项进阶训练:

基础学习路线 → 状态机与 PID 进阶训练 → 综合机器人控制项目

其中,《电控组进阶训练:状态机与 PID》不会重复讲 GPIO、PWM、编码器、串口等基础内容,而是默认学习者已经能够独立完成这些模块,并进一步训练:

因此,不建议刚点亮 LED、刚学会 PWM 就直接进入进阶训练。先把本路线中的基础实验真正做完,再学习控制算法会更有效。

这条路线不要求大家一开始就把所有内容全部学会,而是希望大家按照阶段逐步推进。每完成一个阶段,都应该留下能够实际运行的程序、接线和实验结果,而不是只留下看过的视频和收藏的资料。


一、学习前的准备

1. 学习以实践为主

嵌入式是一门实践性很强的方向。很多知识只看视频时感觉已经听懂,但真正接线、编译和烧录时,仍然会遇到各种问题。

建议保持以下学习节奏:

  1. 先了解知识点的作用。
  2. 跟着教程完成一次实验。
  3. 不看教程,自己重新完成一次。
  4. 修改参数或功能,观察结果变化。
  5. 将代码整理成自己的模块。
  6. 记录遇到的问题和解决方法。

例如学习 PWM 时,不要只满足于让 LED 呼吸或舵机转动,还可以继续尝试:

只有能够自己修改和扩展,才说明真正掌握了这个知识点。

2. 不要一开始就追求复杂项目

刚开始学习时,不建议直接上手平衡车、四轮底盘、机械臂、FOC 或大型机器人项目。

这些项目通常同时涉及:

如果基础不扎实,遇到问题时很难判断到底是代码、接线、参数、供电还是机械结构的问题。

更合理的方法是先完成一系列小实验,再逐步组合成完整项目。

3. 建立自己的学习记录

建议每个人建立一个学习仓库或学习文档,记录:

代码建议使用 Git 管理。即使暂时不上传 GitHub 或 Gitee,也应该养成提交版本的习惯。


二、前置工具与开发环境

很多初学者最早遇到的问题并不是代码错误,而是驱动、下载器、串口、路径、芯片包和软件配置问题。因此,在正式学习前需要先把基本开发环境搭建好。

1. 开发软件

建议准备:

Keil MDK

Keil 是常见的单片机开发环境,适合刚开始接触 STM32 的同学。

需要学会:

前期可以先使用 Keil 跟着教程学习,不需要一开始就折腾复杂工具链。

STM32CubeMX

CubeMX 主要用于:

需要注意:CubeMX 只是帮助生成初始化代码,不能代替理解外设原理。使用 CubeMX 时,至少要知道自己配置了什么、为什么这样配置。

STM32CubeIDE

CubeIDE 集成了 CubeMX、代码编辑、编译、烧录和调试功能。

可以在熟悉基本开发流程后尝试使用,重点掌握:

VSCode

VSCode 适合后期进行更舒适的代码编辑和工程管理。

前期只需要掌握:

不建议刚开始就花大量时间配置复杂的 CMake、OpenOCD 和交叉编译环境。先把基础开发流程跑通,再逐步优化工具。

Git

Git 是代码版本管理工具,需要尽早接触。

前期至少掌握:

建议每完成一个可运行功能就提交一次,例如:

不要等工程全部写完才保存版本。

2. 驱动和调试软件

需要准备:

需要能区分以下设备的作用:

3. VOFA+

VOFA+ 是后续调试中非常实用的工具,需要重点掌握。

建议学会:

例如调电机速度环时,可以同时发送:

只看电机转动现象很难准确判断控制效果,结合曲线会更加直观。

4. 常用硬件工具

建议准备:

刚入门不需要一次性买齐全部设备,但开发板、下载器、USB 转 TTL、万用表和基础接线工具最好尽早准备。


三、AI 与 Agent 辅助学习

AI 和 Agent 可以用于辅助学习和排查问题,但不能代替实际调试。

使用时尽量提供:

AI 可以帮助:

Agent 更适合阅读整个工程和处理多文件任务,例如分析某个功能涉及哪些文件。

所有生成内容都必须经过验证:

不要把未经验证的 AI 代码直接用于比赛或正式项目。


四、C 语言基础

C 语言是嵌入式开发的基础。后面学习 STM32、驱动模块、PID、通信协议和 FreeRTOS,都离不开 C 语言。

1. 推荐资源

推荐:

翁恺适合系统入门,菜鸟教程适合快速查询语法。

2. 基础语法

需要学习:

嵌入式中尤其要注意:

常见数据类型包括:

要知道它们能够表示的大致范围,以及为什么嵌入式工程中经常使用固定宽度整数类型。

3. 函数

需要掌握:

需要理解:

4. 数组和字符串

需要掌握:

嵌入式中经常需要使用数组保存:

5. 指针

指针是 C 语言和嵌入式中的重点,需要反复练习。

需要掌握:

阶段目标不是背概念,而是能看懂类似代码:

void Motor_SetSpeed(Motor_t *motor, int16_t speed);

并能够解释:

6. 结构体和枚举

需要掌握:

结构体非常适合整理模块数据,例如:

typedef struct
{
    int16_t target_speed;
    int16_t actual_speed;
    float kp;
    float ki;
    float kd;
} Motor_t;

后续可以把一个电机的目标值、实际值和控制参数统一管理,而不是使用大量零散的全局变量。

7. 宏定义和预处理

需要学习:

需要能够看懂:

#ifndef __MOTOR_H
#define __MOTOR_H

#endif

以及:

#define MOTOR_MAX_OUTPUT 1000

8. .c.h 文件拆分

这是从写小程序走向写工程的重要一步。

需要理解:

建议练习将以下功能分别拆成模块:

9. C 语言练习任务

建议完成:

10. 阶段目标

完成这一阶段后,至少应该做到:


五、单片机基础

单片机是电控学习的核心。建议使用 STM32 作为主要学习平台,也可以根据比赛或项目需要接触 MSPM0、ESP32 等其他芯片。

不同芯片的寄存器和库函数可能不同,但 GPIO、串口、定时器、ADC、I2C、SPI、CAN 等基本概念是相通的。

1. 推荐教程

优先推荐:

如果时间充裕、有耐心,可以继续看:

不同教程的代码风格和开发板可能不同,不建议在刚入门时同时跟多个教程。先选一套教程完成基础内容,再用其他资料补充。

2. 建立第一个工程

需要掌握:

第一个阶段应该完成:

3. GPIO

需要学习:

实践任务:

4. 外部中断和 NVIC

需要学习:

实践任务:

5. 系统时钟和时钟树

需要了解:

不要求一开始就手算所有时钟,但要能够判断:

6. USART 串口

需要学习:

实践任务:

7. 定时器

需要学习:

实践任务:

8. PWM

需要学习:

实践任务:

9. ADC

需要学习:

实践任务:

10. DMA

需要理解 DMA 的作用:

需要学习:

实践任务:

11. I2C

需要学习:

实践任务:

12. SPI

需要学习:

实践任务:

13. CAN

CAN 在机器人和电机控制中非常常见。

需要学习:

实践任务:


六、常见模块与执行器

学习外设的目的不是记住 API,而是能够驱动真实模块并完成控制任务。

1. 基础模块

建议接触:

学习每个模块时,需要弄清:

2. 舵机

需要学习:

实践任务:

3. 直流电机

需要学习:

实践任务:

4. 编码器电机

需要学习:

实践任务:

5. CAN 电机

需要学习:

使用前必须阅读对应电机的协议手册,不要凭经验猜测报文格式。


七、硬件电路基础

电控成员不能只会写代码,也应该能够看懂基础原理图并排查常见硬件问题。

1. 基础元器件

需要了解:

不要求一开始就进行复杂电路计算,但要知道常见器件的基本作用。

2. 常见电路概念

需要学习:

3. 电源基础

需要了解:

很多系统运行不稳定并不是程序问题,而是供电不足或电源设计不合理。

常见现象包括:

遇到这些问题时,需要优先检查电源。

4. 原理图阅读

需要能够识别:

5. PCB 基础

建议了解:

可以使用:

入门阶段建议先使用嘉立创 EDA,完成一块简单的转接板或最小系统板。


八、调试与仪器使用

会调试比会复制代码更重要。

遇到问题时,不要立刻怀疑所有代码,也不要反复无目的地改参数。应该按照一定顺序排查。

1. 基本排查顺序

推荐顺序:

  1. 检查供电是否正常。
  2. 检查模块工作电压。
  3. 检查是否共地。
  4. 检查接线和引脚定义。
  5. 检查下载器是否连接。
  6. 检查程序是否成功烧录。
  7. 检查时钟配置。
  8. 检查外设参数。
  9. 检查是否进入中断或回调。
  10. 检查数据格式和通信协议。
  11. 最后再检查复杂算法。

2. 万用表

需要学会:

3. 逻辑分析仪

需要学会观察:

逻辑分析仪适合判断:

4. 示波器

需要学会基本操作:

5. 软件调试

需要掌握:

调试时尽量一次只改变一个变量,这样才能判断问题是如何被解决的。


九、控制算法基础

电机、底盘、舵机和云台都离不开控制算法。

这一章只负责建立控制算法入门概念。在这里不要求一开始就推导复杂公式,也不要求直接写完整的机器人控制系统。首先要把“反馈、误差、周期控制、闭环”这些基本概念真正理解,并完成一个最简单的电机闭环实验。

学习 PID 前,至少应该已经能够:

如果上述内容还不能独立完成,应先返回前面的 PWM、编码器、定时器和串口章节继续练习。

1. PID 基础

需要学习:

需要理解:

2. PID 类型

需要学习:

3. PID 工程处理

需要掌握:

4. 滤波基础

需要学习:

不需要刚开始就深入推导复杂公式,先理解不同滤波方法适合解决什么问题。

5. 实践任务

建议依次完成:

  1. 电机开环 PWM 控制
  2. 编码器速度读取
  3. 电机速度闭环
  4. 电机位置闭环
  5. 速度和位置串级控制
  6. 使用 VOFA+ 观察目标和实际曲线
  7. 添加输出限幅和堵转保护

6. 基础 PID 阶段验收

进入进阶 PID 训练前,至少应完成以下验收:

完成这些内容后,再进入《电控组进阶训练:状态机与 PID》,继续学习积分分离、微分滤波、增量式 PID、串级 PID、系统保护和在线调参。


十、工程化与代码规范

当代码逐渐增多时,工程结构会直接影响开发效率。

1. 模块化

建议按功能拆分文件,例如:

motor.c
motor.h
encoder.c
encoder.h
pid.c
pid.h
imu.c
imu.h
can_motor.c
can_motor.h
chassis.c
chassis.h

每个模块应该尽量做到:

2. 命名规范

建议统一:

例如:

Motor_Init();
Motor_SetSpeed();
Motor_Stop();
Encoder_GetSpeed();
PID_Calculate();

命名应该让别人快速判断函数用途。

3. 注释

注释应该说明:

不需要给每一行简单语句写注释,也不要只写“电机函数”“串口函数”这种没有信息量的注释。

4. 参数管理

建议统一管理:

不要把大量数字直接散落在代码中。

5. 状态机

状态机是从“会写功能”走向“会组织完整机器人流程”的重要工具。

刚开始写程序时,很多功能可以直接放在 while(1) 中:

if (key_pressed)
{
    Motor_Run();
}

if (sensor_triggered)
{
    Motor_Stop();
}

当任务变成“启动 → 前进 → 找到目标 → 停车 → 执行动作 → 返回 → 故障处理”以后,如果继续堆叠大量 if,程序很快就会出现:

这时应该开始使用状态机。

例如定义:

typedef enum
{
    STATE_IDLE = 0,
    STATE_INIT,
    STATE_RUN,
    STATE_STOP,
    STATE_ERROR
} SystemState_t;

主循环只根据当前状态执行对应逻辑:

switch (system_state)
{
    case STATE_IDLE:
        break;

    case STATE_INIT:
        break;

    case STATE_RUN:
        break;

    case STATE_STOP:
        break;

    case STATE_ERROR:
        break;
}

基础阶段需要先理解三个核心问题:

  1. 当前处于什么状态?
  2. 当前状态应该执行什么?
  3. 满足什么条件后切换到下一个状态?

建议先完成两个小练习:

练习一:LED 状态机

练习二:电机流程状态机

完成基础练习后,需要能够解释:

基础路线只要求理解并写出简单状态机。更完整的 Enter / Update / Exit、统一状态切换、状态超时、子状态机、故障恢复以及“状态机 + PID”组合设计,放在《电控组进阶训练:状态机与 PID》中继续训练。

6. 错误处理

需要逐步加入:

7. 进入专项进阶训练前的检查

在继续学习 FreeRTOS 或进入状态机/PID专项训练前,建议先完成一次基础能力检查。

应能够独立完成:

如果其中有多项仍然需要完全依赖例程或 AI 才能完成,建议暂时不要急着进入更复杂的控制和 RTOS 内容。

完成后可以进入两条并行路线:


十一、FreeRTOS 实时操作系统

当工程功能越来越多时,如果所有代码都堆在 while(1) 中,程序会越来越难维护。

FreeRTOS 可以把不同功能拆分成独立任务,并通过队列、信号量等机制完成任务之间的协作。

1. 学习前提

学习 FreeRTOS 前,建议先掌握:

基础外设还没有掌握时,不建议过早进入 FreeRTOS。

2. 推荐资源

推荐:

韦东山适合理解原理,正点原子适合结合 STM32 实践。

3. 任务

需要学习:

需要理解为什么不能在任务中长期占用 CPU,以及为什么需要使用阻塞和延时。

4. 队列

队列适合在任务之间传递数据。

需要学习:

实践任务:

5. 信号量

需要学习:

实践任务:

6. 互斥量

互斥量用于保护共享资源。

需要学习:

实践任务:

7. 事件组

事件组适合表示多个状态或条件,例如:

8. 软件定时器和任务通知

需要学习:

9. 内存和栈

需要了解:

不要盲目给每个任务分配很大的栈,也不要完全忽略栈空间。

10. FreeRTOS 实践项目

建议完成一个包含以下任务的小工程:

任务之间通过队列、信号量或任务通知进行通信。

11. 阶段目标

完成 FreeRTOS 学习后,应该能够:


十二、综合实践项目

完成基础学习后,建议通过综合项目把知识串联起来。

项目一:串口控制小系统

功能建议:

项目二:传感器数据采集系统

功能建议:

项目三:编码器电机闭环控制

功能建议:

项目四:简易移动底盘

功能建议:

项目五:FreeRTOS 多任务控制系统

功能建议:

综合项目不要求功能越多越好,重点是稳定、清晰、可调试。


十三、暑假学习安排建议

可以根据个人进度调整,不要求所有人完全一致。

第一阶段:环境和 C 语言

建议内容:

阶段成果:

第二阶段:单片机基础外设

建议内容:

阶段成果:

第三阶段:通信和模块

建议内容:

阶段成果:

第四阶段:控制和工程化

建议内容:

阶段成果:

完成这一阶段后,即可开始《电控组进阶训练:状态机与 PID》。

第五阶段:FreeRTOS 和综合项目

建议内容:

阶段成果:


十四、学习过程中常见误区

1. 只看视频,不动手

看懂不等于会做。每学一个外设,都要完成实际实验。

2. 只会复制例程

例程能够运行只是第一步,还要理解引脚、参数、调用关系和数据流。

3. 所有代码都写在 main.c

工程功能增加后必须逐步模块化,否则后续联调会非常困难。

4. 一出问题就怀疑代码

嵌入式问题可能来自:

要按照顺序排查,不要只盯着程序。

5. 过早学习复杂内容

基础外设还不熟时,不建议直接学习 FreeRTOS、FOC 或复杂机器人算法。

6. 只追求“能跑”

代码能运行不代表工程质量合格,还需要考虑:

7. 不记录问题

同一个问题反复出现,往往是因为没有记录。建议将每次故障的现象、原因和解决方法整理下来。


十五、进阶方向

基础打牢之后,可以根据兴趣选择方向:

1. 电机与控制

2. 机器人控制

3. 嵌入式 Linux

4. ROS / ROS2

5. 视觉与边缘计算

6. 硬件设计

7. 上位机开发


十六、最终目标

完成这条路线后,希望大家不只是“看过教程”,而是能够真正参与嵌入式相关项目:

嵌入式学习前期会比较杂,代码、硬件、电路、工具和算法都要接触。但只要坚持动手,很多看起来零散的内容会逐渐串联起来。

遇到问题不要怕。能够把问题描述清楚、根据现象提出假设、使用工具逐步排查,并最终记录解决过程,本身就是电控成员非常重要的能力。


十七、团队交流

我们团队目前分为:

学习过程中遇到问题,可以在群内交流讨论,也可以分享学习记录、工程代码和调试经验。

团队 QQ 群号:1081176436