MENU

デジタル電流制御

デジタル制御

デジタル制御についての備忘録としてここに記します。

制御プラント

以下の単純な単相ハーフブリッジインバータを制御プラントにして, デジタル制御の議論を行います。

Simple converter

デジタル制御を実現するにはマイクロコントローラを使用します.

Microcontrollers (MCU)

デジタル制御を実現するための組み込みシステムについて

・CPU, RAM, ROM

・A/D, PWM, Timer

を必要とします。

デジタル電流制御

以下の3点に注意します。

・A/Dコンバータを用いた電流検出

サンプリング/変換の時間遅れ

量子化ビットエラー

・CPU内での計算

実行時間の遅延

丸め誤差

PWM制御

キャリア信号/基準値の分解能

これらの要件をクリアするMCUが制御に必要になります。

ダブルアップデートでのタイミングチャート

以下にPWMキャリアの山と谷をサンプリングしたダブルアップデートの模式図を示します。

Timing Chart in Double Update

PWMキャリアの山の部分と谷の部分で電流のサンプリングを行い, 各サンプリング間にAD変換と演算を行い, サンプリングして次のサンプリング点にてPWM制御演算を更新することによって制御を実現します。更新タイミングの遅れ時間は, T_D = T_S = T_{sw}/2 となります。

また山と谷のサンプリングではなく, 山のみのサンプリングを行った際の遅れ時間は, T_D = T_S = T_{sw} となります。

デジタル電流制御

連続時間領域における制御ブロック図を示します。

Digital Current Control

K : 伝達関数内の電流フィードバックゲイン

 e^{-sT} : 遅れ時間

H(t) : ゼロ次ホールド関数

次にデジタル時間領域におけるパルス伝達関数のブロック図を示します。

Pulse Transfer Function

K : パルス伝達関数内の電流フィードバックゲイン

z^{-1} : サンプリング遅れ時間

{ \displaystyle
G^{*}(z) = Kz^{-1} \frac{T_s/L}{z-1}
}

パルス伝達関数

オープンループパルス伝達関数

{ \displaystyle
G^{*}(z) = Kz^{-1} \frac{T_s/L}{z-1}
}

・クローズドループパルス伝達関数

{ \displaystyle
W^{*}(z) = \frac{G^{*}(z)}{1+G^{*}(z)} = \frac{\frac{KT_s}{L}}{z^2-z+\frac{KT_s}{L}}
}

・極 z を求めると,

{ \displaystyle
z = \frac{1}{2} ± \sqrt{\frac{1}{4}-\frac{K T_s}{L}}
}

となります。

z 平面での安定性

{ \displaystyle
z = e^{\sigma±j\omega}
}

s平面下では極 \sigma は収束, 発散を. \omega は振動性を表しています。

\sigma は負に配置されれば収束し, \omega が0であれば振動はなくなります。

Stability Analysis on z plane

z平面下では, e^{\sigma} は収束性を, e^{\omega} は振動性を示します。

e^{\sigma} が単位円内にあれば収束し, e^{\omega} の角度が0であれば振動はなくなります。

パルス伝達関数

ここで, 極の議論に戻ります。

{ \displaystyle
z = \frac{1}{2} ± \sqrt{\frac{1}{4}-\frac{K T_s}{L}}
}

・安定限界ゲイン

{ \displaystyle
K = \frac{L}{T_s}
}

このとき,

{ \displaystyle
z = \frac{1}{2} ± j \frac{\sqrt{3}}{2}
}

となり, 安定限界に極配置されます。

・クリティカルゲイン

{ \displaystyle
K = \frac{L}{4 T_s}
}

のとき,

{ \displaystyle
z = \frac{1}{2}
}

となり, 臨界制動の挙動をとります。

z plane

時間領域における応答

では時間領域における応答を見てみましょう. 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()

Time domain response

 K = \frac{L}{4Ts} のとき, クリティカルゲインとなり振動なく収束します。

 K = \frac{L}{2Ts} のとき, クリティカルゲイン時より早く収束しますが振動成分が残ります。

 K = \frac{L}{Ts} のとき, 収束はさらに早くなるもののかなり振動の大きい応答になります。

デッドビート制御

Dead Beat Current Control

・遅延要素

MCU内のサンプリング遅延

電流応答の遅れ(インダクタンスの要素)

少なくとも 2サンプリングは電流応答の遅れがある 

デッドビート制御の伝達関数

・2サンプリング遅延のクローズドループ伝達関数であると仮定します

{ \displaystyle
W^{*}(z) = z^{-2}
}

オープンループ伝達関数

{ \displaystyle
G^{*}(z) = G^{*}_c(z) z^{-1} \frac{T_s/L}{z-1}
}

・クローズドループ伝達関数

{ \displaystyle
W^{*}(z) = \frac{G^{*}_c(z) z^{-1}T_s}{L(z-1)+G^{*}_c(z)z^{-1}T_s} = z^{-2}
}

G^{*}_c(z) から得られる伝達関数の結果

{ \displaystyle
G^{*}_c (z) = \frac{L}{T_s} \frac{z}{z+1}
}

・極

{ \displaystyle
z = 0
}

・実装

{ \displaystyle
G^{*}_c (z) = \frac{Y^{*}(z)}{X^{*}(z)} = \frac{L}{T_s}\frac{z}{z+1}
}
{ \displaystyle
(z+1)Y^{*}(z) = \frac{L}{T_s}zX^{*}(z)
}
{ \displaystyle
Y^{*}(z) = \frac{L}{T_s}X^{*}(z)-z^{-1}Y^{*}(z)
}

・時間領域表現

{ \displaystyle
y(n)=\frac{L}{T_s}x(n)-y(n-1)
}

ブロック図

Dead Beat Control

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()

Dead Beat Control

2サンプリングで収束することがわかります。