4. 无位置传感器控制总体架构仿真

无位置传感器控制的仿真,难点往往不在单个算法,而在于“谁先算、谁后算、谁用谁的结果”。速度环、电流环、位置估计器和观测器四者之间存在明确的信号依赖:观测器需要电压和电流,位置估计器需要观测器的反电动势或磁链,电流环需要估计角度,速度环又需要估计转速。若时序组织不当,仿真会出现角度滞后、电流环振荡甚至发散。本节围绕这一信号流关系,说明如何在仿真中组织模块,以及采样与PWM更新时序的建模要点。

一、总体信号流:从观测器到速度环的闭环结构

先明确参照约定:本文角度以电角度表示,逆时针为正,估计角度记为 θ̂,实际角度记为 θ,角度误差 Δθ = θ − θ̂。控制采用双闭环结构,外环为速度环,内环为电流环,位置与转速由观测器和位置估计器提供。其信号流可概括为:三相电流与母线电压进入观测器,观测器输出反电动势或定子磁链;位置估计器从中提取 θ̂ 与 ω̂;电流环以 θ̂ 做 Park 变换与逆变换;速度环以 ω̂ 为反馈,输出 q 轴电流指令。

速度环 PI ω* → iq* 电流环 PI id*,iq* → ud,uq 逆 Park 变换 ud,uq,θ̂ → uα,uβ SVPWM uα,uβ → 占空比 逆变器 + PMSM ia,ib,ic / udc 观测器 反电动势 / 磁链 位置估计器 θ̂, ω̂ θ̂ ω̂ 采样与 PWM 更新时序(单 PWM 周期 Tpwm) t0 t1 t2 t3 t4 采样 ia,ib,ic 观测器更新 位置估计 电流环计算 PWM 更新 一个 PWM 周期 Tpwm

二、仿真中如何组织各模块

仿真组织建议采用“被控对象 + 控制器 + 观测器”三层结构,而不是把所有方程塞进一个脚本。被控对象层包含逆变器模型和 PMSM 的 dq 轴电压方程,输入为三相占空比,输出为三相电流与转速;控制器层包含速度环、电流环、Park/逆 Park 和 SVPWM;观测器层包含反电动势观测或滑模观测器,以及位置估计器。三层之间通过明确的接口变量传递,例如控制器输出 uα、uβ,观测器输出 θ̂、ω̂。

模块划分时要注意两个细节。第一,观测器使用的电压应是实际施加的电压,而非电流环的指令电压。若忽略逆变器死区与压降,可用指令电压近似;若考虑死区,应在被控对象层输出实际电压并反馈给观测器。第二,位置估计器输出的 θ̂ 应做角度归一化,避免在 0/2π 跳变处引起 Park 变换的数值突变。仿真中常用 mod(θ̂, 2π) 处理,并在角度误差计算时使用最短路径差值。

三、采样与 PWM 更新时序的建模要点

时序建模的核心是区分“连续时间被控对象”与“离散时间控制器”。在 Simulink 或 PLECS 中,PMSM 与逆变器可用连续或小步长离散求解,而控制器必须按固定采样周期 Ts 离散执行。典型设置是 Ts = Tpwm,采用中心对齐 PWM,在计数器过零或峰值处触发 ADC 采样,采样点位于 PWM 周期中点,以避开开关噪声。

一个 PWM 周期内的执行顺序建议为:t0 时刻采样三相电流与母线电压;t1 时刻观测器更新,得到反电动势或磁链;t2 时刻位置估计器计算 θ̂ 与 ω̂;t3 时刻电流环与速度环计算,输出 ud、uq;t4 时刻更新 PWM 占空比,下一个周期生效。这一顺序保证了控制器使用的角度与电流是同一时刻的信息,避免“用旧角度算新电流”的错位。

若采用单采样单更新,上述顺序在一个 Ts 内完成;若采用双采样双更新,可在 PWM 周期中点与过零点各采样一次,控制器执行两次,等效采样率翻倍。仿真中可用离散状态空间或触发子系统实现,关键是保证采样时刻与 PWM 载波同步,而不是用固定步长随意触发。

建议在仿真中显式记录 θ、θ̂、Δθ、iq、id 和转速波形。若 Δθ 在稳态下存在恒定偏差,通常是观测器增益或角度补偿未调好;若 Δθ 随转速线性增大,则可能是采样延迟未补偿,需要在位置估计器中加入 Ts 对应的角度超前量。

四、一个可复现的仿真参数示例

以下参数为教学示例,用于说明量级与配置方式,并非实测结果。PMSM 参数:定子电阻 Rs = 0.5 Ω,d 轴电感 Ld = 5 mH,q 轴电感 Lq = 5 mH,永磁磁链 ψf = 0.1 Wb,极对数 p = 4,转动惯量 J = 0.001 kg·m²。直流母线电压 udc = 300 V,PWM 频率 fpwm = 10 kHz,采样周期 Ts = 100 μs。速度环 PI:Kp = 0.05,Ki = 2;电流环 PI:Kp = 10,Ki = 500。观测器采用反电动势积分法,截止频率 200 Hz。

% 仿真时序伪代码(单采样单更新)
for k = 1:N
    t = k * Ts;
    % t0: 采样
    ia = motor.ia; ib = motor.ib; ic = motor.ic;
    udc = motor.udc;
    % t1: 观测器更新
    [ealpha, ebeta] = observer(ualpha, ubeta, ia, ib, ic, Ts);
    % t2: 位置估计
    [theta_hat, omega_hat] = pll(ealpha, ebeta, Ts);
    % t3: 双闭环计算
    iq_ref = speed_pi(omega_ref, omega_hat, Ts);
    [ud, uq] = current_pi(id_ref, iq_ref, id, iq, Ts);
    % t4: 逆Park与SVPWM
    [ualpha, ubeta] = inv_park(ud, uq, theta_hat);
    [da, db, dc] = svpwm(ualpha, ubeta, udc);
    % 更新PWM,下一周期生效
    motor.set_duty(da, db, dc);
end

运行上述结构后,重点观察三个现象:启动阶段 θ̂ 能否在 0.1 s 内跟踪上 θ;突加负载时转速跌落是否在速度环作用下恢复;稳态下 id 是否被控制在 0 附近。若 θ̂ 收敛慢,可适当提高观测器增益;若电流环出现高频振荡,应检查 Ts 与电流环带宽的比值,通常要求电流环带宽低于采样频率的 1/10。

五、常见时序错误与排查方向

仿真中最常见的错误是“代数环”:观测器需要电压,而电压又依赖观测器输出的角度,若在同一时刻直接求解会形成循环依赖。解决办法是在观测器输入处加入单位延迟,使用上一周期的电压值,这符合实际数字控制器的执行顺序。另一个错误是角度单位混用,Park 变换使用弧度而 SVPWM 使用角度,仿真中应统一为弧度并在显示时转换。

此外,若速度环和电流环使用相同的采样周期,速度环的积分增益应适当减小,否则会与电流环产生耦合振荡。工程上常让速度环以电流环的 5~10 倍周期执行,或在速度环输出后加一阶低通滤波。仿真中可通过对比不同 Ts 下的转速超调量来判断时序参数是否合理。

不要用连续求解器直接跑含离散控制器的模型而不设置采样时间,否则控制器会以求解器步长执行,导致与实际数字实现不符,角度估计和电流环结果都会失真。

总体而言,无位置传感器控制的仿真架构并不复杂,关键在于把“观测器—位置估计器—电流环—速度环”的信号依赖关系理清,并用固定的采样与 PWM 更新时序把连续被控对象和离散控制器正确连接起来。只要时序对齐、接口变量明确,后续替换不同的观测器算法或调节参数都会变得可控。