1. 项目背景与硬件平台搭建

各位同学,欢迎来到这门实战课。我是你们的老朋友,一个在嵌入式电机控制领域摸爬滚打了十几年的工程师。今天咱们正式开始第一讲:项目背景与硬件平台搭建。

说实话,FOC(磁场定向控制)这玩意儿,刚接触时确实有点唬人。一堆数学公式,什么Clark变换、Park变换,看着就头大。但别怕,咱们这门课不讲虚的,直接上手干。你跟着我一步步来,把这些公式变成实实在在的代码,让电机转起来。

本章核心目标: 搞懂我们为什么要用GD32F303做FOC控制,理清SVPWM的基本原理,并且把最小系统板搭建好。这是后面所有实验的基础。

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%左右,余量很足。

我的经验: 选型时别光看主频,还要看定时器和ADC的配合。GD32F303的定时器可以触发ADC采样,这个功能在FOC里至关重要,能保证电流采样的同步性。

1.2 FOC控制原理概述

FOC,全称是Field-Oriented Control,磁场定向控制。说白了,就是把交流电机模拟成直流电机来控制。为什么要这么干?因为直流电机的控制太简单了,调电压就能调转速,调电流就能调转矩。但交流电机不行,它的磁场和转矩是耦合在一起的,你一动电压,两个都变。

FOC的核心思想,就是通过坐标变换,把三相交流电流分解成两个独立的直流分量:一个控制磁场(d轴),一个控制转矩(q轴)。这样,控制就变得跟直流电机一样简单了。

我画了一张图,帮大家理解这个流程:

FOC控制核心流程 FOC控制核心流程 三相电流采样 Clark变换 Park变换 PI调节(Id/Iq) 反Park变换 SVPWM生成 反馈 核心思想:通过坐标变换,将三相交流量解耦为独立的转矩分量(Iq)和磁通分量(Id)

流程很清晰:先采样三相电流,然后经过Clark变换和Park变换,得到d轴和q轴的直流分量。接着,我们对这两个分量分别做PI调节,得到想要的电压值。最后,通过反Park变换和SVPWM,生成驱动电机所需的PWM波。

注意: 很多初学者容易搞混Clark和Park变换的顺序。记住:Clark变换是把三相变两相(静止坐标系),Park变换是把两相静止变两相旋转(旋转坐标系)。顺序不能乱。

1.3 SVPWM算法简介

SVPWM,Space Vector Pulse Width Modulation,空间矢量脉宽调制。这名字听着高大上,其实原理不复杂。传统的SPWM(正弦脉宽调制)是让三相电压分别按正弦规律变化,但这样做的缺点是母线电压利用率低,只有86.6%。

SVPWM就不一样了。它把三相电压看成一个整体,用一个旋转的空间矢量来表示。通过控制这个矢量的幅值和方向,就能精确控制电机磁场。它的母线电压利用率能达到100%,比SPWM高了15%左右。

我记得第一次在项目里用SVPWM替代SPWM时,电机的转速直接提升了10%,而且噪音还小了。当时我就觉得,这算法真值。

SVPWM的实现,主要分三步:

  1. 扇区判断: 根据当前电压矢量在αβ坐标系下的分量,判断它在哪个扇区。
  2. 作用时间计算: 计算相邻两个基本电压矢量的作用时间。
  3. 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;
}
避坑指南: 我曾经在扇区判断时,直接用浮点数比较,结果在边界处出现了抖动。后来加了0.001的死区阈值,问题就解决了。边界处理一定要小心。

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的中间点采样电流,避开开关噪声。

重要: 原理图上,PWM输出到驱动芯片之间一定要加限流电阻,通常10Ω左右。我见过有人直接连,结果驱动芯片的输入电容和走线电感形成谐振,把波形搞成了振铃。加个电阻就能解决。

1.5 最小系统搭建

好了,理论讲完了,咱们动手。最小系统搭建,说白了就是让芯片能跑起来。你需要准备以下东西:

  • GD32F303CBT6芯片(或者开发板)
  • 8MHz晶振(用于HSE)
  • 32.768KHz晶振(用于RTC,可选)
  • 3.3V稳压芯片(AMS1117-3.3)
  • 若干电容(104和106各几个)
  • SWD调试器(J-Link或DAP-Link)

搭建步骤很简单:

  1. 先焊电源部分,用万用表量3.3V输出是否正常。
  2. 再焊晶振和复位电路。
  3. 接着焊SWD接口,确保能连上调试器。
  4. 最后焊PWM输出和ADC采样相关的引脚。

我个人习惯,每次焊完一个部分,就上电测一下。别等全部焊完再测,万一有问题,排查起来很麻烦。

我的经验: 第一次上电时,用手摸一下芯片温度。如果发烫,赶紧断电,检查电源有没有接反或者短路。我遇到过好几次,都是电容焊反了导致短路。

搭建完成后,你可以写一个简单的LED闪烁程序,验证最小系统是否正常工作。如果LED能闪,说明芯片、晶振、电源都没问题。接下来,就可以开始咱们的FOC之旅了。