1-1 自動控制的基本原理與方式
????????自動控制是指在沒有人直接參與的情況下,利用外加的設備或裝置,使機器、設備或生產過程的某個工作狀態或參數按照預定的規律運行。自動控制的核心原理是反饋控制,即通過將系統的輸出量回送到輸入端,與輸入量進行比較,利用偏差信號產生控制作用,使被控量趨于要求值。
開環控制系統與閉環控制系統
開環控制系統原理
????????開環控制系統是指輸出量與輸入量之間沒有反向聯系,只靠輸入量對輸出量單向控制的系統。其結構簡單,但抗干擾能力差,控制精度不高。
圖 1-1 開環控制系統結構流程圖
閉環控制系統原理
????????閉環控制系統是指輸出量與輸入量之間有反向聯系,靠輸入量與主反饋信號之間的偏差對輸出量進行控制的系統。閉環控制系統通過負反饋實現按偏差控制,具有糾正偏差的能力,抗擾性好,控制精度高。
圖 1-2 閉環控制系統結構流程圖
反饋控制原理 Python 實現
?用Python 代碼模擬一個簡單的溫度控制系統,比較開環和閉環控制的效果:
import numpy as np
import matplotlib.pyplot as plt# 系統參數
ambient_temp = 25 # 環境溫度(°C)
system_gain = 0.8 # 系統增益
time_constant = 10 # 時間常數(秒)
disturbance = 5 # 擾動溫度(°C)# 時間序列
time = np.arange(0, 100, 0.1)# 開環控制系統模擬
def open_loop_control(setpoint, disturbance):"""開環控制系統溫度模擬"""output = np.zeros_like(time)output[0] = ambient_tempfor i in range(1, len(time)):# 開環控制:直接根據設定值計算輸出,無反饋control_signal = setpoint# 一階系統動態響應output[i] = output[i-1] + (system_gain * control_signal - (output[i-1] - ambient_temp) / time_constant) * 0.1# 加入擾動if time[i] > 50:output[i] += disturbancereturn output# 閉環控制系統模擬
def closed_loop_control(setpoint, disturbance):"""閉環控制系統溫度模擬"""output = np.zeros_like(time)output[0] = ambient_temperror = setpoint - output[0]kp = 1.2 # 比例控制增益for i in range(1, len(time)):# 閉環控制:根據誤差計算控制信號error = setpoint - output[i-1]control_signal = kp * error# 一階系統動態響應output[i] = output[i-1] + (system_gain * control_signal - (output[i-1] - ambient_temp) / time_constant) * 0.1# 加入擾動if time[i] > 50:output[i] += disturbancereturn output# 設定值
setpoint = 60 # 目標溫度(°C)# 運行模擬
open_loop_output = open_loop_control(setpoint, disturbance)
closed_loop_output = closed_loop_control(setpoint, disturbance)# 繪制結果
plt.figure(figsize=(10, 6))
plt.plot(time, open_loop_output, 'r-', label='開環控制')
plt.plot(time, closed_loop_output, 'b-', label='閉環控制')
plt.axhline(y=setpoint, color='g', linestyle='--', label='設定值')
plt.axhline(y=ambient_temp, color='k', linestyle=':', label='環境溫度')
plt.axvline(x=50, color='m', linestyle='--', label='擾動加入')
plt.xlabel('時間(秒)')
plt.ylabel('溫度(°C)')
plt.title('開環與閉環控制系統溫度響應對比')
plt.legend()
plt.grid(True)
plt.show()# 計算穩態誤差
open_loop_steady_state = open_loop_output[-1]
closed_loop_steady_state = closed_loop_output[-1]
open_loop_error = setpoint - open_loop_steady_state
closed_loop_error = setpoint - closed_loop_steady_stateprint(f"開環控制穩態溫度: {open_loop_steady_state:.2f}°C, 穩態誤差: {open_loop_error:.2f}°C")
print(f"閉環控制穩態溫度: {closed_loop_steady_state:.2f}°C, 穩態誤差: {closed_loop_error:.2f}°C")
????????上述代碼模擬了一個簡單的溫度控制系統,比較了開環和閉環控制在面對擾動時的表現。從結果可以看出,閉環控制系統能夠有效減小穩態誤差,抵抗擾動的影響。
1-2 自動控制系統示例
電機轉速控制系統
????????電機轉速控制是自動控制領域的經典示例,下面我們通過 Python 代碼模擬一個直流電機轉速控制系統,分別實現開環控制和閉環控制,并比較兩者的性能。
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp# 電機參數
J = 0.01 # 轉動慣量(kg·m^2)
B = 0.01 # 阻尼系數(N·m·s/rad)
K = 0.1 # 電機常數(V·s/rad)
R = 1.0 # 電樞電阻(Ω)
L = 0.01 # 電樞電感(H)# 系統動態方程 - 開環
def open_loop_system(t, x, u):"""開環系統狀態方程: x = [i, ω]"""i, omega = xdidt = (-R/L)*i - (K/L)*omega + u/Ldomegadot = (K/J)*i - (B/J)*omegareturn [didt, domegadot]# 系統動態方程 - 閉環
def closed_loop_system(t, x, u, setpoint, kp, ki):"""閉環系統狀態方程: x = [i, ω, error_integral]"""i, omega, error_int = xerror = setpoint - omega# PID控制control_signal = kp * error + ki * error_intdidt = (-R/L)*i - (K/L)*omega + control_signal/Ldomegadot = (K/J)*i - (B/J)*omegaderror_int = errorreturn [didt, domegadot, derror_int]# 模擬開環控制
def simulate_open_loop(setpoint, disturbance=0, u=10):"""模擬開環控制"""# 初始狀態: 電流i=0, 轉速omega=0t_span = (0, 5)t_eval = np.linspace(0, 5, 500)y0 = [0, 0]# 加入擾動函數def disturbance_func(t):if t > 2:return disturbancereturn 0# 求解微分方程sol = solve_ivp(lambda t, x: open_loop_system(t, x, u + disturbance_func(t)),t_span, y0, t_eval=t_eval, method='RK45')return sol.t, sol.y[1] # 返回時間和轉速# 模擬閉環控制
def simulate_closed_loop(setpoint, disturbance=0, kp=5, ki=0.1):"""模擬閉環控制"""# 初始狀態: 電流i=0, 轉速omega=0, 誤差積分=0t_span = (0, 5)t_eval = np.linspace(0, 5, 500)y0 = [0, 0, 0]# 加入擾動函數def disturbance_func(t):if t > 2:return disturbancereturn 0# 求解微分方程sol = solve_ivp(lambda t, x: closed_loop_system(t, x, disturbance_func(t), setpoint, kp, ki),t_span, y0, t_eval=t_eval, method='RK45')return sol.t, sol.y[1] # 返回時間和轉速# 設定參數
setpoint = 100 # 目標轉速(rad/s)
disturbance = 5 # 擾動轉矩(N·m)# 運行模擬
t_open, omega_open = simulate_open_loop(setpoint, disturbance)
t_closed, omega_closed = simulate_closed_loop(setpoint, disturbance)# 繪制結果
plt.figure(figsize=(12, 6))plt.subplot(1, 2, 1)
plt.plot(t_open, omega_open, 'r-', label='開環控制轉速')
plt.axhline(y=setpoint, color='g', linestyle='--', label='目標轉速')
plt.axvline(x=2, color='m', linestyle='--', label='擾動加入')
plt.xlabel('時間(秒)')
plt.ylabel('轉速(rad/s)')
plt.title('開環控制系統電機轉速響應')
plt.legend()
plt.grid(True)plt.subplot(1, 2, 2)
plt.plot(t_closed, omega_closed, 'b-', label='閉環控制轉速')
plt.axhline(y=setpoint, color='g', linestyle='--', label='目標轉速')
plt.axvline(x=2, color='m', linestyle='--', label='擾動加入')
plt.xlabel('時間(秒)')
plt.ylabel('轉速(rad/s)')
plt.title('閉環控制系統電機轉速響應')
plt.legend()
plt.grid(True)plt.tight_layout()
plt.show()# 計算性能指標
def calculate_performance(t, omega, setpoint):"""計算系統性能指標"""# 穩態轉速steady_state = omega[-1]# 穩態誤差steady_error = setpoint - steady_state# 上升時間(達到90%設定值的時間)idx = np.where(omega >= 0.9 * setpoint)[0]rise_time = t[idx[0]] if len(idx) > 0 else None# 超調量overshoot = np.max(omega) - setpoint if np.max(omega) > setpoint else 0return {'穩態轉速': steady_state,'穩態誤差': steady_error,'上升時間': rise_time,'超調量': overshoot}# 計算并打印性能指標
print("開環控制系統性能指標:")
print(calculate_performance(t_open, omega_open, setpoint))print("\n閉環控制系統性能指標:")
print(calculate_performance(t_closed, omega_closed, setpoint))
????????上述代碼模擬了一個直流電機轉速控制系統,分別實現了開環控制和閉環控制,并在 2 秒時加入擾動轉矩。通過比較可以看出,閉環控制系統在面對擾動時能夠更快地恢復到目標轉速,并且穩態誤差更小。
系統方塊圖
圖 1-3 電機轉速閉環控制系統方塊圖
1-3 自動控制系統的分類
自動控制系統可以從不同角度進行分類,下面通過思維導圖展示主要的分類方式:
圖 1-4 自動控制系統分類思維導圖
按控制方式分類
1. 開環控制系統
- 結構簡單、經濟
- 調試方便
- 抗干擾能力差,控制精度不高
2. 反饋控制系統(閉環控制系統)
- 具有糾正偏差的能力
- 抗擾性好,控制精度高
- 結構復雜,價格高
3. 復合控制系統
- 開環與閉環控制的結合
- 具有更高的控制精度
按系統特性分類
1. 線性系統與非線性系統
- 線性系統:滿足疊加原理
- 非線性系統:不滿足疊加原理,存在非線性元件
2. 連續控制系統與離散控制系統
- 連續控制系統:系統中各處的信號均為連續時間信號
- 離散控制系統:系統中一處或多處的信號為離散時間信號
3. 定常系統與時變系統
- 定常系統:系統參數不隨時間變化
- 時變系統:系統參數隨時間變化
按給定值變化規律分類
1. 恒值控制系統
- 輸入量是恒定的常值
- 任務:在各種擾動作用下使輸出量保持在恒定希望值附近
- 示例:恒溫、恒壓控制系統
2. 隨動系統(跟蹤系統)
- 輸入量是事先不知道的任意時間函數
- 任務:使輸出量迅速而準確地跟隨輸入量的變化
- 示例:雷達自動跟蹤系統
3. 程序控制系統
- 輸入量按照給定的程序變化
- 任務:使輸出量按預先給定的程序指令動作
- 示例:數控車床、機器人控制系統
1-4 對自動控制系統的基本要求
對自動控制系統的基本要求可以概括為三個字:穩、快、準,即穩定性、快速性和準確性。
1. 穩定性
????????穩定性是指系統重新恢復平衡狀態的能力,是對控制系統的最基本要求。一個穩定的系統在受到擾動后,經過一段時間的過渡過程,能夠回到或接近原來的平衡狀態。
2. 快速性
????????快速性是指過渡過程進行時間的長短。快速性好的系統能夠在較短的時間內完成過渡過程,減少系統的響應時間。
3. 準確性
????????準確性是指過渡過程結束后的穩態誤差,反映了系統的控制精度。準確性好的系統能夠使輸出量盡可能接近期望值。
用Python 代碼模擬不同阻尼比的二階系統階躍響應,展示穩定性、快速性和準確性的變化:
import numpy as np
import matplotlib.pyplot as plt
from control import tf, step_response# 定義二階系統傳遞函數
def second_order_system(wn, zeta):"""創建二階系統傳遞函數wn: 自然頻率zeta: 阻尼比"""num = [wn**2]den = [1, 2*zeta*wn, wn**2]return tf(num, den)# 系統參數
wn = 10 # 自然頻率
zeta_values = [0.2, 0.5, 1.0, 1.5] # 不同阻尼比# 繪制不同阻尼比的階躍響應
plt.figure(figsize=(12, 8))for zeta in zeta_values:sys = second_order_system(wn, zeta)t, y = step_response(sys, T=np.linspace(0, 2, 1000))# 計算性能指標steady_state = y[-1]steady_error = 1 - steady_state# 上升時間(達到90%的時間)idx = np.where(y >= 0.9)[0]rise_time = t[idx[0]] if len(idx) > 0 else None# 超調量overshoot = np.max(y) - 1 if np.max(y) > 1 else 0# 調整時間(2%誤差帶)idx = np.where(np.abs(y - 1) < 0.02)[0]settling_time = t[idx[-1]] if len(idx) > 0 else Noneplt.plot(t, y, label=f'ζ={zeta}, 超調量={overshoot*100:.1f}%, 調整時間={settling_time:.2f}s')plt.axhline(y=1, color='k', linestyle='--', label='期望值')
plt.axhline(y=1.02, color='g', linestyle=':', alpha=0.5)
plt.axhline(y=0.98, color='g', linestyle=':', alpha=0.5, label='2%誤差帶')
plt.xlabel('時間(秒)')
plt.ylabel('系統輸出')
plt.title('不同阻尼比二階系統階躍響應')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()# 打印性能指標表格
print("不同阻尼比二階系統性能指標對比:")
print("-" * 70)
print(f"{'阻尼比ζ':<10}{'超調量(%)':<15}{'上升時間(s)':<15}{'調整時間(s)':<15}{'穩態誤差':<15}")
print("-" * 70)for zeta in zeta_values:sys = second_order_system(wn, zeta)t, y = step_response(sys, T=np.linspace(0, 2, 1000))steady_state = y[-1]steady_error = 1 - steady_stateidx_rise = np.where(y >= 0.9)[0]rise_time = t[idx_rise[0]] if len(idx_rise) > 0 else Noneovershoot = np.max(y) - 1 if np.max(y) > 1 else 0idx_settle = np.where(np.abs(y - 1) < 0.02)[0]settling_time = t[idx_settle[-1]] if len(idx_settle) > 0 else Noneprint(f"{zeta:<10.1f}{overshoot*100:<15.1f}{rise_time:<15.2f}{settling_time:<15.2f}{steady_error:<15.6f}")
????????上述代碼模擬了不同阻尼比的二階系統階躍響應,通過改變阻尼比 ζ 的值,我們可以觀察到系統性能的變化:
- 當 ζ<1 時,系統為欠阻尼,響應有超調,但上升時間短
- 當 ζ=1 時,系統為臨界阻尼,無超調,響應速度較快
- 當 ζ>1 時,系統為過阻尼,無超調,但響應速度較慢
1-5 自動控制系統的分析與設計工具
經典控制理論工具
????????經典控制理論主要以傳遞函數為數學工具,研究單輸入單輸出 (SISO)、線性定常系統的分析和設計。主要分析工具包括:
圖 1-5 經典控制理論分析工具思維導圖
時域分析工具示例
用 Python 的 control 庫進行時域分析,包括傳遞函數定義、階躍響應分析和性能指標計算:
import numpy as np
import matplotlib.pyplot as plt
from control import tf, step_response, pzmap, rlocus# 定義系統傳遞函數 - 二階系統
wn = 5 # 自然頻率
zeta = 0.5 # 阻尼比
num = [wn**2]
den = [1, 2*zeta*wn, wn**2]
sys = tf(num, den)print("系統傳遞函數:")
print(sys)# 計算階躍響應
t, y = step_response(sys, T=np.linspace(0, 5, 1000))# 繪制階躍響應曲線
plt.figure(figsize=(12, 10))plt.subplot(2, 2, 1)
plt.plot(t, y)
plt.axhline(y=1, color='r', linestyle='--', label='期望值')
plt.xlabel('時間(秒)')
plt.ylabel('系統輸出')
plt.title('二階系統階躍響應')
plt.legend()
plt.grid(True)# 計算性能指標
from control.matlab import stepinfo # 需要安裝control庫的matlab兼容性函數info = stepinfo(sys)
print("\n階躍響應性能指標:")
print(f"上升時間: {info['RiseTime']:.4f} 秒")
print(f"峰值時間: {info['PeakTime']:.4f} 秒")
print(f"超調量: {info['Overshoot']:.2f} %")
print(f"調整時間: {info['SettlingTime']:.4f} 秒")
print(f"穩態值: {info['SteadyStateValue']:.4f}")
print(f"穩態誤差: {1 - info['SteadyStateValue']:.4f}")# 繪制零極點圖
plt.subplot(2, 2, 2)
pzmap(sys)
plt.title('系統零極點圖')
plt.grid(True)# 繪制根軌跡圖
plt.subplot(2, 2, 3)
rlocus(sys)
plt.title('系統根軌跡圖')
plt.grid(True)# 伯德圖
plt.subplot(2, 2, 4)
mag, phase, omega = sys.bode()
plt.subplot(2, 1, 1)
plt.semilogx(omega, mag) # 繪制幅值圖
plt.title('伯德圖')
plt.ylabel('幅值(dB)')
plt.grid(True)
plt.subplot(2, 1, 2)
plt.semilogx(omega, phase) # 繪制相位圖
plt.xlabel('頻率(rad/s)')
plt.ylabel('相位(度)')
plt.grid(True)plt.tight_layout()
plt.show()
上述代碼展示了經典控制理論中常用的分析工具:
- 傳遞函數定義
- 階躍響應分析及性能指標計算
- 零極點圖繪制
- 根軌跡圖繪制
- 伯德圖繪制
????????通過這些工具,我們可以全面分析控制系統的性能,并為系統設計提供依據。在實際應用中,這些工具通常需要結合使用,以獲得對系統的全面理解。
????????自動控制原理是一門理論與實踐相結合的學科,通過理論分析和計算機仿真相結合的方式,我們可以更好地理解和設計控制系統,使其滿足實際應用的需求。