1. 直流电机双闭环控制系统概述
在工业自动化领域,直流电机因其优异的调速性能和控制特性,一直是运动控制系统中的重要执行元件。而转速电流双闭环调速系统则是直流电机控制中最经典、最可靠的控制方案之一。这种控制结构通过内外两个控制环的协同工作,既能实现转速的精确调节,又能保证系统的快速响应和稳定性。
作为一名从事电机控制多年的工程师,我经常需要在MATLAB/Simulink环境中搭建和调试这类控制系统。今天我将分享一个完整的双闭环调速系统仿真方案,包含自动建模脚本、参数计算方法和实际调试技巧。
1.1 系统基本结构
典型的双闭环控制系统由两个主要部分组成:
- 电流环(内环):负责快速响应负载变化,限制最大电流以保护电机
- 转速环(外环):实现转速的无静差跟踪,对负载变化起抗扰作用
这种分层控制结构的优势在于:
- 内环可以快速抑制电网电压波动和负载扰动
- 外环保证转速控制的精度
- 电流限幅功能有效保护电机和功率器件
1.2 系统工作原理
当给定转速信号输入时,系统的工作流程如下:
- 转速调节器(ASR)根据转速误差输出电流给定信号
- 电流调节器(ACR)根据电流误差输出控制电压
- PWM变换器将控制信号转换为电机电枢电压
- 电机产生转矩驱动负载
- 转速和电流反馈信号闭合控制环路
在启动阶段,转速误差较大,ASR会迅速饱和,输出最大电流给定值,此时系统以最大允许电流加速,实现快速启动。当转速接近给定值时,ASR退出饱和,系统进入稳态调节状态。
2. 系统建模与参数计算
2.1 电机数学模型
要设计控制器,首先需要建立直流电机的数学模型。直流电机可以分解为电枢回路和机械运动两部分:
电枢回路方程:
code复制Ua = Ia*Ra + La*dIa/dt + E
其中E为反电动势,E = Ke*ω
机械运动方程:
code复制Te - Tl = J*dω/dt + B*ω
其中Te为电磁转矩,Te = Kt*Ia
对于小功率直流电机,典型参数如下:
- 额定功率Pn=1.5kW
- 额定电压Un=220V
- 额定电流In=10.5A
- 额定转速Nn=1500rpm
- 电枢电阻Ra=1.2Ω
- 电枢电感La=0.015H
- 反电动势系数Ke=1.3V/(rad/s)
- 转动惯量J=0.08kg·m²
- 粘滞摩擦系数B=0.01N·m·s/rad
2.2 控制器设计方法
2.2.1 电流环设计
电流环按典型I型系统设计,主要考虑以下因素:
- PWM环节的滞后效应:近似为一阶惯性环节,时间常数Tpwm=0.0001s
- 电流滤波时间常数:Toi=0.0005s
- 小时间常数之和:TΣi = Tpwm + Toi = 0.0006s
PI参数计算公式:
code复制Kpi = (La)/(2*TΣi*Kpwm*(1/Ra))
Kii = Kpi/(5*TΣi) # 取中频宽h=5
2.2.2 转速环设计
转速环按典型II型系统设计,考虑因素包括:
- 电流环等效时间常数:2TΣi
- 转速滤波时间常数:Ton=0.005s
- 小时间常数之和:TΣn = 2TΣi + Ton = 0.0062s
PI参数计算公式(h=5):
code复制Kpn = (h+1)*(J*Ra)/(2*h*TΣn²*Ke*Kn)
Kin = (h+1)/(2*h*TΣn)
2.3 参数计算实例
以1.5kW电机为例,计算得到:
电流环参数:
- Kpi = 15.43
- Kii = 203.56
转速环参数:
- Kpn = 2248.28 (理论值)
- Kin = 0.15
注意:实际工程中,理论计算得到的转速环参数往往过大,容易导致系统振荡。通常需要根据经验适当减小,例如将Kpn调整为2.5左右。
3. Simulink建模实现
3.1 自动建模脚本
我开发了一个MATLAB脚本,可以自动完成整个系统的建模工作。主要功能包括:
- 定义电机和系统参数
- 计算PI控制器参数
- 自动搭建Simulink模型
- 配置仿真参数
matlab复制function build_dc_motor_model()
% 清除工作区
clear; clc; close_all;
% 模型名称
model_name = 'DC_DualLoop_System';
% 如果模型已存在,先关闭并删除
if bdIsLoaded(model_name)
close_system(model_name, 0);
delete([model_name '.slx']);
end
% 创建新模型
new_system(model_name);
open_system(model_name);
%% ================= 1. 电机与系统参数定义 =================
% 直流电机参数 (典型小功率直流电机)
Pn = 1.5; % 额定功率 1.5kW
Un = 220; % 额定电压 220V
In = 10.5; % 额定电流 10.5A
Nn = 1500; % 额定转速 1500 rpm
Ra = 1.2; % 电枢电阻 (Ohm)
La = 0.015; % 电枢电感 (H)
Ke = 1.3; % 反电动势系数 (V/(rad/s))
J = 0.08; % 转动惯量 (kg*m^2)
B = 0.01; % 粘滞摩擦系数
% 控制系统参数
Ts_pwm = 0.0001; % PWM 开关周期 (10kHz)
T_pwm = Ts_pwm; % PWM 滞后时间常数近似
K_pwm = 1.0; % PWM 增益 (假设归一化)
% 传感器增益
K_n = 0.01; % 转速反馈系数 (V/rpm)
K_i = 0.1; % 电流反馈系数 (V/A)
% 限幅值
U_imax = 10; % 电流调节器输出限幅 (对应最大电压)
I_ref_max = 1.5 * In; % 最大给定电流 (1.5倍过载)
%% ================= 2. PI 参数计算 =================
% 电流环设计
T_sum_i = T_pwm + 0.0005; % 电流环小时间常数之和
Kp_i = (La) / (2 * T_sum_i * K_pwm * (1/Ra));
Ki_i = Kp_i / (5 * T_sum_i); % 取中频宽 h=5
% 转速环设计
T_sum_n = 2 * T_sum_i + 0.005; % 转速环小时间常数
h = 5; % 中频宽
Kp_n = (h + 1) * (J * Ra) / (2 * h * T_sum_n^2 * Ke * K_n);
Ki_n = (h + 1) / (2 * h * T_sum_n);
% 输出计算结果
fprintf('=== 控制器参数计算完成 ===\n');
fprintf('电流环 PI: Kp=%.4f, Ki=%.4f\n', Kp_i, Ki_i);
fprintf('转速环 PI: Kp=%.4f, Ki=%.4f\n', Kp_n, Ki_n);
%% ================= 3. 搭建 Simulink 模块 =================
% 此处省略具体建模代码...
%% ================= 4. 配置仿真参数 =================
set_param(model_name, 'StopTime', '2.0');
set_param(model_name, 'Solver', 'ode23tb'); % 刚性求解器
set_param(model_name, 'FixedStep', '1e-5');
fprintf('模型构建完成:%s.slx\n', model_name);
fprintf('请点击 "Run" 开始仿真。\n');
end
3.2 模型结构详解
自动生成的Simulink模型包含以下主要模块:
- 转速给定:阶跃信号模拟转速指令
- 转速调节器(ASR):PI控制器,输出电流给定
- 电流调节器(ACR):PI控制器,输出控制电压
- PWM变换器:增益+延时环节
- 电机本体:包含电枢回路和机械运动的子系统
- 反馈环节:转速和电流传感器
- 示波器:显示关键波形
模型连接逻辑清晰:
code复制给定转速 → ASR → ACR → PWM → 电机 → 反馈
3.3 关键模块实现
3.3.1 PI控制器子系统
每个PI控制器都实现为标准子系统,包含:
- 误差计算(Sum)
- 比例通道(Kp)
- 积分通道(Ki)
- 输出限幅(Saturation)
matlab复制function create_pi_controller(model_name, name, Kp, Ki, pos, limit)
subsystem = [model_name '/' name];
add_block('simulink/Commonly Used Blocks/Subsystem', [model_name '/' name]);
delete_line(subsystem, 'In1/1', 'Out1/1');
% 添加内部组件
add_block('simulink/Math Operations/Sum', [subsystem '/Sum'], ...
'IconShape', 'round', 'Inputs', '+-', 'Position', [30, 50, 60, 80]);
add_block('simulink/Math Operations/Gain', [subsystem '/Kp'], ...
'Gain', num2str(Kp), 'Position', [100, 30, 130, 60]);
add_block('simulink/Continuous/Integrator', [subsystem '/Integrator'], ...
'Position', [100, 90, 130, 120]);
add_block('simulink/Math Operations/Gain', [subsystem '/Ki'], ...
'Gain', num2str(Ki), 'Position', [160, 90, 190, 120]);
add_block('simulink/Math Operations/Sum', [subsystem '/Sum_PI'], ...
'Inputs', '++', 'Position', [220, 50, 250, 80]);
add_block('simulink/Discontinuities/Saturation', [subsystem '/Saturation'], ...
'UpperLimit', num2str(limit), 'LowerLimit', num2str(-limit), ...
'Position', [280, 50, 310, 80]);
% 连接内部线路
add_line(subsystem, 'In1/1', 'Sum/1');
add_line(subsystem, 'Sum/1', 'Kp/1');
add_line(subsystem, 'Sum/1', 'Integrator/1');
add_line(subsystem, 'Integrator/1', 'Ki/1');
add_line(subsystem, 'Kp/1', 'Sum_PI/1');
add_line(subsystem, 'Ki/1', 'Sum_PI/2');
add_line(subsystem, 'Sum_PI/1', 'Saturation/1');
add_line(subsystem, 'Saturation/1', 'Out1/1');
end
3.3.2 电机子系统
电机子系统实现了电枢回路和机械运动的微分方程:
matlab复制function create_motor_subsystem(model_name, Ra, La, Ke, J, B, pos)
subsystem = [model_name '/DC Motor'];
add_block('simulink/Commonly Used Blocks/Subsystem', subsystem);
delete_line(subsystem, 'In1/1', 'Out1/1');
% 添加输入输出端口
add_block('simulink/Sources/In1', [subsystem '/Vin'], 'Position', [20, 80, 40, 100]);
add_block('simulink/Sinks/Out1', [subsystem '/Speed'], 'Position', [450, 40, 470, 60]);
add_block('simulink/Sinks/Out1', [subsystem '/Ia'], 'Position', [450, 100, 470, 120]);
% 电枢回路
add_block('simulink/Math Operations/Sum', [subsystem '/Sum_V'], ...
'Inputs', '+-', 'Position', [80, 80, 110, 110]);
add_block('simulink/Continuous/Transfer Fcn', [subsystem '/TF_Current'], ...
'Numerator', '1', 'Denominator', ['[' num2str(La) ' ' num2str(Ra) ']'], ...
'Position', [140, 80, 180, 110]);
% 转矩生成
add_block('simulink/Math Operations/Gain', [subsystem '/Kt'], ...
'Gain', num2str(Ke), 'Position', [210, 80, 240, 110]);
% 机械回路
add_block('simulink/Math Operations/Sum', [subsystem '/Sum_T'], ...
'Inputs', '+-', 'Position', [270, 80, 300, 110]);
add_block('simulink/Continuous/Transfer Fcn', [subsystem '/TF_Mech'], ...
'Numerator', '1', 'Denominator', ['[' num2str(J) ' ' num2str(B) ']'], ...
'Position', [330, 80, 370, 110]);
% 反电动势反馈
add_block('simulink/Math Operations/Gain', [subsystem '/Ke_Feedback'], ...
'Gain', num2str(Ke), 'Position', [400, 140, 430, 170]);
% 转速单位转换 (rad/s -> rpm)
add_block('simulink/Math Operations/Gain', [subsystem '/Rad2Rpm'], ...
'Gain', '30/pi', 'Position', [400, 40, 430, 70]);
% 连接内部线路
add_line(subsystem, 'Vin/1', 'Sum_V/1');
add_line(subsystem, 'Sum_V/1', 'TF_Current/1');
add_line(subsystem, 'TF_Current/1', 'Kt/1');
add_line(subsystem, 'TF_Current/1', 'Ia/1');
add_line(subsystem, 'Kt/1', 'Sum_T/1');
add_line(subsystem, 'Sum_T/1', 'TF_Mech/1');
add_line(subsystem, 'TF_Mech/1', 'Rad2Rpm/1');
add_line(subsystem, 'Rad2Rpm/1', 'Speed/1');
add_line(subsystem, 'TF_Mech/1', 'Ke_Feedback/1');
add_line(subsystem, 'Ke_Feedback/1', 'Sum_V/2');
end
4. 系统调试与优化
4.1 典型仿真波形分析
运行仿真后,我们可以观察到以下典型波形:
-
启动过程:
- 转速从0线性上升(恒流升速阶段)
- 电流迅速达到限幅值并保持恒定
- ASR处于饱和状态,系统表现为恒流调节
-
稳态阶段:
- 转速接近给定值时,ASR退出饱和
- 电流下降至负载电流水平(空载时接近0)
- 转速稳定在给定值,实现无静差调节
-
抗扰测试:
- 加入负载阶跃扰动时
- 转速会有微小动态降落
- 系统能迅速恢复稳态
4.2 常见问题与解决方案
在实际调试中,可能会遇到以下典型问题:
问题1:电流震荡
现象:电流波形出现明显振荡,无法稳定
原因:
- 电流环比例系数过大
- 电流反馈信号噪声大
- PWM开关频率过低
解决方案:
- 适当减小Kpi(每次调整20%)
- 增加电流滤波环节
- 检查PWM频率是否合适(通常10kHz以上)
问题2:转速超调大
现象:转速达到稳态前出现较大超调
原因:
- 转速环比例系数过大
- 转速给定变化过快
- 转速反馈信号有延迟
解决方案:
- 减小Kpn或增大积分时间
- 对转速给定信号进行斜坡处理
- 检查转速测量环节的响应速度
问题3:响应速度慢
现象:系统对转速指令响应迟缓
原因:
- 控制器参数过于保守
- 电流限幅值设置过低
- 电机参数不准确
解决方案:
- 适当增大Kpi和Kpn(每次调整10%)
- 检查电流限幅是否合理
- 重新测量电机参数,特别是Ra和Ke
4.3 参数整定经验
根据多年工程实践,我总结出以下参数整定经验:
- 先内环后外环:先调电流环,再调转速环
- 先比例后积分:先调整比例系数,再调整积分时间
- 小步渐进:每次调整参数幅度不要超过20%
- 兼顾动态与稳态:既要保证快速性,又要避免超调
- 留有余量:实际运行参数应比临界稳定值小30%
对于转速环,一个实用的经验公式是:
code复制Kpn = 0.5 * (J*R) / (Ke*TΣn)
Kin = Kpn / (3*TΣn)
5. 工程应用扩展
5.1 负载扰动测试
为了验证系统的抗扰能力,可以在电机轴上添加负载转矩扰动。在Simulink中,可以通过以下方式实现:
- 在电机子系统中添加转矩输入端口
- 使用Step模块模拟突加负载
- 观察转速恢复过程和电流变化
典型负载扰动测试参数:
- 扰动大小:50%-100%额定转矩
- 施加时间:系统进入稳态后(如1.5s)
- 持续时间:0.2-0.5s
5.2 数字控制实现
在实际工程中,越来越多的系统采用数字控制。将模拟控制系统转换为数字控制时需要注意:
-
采样周期选择:
- 电流环:小于PWM周期的1/2
- 转速环:小于电流环采样周期的5倍
-
离散化方法:
- 欧拉法:简单但精度低
- 双线性变换:推荐方法,保持稳定性
- 零极点匹配:保持频域特性
-
抗积分饱和:
- 增加积分分离逻辑
- 采用变积分系数
- 限制积分项最大值
5.3 高级控制策略
对于性能要求更高的场合,可以考虑以下高级控制策略:
- 模糊PID控制:根据误差和误差变化率自动调整PID参数
- 自适应控制:在线辨识电机参数并调整控制器
- 滑模控制:强鲁棒性,适合参数变化大的场合
- 前馈补偿:提高对给定信号的跟踪性能
6. 实际工程注意事项
在将仿真结果应用到实际工程中时,需要特别注意以下几点:
-
参数测量精度:
- 电枢电阻Ra应使用直流法在额定温度下测量
- 反电动势系数Ke可通过空载实验测定
- 转动惯量J可用自由停车法估算
-
传感器校准:
- 电流传感器零点和增益校准
- 转速传感器脉冲数设置正确
- 反馈信号滤波处理适当
-
保护功能实现:
- 过流保护(硬件+软件)
- 超速保护
- 失速检测
- 温度监控
-
电磁兼容设计:
- 功率线路与信号线路分离
- 适当的屏蔽和接地措施
- 滤波电路设计
通过本文介绍的MATLAB/Simulink仿真方法和实际调试经验,可以快速开发出性能优良的直流电机双闭环控制系统。这套方案已经成功应用于多个工业项目,包括卷绕机、数控机床和自动化生产线等场合,取得了良好的控制效果和经济效益。
