1. 课程导论与开发环境搭建

各位同学,欢迎来到《电机控制与单片机选型外设驱动开发实战》的第一章。我是你们的讲师,一个在嵌入式电机控制领域摸爬滚打了十几年的老工程师。

咱们这门课,不搞虚的。上来就直奔主题:怎么选单片机,怎么搭环境,怎么让电机转起来。你想想看,电机控制这东西,说难也难,说简单也简单。难在你要懂硬件、懂算法、懂实时性;简单在只要路子对了,剩下的就是堆代码和调参数。

我个人习惯,在开始任何项目前,先把工具链和开发环境理清楚。磨刀不误砍柴工,这话一点不假。

1.1 电机控制概述:从原理到实战

电机控制,说白了就是让电机按照你的想法去转。要速度给速度,要位置给位置,要力矩给力矩。

常见的电机类型就那么几种:

电机类型 控制特点 典型应用
直流有刷电机 控制简单,PWM调速即可 玩具、电动工具
直流无刷电机(BLDC) 需要六步换向或FOC 无人机、电动车
永磁同步电机(PMSM) FOC控制,效率高 伺服系统、机器人
步进电机 开环位置控制 3D打印机、数控机床

我在项目中遇到过最头疼的事,就是有人拿着步进电机的方案去做高速应用。结果呢?丢步丢到怀疑人生。选型这事,后面咱们会细讲。

电机控制的核心闭环,无非就是三个环:电流环、速度环、位置环。内环快,外环慢。这个结构,贯穿整个课程。

核心要点: 电机控制的本质,是让电流跟随指令。电流跟住了,速度和位置自然就稳了。

1.2 单片机选型策略:别让芯片拖了后腿

选单片机,我见过太多人犯错了。要么选个性能过剩的,成本压不住;要么选个资源不够的,项目做到一半发现定时器不够用。

做电机控制,单片机选型要看这几个硬指标:

  1. PWM定时器:至少要有高级定时器,支持互补输出、死区插入。这是做电机驱动的命根子。
  2. ADC采样速率:电流采样需要同步触发,1MHz以上的采样率是基本要求。
  3. 运算能力:FOC算法需要大量三角函数和矩阵运算,带FPU的Cortex-M4/M7是首选。
  4. 外设接口:编码器接口(QEI)、SPI(用于磁编码器)、CAN(用于通信)。

我给大家整理了一个选型对比表,照着这个思路去选,基本不会翻车:

需求等级 推荐架构 代表型号 适用场景
入门/学习 Cortex-M3 STM32F103 直流有刷、简单BLDC
中级/产品 Cortex-M4F STM32F405, GD32F450 FOC控制、PMSM
高级/高性能 Cortex-M7 STM32H743, i.MX RT 多轴伺服、机器人
专用芯片 集成预驱 TI InstaSPIN, 灵动MM32 快速原型、小体积

避坑指南: 我曾经选了一款号称主频很高的芯片,结果发现它的ADC采样和PWM触发不同步,电流环跑起来抖得不行。后来换了带双ADC同步采样的型号,问题才解决。选型时一定要看外设联动能力,别光看主频。

1.3 开发板介绍:我们的实战平台

本课程选用的是STM32F407VGT6开发板。为什么选它?

  • 主频168MHz,带单精度FPU,跑FOC算法绰绰有余
  • 2个高级定时器,支持6路互补PWM输出
  • 3个12位ADC,支持注入组和规则组同步采样
  • 板载的电机驱动接口,直接插上驱动板就能用

当然,你手里如果有其他Cortex-M4F的开发板,比如GD32F450或者AT32F435,也没问题。代码移植起来,工作量不大。

咱们课程配套的驱动板,用的是DRV8301三相栅极驱动器,搭配IRFS3006功率MOSFET。这套组合,48V/10A以内的电机都能驱动。

小提示: 如果你是自己打板,记得在电源入口加TVS管和电解电容。我见过有人没加,上电瞬间MOSFET直接炸了。嗯,那味道,终身难忘。

1.4 开发环境搭建:Keil与IAR

工欲善其事,必先利其器。咱们把环境搭好,后面才能顺畅地写代码。

1.4.1 Keil MDK 安装与配置

  1. 下载Keil MDK v5.38或更新版本,安装时选择Cortex-M4支持包
  2. 安装STM32F4xx_DFP设备支持包,版本建议2.16.0以上
  3. 配置编译器为ARM Compiler v6,优化等级选-O2
  4. 设置调试器为ST-Link,选择SWD模式,速度设为4MHz

我个人习惯用Keil,因为它的调试界面直观,变量观察窗口好用。但IAR的编译优化确实更狠,代码密度能小15%左右。

1.4.2 IAR EWARM 安装与配置

  1. 下载IAR Embedded Workbench for ARM v9.40
  2. 安装时勾选STM32F4系列器件支持
  3. 配置编译器优化为High - Speed
  4. 调试器同样选ST-Link,SWD接口

经验之谈: 我建议初学者先用Keil,上手快,资料多。等你对工程结构熟悉了,再尝试IAR。两个IDE的工程文件不通用,但源代码可以共用。咱们课程里,两种IDE的工程模板我都会提供。

1.5 工程模板创建:从零开始搭框架

每次新建项目都从寄存器开始写?没必要。咱们直接基于HAL库搭建工程模板,把电机控制需要的模块都提前配置好。

一个标准的电机控制工程,文件结构应该是这样的:

Project/
├── Core/
│   ├── Inc/          // 头文件
│   ├── Src/          // 主程序
│   └── Startup/      // 启动文件
├── Drivers/
│   ├── CMSIS/        // 内核抽象层
│   └── STM32F4xx_HAL_Driver/  // HAL库
├── Motor/
│   ├── foc.c/h       // FOC算法
│   ├── pid.c/h       // PID控制器
│   └── encoder.c/h   // 编码器读取
└── User/
    ├── main.c
    └── motor_control.c/h  // 电机控制主逻辑

创建工程模板的步骤:

  1. 用STM32CubeMX生成基础工程,配置时钟为168MHz
  2. 使能TIM1高级定时器,配置PWM通道1-3,互补输出,死区时间设为100ns
  3. 使能ADC1和ADC2,配置为注入组同步采样,触发源为TIM1_TRGO
  4. 使能TIM2作为编码器接口,配置为AB相模式
  5. 生成代码后,手动添加Motor文件夹和User文件夹

注意: 时钟配置一定要先确认外部晶振频率。我见过有人用8MHz晶振,却在CubeMX里配成了25MHz,结果系统时钟跑飞了,查了半天才发现是这里的问题。

下面这张图,是咱们整个课程的知识体系框架。你可以把它当作一张地图,后面每学一章,都能在这张图上找到位置。

电机控制课程知识体系框架 电机控制与单片机选型外设驱动开发实战 - 知识体系 第1章:课程导论与开发环境搭建 电机控制概述 | 单片机选型 | 开发板介绍 | Keil/IAR环境搭建 第2-5章:硬件基础与驱动开发 GPIO | 定时器PWM | ADC采样 | 编码器接口 | 通信外设 第6-15章:电机控制核心算法 六步换向 | FOC矢量控制 | PID调节 | 电流环/速度环/位置环 第16-22章:传感器与反馈系统 霍尔传感器 | 磁编码器 | 电流检测 | 温度保护 | 故障诊断 第23-30章:实战项目与调试优化 无刷电机驱动 | 伺服系统 | 多机同步 | 性能调优 | 量产测试 课程从基础到实战,层层递进。每一章都配有可运行的代码示例和调试技巧。