初のモタドラ設計!!ゲート抵抗を計算して求めてみた

初のモタドラ設計!!ゲート抵抗を計算して求めてみた

Tags
LowLayer
BLDC
MD動くかなチャレンジ
お勉強
Published
November 16, 2022

BLDC Driverを作っています

こんな基板を設計しました.これをJLCPCBに発注しました.
僕にとって初めての自作モータドライバと言える作品です.
燃えてほしくないですね.なのでMOSFETの選定やゲートドライブの周辺回路も慎重に設計しました.
notion image

今回のモータドライバ

  • MCU : STM32F446RET6

MOSFETのデータシートを眺める

データシートの表から読み取っていきます.
notion image
notion image

今回の計算で使用した数値

  • Ciss1=795pFCiss_1 = 795pF
  • Ciss2=765pFCiss_2 = 765pF
  • Qg=20nCQg = 20nC
  • Qgs=2.7nCQgs = 2.7nC
  • Qdg=1.8nCQdg = 1.8nC
  • Rgp=1.2ΩRgp = 1.2Ω
  • R=任意のゲート抵抗[Ω]R = 任意のゲート抵抗[Ω]

ではでは,計算していき

Pythonを計算用紙の代わりにしました.
matplotlibでグラフを書きました.

ゲート周りの抵抗RgR_g

Rg=寄生抵抗Rgp+ゲート抵抗RRg = 寄生抵抗R_{gp} + ゲート抵抗R

RC回路の時定数

τ=C×Rgτ = C×Rg

ゲート容量の電圧

Vc=Vgs(1e1τ)V_c = Vgs(1-e^{-\frac{1}{τ}})

ゲートに流れる電流

Ig=VgsRg×e1τtI_{g} = \frac{Vgs}{R_g} ×e^{\frac{-1}{τ}t}

ゲートに流れる最大電流

IgMAX=VgsRgI_{gMAX} = \frac{V_{gs} }{R_g}

MOSFETのゲート容量が95%になった時の電流

Ig3τ=Ig×(10.95)I{g_{3τ}} = I_g×(1-0.95)

MOSFETのターンオン時間

t=τ×log(τonRg+RgpVgs)t = -τ×log(τ_{on} \frac{Rg + R_{gp}}{Vgs})
 
import numpy as np import matplotlib.pyplot as plt # ゲートソース電圧 Vgs = 15.5 # 寄生ゲート抵抗 1.1Ω Rgp = 1.2 # 追加するゲート抵抗 Rg = 50 # [10, 20, 50, 100] # Total gate charge 20nC Qg = 20e-9 # Gate-source charge 2.7nC Qgs = 2.7e-9 # Gate-drain charge 1.8nC Qgd = 1.8e-9 # Ciss 795pF Ciss = 795e-12 # Q = CV → C = Q/V Cg = Qg / Vgs # これであってるん?Cgってここで書きたいのはトータル電荷量ではなくCissじゃないの? print('Cg:', '{:.6g}'.format(Cg * 1e12), 'pF') #これはなに? # 時定数 τ = RC tau = Ciss * (Rgp + Rg) # 最大ゲート電流 Ig = Vgs / (Rgp + Rg) print('IgMax:', '{:.3g}'.format(Ig), 'A') # 3τ後のゲート電流z Ig_3tau = Ig*(1-0.95) # 駆動周波数 KHz F = 20e3 # 周期 us T = 1 / F print('period:', T * 1e9, 'ns') T_min = T / 256 print('period Min:', T_min * 1e9, 'ns') # ターンオン時間 timeTurnOn = -tau * np.log(Ig_3tau * (Rgp + Rg) / Vgs) print('timeTurnOn:', '{:.3g}'.format(timeTurnOn * 1e9), 'ns') # Graph Settings fig = plt.figure() # グラフ領域作成 graph1 = fig.add_subplot(1, 2, 1) # グラフ1 graph2 = fig.add_subplot(1, 2, 2) # グラフ1 t = np.linspace(0.0000000001, 8 * tau, 200) # 時間ベクトル作成 def transientCurrent(t): # 過渡電流 return Vgs / (Rgp + Rg) * (np.exp(-t / tau)) def drawGateResistorCurrentGraph(): # ゲート抵抗に流れる電流のグラフ graph1.set_xlabel('t') graph1.set_ylabel('i(t)') graph1.set_title('Gate Resistor Current [' + 'Rg:' + str(Rg) + 'Ω' + ' ,Vgs:' + str(Vgs) + 'V]') graph1.plot(t, transientCurrent(t)) graph1.plot(tau * 1, transientCurrent(tau * 1), marker='.') # 1τ graph1.plot(tau * 2, transientCurrent(tau * 2), marker='.') # 2τ graph1.plot(tau * 3, transientCurrent(tau * 3), marker='.') # 3τ def transientCVoltage(t): # コンデンサの過渡電圧 return Vgs * (1-np.exp(-t / tau)) def drawCissVoltageGraph(): # Cissにチャージされた電圧のグラフ graph2.set_xlabel('t') graph2.set_ylabel('V(t)') graph2.set_title('Ciss Voltage [' + 'Rg:' + str(Rg) + 'Ω' + ' ,Vgs:' + str(Vgs) + 'V]') graph2.plot(t, transientCVoltage(t)) graph2.plot(tau * 1, transientCVoltage(tau * 1), marker='.') # 1τ graph2.plot(tau * 2, transientCVoltage(tau * 2), marker='.') # 2τ graph2.plot(tau * 3, transientCVoltage(tau * 3), marker='.') # 3τ def main(): print('Param [Rg:', Rg, 'Ω', ',Vgs:', Vgs, 'V]') drawGateResistorCurrentGraph() # ゲート抵抗に流れる電流のグラフ drawCissVoltageGraph() # Cissにチャージされた電圧のグラフ plt.show() if __name__ == "__main__": main()

計算結果

Cg: 1290.32 pF IgMax: 0.303 A period: 50000.0 ns period Min: 195.3125 ns timeTurnOn: 122 ns Param: [Rg: 50 Ω ,Vgs: 15.5 V]
notion image
  • ゲート駆動電圧を15.5Vにしてゲート抵抗に50Ωとした時,ターンオン時間が122nsになりました
  • またPWM周波数を20KHzでMOSFET駆動した場合,最小パルスは196nsとなります
  • 最小パルスの時間以内にMOSFETはターンオンすることがわかりました.
  • 最大電流は0.3AなのでMOSFETを6つ駆動した時,最大電流は0.3 × 6 = 1.8A.ゲートドライバの最大定格電流2.5A以下になっています
DRV8300は最小デッドタイムが200ns.250nsくらいにデッドタイムを決めたいと思います.
 
おしまい
完全に理解しました.変なところあったらコメントで教えていただけるとありがたいです.

ところでこれって何のモータードライバ?

私は今,RoboCup SSLに参加していまして,サッカーロボットを作っています.
ハードウェア担当なので組み込み回路周りもやっています.
Ri-oneに入ってからはロボットの足回り作っていて,サイクロイド減速機遊星内歯車減速機など,色々作ってきました.
そして今回はモータードライバを作ってみることにしました.
ツイートをいくつか貼り付けています.(クリックすると動画や映像を見ることができるので良かったら見てください)
Video preview
 
Ri-one SSLのTwitterもあるので良かったらフォローしてください〜

参考

Special Thanks

中丼さん,回路の相談に乗っていただき,ありがとうございました!
これからも頑張ります。