Pythonを使ったDCモータのシミュレーション
Pythonを使ってブラシ付きDCモータのシミュレーションをやってみたいと思います。
(1) まずは、ブラシ付きDCモータの電気特性について整理します。
モータの内部に踏み入れずに、モータの入力電圧と出力回転速度のみについてみると、
...........①
が成り立つ。
ただし、
: モータ端子電圧 (V)
: 電機子抵抗
: モータ電流 (A)
: ブラシ接触抵抗による電圧降下 (V)
: 逆起電力定数 (Vs/rad)
: 角速度 (rad/s)
また、モータの入力電流と出力トルク間についてみると、
..........................②
が成り立つ。
ただし、
: 出力トルク (Nm)
: トルク定数 (Vs/rad)
: 摩擦などによるトルク損失 (Nm)
さらにモータの入出力は
モータ入力..........................③
モータ出力..........................④
モータ効率..........................⑤
式①と②を式④に代入すると
.....⑥
によって表現されます。式⑥が2次関数なので、出力が最大値をとるための入力値を求めることができます。
#!/usr/bin/env python import sympy as sym Ra, Kt, Ke, ia, va, Tf, Vb, = sym.symbols('Ra Kt Ke ia va Tf Vb') expr = -Ra * Kt * ia**2/Ke + (Kt*va - Kt*Vb + Tf*Ra)*ia/Ke +(Tf*Vb - Tf*va)/Ke d = sym.Derivative(expr, ia) f = d.doit() print(sym.solve(sym.Eq(f, 0), ia))
のときに、最大値をとることがわかります。
(2) 続いてモータにつながる機械系の特性をも考慮に入れます。
トルクは慣性モーメントJ、回転角および角速度間の関係は、
...................⑦
式②から損失部分を取り除き、式③に代入すると、モータ電流と出力トルクの関係が得られる。
..................⑧
モータ逆起電力と回転速度間の関係は、
...............................⑨
によって与えられます。
また、モータの中身に踏み入れてコイルに存在するL成分コイルインダクタンス[の影響をモデリングすると、モータ中電圧の平衡状態は
............⑩
式⑥のブラシ接触抵抗による電圧降下を無視し、式④⑤と連立してラプラス変換すれば、
.......................⑪
となります。
式⑦の連列方程式をブロック線図で表現すると下図となり、モータ特性を表すものとなります。
式⑦の時間ドメイン方程式として表現すると
............⑫
となります。
逆起電力定数とトルク定数を0.175、慣性モーメントJを0.00005、コイルインダクタンスを3.1mH、電機子抵抗を2.5ohmとおいて、3.0vのステップ電圧を与えた場合のモータ回転速度を計算してみます。
#!/usr/bin/env python import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint Kt = 0.175 # Vs/rad Ke = 0.175 # Nm/A J = 0.00005 # kg m2 La = 3.1e-3 # H Ra = 2.5 # ohm def model(z, t, u): w = z[0] ia = z[1] dwdt = Kt*ia/J didt = -Ke*w/La-Ra*ia/La + u/La dzdt = [dwdt, didt] return dzdt # initial condition z0 = [0,0] # number of time points n = 50001 # time points t = np.linspace(0,2.5,n) # step input u = np.zeros(n) # change to 3.0 at time = 1.0s u[20001:] = 3.0 # store solution w = np.empty_like(t) ia = np.empty_like(t) # record initial conditions w[0] = z0[0] ia[0] = z0[1] # solve ODE for i in range(1,n): # span for next time step tspan = [t[i-1],t[i]] # solve for next step z = odeint(model,z0,tspan,args=(u[i],)) # store solution for plotting w[i] = z[1][0] ia[i] = z[1][1] # next initial condition z0 = z[1] # plot results plt.plot(t,u,'g:',label='Input v(t)') plt.plot(t,w,'b-',label='Output w(t)') plt.plot(t,ia,'r--',label='ia(t)') plt.ylabel('values') plt.xlabel('time') plt.legend(loc='best') plt.show()