一阶倒立摆程序之串级PID控制实践

一阶倒立摆程序之串级PID控制实践 一阶倒立摆程序 串级pid控制 包含:自写pid功能块起摆稳摆程序 软件:汇川InoProshop(1.7.3) 仅供参考和学习最近在研究一阶倒立摆的控制用汇川InoProshop(1.7.3)软件实现了基于串级PID控制的程序包括自写的PID功能块以及起摆和稳摆程序这里分享一下过程供大家参考学习。一、串级PID控制原理简述串级PID控制就是在常规PID控制基础上增加一个副回路。主PID控制器的输出作为副PID控制器的设定值副PID控制器的输出直接作用于被控对象。这样可以让系统更快地响应并且对干扰有更强的抑制能力。在一阶倒立摆系统中主回路通常控制摆杆的角度副回路控制小车的位置。二、自写PID功能块在汇川InoProshop里我们自己动手写PID功能块。以经典的增量式PID为例代码如下// 定义PID结构体 TYPE PID_TYPE : STRUCT Setpoint : REAL; // 设定值 ProcessVariable : REAL; // 过程变量 Kp : REAL; // 比例系数 Ki : REAL; // 积分系数 Kd : REAL; // 微分系数 PrevError : REAL; Integral : REAL; Output : REAL; END_STRUCT END_TYPE // PID功能块函数 METHOD PIDController : REAL VAR_INPUT This : PID_TYPE; dt : REAL; // 采样时间间隔 END_VAR VAR Error : REAL; PTerm, ITerm, DTerm : REAL; BEGIN Error : This.Setpoint - This.ProcessVariable; PTerm : This.Kp * (Error - This.PrevError); This.Integral : This.Integral Error * dt; ITerm : This.Ki * Error * dt; DTerm : This.Kd * (Error - 2 * This.PrevError This.PrevPrevError) / (dt * dt); This.Output : This.Output PTerm ITerm DTerm; This.PrevError : Error; PIDController : This.Output; END_METHOD代码分析首先定义了一个PID结构体包含设定值、过程变量、PID三个系数以及一些中间变量。在PIDController方法里先计算当前误差Error根据增量式PID公式分别计算比例项PTerm、积分项ITerm和微分项DTerm最后更新输出Output并保存当前误差为下一次计算做准备。三、起摆程序起摆的目标是让原本静止下垂的摆杆摆起到接近垂直的位置。我们利用PID控制小车的加速度从而让摆杆获得足够的能量起摆。// 定义起摆相关变量 VAR startupPID : PID_TYPE; startupSetpoint : REAL : 1.57; // 设定摆杆接近垂直角度 startupProcessVar : REAL; // 当前摆杆角度 dtStartup : REAL : 0.02; // 起摆采样时间 END_VAR // 起摆主程序部分 startupProcessVar : GetPendulumAngle(); // 获取当前摆杆角度函数 startupPID.Setpoint : startupSetpoint; startupPID.ProcessVariable : startupProcessVar; startupPID.Kp : 80; startupPID.Ki : 0.1; startupPID.Kd : 10; acceleration : PIDController(startupPID, dtStartup); SetCartAcceleration(acceleration); // 设置小车加速度函数代码分析先定义了起摆用的PID变量startupPID以及设定值和采样时间等。在主程序部分获取当前摆杆角度设置PID参数调用PIDController函数计算出小车需要的加速度然后通过函数SetCartAcceleration控制小车加速度使摆杆起摆。四、稳摆程序当摆杆摆起到接近垂直位置后就需要稳摆程序来维持摆杆的垂直状态。这时候串级PID控制就发挥作用了。// 定义稳摆相关变量 VAR mainPID : PID_TYPE; subPID : PID_TYPE; mainSetpoint : REAL : 0; // 摆杆垂直角度设定为0 mainProcessVar : REAL; // 当前摆杆角度 subSetpoint : REAL; subProcessVar : REAL; // 当前小车位置 dtMain : REAL : 0.02; dtSub : REAL : 0.01; END_VAR // 稳摆主程序部分 mainProcessVar : GetPendulumAngle(); subProcessVar : GetCartPosition(); // 获取小车位置函数 mainPID.Setpoint : mainSetpoint; mainPID.ProcessVariable : mainProcessVar; mainPID.Kp : 100; mainPID.Ki : 0.2; mainPID.Kd : 20; subSetpoint : PIDController(mainPID, dtMain); subPID.Setpoint : subSetpoint; subPID.ProcessVariable : subProcessVar; subPID.Kp : 50; subPID.Ki : 0.1; subPID.Kd : 10; force : PIDController(subPID, dtSub); SetCartForce(force); // 设置小车受力函数代码分析这里定义了主副两个PID变量。主PID控制摆杆角度副PID控制小车位置。先获取摆杆角度和小车位置设置主PID参数并计算出副PID的设定值再设置副PID参数计算出小车需要的受力通过SetCartForce函数控制小车从而稳定摆杆。一阶倒立摆程序 串级pid控制 包含:自写pid功能块起摆稳摆程序 软件:汇川InoProshop(1.7.3) 仅供参考和学习通过以上自写的PID功能块、起摆和稳摆程序利用汇川InoProshop实现了一阶倒立摆的串级PID控制希望对大家学习相关知识有所帮助。