网站建设合同义务,怎么做素材网站,wordpress图片主题破解版,银川做淘宝网站的带死区的PID控制算法
在计算机控制系统中#xff0c;为了避免控制动作过于频繁#xff0c;消除因频繁动作所引起的振荡#xff0c;可采用带死区的PID控制。带死区的PID控制通过引入一个死区#xff0c;使得在误差较小的范围内不进行控制动作#xff0c;从而减少控制系统的…带死区的PID控制算法
在计算机控制系统中为了避免控制动作过于频繁消除因频繁动作所引起的振荡可采用带死区的PID控制。带死区的PID控制通过引入一个死区使得在误差较小的范围内不进行控制动作从而减少控制系统的频繁调整提高系统的稳定性。
理论基础
传统PID控制算法
传统PID控制器的控制律为 u ( t ) K p e ( t ) K i ∫ e ( t ) d t K d d e ( t ) d t u(t) K_p e(t) K_i \int e(t) \, dt K_d \frac{d e(t)}{dt} u(t)Kpe(t)Ki∫e(t)dtKddtde(t)
其中 u ( t ) u(t) u(t) 是控制输入 e ( t ) r ( t ) − y ( t ) e(t) r(t) - y(t) e(t)r(t)−y(t) 是误差信号 K p K_p Kp 是比例增益 K i K_i Ki 是积分增益 K d K_d Kd 是微分增益
带死区的PID控制算法
带死区的PID控制器通过在误差信号上引入一个死区 δ \delta δ使得在误差 e ( t ) e(t) e(t) 的绝对值小于死区 δ \delta δ 时控制输入 u ( t ) u(t) u(t) 不进行调整。其控制律为 u ( t ) { K p e ( t ) K i ∫ e ( t ) d t K d d e ( t ) d t if ∣ e ( t ) ∣ δ 0 if ∣ e ( t ) ∣ ≤ δ u(t) \begin{cases} K_p e(t) K_i \int e(t) \, dt K_d \frac{d e(t)}{dt} \text{if } |e(t)| \delta \\ 0 \text{if } |e(t)| \leq \delta \end{cases} u(t){Kpe(t)Ki∫e(t)dtKddtde(t)0if ∣e(t)∣δif ∣e(t)∣≤δ
其中 δ \delta δ 是死区的阈值
公式推导
带死区的PID控制算法可以通过以下步骤推导得到
定义误差信号 e ( t ) r ( t ) − y ( t ) e(t) r(t) - y(t) e(t)r(t)−y(t)
判断误差是否在死区范围内 ∣ e ( t ) ∣ ≤ δ |e(t)| \leq \delta ∣e(t)∣≤δ
根据误差范围计算控制输入 u ( t ) { K p e ( t ) K i ∫ e ( t ) d t K d d e ( t ) d t if ∣ e ( t ) ∣ δ 0 if ∣ e ( t ) ∣ ≤ δ u(t) \begin{cases} K_p e(t) K_i \int e(t) \, dt K_d \frac{d e(t)}{dt} \text{if } |e(t)| \delta \\ 0 \text{if } |e(t)| \leq \delta \end{cases} u(t){Kpe(t)Ki∫e(t)dtKddtde(t)0if ∣e(t)∣δif ∣e(t)∣≤δ
Python代码示例
下面是一个实现带死区的PID控制器的Python代码示例。假设我们有一个简单的温度控制系统通过带死区的PID控制器保持系统温度在期望值。
import numpy as np
import matplotlib.pyplot as plt# 定义系统参数
dt 0.1 # 时间步长
t np.arange(0, 20, dt) # 时间数组
n len(t)# 初始化状态变量
temperature np.zeros(n) # 系统温度
desired_temperature np.zeros(n) # 期望温度
desired_temperature[100:] 50 # 期望温度从时间t10s开始为50
external_disturbance np.sin(t) * 5 # 外界扰动# 控制器参数
Kp 2.0 # 比例增益
Ki 1.0 # 积分增益
Kd 0.5 # 微分增益
delta 1.0 # 死区阈值# 初始化误差变量
e_prev 0 # 上一时刻的误差
integral 0 # 误差积分# 模拟系统
for i in range(1, n):# 计算误差e desired_temperature[i] - temperature[i-1]# 判断误差是否在死区范围内if abs(e) delta:# 误差积分integral e * dt# 误差微分derivative (e - e_prev) / dt# PID控制器u Kp * e Ki * integral Kd * derivativeelse:u 0 # 在死区范围内控制输入为0# 更新系统温度temperature[i] temperature[i-1] (u external_disturbance[i]) * dt# 更新上一时刻的误差e_prev e# 绘制结果
plt.figure(figsize(10, 4))
plt.plot(t, desired_temperature, labelDesired Temperature)
plt.plot(t, temperature, labelActual Temperature)
plt.plot(t, external_disturbance, labelExternal Disturbance)
plt.xlabel(Time [s])
plt.ylabel(Temperature)
plt.legend()
plt.title(Dead Zone PID Control for Temperature System)
plt.grid(True)
plt.show()代码解释
系统参数和时间数组定义了时间步长 dt 和时间数组 t用来模拟系统在一段时间内的行为。状态变量初始化初始化了系统温度 temperature、期望温度 desired_temperature 和外界扰动 external_disturbance。控制器参数定义了带死区的PID控制器的比例增益 Kp、积分增益 Ki、微分增益 Kd 和死区阈值 delta。误差变量初始化初始化了上一时刻的误差 e_prev 和误差积分 integral。系统模拟通过迭代计算在每个时间步长内根据带死区的PID控制律计算控制输入并更新系统温度。结果绘制使用 matplotlib 绘制系统温度、期望温度和外界扰动的变化曲线。
结论
带死区的PID控制器通过在误差信号上引入一个死区有效减少了控制系统的频繁调整避免了因频繁动作所引起的系统振荡从而提高了系统的稳定性。在实际应用中带死区的PID控制器适用于控制量需要频繁调整的场合能够显著改善系统的动态特性。结合Python代码示例可以更直观地理解带死区的PID控制器的基本原理和实现方法。