今回はブラシレスDCモータ(以降BLDCモータ)をArduinoを使って三相交流にて回していきたいと思います。
前回の記事で矩形波ではありますがBLDCモータを回転させることには成功しました。BLDCモータが回転する原理についてはその記事をご覧ください。
- Arduinoで交流波形を出力する
- Arduinoで三相交流波形を出力する
- 回路の製作
- BLDCモータを三相交流で回転させる
❶Arduinoで交流波形を出力する
「Arduinoで交流波形を出力する」という項目名ですが残念ながらArduinoでは交流波形は出力できません。
Arduinoに限らずほとんどのマイコンはONもしくはOFFの出力しかできないためです。要するに下図の図1のように5Vか0Vしか出力できません。
しかし、今回作りたい交流波形は図2の正弦波のように5Vから徐々に電圧を下げ0Vにする。また、0Vから徐々に電圧を上げ5Vにするといったように5V、0V以外の電圧も出力する必要があります。
そこでPWM制御を利用し、疑似的な交流波形は出力します。
PWM制御とは、電圧信号を高速でON、OFFし、そのパルスの幅を変えることで、平均的な電力や電圧を制御します。
電圧の低いところではON時間の短いパルス幅に、電圧の高いところではON時間の長いパルス幅にして、疑似的に正弦波を作り出します。
一見複雑そうですが、ArduinoIDEにはsin波形を簡単に作ることができるsin関数があります。
下記コードは正弦波を生成し、シリアルプロッタに出力するコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
const int Time = 1000; // 遅延時間 const int numSamples = 64; // 生成するSin波のサンプル数 int WP = 0; // 波形位置 void setup() { Serial.begin(9600); // シリアル通信を開始 } void loop() { // 波形の生成 float Sin = sin(2 * PI * WP / numSamples); // 波形位置の更新 WP = (WP + 1); // シリアルプロッタに出力 Serial.println(Sin); // シリアル通信で値を送信 // アナログ入力から取得した速度に基づいて遅延を挿入 delayMicroseconds(Time); } |
また、出力した正弦値をPWMでアナログ出力する際のデューティー比として入力すれば、指定したピンから疑似正弦波を出力することができます。
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 |
const int pin = 3; // 出力ピン const int Time = 1000; // 遅延時間 const int numSamples = 64; // 生成するSin波のサンプル数 int WP = 0; // 波形位置 void setup() { pinMode(pin, OUTPUT); Serial.begin(9600); // シリアル通信を開始 } void loop() { // 波形の生成 float Sin = sin(2 * PI * WP / numSamples) * 127 + 128; // PWMでアナログ出力 analogWrite(pin, Sin); // 波形位置の更新 WP = (WP + 1); // アナログ入力から取得した速度に基づいて遅延を挿入 delayMicroseconds(Time); } |
出力波形は下記のようになります。黄色の波形が無加工の出力波形で青色の波形が ローパスフィルタを通した後の出力波形になります。
➋Arduinoで三相交流波形を出力する
続いて三相交流波形を作っていきます。
といっても先に紹介したコードを改良し、3つのPinから位相の違う交流波形を出力するだけです。
下記コードにて三相交流を出力することができます。
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 |
const int pinA = 3; // 出力ピン1 const int pinB = 5; // 出力ピン2 const int pinC = 6; // 出力ピン3 const int Time = 1000; // 遅延時間 const int numSamples = 64; // 生成するSin波のサンプル数 int WP_A = 0; // 波形位置 int WP_B = numSamples / 3; // 波形位置 WP_Aから180°ずらす int WP_C = numSamples *2 / 3; // 波形位置 WP_Aから180°ずらす void setup() { pinMode(pinA, OUTPUT); pinMode(pinB, OUTPUT); pinMode(pinC, OUTPUT); } void loop() { // 波形の生成 int Sin_A = sin(2 * PI * WP_A / numSamples) * 127 + 128; int Sin_B = sin(2 * PI * WP_B / numSamples) * 127 + 128; int Sin_C = sin(2 * PI * WP_C / numSamples) * 127 + 128; // PWMでアナログ出力 analogWrite(pinA, Sin_A); analogWrite(pinB, Sin_B); analogWrite(pinC, Sin_C); // 波形位置の更新 WP_A = (WP_A + 1); WP_B = (WP_B + 1); WP_C = (WP_C + 1); // アナログ入力から取得した速度に基づいて遅延を挿入 delayMicroseconds(Time); } |
❸回路の製作
今回作成したコードですと、前回の記事
で製作したゲートドライバは使用できません。なので新しくゲートドライバ回路を作ります。
今回はゲートドライバICを使ったブートストラップタイプのゲートドライバを作りました。
下記に回路図を添付します。
なお、インバータ回路は前回の記事で製作したものを流用します。
❹BLDCモータを三相交流で回転させる
下記に配線後の写真を添付します。
なお、Arduinoに書き込むコードも可変抵抗で回転速度を調整できるように改良したものを使用してみます。
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 |
const int out_pinA = 3; // 出力ピン1 const int out_pinB = 5; // 出力ピン2 const int out_pinC = 6; // 出力ピン3 const int in_pin = A0; // アナログ入力ピン const int numSamples = 64; // 生成するSin波のサンプル数 int WP_A = 0; // 波形位置 int WP_B = numSamples / 3; // 波形位置 WP_Aから120°ずらす int WP_C = numSamples *2 / 3; // 波形位置 WP_Aから240°ずらす void setup() { pinMode(out_pinA, OUTPUT); pinMode(out_pinB, OUTPUT); pinMode(out_pinC, OUTPUT); } void loop() { // アナログ入力から遅延時間を取得 int Time = analogRead(in_pin); Time = map(Time, 0, 1023, 0, 3000); // 適切な範囲に変換 //スイッチOFF if (Time >= 2900) { analogWrite(out_pinA, 0); analogWrite(out_pinB, 0); analogWrite(out_pinC, 0); } //スイッチON 速度調整 else{ // 波形の生成 int Sin_A = sin(2 * PI * WP_A / numSamples) * 127 + 128; int Sin_B = sin(2 * PI * WP_B / numSamples) * 127 + 128; int Sin_C = sin(2 * PI * WP_C / numSamples) * 127 + 128; // PWMでアナログ出力 analogWrite(out_pinA, Sin_A); analogWrite(out_pinB, Sin_B); analogWrite(out_pinC, Sin_C); // 波形位置の更新 WP_A = (WP_A + 1); WP_B = (WP_B + 1); WP_C = (WP_C + 1); } // アナログ入力から取得した速度に基づいて遅延を挿入 delayMicroseconds(Time); } |
これまで紹介した方法でBLDCモータを回転させることができました。
また、消費電力も前回は1.5Vを入力時の電流量は5.2Aで7.8W消費でしたが、今回は1.5Vを入力時の電流量は3.3Aで約5W消費となり、消費電力も下げることができました。