デジタル電流制御
デジタル制御①
デジタル制御についての備忘録としてここに記します。
制御プラント
以下の単純な単相ハーフブリッジインバータを制御プラントにして, デジタル制御の議論を行います。
デジタル制御を実現するにはマイクロコントローラを使用します.
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()
のとき, クリティカルゲインとなり振動なく収束します。
のとき, クリティカルゲイン時より早く収束しますが振動成分が残ります。
のとき, 収束はさらに早くなるもののかなり振動の大きい応答になります。