ArduinoでVVVFインバータ作ってみた

#1. VVVFインバータでモータを回す
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">エイプリルフールなのでArduinoでVVVFインバータ作った <a href="https://t.co/50eoqjCtdy">pic.twitter.com/50eoqjCtdy</a></p>&mdash; tueks (@tueks3) <a href="https://twitter.com/tueks3/status/1245362928204656640?ref_src=twsrc%5Etfw">April 1, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
部屋にちょうど良いIPMが転がっていたのでVVVFインバータを作ってみました。電源回路、コードも含めた自作がようやく実現できました。Arduinoでモータ回せるのでよかったら皆さんも挑戦してみてください！
ちなみにエイプリルフールは特に関係ないです。

**注意：100Vの電源を使います。あぶないので電子回路の知識・経験がある人以外真似しないでください。**
**この記事を参考にして起きた事故やケガ、損害に関して私は一切責任をおいません。**
#2. VVVFインバータのコード
三相交流PWMをV/f一定で出力するやつです。
基本的な参考サイトはこちら。
http://maicommon.ciao.jp/ss/Arduino_g/PWM/index.htm
"第8項 正弦波による発光"を参考にしました。友人のミズヒト氏とほぼ同じコードになってしまいましたねｗ
http://hinatsumic.blogspot.com/2016/09/vvvf.html

```cpp:VVVF.ino

/*VVVF Project*/
/*2020.3.19 @tueks3*/
/*copy left*/


//Pin setup
int uOut = 9; //U pwm out
int vOut = 3; //V pwm out
int wOut = 11; //W pwm out
int freqIn = 0;
int amplitudeIn  = 1;



//variable setup
float freq ;
float amplitude = 0.;
float uModulate;
float vModulate;
float wModulate;
int ang;
//int sinw[] = {126, 130, 134, 139, 143, 147, 152, 156, 160, 164, 169, 173, 177, 181, 185, 188, 192, 196, 200, 203, 206, 210, 213, 216, 219, 222, 225, 227, 230, 232, 235, 237, 239, 241, 242, 244, 245, 247, 248, 249, 250, 250, 251, 251, 251, 251, 251, 251, 251, 250, 250, 249, 248, 247, 245, 244, 242, 241, 239, 237, 235, 232, 230, 228, 225, 222, 219, 216, 213, 210, 207, 203, 200, 196, 192, 189, 185, 181, 177, 173, 169, 165, 160, 156, 152, 148, 143, 139, 134, 130, 126, 121, 117, 113, 108, 104, 100, 95, 91, 87, 83, 79, 74, 70, 67, 63, 59, 55, 52, 48, 45, 41, 38, 35, 32, 29, 26, 24, 21, 19, 17, 14, 12, 11, 9, 7, 6, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 6, 7, 9, 10, 12, 14, 16, 18, 21, 23, 26, 29, 32, 35, 38, 41, 44, 48, 51, 55, 58, 62, 66, 70, 74, 78, 82, 86, 90, 95, 99, 103, 108, 112, 116, 121,};
int sinw[180];
int angu;
int angv;
int angw;

void setup() {
  // put your setup code here, to run once:
  pinMode(uOut, OUTPUT);
  pinMode(vOut, OUTPUT);
  pinMode(wOut, OUTPUT);
  //PWM Frequency : 3, 5, 6, 9, 10, 11 490 Hz (pins 5 and 6: 980 Hz)
  
    Serial.begin(9600);
    for (ang = 0; ang < 180; ang = ang + 1) {
      sinw[ang] = 126 * (sin(ang * 3.14 / 90) + 1);
      Serial.print(sinw[ang]);
      Serial.print(",");
    }
  

  angu = 0;
  angv = 60;
  angw = 120;


}

void loop() {
  // put your main code here, to run repeatedly:
  freq = analogRead(freqIn) / 10.23; //0~100Hz
  amplitude = freq * 0.0099 + 0.1; // V/f control +0.1 mean tollque boost


  uModulate = sinw[angu];
  vModulate = sinw[angv];
  wModulate = sinw[angw];

  if (freq < 1.0) {
    amplitude = 0;
  }
  if (amplitude >= 1.) {
    amplitude = 1.;
  }
  analogWrite (uOut, int ( uModulate  * amplitude));
  analogWrite (vOut, int ( vModulate * amplitude));
  analogWrite (wOut, int ( wModulate * amplitude));

  angu = angu + 1;
  angv = angv + 1;
  angw = angw + 1;


  if (angu >= 180) {
    angu = 0;
  }
  if (angv >= 180) {
    angv = 0;
  }
  if (angw >= 180) {
    angw = 0;
  }
  delayMicroseconds(int(9000 / freq));

}
```
変調波の周波数を上げようとしても30Hzくらいしか出せませんでした泣
analogWrite関数の処理に時間がかかるようです。
その後レジスタ叩き(FastPWM機能)にも挑戦しましたがPWMの同期がとれずうまくいかなかったので辞めました（笑）

#3. 回路図
![VVVFind.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/4057f94d-2ed1-fde6-2f2a-cd9a4fc31bde.png)
Arduino, IPM部
![FloatingPowerSupply.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/f0aa7ddc-84f0-a4ae-439a-96a427ff9f6a.png)
電源部
トランス詳細
トランス・コア：PC44　PQ20/20
トランス回路図上側：1次コイル44Turns, 補助電源8T, 5V出力6T, 15V出力8T, Spacer GAP 0.5mm
トランス回路図下側：1次コイル44Turns, 15V出力8T, Spacer GAP 0.5mm





**Arduino,IPM部**
![INV.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/e3fe4cb8-5018-ca99-e030-272088822b19.jpeg)

Arduino Nanoで三相交流のPWMを発生させて富士電機のIPM "6MBP100VDA060-50"で三相誘導機を駆動します。
IPMとはインテリジェントパワーモジールの略で、三相分のIGBTブリッジ、ゲートドライバ、各種保護回路が内蔵されています。
以前床から収穫したIPMを使ってやろう（老婆心）と思いこの企画はスタートしました。
フォトカプラは6N136を使ってます。フォトカプラのLEDをカソードで駆動するので負論理となってます。ですのでNOTを使ったデッドタイム生成回路も負倫理で出力してます。



**電源部・マルチ出力 フライバックコンバータ**
![FlybakDCDC.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/839d98aa-89d1-4f17-cede-4b0a28ea5fd0.jpeg)

絶縁5出力のフライバックコンバータです。キャパシタインプット整流回路を非絶縁パワー1出力（141V）としてインバータのバス電圧にしています。
三相ブリッジのハイサイドのゲートを叩くためのフローティング電源を構成しました。以前ブートストラップ回路を試しましたがUVLOが働き失敗してしまったので仕方なく作らないといけなかったのです。めんどくさいけど。
フローティング電源を構成するにはON/OFF方式のフライバックコンバータやRCCが便利です。何より出力インダクタが不要なのでコスト・実装面積が低くなるのがGOODです。
制御回路はTL494を使いました。最近TL494芸人みたいになってるな俺。
PQ20/20では5出力出すにはコアが小さいので2つのコアを使いました。大きいコアでやればいいのでは？と思われたあなた。
別にそれでもかまいません。ただし結合の低下による漏れインダクタンス増加、温度上昇を考えると小さいの2つのほうがメリットあるかもしれません。僕がこんな構成にしたのはぶっちゃけPQ20/20が日米（秋葉原のジャンクや）で安く手に入るからなんですけどね。
2つのトランスを同じバス（整流回路）につなげてスイッチングさせる場合、"ビート"が問題になります。
ビートとは異なるスイッチング周波数で動かした場合にその周波数の差が"うなり"として可聴帯域でのノイズとして出現するものです。
それを回避するために2つのTL494のスイッチング周波数を同期させました。マスタ・スレーブ動作というらしいです。おかげで目立ったノイズやトランスの鳴きはありませんでした。

**おまけ、トランス設計シート**
盟友kentamuのトランス設計シートを改造し、PC44 PQ20/20のフライバックコンバータ設計ができるようにしておきました。
https://drive.google.com/file/d/1hdjASGfmdNxvOQzqKIMKKIXP18Y2pyi3/view?usp=sharing

Vds波形
![flybackVds.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/3fbe648e-c83a-1d10-4647-b3d01ba5846e.jpeg)
青：Vds（1/10倍）
黄：Vgs
フライバック電圧80Vで設計しましたが実測232V-140V=92V　まあちょっとずれちゃったけど動いてるのでOK～


#おわりに
VVVFインバータと検索してこの記事に引っかかった方はもしかすると不満だらけかもしれません。そのままこの記事が役に立つ人は電源の沼に片足突っ込んでるのではなかろうか。
まずIPMは持ってないしフローティング電源なんて作る気起きないし....そんな方々に朗報！微分トランスというものを使うと簡単に絶縁ゲートドライバが作れるぞ！
続報乞ご期待であります！

**参考**
「改定　スイッチング・レギュレータ設計ノウハウ」
https://www.cqpub.co.jp/hanbai/books/30/30811.htm
絶版なんのでアマゾンで中古を探すといいかもしれません。
TL494の使い方がわからない人はこの本とにらめっこするといいと思います。

「Arduinoの概要」
http://maicommon.ciao.jp/ss/Arduino_g/PWM/index.htm
"第8項 正弦波による発光"