用S函数模块在Simulink中搭建一个两电机PID控制系统

2025-12-18

用S函数模块在Simulink中搭建一个两电机PID控制系统,并通过阶跃信号测试、Scope模块观察效果。

两电机PID控制的Simulink仿真实现

为了实现两电机PID控制仿真,我们可以采用S函数来封装PID控制器和电机模型,通过阶跃信号作为输入,并用Scope模块观察结果。

仿真模型结构

一个典型的两电机PID控制Simulink仿真模型主要包含以下部分:

组件 功能 实现方式
信号源 生成阶跃输入 Step模块
PID控制器 计算控制信号 S函数
电机模型 模拟电机动态特性 S函数或Transfer Fcn
显示模块 可视化结果 Scope模块

S函数实现PID控制器和电机模型

S函数(System-Function)是Simulink中用于创建自定义模块的强大工具,特别适合实现PID控制器和电机模型这样的复杂动态系统。

PID控制器S函数示例

function [sys,x0,str,ts] = pid_controller(t,x,u,flag, Kp, Ki, Kd, Ts)
% PID控制器S函数
% 输入u: 误差信号
% 参数: Kp, Ki, Kd - PID参数; Ts - 采样时间

switch flag
    case 0  % 初始化
        sizes = simsizes;
        sizes.NumContStates = 0;
        sizes.NumDiscStates = 3; % 存储积分项、上一次误差和上一次输出
        sizes.NumOutputs = 1;
        sizes.NumInputs = 1;
        sizes.DirFeedthrough = 1;
        sizes.NumSampleTimes = 1;
        sys = simsizes(sizes);
        x0 = [0; 0; 0]; % 初始状态
        str = [];
        ts = [Ts 0]; % 采样时间
        
    case 2  % 离散状态更新
        error = u(1); % 当前误差
        prev_integral = x(1); % 上一次积分项
        prev_error = x(2); % 上一次误差
        
        % 积分项更新 (梯形积分)
        integral = prev_integral + (error + prev_error) * Ts / 2;
        
        % 微分项 (带滤波)
        derivative = (error - prev_error) / Ts;
        
        % 更新状态
        sys = [integral; error; derivative];
        
    case 3  % 输出计算
        integral = x(1);
        derivative = x(3);
        error = u(1);
        
        % PID输出
        output = Kp * error + Ki * integral + Kd * derivative;
        sys = output;
        
    case {1, 4, 9}  % 未使用的flag
        sys = [];
    otherwise
        error(['未处理的flag = ',num2str(flag)]);
end

直流电机模型S函数示例

function [sys,x0,str,ts] = dc_motor_model(t,x,u,flag, R, L, Kt, J, B, Ke, Ts)
% 直流电机模型S函数
% 状态: [电流; 转速]
% 输入: 电压
% 参数: R-电阻, L-电感, Kt-转矩常数, J-转动惯量, B-阻尼系数, Ke-反电动势常数

switch flag
    case 0  % 初始化
        sizes = simsizes;
        sizes.NumContStates = 0;
        sizes.NumDiscStates = 2; % 电流和转速
        sizes.NumOutputs = 1;    % 输出转速
        sizes.NumInputs = 1;     % 输入电压
        sizes.DirFeedthrough = 0;
        sizes.NumSampleTimes = 1;
        sys = simsizes(sizes);
        x0 = [0; 0]; % 初始状态为零
        str = [];
        ts = [Ts 0];
        
    case 2  % 离散状态更新
        voltage = u(1); % 输入电压
        current = x(1); % 当前电流
        speed = x(2);   % 当前转速
        
        % 电机方程离散化
        % 电枢电路: V = R*i + L*di/dt + Ke*ω
        % 机械方程: Kt*i = J*dω/dt + B*ω
        
        % 前向欧拉离散化
        di_dt = (voltage - R * current - Ke * speed) / L;
        dw_dt = (Kt * current - B * speed) / J;
        
        new_current = current + di_dt * Ts;
        new_speed = speed + dw_dt * Ts;
        
        sys = [new_current; new_speed];
        
    case 3  % 输出
        sys = x(2); % 输出转速
        
    case {1, 4, 9}
        sys = [];
    otherwise
        error(['未处理的flag = ',num2str(flag)]);
end

完整Simulink模型搭建

模型架构

在Simulink中搭建如下结构的模型:

[Step1] --> [Sum1] --> [S-Function PID1] --> [S-Function Motor1] --> [Scope1]
              ↑                               ↓
          [Feedback1]                    [Output1]
              
[Step2] --> [Sum2] --> [S-Function PID2] --> [S-Function Motor2] --> [Scope2]
              ↑                               ↓
          [Feedback2]                    [Output2]

关键参数设置

  1. 阶跃信号模块

    • 阶跃时间:0.5秒
    • 初始值:0
    • 终值:100(表示目标转速)
  2. S函数参数

    • PID控制器:Kp=1.5, Ki=0.8, Kd=0.2, Ts=0.001
    • 电机模型:R=1, L=0.5, Kt=0.8, J=0.01, B=0.1, Ke=0.8, Ts=0.001
  3. Scope模块设置

    • 时间范围:0-2秒
    • 输入数量:2(分别显示两个电机响应)
    • 启用数据记录

仿真结果分析

预期的Scope输出

在Scope中你应该能看到:

  • 电机1和电机2的转速响应曲线
  • 阶跃输入信号
  • PID控制器输出

性能指标分析

通过仿真结果,可以评估以下性能指标:

  1. 上升时间:从10%到90%稳态值所需时间
  2. 调节时间:达到并保持在±2%稳态值范围内的时间
  3. 超调量:最大超出稳态值的百分比
  4. 稳态误差:稳态时的偏差

参考代码 两电机pid控制simulink仿真 www.3dddown.com/csa/78495.html

高级应用:双电机同步控制

对于需要精确同步的应用,可以考虑交叉耦合控制策略:

% 在S函数中实现同步误差补偿
function sync_error = calculate_sync_error(speed1, speed2, position1, position2)
    % 速度同步误差
    speed_sync_error = speed1 - speed2;
    
    % 位置同步误差(如果需要)
    position_sync_error = position1 - position2;
    
    % 综合同步误差
    sync_error = 0.7 * speed_sync_error + 0.3 * position_sync_error;
end

调试技巧

如果仿真结果不理想:

  1. 检查S函数编程:确保所有状态更新正确
  2. 调整PID参数:先用Ziegler-Nichols方法初步整定,再精细调整
  3. 验证电机参数:确保电机模型参数符合实际系统
  4. 使用Simulation Data Inspector:深入分析信号特性和相互关系

实际应用建议

  1. 实时控制考虑:将验证好的算法部署到实际电机控制硬件
  2. 性能优化:对于高性能应用,考虑磁场定向控制等高级策略
  3. 安全性:在实际系统中加入限幅和保护逻辑