1. 项目背景与硬件平台搭建
各位同学,欢迎来到这门实战课。我是你们的老朋友,一个在嵌入式电机控制领域摸爬滚打了十几年的工程师。今天咱们正式开始第一讲:项目背景与硬件平台搭建。
说实话,FOC(磁场定向控制)这玩意儿,刚接触时确实有点唬人。一堆数学公式,什么Clark变换、Park变换,看着就头大。但别怕,咱们这门课不讲虚的,直接上手干。你跟着我一步步来,把这些公式变成实实在在的代码,让电机转起来。
1.1 为什么选GD32F303?
选型这事儿,我踩过不少坑。以前用某国际大厂的芯片,性能确实强,但价格也“感人”,而且供货周期长,动不动就缺货。后来项目催得紧,我被迫换上了GD32F303。用下来发现,这芯片真香。
GD32F303是国产ARM Cortex-M4内核的MCU,主频能跑到120MHz。对于FOC控制来说,这个性能完全够用。你想想看,FOC控制的核心计算量在于电流环的PI调节和SVPWM的扇区判断,这些运算在M4内核上跑,绰绰有余。
我给大家列个表,对比一下它和同级别芯片的关键参数:
| 参数 | GD32F303 | STM32F303(对比) |
|---|---|---|
| 内核 | ARM Cortex-M4 | ARM Cortex-M4 |
| 主频 | 120 MHz | 72 MHz |
| Flash | 最大 256 KB | 最大 256 KB |
| SRAM | 最大 48 KB | 最大 40 KB |
| 高级定时器 | 2个(支持6路互补PWM) | 2个(支持6路互补PWM) |
| ADC | 3个12位(采样率2.6Msps) | 4个12位(采样率5Msps) |
| 价格(批量) | 约 ¥8-12 | 约 ¥15-25 |
你看,主频比STM32F303高了将近一倍,价格却便宜不少。对于咱们做产品来说,性价比是第一位的。我个人习惯,在项目初期选型时,会留出20%的性能余量。GD32F303的120MHz主频,跑FOC算法时CPU负载大概在40%左右,余量很足。
1.2 FOC控制原理概述
FOC,全称是Field-Oriented Control,磁场定向控制。说白了,就是把交流电机模拟成直流电机来控制。为什么要这么干?因为直流电机的控制太简单了,调电压就能调转速,调电流就能调转矩。但交流电机不行,它的磁场和转矩是耦合在一起的,你一动电压,两个都变。
FOC的核心思想,就是通过坐标变换,把三相交流电流分解成两个独立的直流分量:一个控制磁场(d轴),一个控制转矩(q轴)。这样,控制就变得跟直流电机一样简单了。
我画了一张图,帮大家理解这个流程:
流程很清晰:先采样三相电流,然后经过Clark变换和Park变换,得到d轴和q轴的直流分量。接着,我们对这两个分量分别做PI调节,得到想要的电压值。最后,通过反Park变换和SVPWM,生成驱动电机所需的PWM波。
1.3 SVPWM算法简介
SVPWM,Space Vector Pulse Width Modulation,空间矢量脉宽调制。这名字听着高大上,其实原理不复杂。传统的SPWM(正弦脉宽调制)是让三相电压分别按正弦规律变化,但这样做的缺点是母线电压利用率低,只有86.6%。
SVPWM就不一样了。它把三相电压看成一个整体,用一个旋转的空间矢量来表示。通过控制这个矢量的幅值和方向,就能精确控制电机磁场。它的母线电压利用率能达到100%,比SPWM高了15%左右。
我记得第一次在项目里用SVPWM替代SPWM时,电机的转速直接提升了10%,而且噪音还小了。当时我就觉得,这算法真值。
SVPWM的实现,主要分三步:
- 扇区判断: 根据当前电压矢量在αβ坐标系下的分量,判断它在哪个扇区。
- 作用时间计算: 计算相邻两个基本电压矢量的作用时间。
- PWM占空比生成: 根据作用时间,计算出三相PWM的比较值。
这里我给大家一个扇区判断的代码片段,这是最基础的部分:
// 扇区判断函数
uint8_t svpwm_sector_calc(float v_alpha, float v_beta)
{
uint8_t sector = 0;
// 计算三个参考值
float v_ref1 = v_beta;
float v_ref2 = -0.5f * v_beta + 0.866f * v_alpha; // sqrt(3)/2 ≈ 0.866
float v_ref3 = -0.5f * v_beta - 0.866f * v_alpha;
// 根据符号判断扇区
if (v_ref1 > 0) sector |= 0x01;
if (v_ref2 > 0) sector |= 0x02;
if (v_ref3 > 0) sector |= 0x04;
return sector;
}
1.4 开发板原理图分析
咱们课程用的是GD32F303CBT6这颗芯片,LQFP48封装。我带着大家看看原理图的关键部分。
首先是电源部分。GD32F303需要3.3V供电,但电机驱动部分通常需要12V或24V。所以板子上要有两个电源域:一个给MCU,一个给驱动。两者之间用光耦或隔离芯片隔开,防止驱动部分的噪声串到MCU。
我给大家列一下最小系统需要的关键引脚:
| 功能 | 引脚 | 说明 |
|---|---|---|
| PWM输出 | PA0-PA5 | 定时器0的6路互补PWM |
| 电流采样 | PA6-PA7 | ADC0的通道0和1 |
| 编码器输入 | PB6-PB7 | 定时器2的编码器模式 |
| 串口调试 | PA9-PA10 | USART1 |
| SWD调试 | PA13-PA14 | SWDIO和SWCLK |
这里有个关键点:PWM输出和ADC采样必须用同一个定时器触发。GD32F303的定时器0可以配置成中心对齐模式,并在计数到0或周期值时触发ADC采样。这样能保证在PWM的中间点采样电流,避开开关噪声。
1.5 最小系统搭建
好了,理论讲完了,咱们动手。最小系统搭建,说白了就是让芯片能跑起来。你需要准备以下东西:
- GD32F303CBT6芯片(或者开发板)
- 8MHz晶振(用于HSE)
- 32.768KHz晶振(用于RTC,可选)
- 3.3V稳压芯片(AMS1117-3.3)
- 若干电容(104和106各几个)
- SWD调试器(J-Link或DAP-Link)
搭建步骤很简单:
- 先焊电源部分,用万用表量3.3V输出是否正常。
- 再焊晶振和复位电路。
- 接着焊SWD接口,确保能连上调试器。
- 最后焊PWM输出和ADC采样相关的引脚。
我个人习惯,每次焊完一个部分,就上电测一下。别等全部焊完再测,万一有问题,排查起来很麻烦。
搭建完成后,你可以写一个简单的LED闪烁程序,验证最小系统是否正常工作。如果LED能闪,说明芯片、晶振、电源都没问题。接下来,就可以开始咱们的FOC之旅了。