デジタル制御
デジタル制御についての備忘録としてここに記します。
制御プラント
以下の単純な単相ハーフブリッジインバータを制御プラントにして, デジタル制御の議論を行います。
デジタル制御を実現するにはマイクロコントローラを使用します.
Microcontrollers (MCU)
デジタル制御を実現するための組み込みシステムについて
・CPU, RAM, ROM
・A/D, PWM, Timer
を必要とします。
デジタル電流制御
以下の3点に注意します。
・A/Dコンバータを用いた電流検出
サンプリング/変換の時間遅れ
量子化ビットエラー
・CPU内での計算
実行時間の遅延
キャリア信号/基準値の分解能
これらの要件をクリアするMCUが制御に必要になります。
ダブルアップデートでのタイミングチャート
以下にPWMキャリアの山と谷をサンプリングしたダブルアップデートの模式図を示します。
PWMキャリアの山の部分と谷の部分で電流のサンプリングを行い, 各サンプリング間にAD変換と演算を行い, サンプリングして次のサンプリング点にてPWM制御演算を更新することによって制御を実現します。更新タイミングの遅れ時間は, = = となります。
また山と谷のサンプリングではなく, 山のみのサンプリングを行った際の遅れ時間は, = = となります。
デジタル電流制御
連続時間領域における制御ブロック図を示します。
・ : 伝達関数内の電流フィードバックゲイン
・ : 遅れ時間
・ : ゼロ次ホールド関数
次にデジタル時間領域におけるパルス伝達関数のブロック図を示します。
・ : パルス伝達関数内の電流フィードバックゲイン
・ : サンプリング遅れ時間
パルス伝達関数
・クローズドループパルス伝達関数
・極 z を求めると,
となります。
z 平面での安定性
s平面下では極 は収束, 発散を. は振動性を表しています。
は負に配置されれば収束し, が0であれば振動はなくなります。
z平面下では, は収束性を, は振動性を示します。
が単位円内にあれば収束し, の角度が0であれば振動はなくなります。
パルス伝達関数
ここで, 極の議論に戻ります。
・安定限界ゲイン
このとき,
となり, 安定限界に極配置されます。
・クリティカルゲイン
のとき,
となり, 臨界制動の挙動をとります。
時間領域における応答
では時間領域における応答を見てみましょう. python control を使用して図示します.
""" time domain response of digital control """ import math import matplotlib.pyplot as plt import numpy as np from control import tf, c2d from control.matlab import step ### 数式 s = tf('s') z = tf('z') L = 1 # インダクタンス ts = 0.2 # サンプリング時間 # ゲイン Kc = L/(4*ts) Kh = L/(2*ts) Ks = L/ts # クローズドループ伝達関数 Wc = (Kc*ts/L)/(z*z - z + Kc*ts/L) Wh = (Kh*ts/L)/(z*z - z + Kh*ts/L) Ws = (Ks*ts/L)/(z*z - z + Ks*ts/L) print(Wc) print(Wh) print(Ws) # 0次ホールドによる離散化 print('discrete time system(zoh)', Wc) print('discrete time system (zoh) ', Wh) print('discrete time system(zoh)', Ws) ### 図示 fig, ax = plt.subplots(1, 3, figsize = (6, 2.6)) #離散時間システム(0次ホールドによる離散化) T = np.arange(0, 4, ts) # Kc = L/4Ts y, t = step(Wc, T) ax[0].plot(t, y, ls = '-', marker = 'o', label = 'Kc = L/4Ts') # Kh = L/2Ts y, t = step(Wh, T) ax[1].plot(t, y, ls = '-', marker = 'o', label = 'Kh = L/2Ts') # Ks = L/Ts y, t = step(Ws, T) ax[2].plot(t, y, ls = '-', marker = 'o', label = 'Ks = L/Ts') title = ['Kc', 'Kh', 'Ks'] for i in range(3): ax[i].set_xlabel('t') ax[i].set_ylabel('y') ax[i].set_title(title[i]) ax[i].legend() fig.tight_layout() plt.show()
のとき, クリティカルゲインとなり振動なく収束します。
のとき, クリティカルゲイン時より早く収束しますが振動成分が残ります。
のとき, 収束はさらに早くなるもののかなり振動の大きい応答になります。
デッドビート制御
・遅延要素
MCU内のサンプリング遅延
電流応答の遅れ(インダクタンスの要素)
少なくとも 2サンプリングは電流応答の遅れがある
デッドビート制御の伝達関数
・2サンプリング遅延のクローズドループ伝達関数であると仮定します
・クローズドループ伝達関数
・ から得られる伝達関数の結果
・極
・実装
・時間領域表現
ブロック図
1サンプリング遅延と加算器で表現されます.
時間応答
では時間応答を見てみましょう。
""" time domain response of digital control """ import math import matplotlib.pyplot as plt import numpy as np from control import tf, c2d from control.matlab import step ### 数式 s = tf('s') z = tf('z') L = 1 # インダクタンス ts = 0.2 # サンプリング時間 # ゲイン Kd = L/ts # デッドビートコントローラ Gz = Kd * z / (z + 1) # オープンループ伝達関数 Goz = Gz * (1/z) * ((ts/L)/(z-1)) # クローズドループ伝達関数 Wz = Goz / (1+Goz) print(Wz) # 0次ホールドによる離散化 print('discrete time system (zoh) ', Wz) ### 図示 fig, ax = plt.subplots(1, 2, figsize = (6, 2.6)) # 連続時間システム Tc = np.arange(0, 4, 0.01) Uc = 1 y, t = step(Uc, Tc) ax[0].plot(t, y, ls = '-') #離散時間システム(0次ホールドによる離散化) T = np.arange(0, 4, ts) y, t = step(Wz, T) ax[0].plot(t, y, ls = '-', marker = 'o', label = 'Dead Beat') title = ['Dead Beat'] for i in range(1): ax[i].set_xlabel('t') ax[i].set_ylabel('y') ax[i].set_title(title[i]) ax[i].legend() fig.tight_layout() plt.show()
2サンプリングで収束することがわかります。