PID制御の基礎をPythonのライブラリの一種であるcontrolを使って勉強しましょう。
今回は、ミニ四駆などのおもちゃによく使われているDCモータの特性と回転制御をシミュレーションで確認します。
この記事を読めば、DCモータの外乱応答のモデル化とpythonを使った外乱応答のシミュレーションがわかります。
目次
外乱を含んだDCモータモデル
DCモータに環境変化による抵抗力などのトルク外乱が入った場合を考えてみましょう。
ブロック線図は以下のようになります。
使用したpythonライブラリ
今回は以下のpythonライブラリを使用しました。
- control
- matplotlib
- numpy
- scipy
- pandas
python controlでシミュレーションするために伝達関数を等価変換する
外乱トルクが入ったDCモータモデルのブロック線図を下図のように等価変換(簡単化)することができます。
詳細はこちらの記事に書いてますので参考にしてください。
DCモータの回転制御シミュレーション
python controlを使ってDCモータの外乱応答を確認する
DCモータの端子間に電圧を3.15V(約1000rpm指令相当)印加したときのステップ応答を確認します。
0.5s時点で左上の電圧指令値が0V → 3.15Vに変化しています。
左下の青線が目標値応答伝達関数の出力で、1000rpmに向けて上昇していることがわかります。
5s時点で右上の外乱トルクが入力されています。
左下の赤線が外乱応答伝達関数の出力で、外乱トルクに応じて回転を妨げる(マイナス方向)の回転数を出力しています。
右下図が目標値応答と外乱応答を足し合わせた最終的な出力になり、外乱トルクが入力された後では所望の回転数1000rpmを維持することができていないことがわかると思います。
シミュレーションのpythonソースコード
今回入力データが『電圧目標値』と『外乱トルク』の2つを用意するため、csvファイルからデータを読み込んでいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
"""DCモータの応答""" from control.matlab import * import numpy as np from matplotlib import pyplot as plt from scipy import arange import pandas as pd """表示の設定""" mon_t_st = 0 mon_t_end = 10 """入力データの読み込み""" t = pd.read_csv('input_data_voltage.csv', usecols=[0]) print(t) u = pd.read_csv('input_data_voltage.csv', usecols=[1]) u = u*3.15 # csvデータを3.15Vに調整 print(u) d = pd.read_csv('input_data_voltage.csv', usecols=[2]) d = d*(-0.03) # csvデータを-0.03Nmに調整 print(d) plt.subplot(2,2,1) plt.plot(t,u) plt.grid(True) plt.xlabel('Time[s]') plt.ylabel('Voltage[V]') plt.xlim(mon_t_st,mon_t_end) plt.ylim(0,5) plt.subplot(2,2,2) plt.plot(t,d) plt.grid(True) plt.xlabel('Time[s]') plt.ylabel('DistTRQ[Nm]') plt.xlim(mon_t_st,mon_t_end) plt.ylim(-0.05,0.05) """------------------------""" pi = np.pi # 円周率 """DCモータの特性パラメータ""" R = 0.65 # 回路の抵抗[Ω] L = 0.0021 # 回路のインダクタンス[H] J = 0.0005 # モータイナーシャ[kgm^2] Ke = 0.03 # 誘起電圧定数[V/(rad/s)] Kt = 0.03 # トルク定数[Nm/A] """------------------------""" """DCモータの伝達関数""" G1 = tf(Kt,[L*J,R*J,Kt*Ke]) # e→ωの伝達特性 G2 = tf([L,R],[L*J,R*J,Kt*Ke]) # Td→ωの伝達特性 print(G1) print(G2) """------------------------""" #ステップ応答 (y1,t1,x1) = lsim(G1, u, t) (y2,t2,x2) = lsim(G2, d, t) yout = y1 + y2 y1 = y1*60/2/pi # [rad/s]→[rpm] y2 = y2*60/2/pi # [rad/s]→[rpm] y_rpm = yout*60/2/pi # [rad/s]→[rpm] plt.subplot(2,2,3) plt.plot(t1,y1,color='blue') plt.plot(t1,y2,color='red') plt.grid(True) plt.xlabel('Time[s]') plt.ylabel('Rev[rpm]') plt.xlim(mon_t_st,mon_t_end) plt.ylim(-1200,1200) plt.subplot(2,2,4) plt.plot(t2,y_rpm) plt.ylim(0,1200) plt.xlim(mon_t_st,mon_t_end) plt.grid(True) plt.xlabel('Time[s]') plt.ylabel('Rev[rpm]') plt.show() |
Python controlを使ったDCモータの回転制御シミュレーション(外乱応答)まとめ
今回はDCモータに外乱トルクが加わった場合に回転数が維持できなくなることをシミュレーションで確認しました。
次回はPID制御コントローラを使って、外乱が加わっても回転数を維持できるように制御したいと思います。
最後まで読んでいただき、ありがとうございました。
pythonで制御の勉強にはこの本がおススメ!
コメント