🤖

モータ選定のための3相インバータを作った話

2024/09/21に公開

背景

ブラシレスモータを使って製作したいものがあったが,unknownの3相モータのトルクを確認したかったのでインバータ作りました.

注意点!!!!
インバータ自体は問題なく作成できたのですが,モータをまわすという点では,成功したとは言えないと思います.

仕様

  • Vdd=12V(鉛蓄電池)
  • ゲートドライブ回路は自作せずIR2302
  • マイコンはそこらへんに転がってたXIAO RP2040
  • 周波数は60Hz以上を想定(MOSFETを安くしたい)

選定

MOSFETの選定

モータにつなぐので,それなりに電流はながれるはずです(モータがunknownだからわからないが,10 A以内と信じることとする).秋月でnchのMOSFETを検索して,安い順にしてデータシートを読み漁りました.

  • 耐電圧12/0.8=15V以上
  • 1/60Hz*(1/3)=5.6 msで安全動作領域内
  • 閾値電圧5 V以内
  • ユニバーサル基板ささること(10Aながれたらそもそもアウトなきが...モシャ)

で,結局2SK3800を用いることにしました.

他の特性は以下の通り[1]

ゲート抵抗

ゲート抵抗はMOSFETのt_{on}とゲート入力電荷から求まります.

Rg_{min}=Vgs/Qg/t_{on}= 5/(50\times 100)\approx 24\;\Omega

ということで家に転がってた20 Ωを使おうと思います.

ゲートドライバ

IR2110とか使うのが無難なんでしょうが,家に転がってたIR2302使います.ハイサイド,ローサイドどっちも一つの信号で動かせるので楽ですし,耐電圧もあるので,そう簡単に壊れない(はず)です.また,デットタイムを540 ns勝手に入れてくれるので,ゲート駆動の信号を作るのがちょい楽になります.

マイコンの選定

今回,そこらへんに転がってたXIAO RP2040が5 V生えてたのでこれを使うことにしました.IR2302のVccが5 V以上推奨.

ちなみにもってたXIAO SAMD21は死ァオしました.

回路図

IR2302のデータシートと前述で選定したものを使って回路を組みました.今回はマルチレベルやZVSを考慮した回路にはせず,単純な2レベルの三相インバータにしています.U,V,Wはモータにつなぐポートです.

Circuit

ゲートドライブ関係の回路について

MOSFETを駆動するにはVgs(ゲート・ソース間電圧)がMOSFETの閾値電圧を超えないといけません.そこで問題になるのがハイサイド側です.Vsは0 Vにもなりうるし,Vddにもなりうります.(厳密にはオン抵抗あるので多少小さくなりますが..) どうやってVgs+Vsの電圧をゲートにかけられるのか....
そこで手段としては

  • 絶縁型DCDCを使う
  • ブーストラップ回路(コンデンサによるブースト)

があげられます.
今回使うIR2302はブーストラップ回路を想定されています.以下の図の上の図がLOWのとき,下の図はHIGHのときのコンデンサ周りを示しています.

  1. LOWのときVsに対して電圧差Vccがコンデンサにかかり,電荷が充電されます.
  2. HIGHのとき,コンデンサが放電し,Vsに対してVccの電位差がゲートにかかります.
    コンデンサを用いているので,放電しきる前にスイッチングする必要があります.よってコンデンサの素子値はスイッチングに対して十分な容量が必要になります.

ゲートドライブ動作説明

[2]を参照した.

ゲートドライブ用マイコンのコード

XIAO RP2040のコードを書きました.120度ずつ位相をずらしてスイッチングする感じになっています.[3]のコードを参考にしました.ただし,参考元のコードはオーバーフローの可能性があり,unsafeなコードになっていたので,オーバーフローしないようなコードにしました.

実際に作った

実機

prototype

実際に使ったモータはこちら,極対数,絶対定格電圧,電流詳細不明の家に転がってたモータ
moter

無負荷時の波形を確認

オシロスコープでU,V,W相対GND電圧を確認しました.120度ずつ位相がずれていて,U-V相の差の電圧波形(V結線にあたる)はフィルタ回路挟めば正弦波になりそうな形になっていることが確認できました.
この状態ならモータをつないでも問題なさそうと判断しました.
waves

回せた?????

実際に回してみた結果,直安(5Aまでながせる)でCCかかりっぱだったので鉛蓄電池で回した結果,10 Aをこえる電流が鉛蓄電池から出力されていることがわかり,エマストしました.また,モータは一回転するあたりでつっかかったりしたので,コードに多少問題があるのかもしれません.

  • MOSFETの発熱は大したこともなく,無負荷時の波形は問題なかったです.
  • 位相制御一切していないので,負荷時に問題が起こった可能性があります.
  • モータがちゃんと回ってない場合,磁束変化がなく,ただの導線となっていた可能性があります.その場合,モータに過電流が流れた可能性があります.

※一応2年前2SK4017でインバータ回路を作成したときは,ちゃんと回りましたし,5A以下でした.

回った!!

実際にやってみると,60 Hzで回りました.しかし,周波数が高すぎると,振動しているだけで,モータの回転子が追い付いてないように思えました.また,波形も周波数が一定程度超えると汚くなるので,周波数を高めに使う場合は,PWMではなく,矩形波でもいいと思います.

※以前ちゃんと回らなったのはsin波を細かく区切りすぎてマイコンのI/Oが追いついてなかったからだと思います.マイコンのI/Oの速さ,動作周波数等をしっかり考えた上で使うマイコンを考えた方がよさそうです.

今後の方針

持っていたモータのトルクが怪しいので,自作するか高いモータを買うかしようかなと思います.また,インバータに関しては高い周波数に対応していないので,のちのち高い周波数に対応したコードをあげようと思います.

コード(改善済み)

  • 周波数を固定する場合は,モータの始動時,ローターが回転磁界に追い付かず,振動するだけという現象が起こる可能性あります.その場合は,手でモータを回してあげてある程度初期回転速度を与えてあげると回ると思います.それでも回らない場合,周波数が高すぎてマイコンのanalogWriteが追い付ていないか,電圧が足らなさ過ぎてトルクが出ていないかのどちらかだと思います.
#define SAMPLES 64
const int pinA=2;
const int pinB=9;
const int pinC=10;

const int numSamples = 64;  // 生成するSin波のサンプル数

// 波形位置
int WP_A = 0;  
int WP_B = SAMPLES / 3;
int WP_C = SAMPLES *2 / 3;
int angle_cnt=0;

double sinwave[SAMPLES]={0};

 
void setup() {
  // 波形の生成
  for (int i = 0; i < SAMPLES; i++) {
    sinwave[i] = sin(2 * PI * i / SAMPLES) * 127 + 128;
  }
  pinMode(pinA, OUTPUT);
  pinMode(pinB, OUTPUT);
  pinMode(pinC, OUTPUT);
}
 
void loop() {
  static int fsw=60;
  // 各層配列の何個目を参照するか決める
  WP_A = (WP_A + 1) % SAMPLES;
  WP_B = (WP_B + 1) % SAMPLES;
  WP_C = (WP_C + 1) % SAMPLES;
  
  // PWMでアナログ出力
  analogWrite(pinA, sinwave[WP_A]);
  analogWrite(pinB, sinwave[WP_B]);
  analogWrite(pinC, sinwave[WP_C]);
 
  // アナログ入力から取得した速度に基づいて遅延を挿入
  int delay_time=1.0/(fsw * SAMPLES)*1000000;
  delayMicroseconds(delay_time);
}

参考

[1]秋月電子 2SK3800データシート
https://akizukidenshi.com/goodsaffix/2sk3800_ds_jp.pdf

[2]Tech Web 三相変調インバータ回路の基本動作
https://techweb.rohm.co.jp/product/power-device/si/15580/

[3]ブラシレスモーターを三相交流で動かす
https://kimudiary.com/arduino/ブラシレスモーターを三相交流で動かす/

Discussion