1. 一阶倒立摆系统概述
一阶倒立摆是控制理论中经典的实验平台,它由一个可以在水平轨道上移动的小车和安装在小车上的自由摆杆组成。这个看似简单的系统实际上是一个非线性、不稳定的高阶系统,对控制算法提出了严峻挑战。在工业自动化领域,类似的控制场景随处可见,比如起重机防摇摆控制、火箭姿态控制等。
我第一次接触倒立摆是在研究生阶段的控制理论课上,当时就被这个"反直觉"的系统深深吸引——要让摆杆保持直立,居然需要小车不断左右移动来补偿。经过多年工业现场实践后,我发现在汇川InoProShop平台上实现倒立摆控制,不仅能深入理解PID控制原理,更能掌握工业级运动控制的实现方法。
2. 串级PID控制原理深度解析
2.1 基本控制结构
串级PID控制采用内外双环结构,内环(副回路)响应速度快,负责抑制高频干扰;外环(主回路)响应相对较慢,负责保证系统稳态精度。在一阶倒立摆系统中,典型的控制架构是:
- 外环:角度环(控制摆杆角度)
- 内环:位置环(控制小车位置)
这种结构之所以有效,是因为摆杆角度变化相对小车位置变化更缓慢。通过将角度环的输出作为位置环的设定值,可以实现"角度粗调,位置微调"的控制效果。
2.2 数学建模分析
倒立摆的非线性动力学方程可以简化为:
θ̈ = (mglsinθ - mlẍcosθ)/(ml²)
其中:
- θ:摆杆偏离垂直位置的角度
- m:摆杆质量
- l:摆杆长度
- g:重力加速度
- x:小车位置
在小角度范围内(θ≈0),可以做线性化近似:
sinθ ≈ θ,cosθ ≈ 1
得到简化后的传递函数:
G(s) = θ(s)/X(s) = 1/(s² - g/l)
这个极点分布在右半平面的系统直观展示了倒立摆的内在不稳定特性。
3. PID功能块实现细节
3.1 增量式PID算法选择
在工业控制中,增量式PID相比位置式具有三大优势:
- 无积分饱和问题
- 易于实现手动/自动无扰切换
- 输出限幅处理更简单
增量式PID的离散化公式:
Δu(k) = Kp[e(k)-e(k-1)] + KiTse(k) + Kd[e(k)-2e(k-1)+e(k-2)]/Ts
其中Ts为采样周期,这个公式直接对应了我们代码中的实现。
3.2 汇川PLC的ST语言实现
在InoProShop中,我们采用结构化文本(ST)编写PID功能块。几个关键实现细节:
- 抗积分饱和处理:
st复制IF ABS(This.Integral) > IntegralLimit THEN
This.Integral := SIGN(This.Integral) * IntegralLimit;
END_IF
- 输出限幅:
st复制IF This.Output > OutputMax THEN
This.Output := OutputMax;
ELSIF This.Output < OutputMin THEN
This.Output := OutputMin;
END_IF
- 微分项滤波:
st复制// 使用一阶低通滤波平滑微分项
DTerm := (This.Kd * (Error - This.PrevError) / dt) * Alpha
+ DTerm * (1 - Alpha);
实际调试中发现,微分项的高频噪声会严重影响控制效果,加入滤波系数Alpha(0.1~0.3)后系统稳定性显著提升。
4. 起摆控制策略实现
4.1 能量累积法原理
起摆控制的核心是通过给摆杆注入足够的动能,使其能够摆动到垂直位置附近。我们采用基于能量的控制策略:
E = 1/2 * m * v² + mgl(1-cosθ)
通过控制小车加速度,使得每次摆动时摆杆能量增加约10%-15%,经过3-5个摆动周期后即可达到接近垂直位置。
4.2 参数整定经验
起摆PID参数整定需要特别注意:
- 比例系数Kp:主要影响响应速度,过大容易导致超调
- 积分系数Ki:帮助消除稳态误差,但过大会引起振荡
- 微分系数Kd:抑制超调,但过大会放大噪声
推荐参数范围:
st复制startupPID.Kp := 50.0; // 初始值
startupPID.Ki := 0.05; // 约为Kp的1/1000
startupPID.Kd := 5.0; // 约为Kp的1/10
调试技巧:
- 先设Ki=0,Kd=0,调整Kp使系统出现持续振荡
- 加入适量Kd抑制振荡
- 最后加入小量Ki消除静差
5. 稳摆控制实现细节
5.1 串级PID参数协调
主副回路采样时间需要合理配置:
- 主回路(角度环):20ms
- 副回路(位置环):10ms
这种2:1的采样时间比在实践中表现良好。如果副回路响应不够快,可以进一步缩短其采样时间到5ms。
5.2 抗干扰措施
工业现场常见的干扰源包括:
- 电机扭矩波动
- 轨道不平整
- 传感器噪声
我们在代码中加入以下抗干扰处理:
st复制// 角度测量滤波
FilteredAngle := 0.9 * FilteredAngle + 0.1 * RawAngle;
// 死区处理
IF ABS(Error) < DeadZone THEN
Error := 0;
END_IF
5.3 控制模式平滑切换
从起摆到稳摆需要无缝切换,关键实现:
st复制// 切换条件判断
IF ABS(Angle) < SwitchThreshold AND ABS(AngularVelocity) < SpeedThreshold THEN
// 初始化稳摆PID参数
mainPID.Output := startupPID.Output;
subPID.Output := 0;
bInSwingUp := FALSE;
END_IF
6. 调试经验与问题排查
6.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 摆杆无法起摆 | Kp太小/起摆能量不足 | 增大Kp或延长起摆时间 |
| 稳摆时持续振荡 | 微分增益不足/采样时间过长 | 增大Kd或缩短采样周期 |
| 小车跑出限位 | 积分项累积过大 | 增加积分限幅或减小Ki |
| 响应迟缓 | PID参数过于保守 | 按20%幅度逐步增大参数 |
6.2 传感器校准要点
- 角度零点校准:摆杆自然下垂时读取ADC值
- 位置传感器校准:
st复制// 在轨道两端各触发一次限位开关
LeftLimitPos := 0.0;
RightLimitPos := TrackLength;
- 陀螺仪校准:
st复制// 静止状态下采集100个样本取平均
GyroOffset := AVERAGE(GyroReadings);
6.3 实时监控实现
在InoProShop中创建监控变量:
st复制VAR_GLOBAL
g_RealTimeAngle : REAL;
g_RealTimePosition : REAL;
g_PIDOutput : REAL;
END_VAR
通过Modbus TCP或OPC UA协议将实时数据上传至上位机,使用InoProShop的DataRecorder功能记录关键变量变化曲线。
7. 性能优化进阶技巧
7.1 自适应PID参数
根据摆杆角度动态调整参数:
st复制// 大角度时使用激进参数
IF ABS(Angle) > 0.5 THEN
Kp := AggressiveKp;
Kd := AggressiveKd;
ELSE
Kp := NormalKp;
Kd := NormalKd;
END_IF
7.2 前馈补偿
加入速度前馈提高响应速度:
st复制FeedForward := Velocity * FeedForwardGain;
Output := PIDOutput + FeedForward;
7.3 模糊PID实现
在ST语言中实现简单的模糊规则:
st复制// 根据误差和误差变化率调整参数
IF ABS(Error) > 0.2 AND ABS(DeltaError) > 0.1 THEN
Kp := Kp * 1.5;
Kd := Kd * 0.8;
END_IF
这个项目最让我印象深刻的是,看似简单的PID控制,在实际实现时需要处理无数细节问题。比如微分项的噪声抑制、控制模式的无扰切换、采样时间的合理配置等,这些都是在理论课本上不会涉及的实战经验。建议初学者可以先从模拟环境开始,等基本算法验证通过后再移植到真实设备上调试。