无刷直流电机的调速 Matlab/simulink仿真搭建模型

BLDC电机的六步换向控制,pi控制。该示例显示了对额定功率为 1kW、转速为 3000 rpm 且速度可调的梯形 PMSM 电机使用六步开关开启模式的情况。
一台额定功率为 1 kW、电压为 500 Vdc、转速为 3000 rpm 的三相电机由一台六级电压逆变器供电。该逆变器是专用电源系统库中的 MOSFET 电桥。速度调节器用于控制直流母线电压。逆变器栅极信号是通过解码电机的霍尔效应信号产生的。逆变器的三相输出应用于 PMSM 块的定子绕组。施加在机器轴上的负载转矩首先被设置为 0,然后在 t = 0.1 s 时逐步升至额定值(3 N.m)。
采用两个控制回路。内环使逆变器栅极信号与电动势同步。外环通过改变直流母线电压来控制电机速度。
在这里插入图片描述
这是一个非常经典的无刷直流电机(BLDC)六步换向控制仿真需求。

这个系统的核心在于:
换向逻辑:根据霍尔传感器信号决定哪两个 MOSFET 导通。
速度控制:通过 PI 控制器调节 PWM 占空比,从而调节施加在电机上的平均电压。

🛠️ 第一步:Simulink 模型搭建结构

请在 Simulink 中按照以下结构连接模块(使用 Simscape Electrical 库):

电机部分:
使用 Permanent Magnet Synchronous Machine 模块。
关键设置:将 Rotor type 设置为 Salient-pole,将 Back EMF waveform 设置为 Trapezoidal(梯形波),这是模拟 BLDC 的关键。
参数设置:功率 1kW,电压 500V,转速 3000rpm,极对数 3(对应六级)。
逆变器部分:
使用 Universal Bridge 模块。
设置:Power electronic device 选 MOSFET / Diode,Number of bridge arms 选 3。
电源部分:
使用 DC Voltage Source 模块。
注意:根据你的描述“速度调节器控制直流母线电压”,这里可以将 DC Source 的电压值连接到一个输入端口,由 PI 控制器输出控制;或者更常见的做法是:DC 电压固定(如 500V),PI 控制器输出 PWM 占空比给逆变器(下面的代码采用更通用的 PWM 占空比控制方式)。
传感器:
电机模块自带霍尔信号输出(ht 端口),将其连接到换向逻辑模块。
电机模块的 m 端口(测量)连接到 Bus Selector,提取 Speed(转速)和 Torque(转矩)。

💻 第二步:核心控制代码

你需要创建两个 MATLAB Function 模块。

速度 PI 控制器
这个模块读取实际转速和参考转速,输出 PWM 占空比。

模块输入:
ref_speed: 参考转速 (3000 rpm)
act_speed: 实际转速 (rpm)

模块输出:
duty_cycle: PWM 占空比 (0~1)

代码内容:

function duty_cycle = Speed_Controller(ref_speed, act_speed)
% 速度 PI 控制器
% 输入: 参考转速, 实际转速
% 输出: 占空比

persistent integral_error prev_error;

% 初始化变量
if isempty(integral_error)
    integral_error = 0;
    prev_error = 0;
end

% PI 参数 (需要根据电机惯量调整)
Kp = 0.05; 
Ki = 0.001;

% 计算误差
error = ref_speed - act_speed;

% 积分项 (带抗饱和限制)
integral_error = integral_error + error;
integral_error = min(max(integral_error, -100), 100); % 限制积分累积

% PI 计算
duty_cycle = Kp * error + Ki * integral_error;

% 占空比限幅 (0 到 1 之间)
duty_cycle = min(max(duty_cycle, 0), 1);

% 更新历史值
prev_error = error;

end

六步换向逻辑
这是 BLDC 控制的核心,根据霍尔信号生成 6 个 MOSFET 的栅极信号。

模块输入:
hall_signals: 霍尔信号向量 [Ha, Hb, Hc]
duty_cycle: 来自 PI 控制器的占空比

模块输出:
gates: 6路栅极信号向量 [g1, g2, g3, g4, g5, g6]

代码内容:

function gates = Six_Step_Commutation(hall_signals, duty_cycle)
% 六步换向逻辑
% 输入: 霍尔信号 [Ha, Hb, Hc], 占空比
% 输出: 6路栅极信号 [g1, g2, g3, g4, g5, g6]
% 对应关系: g1(上桥A), g2(上桥B), g3(上桥C), g4(下桥A), g5(下桥B), g6(下桥C)

% 将霍尔信号转换为十进制状态 (0-7)
% 假设 hall_signals 是 [Ha, Hb, Hc]
state = hall_signals(14 + hall_signals(2)2 + hall_signals(3)*1;

% 初始化栅极信号为 0
gates = [0, 0, 0, 0, 0, 0];

% 六步换向表
switch state
    case 1 % 001 (Ha=0, Hb=0, Hc=1) -> A+ B-
        gates = [duty_cycle, 0, 0, 1, 0, 0]; 
    case 2 % 010 (Ha=0, Hb=1, Hc=0) -> A+ C-
        gates = [duty_cycle, 0, 0, 0, 0, 1];
    case 3 % 011 (Ha=0, Hb=1, Hc=1) -> B+ C-
        gates = [0, duty_cycle, 0, 0, 0, 1];
    case 4 % 100 (Ha=1, Hb=0, Hc=0) -> B+ A-
        gates = [0, duty_cycle, 0, 1, 0, 0];
    case 5 % 101 (Ha=1, Hb=0, Hc=1) -> C+ A-
        gates = [0, 0, duty_cycle, 1, 0, 0];
    case 6 % 110 (Ha=1, Hb=1, Hc=0) -> C+ B-
        gates = [0, 0, duty_cycle, 0, duty_cycle, 0]; % 注意:这里应该是 B- 导通,即 g5
        % 修正标准六步逻辑: C+ (g3), B- (g5)
        gates = [0, 0, duty_cycle, 0, 1, 0]; 
    otherwise
        gates = [0, 0, 0, 0, 0, 0]; % 非法状态或停止
end

% 注意:上面的逻辑是基于理想方波控制。
% 在实际 PWM 控制中,通常只对上桥臂进行 PWM 调制,下桥臂常通;
% 或者上下桥臂互补。这里采用简单的上桥 PWM,下桥常通逻辑。
% 修正上述逻辑以匹配标准 Hysteresis 或 PWM 模式:

% 重新定义标准六步换向 (上桥 PWM, 下桥常通)
% 状态: [Ha Hb Hc] -> 导通相 -> 栅极信号
% g1=A+, g4=A-, g2=B+, g5=B-, g3=C+, g6=C-

gates = zeros(1,6);

if state == 5      % 101: A+ (g1), B- (g5)
    gates(1) = duty_cycle; gates(5) = 1;
elseif state == 1  % 001: A+ (g1), C- (g6)
    gates(1) = duty_cycle; gates(6) = 1;
elseif state == 3  % 011: B+ (g2), C- (g6)
    gates(2) = duty_cycle; gates(6) = 1;
elseif state == 2  % 010: B+ (g2), A- (g4)
    gates(2) = duty_cycle; gates(4) = 1;
elseif state == 6  % 110: C+ (g3), A- (g4)
    gates(3) = duty_cycle; gates(4) = 1;
elseif state == 4  % 100: C+ (g3), B- (g5)
    gates(3) = duty_cycle; gates(5) = 1;
end

end

⚙️ 第三步:电机参数设置

在 Permanent Magnet Synchronous Machine 模块的参数对话框中,填入以下估算值(基于 1kW, 500V, 3000rpm):

Rotor type: Salient-pole
Back EMF waveform: Trapezoidal
Rated power, voltage, frequency: 1000 VA, 500 V, 50 Hz (频率设为基波频率即可)
Parameters:
Stator resistance Rs: 0.5 Ohm (估算)
Stator inductance Ls: 0.005 H (估算)
Mutual inductance Lm: 0.002 H
Flux linkage: 0.15 Wb (根据 E = Ke*w 估算)
Inertia J: 0.02 kg.m^2
Friction coefficient B: 0.001
Number of pole pairs: 3 (对应 6 极)

📈 第四步:仿真运行与波形观察

负载设置:
在电机的 Tm 输入端,连接一个 Step 模块。
设置 Step time 为 0.1,Final value 为 3.18 (因为 P = T times omega,3000rpm approx 314 rad/s,1000W / 314 approx 3.18 Nm)。
参考速度:
给 PI 控制器输入一个 Constant 模块,值为 3000。
观察结果:
转速: 应该在 0.05s 左右稳定在 3000rpm,0.1s 时负载加入后会有微小波动然后恢复。
电流: 应该是梯形波(平顶波)。
霍尔信号: 应该是频率随转速变化的方波。

这个方案完全符合你描述的“六步开关开启模式”和“PI 控制速度”。
在这里插入图片描述
无刷直流电机(BLDC)启动和加载过程。波形呈现出以下特征:

0 ~ 0.1s:电机启动阶段,电流冲击大(启动电流),随后逐渐稳定。
0.1s 之后:负载突加,电流产生波动并再次趋于稳定。
稳态:电流呈现方波特征(这是 BLDC 六步换向的典型特征),但带有明显的纹波(这是由于逆变器 PWM 开关和电感不够大造成的)。

第一部分:六步换向逻辑代码 (Switch Logic)

这段代码根据霍尔传感器信号(Hall_A, Hall_B, Hall_C)的组合,输出 6 路 PWM 信号给 MOSFET 逆变器。

输入: Hall_A, Hall_B, Hall_C (0 或 1)
输出: S1, S2, S3, S4, S5, S6 (0 或 1)

function [S1, S2, S3, S4, S5, S6] = BLDC_Commutation(Hall_A, Hall_B, Hall_C)
% 根据霍尔信号进行六步换向
% 注意:这里的逻辑电平定义取决于电机的接线和霍尔安装位置
% 以下是一个标准的顺时针旋转逻辑

% 定义霍尔组合
Hall_State = [Hall_A, Hall_B, Hall_C];

% 定义六步开关状态 (S1~S6)
% S1/S4 控制 A 相, S2/S5 控制 B 相, S3/S6 控制 C 相
% 上管导通为 1, 下管导通为 1

switch Hall_State
case [0 0 1] % Step 1
S1 = 1; S4 = 0;
S2 = 0; S5 = 0;
S3 = 0; S6 = 1;
case [0 1 1] % Step 2
S1 = 1; S4 = 0;
S2 = 0; S5 = 1;
S3 = 0; S6 = 0;
case [0 1 0] % Step 3
S1 = 0; S4 = 0;
S2 = 1; S5 = 0;
S3 = 0; S6 = 1;
case [1 1 0] % Step 4
S1 = 0; S4 = 1;
S2 = 1; S5 = 0;
S3 = 0; S6 = 0;
case [1 0 0] % Step 5
S1 = 0; S4 = 1;
S2 = 0; S5 = 0;
S3 = 1; S6 = 0;
case [1 0 1] % Step 6
S1 = 0; S4 = 0;
S2 = 0; S5 = 1;
S3 = 1; S6 = 0;
otherwise
% 默认关闭所有开关(刹车或待机)
S1 = 0; S2 = 0; S3 = 0;
S4 = 0; S5 = 0; S6 = 0;
end

第二部分:PI 速度控制代码 (Speed Controller)

这段代码读取电机当前转速,与给定转速对比,通过 PI 算法输出 PWM 占空比(Duty)。这个占空比随后会乘以六步换向的开关信号,生成最终的 PWM 波形。

输入: w_mech (机械转速), w_ref (参考转速), Ts (采样时间, e.g., 1e-5)
输出: Duty (占空比, 0~1)

function Duty = Speed_PI_Controller(w_mech, w_ref, Ts)
% PI 控制器参数 (需要根据电机参数整定)
% 你的电机是 1kW, 500V, 3000rpm
% 初始参数建议,如果震荡剧烈请减小 Kp
persistent Kp Ki Integral Error_Prev;
if isempty(Kp)
Kp = 0.5; % 比例增益 (建议 0.1 ~ 2.0)
Ki = 0.05; % 积分增益 (建议 0.01 ~ 0.2)
Integral = 0;
Error_Prev = 0;
end

% 计算误差
Error = w_ref - w_mech;

% 积分项 (抗积分饱和)
Integral = Integral + Error * Ts;
% 限幅处理,防止积分饱和导致超调过大
if Integral > 10
Integral = 10;
elseif Integral 1
Duty = 1;
elseif Duty < 0
Duty = 0;
end

% 更新历史数据
Error_Prev = Error;

PI 参数过大:如果你的 Kp 太大,系统会像过山车一样震荡。建议:尝试将 Kp 减小到 0.2 或 0.3。
PWM 频率太低:如果逆变器的 PWM 频率太低,电流纹波会很大。建议:在 Simulink 中将仿真算法的 Fixed-step size 设小一点(例如 1e-6),或者在逆变器模块中检查开关频率。
负载突变冲击:在 t=0.1s 时负载从 0 突变到 3Nm,电机转速瞬间下降,电流瞬间飙升以克服惯性。这是正常的物理现象,但如果震荡持续不衰减,说明 PI 控制器参数不合适。

📝 如何连接这些代码?

将 BLDC_Commutation 模块的输出(S1~S6)连接到 Universal Bridge 的 G 端口。
将 Speed_PI_Controller 的输出(Duty)乘以(* 模块) S1~S6 的信号。注意:Simulink 中不能直接将 0/1 信号与 PWM 信号相乘,你需要将 S1~S6 转换为 PWM 信号。
进阶做法:使用 PWM Generator 模块,将 Duty 作为输入,Switch 信号作为使能。
简易做法:在 BLDC_Commutation 输出端,使用 Switch 模块,当 S1=1 时输出 Duty,当 S1=0 时输出 0。

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐