元高専生のロボット作り

元高専生のロボット作り

主にプログラミング, 電子系について書きます。たまに機械系もやります。メモ代わりの記事ばっか書きます

ブラシDCモータのPWM制御シミュレーション

ブラシDCモーターにPWM制御をかけたときの電流とか回転数が見たくなりました。

ステップ入力を印加した時と、PWMのデューティ比を徐々に上げたときで、それぞれシミュレーションします。

モデリング

以下ではモーターの微分方程式を解いていきます。つまり積分の式を求める。
しかし、シミュレーションでは微分方程式をそのまま使うので、積分の式が欲しい人以外は読み飛ばしてよいです。

回路方程式

まずは、モーターのモデリングです。

電圧v(t)を印加したブラシDCモータの等価回路は以下の図のようにします。
抵抗R、インダクタンスL、逆起電力e(t)としてモータ内の要素を表します。

f:id:sgrsn1711:20190520184542p:plain

この回路の微分方程式は以下で表されます。

 v(t)=L \frac{d i(t)}{d t}+R i(t)+e(t)

この微分方程式の解を求めます。

定数変化法によって解いていくと

まずは斉次、

 L \frac{d i(t)}{d t}+R i(t)=0

の解は、

 i(t)=C e^{-\frac{R}{L} t} (Cは積分定数)

CをC1(t)として、

 i(t)=C_{1}(t) e^{-\frac{R}{L} t}

またこの微分

 \frac{d i(t)}{d t}=\frac{d C_{1}(t)}{d t} e^{-\frac{R}{L} t}-\frac{R}{L} C_{1}(t) e^{-\frac{R}{L} t}

をそれぞれ最初の式に代入して、

 v(t)-e(t)=L \frac{d C_{1}(t)}{d t} e^{-\frac{R}{L} t}

が得られます。

C1(t)について解くと、

 C_{1}(t)=\int_{0}^{t} \frac{1}{L}\{v(\tau)-e(\tau)\} e^{\frac{R}{L} \tau} d \tau+C_{1}

(C_{1}は積分定数)

と求まります。したがって、代入すれば、

 i(t)=e^{-\frac{R}{L} t}\left\{\int_{0}^{t} \frac{1}{L}\{v(\tau)-e(\tau)\} e^{\frac{R}{L} \tau} d \tau+C_{1}\right\}

とi(t)の式が求まりました。
しかし、まだ終わりではありません。

逆起電力e(t)の式を求める必要があります。

逆起電力e(t)はモータの角速度に比例し、以下の式で表されます。Kは逆起電力定数です。

 e(t)=K \omega(t)

機械系の運動方程式

ω(t)を求めるためにブラシDCモーターの機械的モデリングを行います。

ブラシDCモータをトルクT(t)を入力した軸として図のようにします。

f:id:sgrsn1711:20190520190918p:plain

この機械系の微分方程式は以下の式で表されます。

 T(t)=J \frac{d \omega(t)}{d t}+D \omega(t)

やはり定数変化法で解くと、同様に

 C_{2}(t)=\int_{0}^{t} \frac{1}{J} T(\tau) e^{\frac{D}{J} \tau} d \tau+C_{2}

 \omega(t)=e^{-\frac{D}{J} t}\left\{\int_{0}^{t} \frac{1}{J} T(\tau) e^{\frac{D}{J} \tau} d \tau+C_{2}\right\}
(C_{2}は積分定数)

とω(t)の式が得られました。

また、T(t)は電流i(t)に比例し、以下の式で表されます。

 T(t)=K i(t)


式のまとめ

微分
今回つかうのはこちら。

 v(t)=L \frac{d i(t)}{d t}+R i(t)+e(t)
 e(t)=K \omega(t)
 T(t)=J \frac{d \omega(t)}{d t}+D \omega(t)
 T(t)=K i(t)

積分

 \begin{array}{l}{i(t)=e^{-\frac{R}{L} t}\left[\int_{0}^{t} \frac{1}{L}\{v(\tau)-e(\tau)\} e^{\frac{R}{L}} d \tau+C_{1}\right]} \\ {e(t)=K \omega(t)}\end{array}

 \begin{array}{l}{\omega(t)=e^{-\frac{D}{J} t}\left[\int_{0}^{t} \frac{1}{J} T(\tau) e^{\frac{D}{J} \tau} d \tau+C_{2}\right]} \\ {T(t)=K i(t)}\end{array}

シミュレーション
ステップ応答と、PWM入力の応答でそれぞれシミュレーションします。
pythonでコードを書いて実行します。
scipyでシミュレーションして図はmatplotlibで出力。

コード
デューティ比は0.5です。

from scipy.integrate import odeint
import numpy as np
import matplotlib.pyplot as plt

# maxon RE40 グラファイトブラシ, 150 Watt 製品番号 148867
R = 0.299       #[Ω]
L = 0.082e-3    #[H]
J = 142.0e-7    #[kgm^2]
tau_m = 4.67e-3 #[sec]
D = J/tau_m     #[Nm sec/rad]
E = 24.0        #[V]
K = 30.2e-3     #[Nm/A]
f = 20e+3

def motorStep(var, t):
    i = var[0]
    omega = var[1]
    e = K*omega
    T = K*i
    if t < 0.000002:
        v = 0
    else:
        v = E
    didt = 1/L * (v - R*i - e)
    domegadt = 1/J * (T - D*omega)
    return [didt, domegadt]

def motorFromPWM(var, t):
    i = var[0]
    omega = var[1]
    e = K*omega
    T = K*i
    if t < 0.000002:
        pwm = 0.0
    else:
        pwm = ( (np.sin(2*np.pi*f*t)+0.9999) ).astype(np.int)*E
        pwm = pwm.astype(np.float)
    didt = 1/L * (pwm - R*i - e)
    domegadt = 1/J * (T - D*omega)
    return [didt, domegadt]

var_0 = [0.0, 0.0]
t = np.arange(0, 0.1, 0.000001)
var_list_step = odeint(motorStep, var_0, t)
var_list_pwm = odeint(motorFromPWM, var_0, t)

fig, ax = plt.subplots(1,2)
ax[0].plot(t, var_list_step[:, 0], label='step', ls='-')
ax[0].plot(t, var_list_pwm[:, 0], label='pwm', ls='-.')
ax[0].set_xlabel('t')
ax[0].set_ylabel('i[A]')
ax[0].legend(loc='best')
ax[0].grid(ls=':')
ax[0].set_title('Current')
ax[1].plot(t, var_list_step[:, 1]*60/(2*np.pi), label='step', ls='-')
ax[1].plot(t, var_list_pwm[:, 1]*60/(2*np.pi), label='pwm', ls='-.')
ax[1].set_xlabel('t')
ax[1].set_ylabel('$\omega[rpm]$')
ax[1].legend(loc='best')
ax[1].grid(ls=':')
ax[1].set_title('Speed')
plt.subplots_adjust(wspace=0.4)
plt.savefig('MotorSimResult.png')

出力結果

f:id:sgrsn1711:20200411181209p:plain

左は電流、右は回転数です。
デューティ比を0.5に設定してあるのでPWM制御した場合の方だと電流が約1/2倍になっていますね。
始動電流もある程度抑えられています。

実験

完全に別ものですが、モータに流れる電流を電流センサで読み取ってみました。

モーターはRS-540
センサはACS714
印加電圧は8 V程度
制御はmbed LPC1768です。

実験結果

単純に電圧を印可した場合(左)、デューティ比を線形に上げた場合(右)です。

f:id:sgrsn1711:20190520194136p:plain

確かにデューティ比が1になったときに始動電流らしきものが発生しています。