1. 课程导论与开发环境搭建
各位同学,欢迎来到《电机控制与单片机选型外设驱动开发实战》的第一章。我是你们的讲师,一个在嵌入式电机控制领域摸爬滚打了十几年的老工程师。
咱们这门课,不搞虚的。上来就直奔主题:怎么选单片机,怎么搭环境,怎么让电机转起来。你想想看,电机控制这东西,说难也难,说简单也简单。难在你要懂硬件、懂算法、懂实时性;简单在只要路子对了,剩下的就是堆代码和调参数。
我个人习惯,在开始任何项目前,先把工具链和开发环境理清楚。磨刀不误砍柴工,这话一点不假。
1.1 电机控制概述:从原理到实战
电机控制,说白了就是让电机按照你的想法去转。要速度给速度,要位置给位置,要力矩给力矩。
常见的电机类型就那么几种:
| 电机类型 | 控制特点 | 典型应用 |
|---|---|---|
| 直流有刷电机 | 控制简单,PWM调速即可 | 玩具、电动工具 |
| 直流无刷电机(BLDC) | 需要六步换向或FOC | 无人机、电动车 |
| 永磁同步电机(PMSM) | FOC控制,效率高 | 伺服系统、机器人 |
| 步进电机 | 开环位置控制 | 3D打印机、数控机床 |
我在项目中遇到过最头疼的事,就是有人拿着步进电机的方案去做高速应用。结果呢?丢步丢到怀疑人生。选型这事,后面咱们会细讲。
电机控制的核心闭环,无非就是三个环:电流环、速度环、位置环。内环快,外环慢。这个结构,贯穿整个课程。
核心要点: 电机控制的本质,是让电流跟随指令。电流跟住了,速度和位置自然就稳了。
1.2 单片机选型策略:别让芯片拖了后腿
选单片机,我见过太多人犯错了。要么选个性能过剩的,成本压不住;要么选个资源不够的,项目做到一半发现定时器不够用。
做电机控制,单片机选型要看这几个硬指标:
- PWM定时器:至少要有高级定时器,支持互补输出、死区插入。这是做电机驱动的命根子。
- ADC采样速率:电流采样需要同步触发,1MHz以上的采样率是基本要求。
- 运算能力:FOC算法需要大量三角函数和矩阵运算,带FPU的Cortex-M4/M7是首选。
- 外设接口:编码器接口(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 安装与配置
- 下载Keil MDK v5.38或更新版本,安装时选择Cortex-M4支持包
- 安装STM32F4xx_DFP设备支持包,版本建议2.16.0以上
- 配置编译器为ARM Compiler v6,优化等级选-O2
- 设置调试器为ST-Link,选择SWD模式,速度设为4MHz
我个人习惯用Keil,因为它的调试界面直观,变量观察窗口好用。但IAR的编译优化确实更狠,代码密度能小15%左右。
1.4.2 IAR EWARM 安装与配置
- 下载IAR Embedded Workbench for ARM v9.40
- 安装时勾选STM32F4系列器件支持
- 配置编译器优化为High - Speed
- 调试器同样选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 // 电机控制主逻辑
创建工程模板的步骤:
- 用STM32CubeMX生成基础工程,配置时钟为168MHz
- 使能TIM1高级定时器,配置PWM通道1-3,互补输出,死区时间设为100ns
- 使能ADC1和ADC2,配置为注入组同步采样,触发源为TIM1_TRGO
- 使能TIM2作为编码器接口,配置为AB相模式
- 生成代码后,手动添加Motor文件夹和User文件夹
注意: 时钟配置一定要先确认外部晶振频率。我见过有人用8MHz晶振,却在CubeMX里配成了25MHz,结果系统时钟跑飞了,查了半天才发现是这里的问题。
下面这张图,是咱们整个课程的知识体系框架。你可以把它当作一张地图,后面每学一章,都能在这张图上找到位置。