BLDC无刷直流电机matlab仿真,转速电流双闭环控制,有感或无感换相方式,电机模型自带反电动势输出,默认用无感反电动势过零换相方式,里面有霍尔信号(未使用),Simulink仿真
直接打开Simulink新建模型,先把BLDC本体拖进来。这个电机模型自带了反电动势输出端口,在无感控制时特别方便。模型里其实还挂着霍尔信号输出,不过咱们这次不用它——反电动势过零检测才是今天的主角。
双击电机模块,参数设置里有个换相方式的下拉菜单。默认选的是Sensorless,这就是无感模式。注意看这里的反电动势波形相位差设置,保持默认的120度就行。顺手把极对数改成4,额定转速3000rpm,这参数后面做PI调节时会用上。
双闭环结构得先搭电流环。直接上PI控制器,代码层面其实就两行核心运算:
error = I_ref - I_actual; output = Kp*error + Ki*error*Ts;不过实际在Simulink里直接拖Discrete PID模块更方便。电流环的采样时间建议设小点,比如1e-5秒,毕竟电流变化比转速快得多。输出记得加限幅,别让PWM占空比超限。
转速环套在电流环外面,这里有个小技巧:把转速给定通过斜坡函数模块,防止阶跃突变导致震荡。霍尔信号虽然没接,但模块里的Hall ABC端口还是得悬空接Terminator,避免仿真报错。
换相逻辑部分最烧脑。用MATLAB Function模块写了段过零检测代码:
function comm_seq = fcn(emf_a, emf_b, emf_c) persistent last_state; if isempty(last_state) last_state = 0; end % 检测反电动势过零点 crossing = (emf_a.*emf_b < 0) * 1 + (emf_b.*emf_c < 0) * 2 + (emf_c.*emf_a < 0) * 4; if crossing ~= last_state comm_seq = mod(crossing + 2, 6) + 1; last_state = crossing; else comm_seq = 0; % 保持当前状态 end这段代码实现的是六步换相的核心逻辑,用乘积符号判断过零点。注意那个mod运算处理相位偏移,实测加上30度电角度延迟效果更好。最后输出的comm_seq直接驱动逆变器模块的开关序列。
仿真跑起来后,在Scope里看到转速曲线像坐过山车——开始疯狂震荡。这时候该调PI参数了,记住口诀:"先调电流环,再整转速环"。电流环的Kp从0.5开始试,Ki设成Kp的1/10。转速环带宽要比电流环低一个数量级,不然两个环路会打架。
当转速终于稳住时,突然加载5N·m的扰动。电流瞬间飙到15A又快速回落,说明动态响应合格。把反电动势波形放大看,过零点的毛刺得用低通滤波器处理,但滤波时间常数不能太大,否则换相滞后会导致转矩脉动。
最后在模型里加个Powergui模块,把仿真模式改成离散步长。这样跑起来比默认的变步长快三倍不止,特别是换相频率高的时候。存模型前记得把霍尔信号那条蓝色的虚线删干净,强迫症患者表示看着舒服多了。