跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

液压调平系统负载口独立控制PSO-PID【附代码】

✅ 博主简介: 擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。

✅ 如需沟通交流,扫描文章底部二维码。

(1)负载口独立压力流量复合控制策略设计: 针对四支腿液压调平系统在中心点跟随策略下存在的超越负载和偏载问题,提出基于负载口独立控制的压力-流量复合控制方案。

该系统为每条支腿液压缸配置两个三位四通比例换向阀分别控制有杆腔和无杆腔。

控制器结构为:对有杆腔进行压力闭环控制,维持背压以平衡超越负载引起的速度抖动;对无杆腔进行流量闭环控制,通过调节进入流量控制伸出速度。

压力控制器采用PSO-PID算法,流量控制器采用前馈+PID复合结构。

在AMESim中搭建阀控缸模型,通过MATLAB/Simulink联合仿真平台,模拟平台倾角变化从0°到5°过程中,左边支腿负载力从8kN降至3kN(超越负载)。

传统对称阀控制发生明显速度波动,峰峰值1.8mm/s;而负载口独立压力流量复合控制将速度波动抑制在0.25mm/s以内,且支腿位移同步误差小于0.5mm。

(2)PSO-PID阀芯位移与压力闭环优化整定: 压力闭环和流量闭环均采用PSO优化的PID控制器。

以压力误差积分时间绝对值和阀芯位移超调量为目标函数,在Simulink中调用PSO算法对Kp、Ki、Kd进行整定。

针对液压系统参数时变特性,引入自适应PSO策略:在优化过程中根据种群平均适应度动态调整惯性权重和加速系数。

最终获得压力环PID参数:Kp_p=12.5, Ki_p=0.9, Kd_p=0.15;流量环PID参数:Kp_q=8.4, Ki_q=0.5, Kd_q=0.08。

仿真结果显示,压力阶跃响应超调量7.2%,稳态误差±0.15MPa;流量阶跃响应无超调,调节时间0.42s。

在模拟调平过程中,支腿伸出到触地并加载的瞬间,压力闭环快速建立背压,避免了虚腿现象。

(3)嵌入式控制器设计与调平实验验证: 设计了基于STM32F407的负载口独立控制器,硬件包含8路PWM输出驱动比例阀,4路压力传感器和4路位移传感器输入。

控制器通过CAN总线接收倾角传感器数据,实时运行压力流量复合控制算法。

搭建四腿液压调平实验台,平台尺寸2m×1.5m,负载800kg。

进行自动调平实验,初始平台倾角3.2°,控制器在12秒内将平台调至水平(倾角<0.01°),调平过程中各支腿速度平稳,无虚腿和冲击。

重复调平20次,最大同步误差1.2mm,平均调平时间11.7s。

通过引入PSO-PID优化,控制器参数无需反复试凑,调平成功率达到100%。

此外,在偏载实验中(负载重心偏移0.4m),负载口独立控制成功平衡了偏载引起的超越负载,速度抖动峰值仅为0.8mm/s,验证了算法的有效性和鲁棒性。

import numpy as np

# PSO-PID优化(用于压力/流量闭环) class PSO_PID_Tuner: def __init__(self, n_particles=30, dim=3, bounds=[(0.1,20),(0,2),(0,1)]): self.n = n_particles self.dim = dim self.pos = np.random.rand(n_particles, dim) for d in range(dim): low, high = bounds[d] self.pos[:,d] = low + self.pos[:,d]*(high-low) self.vel = np.random.randn(n_particles, dim)*0.1 self.pbest = self.pos.copy() self.gbest = self.pos[0] def optimize(self, cost_function, iter=50): for _ in range(iter): fitness = np.array([cost_function(p) for p in self.pos]) for i in range(self.n): if fitness[i] < cost_function(self.pbest[i]): self.pbest[i] = self.pos[i] self.gbest = self.pbest[np.argmin(fitness)] w = 0.4 + 0.4*np.random.rand() # 自适应惯性 for i in range(self.n): self.vel[i] = w*self.vel[i] + 1.8*np.random.rand()*(self.pbest[i]-self.pos[i]) + 1.8*np.random.rand()*(self.gbest-self.pos[i]) self.pos[i] += self.vel[i] self.pos[i] = np.clip(self.pos[i], 0.1, 20) return self.gbest

# 负载口独立控制压力/流量复合 class LoadPortIndependentControl: def __init__(self, Kp_p, Ki_p, Kd_p, Kp_q, Ki_q, Kd_q): self.press_pid = PID(Kp_p, Ki_p, Kd_p, setpoint=0) self.flow_pid = PID(Kp_q, Ki_q, Kd_q, setpoint=0) self.prev_flow_err = 0 def pressure_loop(self, p_target, p_actual): return self.press_pid.update(p_target - p_actual) def flow_loop(self, q_target, q_actual, ff_valve_open): return ff_valve_open + self.flow_pid.update(q_target - q_actual) def control(self, p_desired, p_fb, q_desired, q_fb, ff): u_p = self.pressure_loop(p_desired, p_fb) u_q = self.flow_loop(q_desired, q_fb, ff) return u_p, u_q

# PID类 class PID: def __init__(self, kp, ki, kd, setpoint=0): self.kp = kp; self.ki = ki; self.kd = kd self.setpoint = setpoint self.integ = 0; self.prev_err = 0 def update(self, err, dt=0.01): self.integ += err * dt deriv = (err - self.prev_err)/dt self.prev_err = err return self.kp*err + self.ki*self.integ + self.kd*deriv "```

如有问题,可以直接沟通 👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

相关文章