3、直流电机开环控制:H桥驱动原理、PWM调速、死区时间设置、开环调速仿真
各位同学,欢迎来到第三章。
前两章我们把直流电机的基本模型和数学方程捋了一遍。从这章开始,咱们要动真格的了——让电机真正转起来。
开环控制,说白了就是“我让你转你就转,转成啥样我不管”。听起来有点粗暴?但在很多场合,比如风扇、水泵、玩具车,开环完全够用。而且,它是理解闭环控制的基础。
3.1 H桥驱动原理:让电机正反转
直流电机怎么才能正转、反转?
答案很简单:改变电流方向。电流从A端进B端出,电机正转;反过来,从B端进A端出,它就反转。
那问题来了——我们只有一个电源(比如12V),怎么实现电流换向?
这就轮到H桥登场了。
H桥的基本结构
H桥由四个开关管(通常是MOSFET或IGBT)组成,接成“H”形。电机接在中间横杠上。
四个开关管分别叫:Q1(左上)、Q2(右上)、Q3(左下)、Q4(右下)。
工作模式就两种:
- 正转:导通Q1和Q4,电流从电源正极→Q1→电机→Q4→地。
- 反转:导通Q2和Q3,电流从电源正极→Q2→电机→Q3→地。
嗯,这里要注意:绝对不能同时导通Q1和Q2,或者Q3和Q4。为什么?因为那等于把电源正负极直接短路,瞬间电流能把管子烧成灰。我刚开始做驱动板时就犯过这个错,啪的一声,MOS管直接炸了,板子上一股焦味……从那以后,我每次上电前都会用万用表量一遍逻辑。
核心要点:H桥的本质是四个开关,通过不同组合改变电机两端电压极性。
3.2 PWM调速:用占空比控制速度
电机转起来了,但怎么控制它转多快?
你可能会想:调电压呗。电压高转得快,电压低转得慢。
没错,道理是这个道理。但实际中我们很少直接调模拟电压,而是用PWM——脉冲宽度调制。
PWM的原理
说白了就是:把电源电压(比如12V)以很高的频率(比如20kHz)不停地开关。开的时间长,关的时间短,平均电压就高;反过来平均电压就低。
这个“开的时间占整个周期的比例”,就叫占空比。
- 占空比100%:一直开着,平均电压=12V,电机全速。
- 占空比50%:一半时间开一半时间关,平均电压=6V,电机半速。
- 占空比0%:一直关着,电机停转。
你想想看,电机是个大电感,电流不会突变。PWM频率足够高时,电流纹波很小,电机转起来就很平滑。
个人经验:我一般把PWM频率设在16kHz~20kHz之间。低于16kHz人耳能听到啸叫声,很烦人;高于20kHz开关损耗会明显增加。20kHz是个不错的折中点。
PWM与H桥的结合
实际驱动时,我们不会傻傻地让四个管子全硬开关。常用的方式是:
- 正转时:Q1常开,Q4用PWM控制。或者反过来,Q4常开,Q1用PWM。
- 反转时:Q2常开,Q3用PWM控制。
这样只需要一个PWM通道,控制简单,开关损耗也小。
3.3 死区时间设置:别让上下管直通
刚才我说过,上下管不能同时导通。但实际中,开关管不是理想器件——它关断需要时间。
比如,你让Q1关断、Q2导通。如果Q1还没完全关断,Q2就已经导通了,那瞬间就是上下管直通,短路!
这就是死区时间存在的意义。
死区时间是什么?
就是在切换上下管时,故意插入一段“两个管子都关断”的时间。比如:
- 先关断Q1。
- 等待死区时间(比如1微秒)。
- 再导通Q2。
这样,无论Q1关断多慢,都不会和Q2同时导通。
死区时间设多大?
这取决于你用的MOSFET的关断延迟时间。一般数据手册会给出td(off)和tf。
我个人的经验公式:
死区时间 ≥ (td(off) + tf) × 1.5
留50%的余量,安全第一。
| MOSFET型号 | 典型关断延迟 | 建议死区时间 |
|---|---|---|
| IRF540 | 约50ns | 200~500ns |
| IRF3205 | 约60ns | 300~600ns |
| IGBT(如FGA25N120) | 约300ns | 1~2μs |
警告:死区时间不是越大越好。死区太长,电机在换向时会有短暂的“无驱动”状态,导致电流断续,转矩波动变大。我曾经在一个项目中把死区设成5μs,结果电机低速时抖得像筛子……后来改成1μs就正常了。
3.4 开环调速仿真:让模型跑起来
理论讲完了,咱们来点实际的——在Simulink里搭一个开环调速模型。
仿真模型结构
我习惯这样搭:
- PWM生成模块:用Repeating Sequence或PWM Generator,设置频率20kHz,占空比可调。
- H桥模型:用四个MOSFET(可以用理想开关代替),加上死区时间逻辑。
- 直流电机模型:用前两章讲的电枢方程和机械方程。
- 示波器:看电压、电流、转速波形。
关键参数设置
电机参数我用一个实际的小直流电机:
- 额定电压:12V
- 电枢电阻:2Ω
- 电枢电感:5mH
- 反电动势常数:0.1 V/(rad/s)
- 转动惯量:0.001 kg·m²
仿真代码(MATLAB脚本方式)
如果你不想拖模块,也可以用脚本跑。下面是我常用的一个简化版:
% 直流电机开环PWM调速仿真
% 参数定义
R = 2; % 电枢电阻,Ω
L = 0.005; % 电枢电感,H
Ke = 0.1; % 反电动势常数,V/(rad/s)
J = 0.001; % 转动惯量,kg·m²
B = 0.0001; % 阻尼系数,N·m/(rad/s)
Vdc = 12; % 电源电压,V
f_pwm = 20000; % PWM频率,Hz
T_pwm = 1/f_pwm;
duty = 0.6; % 占空比60%
% 仿真时间
t_end = 0.5; % 0.5秒
dt = 1e-6; % 步长1微秒
t = 0:dt:t_end;
n = length(t);
% 状态变量初始化
i = 0; % 电流,A
w = 0; % 转速,rad/s
theta = 0; % 角度,rad
% 存储结果
i_rec = zeros(1, n);
w_rec = zeros(1, n);
% 主循环
for k = 1:n
% 生成PWM信号
pwm = (mod(t(k), T_pwm) < duty*T_pwm);
% H桥输出电压(简化:忽略死区)
Va = pwm * Vdc;
% 电机方程
di = (Va - R*i - Ke*w) / L;
dw = (Ke*i - B*w) / J;
% 更新状态(欧拉法)
i = i + di * dt;
w = w + dw * dt;
% 记录
i_rec(k) = i;
w_rec(k) = w;
end
% 画图
figure;
subplot(2,1,1);
plot(t, i_rec);
xlabel('时间 (s)'); ylabel('电流 (A)');
title('电枢电流');
subplot(2,1,2);
plot(t, w_rec);
xlabel('时间 (s)'); ylabel('转速 (rad/s)');
title('电机转速');
跑完这个仿真,你会看到:
- 电流在启动瞬间有个很大的冲击(因为反电动势还没建立起来)。
- 转速慢慢上升,最后稳定在一个值。
- 如果占空比从60%改成80%,稳态转速也会跟着升高。
避坑指南:仿真步长别设太大。我曾经用10微秒步长跑这个模型,结果电流波形全是锯齿,还以为程序写错了。后来换成1微秒,波形就平滑了。记住,PWM频率20kHz时,一个周期才50微秒,步长至少要比这个短一个数量级。
好了,这一章的内容就到这儿。
从H桥的四个开关管,到PWM的占空比控制,再到死区时间的设置,最后用仿真验证了整个开环调速过程。你现在应该能自己搭一个简单的直流电机驱动系统了。
下一章,我们会给这个系统加上反馈——让电机转速更精确、更稳定。闭环控制,才是真正有意思的地方。
课后小作业:把上面代码中的占空比改成0.3和0.9,分别跑一次,看看稳态转速和电流有什么变化。再试试把死区时间加进去(在H桥输出那里加一个延迟逻辑),看看波形有什么不同。