基于均值零序分量注入的 SVPWM 算法实现

这段代码实现了基于均值零序分量注入的 SVPWM(空间矢量脉宽调制) 算法,核心功能是将旋转坐标系(d-q 轴)下的电压指令转换为三相 PWM 占空比,最终输出到逆变器驱动电机。下面分步解释其原理和代码逻辑:

1. 函数作用与输入参数

void setPhaseVoltage(float Uq, float Ud, float el\_angle)
  • 输入参数

    • UdUq:旋转坐标系(d-q 轴)下的电压指令(d 轴通常为励磁分量,q 轴为转矩分量)。

    • el_angle:电机转子的电角度(用于坐标变换)。

  • 功能:通过一系列坐标变换和 SVPWM 调制,计算三相 PWM 的占空比,最终输出到定时器的比较寄存器。

2. Park 逆变换(d-q 轴 → α-β 轴)

float U\_alpha = -Uq \* arm\_sin\_f32(el\_angle) + Ud \* arm\_cos\_f32(el\_angle);

float U\_beta = Uq \* arm\_cos\_f32(el\_angle) + Ud \* arm\_sin\_f32(el\_angle);
  • 原理:Park 变换用于将静止坐标系(α-β 轴)与旋转坐标系(d-q 轴)之间的转换。此处为逆 Park 变换,将旋转坐标系的UdUq转换为静止坐标系的(α-β 轴是静止的,与电机定子绕组对齐)。

  • 公式来源:逆 Park 变换的矩阵运算为:

$\begin{bmatrix} U_\alpha \ U_\beta \end{bmatrix} =
\begin{bmatrix} \cos\theta & -\sin\theta \ \sin\theta & \cos\theta \end{bmatrix}
\begin{bmatrix} U_d \ U_q \end{bmatrix}
$

其中θ = el_angle(电角度),与代码计算一致。

3. 电压归一化(转换为占空比比例)

U\_alpha = U\_alpha / Udc;

U\_beta = U\_beta / Udc;
  • 原理Udc是直流母线电压(逆变器输入的直流电压)。将除以Udc,得到归一化的电压比例(范围通常在 [-0.5, 0.5] 之间),便于后续后续计算 PWM 占空比。

4. Clark 逆变换(α-β 轴 → a-b-c 轴)

float Ua = U\_alpha;

float Ub = -0.5f \* U\_alpha + 0.8660254f \* U\_beta;

float Uc = -0.5f \* U\_alpha - 0.8660254f \* U\_beta;
  • 原理:Clark 变换用于将三相坐标系(a-b-c 轴)与静止坐标系(α-β 轴)之间的转换。此处为逆 Clark 变换,将转换为三相静止坐标系的相电压UaUbUc

  • 公式来源:逆 Clark 变换(假设三相平衡,无零序分量)的简化公式为:

KaTeX parse error: {align*} can be used only in display mode.

代码中0.8660254f√3/2的近似值,与公式一致。

5. 均值零序分量注入(SVPWM 核心优化)

float Umax = findMax(\&Ua, \&Ub, \&Uc);  // 找三相电压最大值

float Umin = findMin(\&Ua, \&Ub, \&Uc);  // 找三相电压最小值

float Umid = -0.5f \* (Umax + Umin);   // 计算均值零序分量

Ta = Ua + Umid;

Tb = Ub + Umid;

Tc = Uc + Umid;
  • 零序分量的作用:在 SVPWM 中,零序分量(如三次谐波)注入不会影响电机的相电压(因相电压差中零序分量会抵消),但可提高直流电压利用率避免过调制(防止 PWM 占空比超出 0~1 范围)。

  • 均值零序分量计算

    这里通过三相电压的最大值Umax和最小值Umin,计算出Umid = -0.5*(Umax + Umin),作为注入的零序分量。其目的是将三相电压整体 “平移”,使调制波的峰值被约束在合理范围内(减少过调制风险)。

6. 占空比约束与 PWM 输出

map\_constraint(\&Ta);  // 约束Ta在\[0,1]范围

map\_constraint(\&Tb);

map\_constraint(\&Tc);

// 设置定时器比较值(PWM占空比)

\_\_HAL\_TIM\_SET\_COMPARE(\&htim1, TIM\_CHANNEL\_1, Ta \* PWM\_ARR);

\_\_HAL\_TIM\_SET\_COMPARE(\&htim1, TIM\_CHANNEL\_2, Tb \* PWM\_ARR);

\_\_HAL\_TIM\_SET\_COMPARE(\&htim1, TIM\_CHANNEL\_3, Tc \* PWM\_ARR);
  • map_constraint:确保TaTbTc(归一化的占空比)被限制在[0, 1]范围内,避免 PWM 输出异常。

  • PWM 输出:将归一化的占空比TaTbTc乘以定时器的自动重装载值PWM_ARR,得到实际的比较寄存器值,最终通过定时器输出三相 PWM 波形,驱动逆变器的功率管。

总结

整个流程是:

d-q轴电压指令 →(逆 Park 变换)→ α-β轴电压 →(归一化)→(逆 Clark 变换)→ 三相电压 →(注入零序分量优化)→ 三相PWM占空比 → 输出 PWM 波形。

其中,均值零序分量注入是该 SVPWM 算法的核心优化,用于提高直流电压利用率并避免过调制,保证电机稳定运行。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐