岩の製作記

作ったものを適当に記録します

DCモータドライバの作り方

はじめに

この記事は、学ロボAdvent Calendar 2023の19日目の記事です。

adventar.org

またこの記事は京大機械研究会の部内wikiと同じものです。

モータドライバはなぜ必要?

マイコンからモータを回したいとき、誰もが最初はGPIOにモータを繋げようとするでしょう。ですが残念ながらこれはうまくいきません。GPIOの電流出力能力がせいぜい数mA~数十mAに対してモータは数A単位で電流を食うので、下手すればマイコンが燃えてしまいます。そこでモータドライバ (モタドラ、MD) が必要になるわけです。

DCモータってどんなやつ

どんなやつといっても、電圧を加えると電流が流れて回る。逆向きに電圧を加えると逆向きに回る。電圧を加えるのをやめると回転が止まる。簡単ですね。また電圧を上げるとトルクが増加し回転数が上がり、負荷を増やすと回転数が下がって電流が増加します。これも直感的にわかりますね。真面目に説明するならば逆起電力+巻線抵抗の両端電圧と入力電圧のつり合いを考える必要がありますが、なんとなくで理解できていたら大丈夫でしょう。DCモータはとりあえず電圧加えたら回るってことだけ分かっていれば良いです。モータと回路は燃やして強くなるものです (諸説)。

一番簡単なモータドライバ

さて本題に入りましょう。いきなり多機能なモータドライバを組むのは難しいので簡単なものから始めましょう。というわけでこれです。

motordriver1.png (5.8 kB)

馬鹿にしてはいけません。これはモータの回転と停止を制御できるモータドライバです。逆転はできませんが。 ちなみに分からない人に説明しておくとVDDとGNDは電源を表しています。VDDに電源の+極が、GNDに電源の-極が繋がっていると考えれば良いでしょう。 これのスイッチをNch-MOSFETに置き換えたものがこれです。

motordriver2.png (10.0 kB)

今度はINPUTに加えた電圧でモータを制御できるようになりました。Nch-MOSFETはG(ゲート)-S(ソース)間にVth(スレッショルド電圧)以上の電圧を加えるとD(ドレイン)-S(ソース)間が導通(ターンオン)し、電圧をVth以下にすると非導通になる(ターンオフする)素子です。要はGS間の電圧の有無でスイッチをコントロールできるわけです。 電圧で制御すると言いましたが、実際はGS間はコンデンサのような特性を示すため、MOSFETの駆動はこの仮想的なコンデンサを充放電することで行います。INPUTに電圧を与えるとR1(ゲート抵抗)を介してコンデンサが充電/放電され、MOSFETがON/OFFします。R2はINPUTの電圧が不定となったときにコンデンサを放電してMOSFETをOFFするためにつけています。この回路がMOSFET駆動の基本となるので形を覚えておきましょう。難しく感じるかもしれませんがここは大事なので気合で理解してください。

正転/逆転できるモータドライバ

motordriver3.png (8.3 kB)

これはHブリッジと呼ばれる回路です。スイッチが4つに増えましたね。落ち着いて動作を確認しましょう。まずは全てのスイッチがOFFの時、モータは停止します。次にSW1とSW4がONの時、1番端子から2番端子に電流が流れてモータは回転します。次にSW2とSW3がONの時、2番端子から1番端子に電流が流れてモータは逆回転します。次にSW2とSW4、またはSW1とSW3がONの時、両端子が繋がれてモータは停止します。ここで、モータの軸を回転させようとすると電流が流れますが、この状態では両端子がショートしているためモータの回転を止めようとする力が働きます。要はブレーキがかかるわけですね。最後にSW1とSW2、またはSW3とSW4がONの時、この回路はショートします。危険ですね。でもこうするしかないのでみんなこの回路を使うんです。仕方ないのでこのような状態に陥らないようにスイッチを制御しましょう。

Pch/Nch-MOSFET混合モータドライバ

motordriver4.png (30.3 kB)

スイッチをNch-MOSFETとPch-MOSFETで置き換えました。Q2、Q4については先程と同じですね。そして新たにQ1とQ3にPch-MOSFETが導入されました。これも同じくGS間の電圧で動く素子ですが、先程と違うのはGS間に負の電圧を加えるとターンオンする点です。Nch-MOSFETの逆みたいな素子ですね。なんでPchなのかというと後述するめんどくさいゲート駆動の問題を避けるためです。この回路をマイコンから動かせるようにしたのがこちらです。

motordriver5.png (35.6 kB)

ややこしくなってきましたね。先程の回路にレベル変換用のトランジスタを追加し、マイコンの3.3VのGPIOでMOSFETが駆動できるようになりました。しかしこの回路は致命的な欠点をいくつか抱えています。 まず1つ目、VDDの入力電圧が10V~15V程度に限定されることです。MOSFETのゲート耐圧は20V程度のものが多く、またターンオンには最低でも10V程度の電圧が必要とされるからです。24Vを多用するロボコン等には向きませんね。 次に2つ目、MOSFETの駆動が遅いという点です。各MOSFETに対しトランジスタ1石で駆動するとプルアップ抵抗 (R3とかR4とか) のせいでどうしてもゲート駆動電流が低くなってしまいます。すなわちGS間のコンデンサの充放電に時間がかかり、信号を入力してからMOSFETが完全にON/OFFするまでにタイムラグが生じます。後述するPWM制御などを行った際、このタイムラグが問題になります。 次に3つ目、入力次第で短絡が可能という事です。これは入力にロジックICを挟むなどして解決できますが。 最後に4つ目、Pch-MOSFETはON抵抗が高いという事です。MOSFETはターンオンした時にDS間が抵抗のようにふるまい、この抵抗値をON抵抗といいます。これがPch-MOSFETはNch-MOSFETに比べて数倍以上高いため、大電流を流した時に発熱が問題になります。なのでこの回路はRS-385とかそれ以下の小さいモータ専用になってしまいます。だったら全部Nch-MOSFETで作ればいいじゃん、ということで次の回路です。

フルNch-MOSFETモータドライバ

motordriver6.png (22.0 kB)

先程の回路のPch-MOSFETをNch-MOSFETで置き換えたものです。なんだ、これでいいじゃないか、Pch-MOSFETとか出してくんなやとか言ってはいけません。これ、ゲートの駆動がチョット大変なんです。Q2とQ4は今までと同じくGNDに対してINPUT2、INPUT4に10V程度を与えれば駆動できますね。しかしQ1とQ3はどうでしょう。Q1に注目すると、例えばQ1とQ4をONの状態で維持しようと思ったら、Q1がONのときQ1のソースの電圧はQ1のドレインの電圧にほぼ等しいことを考えると、VDD(電源電圧) 以上の電圧をゲートに加えないといけないことが分かります。つまり昇圧回路か別電源が必要ということです。困りましたね。というわけでこうしてみましょう。

ハイサイドMOSFET駆動とゲートドライバの導入

motordriver7.png (40.9 kB)

ここで新たなデバイス、ゲートドライバを導入します。これは名前の通りMOSFETのゲートを駆動するためのデバイスで、電源を与えると入力に応じてMOSFETのゲートをON/OFFしてくれます。今回はフォトカプラ(LEDと受光素子を用いた絶縁デバイス) とゲートドライバが一緒になったデバイスTLP250を使ってみました。INPUT1に電圧を加えるとフォトカプラU1のLEDが光り、ゲートドライバがONになって電池BT1から電荷が与えられてQ1がターンオンします。INPUT1を0VにするとLEDが消灯してゲートドライバがOFFになり、Q1はターンオフします。ここで電池を使ってハイサイド(Q1、Q3)ゲート駆動用の電源をVDDと別で用意したことがポイントです。とは言いつつも電池は電池、時間が経つと使えなくなってしまいます。さらに10V程度ある電池を用意するのも大変です。というわけで電池を絶縁DCDCコンバータに置き換えてみましょう。

motordriver8.png (50.7 kB)

電池が絶縁DCDCコンバータになった以外は先程と変わっていません。動作も同じです。 これで完璧!と言いたいところですが、絶縁DCDCコンバータはやや高価です。絶縁電源を使わずにハイサイドMOSFETを駆動したい、ということで登場するのがブートストラップ回路です。

ブートストラップ式フルNchモータドライバ

motordriver9.png (47.6 kB)

ダイオードが追加されましたね。ここでポイントとなるのがPWM制御です。PWM制御は、高速でONとOFFを繰り返してONとOFFの時間の比でモータの出力を制御するというものです。つまり、HブリッジでPWM制御を行うときはQ1とQ4がON、Q2とQ4がONを繰り返してON/OFFを切り替えるわけです。このときの回路の動作を考えてみましょう。 Q2がONのとき、点SAは0Vに近い電圧になり、D1を通してC1が充電されます。Q2がOFFになりQ1をONにしようとすると、コンデンサから電荷が供給されてQ1がONになります。このときダイオードの整流作用でコンデンサから電源に電流が流れることはありません。これを繰り返せばハイサイドMOSFETの駆動が達成できるわけです(下図)。

motordriver11.png (40.8 kB) motordriver12.png (40.1 kB)

Q2がOFFの時間が続くとコンデンサの電圧は少しずつ下がってしまうのでQ1をずっとONにはできず、PWM制御が前提となってしまいますが、正しく設計すればDuty0.99くらいは達成可能なので十分実用的な回路だと言えます。

ロジックの整理

先程までは入力が4つあり、入力次第ではショートしてしまうのでロジックICを使って入力を制御しましょう。今回はPWM、PHASE(回転方向)、ENABLE(Loで全MOSFETがOFF)の3入力で制御できるようにしてみましょう。ショートが起きないのに加え、マイコンのPWM出力も1本で済みます。真理値表は以下の通りです。

ENABLE PHASE PWM INPUT1 INPUT2 INPUT3 INPUT4
1 0 0 0 1 0 1
1 0 1 1 0 0 1
1 1 0 0 1 0 1
1 1 1 0 1 1 0
0 x x 0 0 0 0

カルノー図を描いても良いですが、これくらいなら脳内でサクッと組んじゃいましょう。こんな感じです。

motordriver13.png (21.7 kB)

デッドタイム

実は先程の回路ではまだ実用できません。というのは、Q1とQ2のON/OFFを切り替える際に、一瞬だけショートしてしまうからです。なぜなら始めに述べた通りMOSFETのゲートはコンデンサのような特性を示し、このコンデンサを充電/放電する時間が必要でその間MOSFETは中途半端にONになった状態になるからです。すると以下のようにQ1とQ2が同時にONになった時間が生まれてしまいます。

motordriver14.png (13.0 kB)

そこでQ1、Q2のターンオフはそのままで、ターンオンのみをちょっとだけ遅らせて両方OFFの時間を作ります。この時間をデッドタイムと言います。

motordriver15.png (10.2 kB)

こうすることで、ON/OFFの切り替え時もMOSFETがショートするのを防ぐことができます。デッドタイムマイコンで作っても良いですが、より確実な回路で作るのをおすすめします。例えば以下のようにすれば回路でデッドタイムを自動挿入できます。

motordriver16.png (40.4 kB)

遅延といえば定番のRC回路ですね。ロジック出力をいったん反転し、RC回路で遅延を発生させて、ダイオードで充電方向のみバイパスします。こうすると、C_Deadtimeの充電は一瞬、放電はゆっくり行われます。これをさらに反転したものをゲートドライバに入れています。つまり、ゲートドライバがONからOFFになるとき(=C_Deadtimeが充電されるとき) は遅延なく、ゲートドライバがOFFからONになるとき(=C_Deadtimeが放電されるとき) は一定の遅延が挟まれます。これでデッドタイムが作れたことになります。ここまでくるともう十分実用的なモータドライバができますね。

実際の設計

というわけでお待たせいたしました。それでは実際の回路を設計していきましょう。...とその前に、フォトカプラはスイッチング速度が遅い(~20kHz程度)のでそれ以上のPWM周波数が必要なら磁気式絶縁ICを使いましょう。絶縁ICとゲートドライバが一緒になったIC(ADuM3224など)を使えば楽ですね。今回はこれを用いた絶縁型モータドライバを組んでみます。ちなみに絶縁するのはモータ等から来るコモンモードノイズをロジック側に極力入れないようにするためです。まあちゃんと対策していればロボコン程度なら絶縁しなくても問題は無かったりしますが、考えるのが面倒くさいので今回は絶縁仕様とします。

仕様の決定

駆動対象: DCモータ 電源電圧: 24V 最大電流: 連続30A 入力: PWM、PHASE、DISABLE ロジック電圧: 3.3V 絶縁: あり FET: フルNch-MOSFET

Hブリッジ

motordriver17.png (20.0 kB)

まずはモータドライバの心臓部、Hブリッジを設計します。Hブリッジの設計というかMOSFET(とヒートシンク) の選定ですね。まずはVds定格(ドレイン-ソース間電圧定格)です。今回は電源電圧が24Vですが、サージ電圧などが発生する可能性も考えて定格には余裕を持ちましょう。40V、できれば60V以上の耐圧を持つMOSFETを選びましょう。Id(ドレイン電流) についても同様に最大電流から少し余裕を持って選定を行いましょう。次に注目するのはON抵抗です。ON抵抗をRds(on)、流す電流をIdsとするとMOSFETには

 \displaystyle
P=R_{ds(on)} \times Ids^{2}

の熱が発生します。ヒートシンクの熱抵抗をRth(heatsink)、MOSFETのチャネル-ケース間熱抵抗をRth(ch-c)とすると、ヒートシンクの温度上昇は

 \displaystyle
T=P \times (R_{th(heatsink)}+R_{th(ch-c)})

となります。外気温を50℃まで想定し、最大温度を80℃とすると、Tを30以下に抑える必要があります。MOSFETヒートシンクのデータシートを見ながら、Tが30以下になるようなRds(on)を持つMOSFETヒートシンクを選びましょう。 また他にも注目しておきたいのがゲート入力電荷量Qgです。これが大きいほど後のゲートドライバ周辺の設計で苦労するので、なるべく小さいものを選びましょう。 ここで注意すべきなのが、耐圧が高くなるほどON抵抗は大きくなり、ON抵抗やゲート入力容量は小さいほどMOSFETが高価になる傾向があるということです。トレードオフの中で用途に合ったMOSFETを選ぶしかないのです。今回は入手性を考えて秋月電子のTK100E06N1を選びました。用途によっては表面実装品やDigikey、Mouser、RSコンポーネンツを利用するのも良いでしょう。

ゲートドライバ

次にMOSFETを駆動するゲートドライバを選定します。ゲートドライバの選定で注目するのは、機能と、入力電圧と、出力電流です。PWM周波数が高いほど、またMOSFETのQgが大きいほど、より高速で出力電流の取れるゲートドライバが必要になります。今回は絶縁も同時にしてしまいたかったので、秋月電子のADuM3224を選びました。これはロジック電圧3.3Vに対応しており、1個で絶縁とHブリッジのMOSFET2個(ハーフブリッジという) が駆動でき、出力電流も4A取れる優れものです。私が購入したときは確か440円だったのですが、倍近い値段になってしまっていますね...。安いものが良ければそちらでも構いませんし、Digikey等にもっといいのがあるかもしれません。

ゲート抵抗、プルダウン抵抗

ゲートドライバが決まったらゲート抵抗とプルダウン抵抗を決めます。ゲート抵抗は大きすぎるとスイッチングが遅くなって損失(=発熱) が増えますし、小さすぎると寄生成分等でリンギング(電圧の振動) が起きる可能性があります。また駆動時の最大電流がゲートドライバの規定値を超えないようにしなければなりません。今回はゲート抵抗として10Ωを選定しました。最大電流はゲート駆動電圧を12Vとすると1.2Aなので、ゲートドライバの規定値4Aに収まっています。またプルダウン抵抗は、通常数十kΩ~100kΩとする場合が多く、今回は20kΩとしました。プルダウン抵抗は大きすぎるとノイズの影響を受けやすくなり役割を果たせなくなりますし、小さすぎるとブートストラップコンデンサがプルダウン抵抗を介して放電する影響を無視できなくなってしまいます。

ブートストラップ回路

motordriver18.png (36.0 kB)

次にゲートドライバを使ってブートストラップ回路を組みます。ダイオードD1、D2は逆回復時間の短いショットキーバリアダイオードを使用しましょう。ブートストラップコンデンサC1、C3は、基本的にはMOSFETのゲート容量の10倍以上としますが各ゲートドライバのデータシートを参照すべきです。今回はADuM3224のデータシート通り、10uFとしました。またバイパスコンデンサC2、C4についても、同様に10uFとしました。コンデンサ積層セラミックコンデンサを使いましょう。またゲート駆動電圧ですが、基本的に高いほどON抵抗は小さくなるので、定格に余裕を持った範囲で大きくしましょう。今回は12Vにしました。

制御ロジックとデッドタイム生成

motordriver19.png (38.7 kB)

ゲート駆動回りが完成したら制御ロジックとデッドタイム生成回路を組みましょう。今回はゲートドライバにDISABLE入力があるので、これはそのまま利用し、PWMとPHASEの2入力でINPUT1~INPUT4を制御するようにしました。デッドタイムの計算方法はいろいろありますが、今回使った式を紹介しますと以下の通りです。

 \displaystyle
T_{dead}=\lbrace - C_{gate} \times R_{gate} \times \ln \frac{V_{th}}{V_{gate}} +(t_{off}-t{on}) \rbrace \times 1.5

Cgateはゲート入力容量、Rgateはゲート抵抗、VthはMOSFETスレッショルド電圧、Vgateはゲート駆動の電圧、toffはターンオフ時間、tonはターンオン時間、1.5倍しているのは安全率です。MOSFETのデータシートとゲート抵抗値からTdeadを計算すると387nsとなります。時定数が387ns以上になるようにRdeadとCdeadを選び、今回はRdead=1.2kΩ、Cdead=330pFとしました。時定数はR x C = 396 [ns] です。

電源部と入力

motordriver20.png (13.5 kB)

最後に電源と入力です。ゲート電源を三端子レギュレータで生成し、また電源入力にはモータの逆起電力吸収用の大きめのコンデンサを載せます。ロジック入力はコネクタ接続とするならプルダウン抵抗を入れておきましょう。好きなマイコンと直結してもよいです。

全回路図

motordriver21.png (102.9 kB)

これにてモータドライバはとりあえず完成です。お疲れ様でした。

発展編

モータと直列にホール式電流センサを入れたり、Hブリッジの直下にシャント抵抗とアンプを置いたりすると電流制御ができますね。また下のようにハーフブリッジを3つにするとブラシレスモータドライバが作れます。 motordriver22.png (74.2 kB)

あとがき

モータドライバの設計は最初は難しく感じるかもしれませんが慣れれば簡単になってきます。たくさんモータドライバを作って、燃やして、強くなりましょう。 上記の内容は全て筆者が独学した内容を初心者向けに解釈して記述したにすぎないので、誤りがあるかもしれません。その際は是非コメントまたは筆者までお知らせください。 また上記の回路図は未検証です。内容をまねて作った作品が不具合を起こしたりそれによって損害を負っても、筆者は責任を負いかねますのでご了承ください。