5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ブラシレスモーターをL298Nで動かす

Posted at

#概要
ブラシレスモーターを正転逆転両方に対応させたいのですが,ドローン用のESCは基本的に一方向のみにしか対応していません.
よって,L298Nでとりあえずどこまで動かせるかやってみたいと思います.

結論
現状,失敗している
電流2Aではちょっとパワーが足りないため,脱調がすぐ発生する
センサレスで単純にON,OFFしているためかもしれないが

#参考

ブラシレスモーターの構造
https://www.ipros.jp/technote/basic-motor3/

ESCの自作
https://www.youtube.com/watch?v=W9IHEqlGG1s

#原理

1.png

こんな感じの構造と考えるようです.
IMG_4222.JPG
実際には,コイルがたくさんある感じで
2.png
こんな感じと考えれるでしょう

コイルは12こ(間隔30deg),ステーターの磁石は14個(間隔25.7deg)ある.

数に差を作ることで,回転方向の指定が可能になります.差がなければ,回転方向の指定ができない.

例えば,

A=Float
B=HIGH
C=GND

5.png
この状態の時,次の二つの状態どちらの指定かで回転方向が決定します.

A=GND
B=HIGH
C=Float

7.png

A=HIGH
B=Float
C=GND

8.png

磁石と,コイルの数にずれがあるため,回転方向の指定ができるのです.

こんな感じで考えると,A,B,Cへの$HIGH,GND,Float$の流れは

9.png

一つずつ,ずらすような形にすればOKです.
ただし,HIGH,GNDのチェックはした方がよさそうです.A,B,Cのどれか一つでも,HIGH,LOWが逆になっていた場合回りません.

#駆動回路
A,B,Cに接続する回路は次のように,Hブリッジ回路の半分です.ハーフブリッジ回路とかともいうっぽいです(https://techweb.rohm.co.jp/motor/knowledge/basics/basics-03/397).

10.png
この回路をA,B,Cそれぞれにつけるので
11.png
6個スイッチ(FET)が必要になります.

###参考:Hブリッジ回路
DCモーターの駆動によく使われます.
12.png

こんな形をしています,

13.png

14.png

こんな感じで,正転逆転の指定が可能になります.

#L298N回路
L298Nのデータシートより
https://akizukidenshi.com/download/ds/st/l298n.pdf
回路図
https://www.it-denshi.com/product/215

l298.png

2つHブリッジ回路が入っています.
l298_float.png

l298_GND.png
l298_HIGH.png

Hブリッジ回路一つを使えば,ブラシレスモータのための$HIGH,GND,Float$の指定が可能になります.
制御信号がつながっているため,L298Nは2つ必要になります.

各Hブリッジ回路は2Aまでなので,そこにも気を付ける必要があります.

#配線 ver.1

非常に雑ですが
IMG_4223.JPG

ブラシレスモータの3線はL298Nの出力2つのうち一つにつけています.
今回はFloat状態が必要なため,Enableへの接続も必要になってます.3本(IN1,IN2,ENA)×3セット=9本 Arduinoにつないでます.
ただし,このままだと,確実にPWM信号線が足りなくなるので,何らかの工夫が必要でしょう.

youtubeの動画( https://www.youtube.com/watch?v=W9IHEqlGG1s) だと,電流が流れすぎてしまい,電源がカバーできず失敗します.
そのため,"Current chopping"という方式で,電流に合わせてHIGHにしている信号線をGNDにしています.

###結果
2本つないでいるL298Nの方は熱を持ったため動作していることがわかったが,もう一方のL298Nの方は熱を持たず,電流が流れていないように見えた.

テスターでA,B,C相の電圧を見た結果,B相のHIGH,LOWが逆になっているため失敗していた

B相のHIGH,LOWを入れ替えた結果回るようになったが,トルクが小さい.すぐ脱調する.電源的には2A以上流れているにも拘わらずだ.
ESC自体の自作が必要になるのだろうか・・・

おそらく,ブラシレスモーターは2Aとかより高電流でないとトルクが小さいのかもしれない・・・

とりあえず,L298Nでブラシレスモーターを回すのは難しい

いいブラシレスモータードライバを探した方がはやいな
もっといい方法・現状の脱調の原因をだれか教えてください.

正弦波とかにしたらうまくいくのかな・・・

#define A_in1 A1
#define A_in2 A2
#define A_enc A3
#define B_in1 6
#define B_in2 5
#define B_enc 4
#define C_in1 9
#define C_in2 10
#define C_enc 11

void setup() {
  pinMode(A_in1, OUTPUT);
  pinMode(A_in2, OUTPUT);
  pinMode(A_enc, OUTPUT);
  pinMode(B_in1, OUTPUT);
  pinMode(B_in2, OUTPUT);
  pinMode(B_enc, OUTPUT);
  pinMode(C_in1, OUTPUT);
  pinMode(C_in2, OUTPUT);
  pinMode(C_enc, OUTPUT);

  digitalWrite(A_enc, LOW); //全部floatにしておく
  digitalWrite(B_enc, LOW);
  digitalWrite(C_enc, LOW);

  Serial.begin(250000);

  A_phase(0);
  B_phase(0);
  C_phase(0);


  //B_phase(1);

}

void loop() {
  /*
  int time_delay = 3000;
  C_phase(0);
  Serial.println("0");
  delay(time_delay);
  C_phase(1);
  Serial.println("1");
  delay(time_delay);
  C_phase(2);
  Serial.println("2");
  delay(time_delay);
  */

  
    int time_delay=5;
    A_phase(2);
    B_phase(1);
    C_phase(0);
    Serial.println("1");
    delay(time_delay);
    A_phase(0);
    B_phase(1);
    C_phase(2);
    Serial.println("2");
    delay(time_delay);
    A_phase(1);
    B_phase(0);
    C_phase(2);
    Serial.println("3");
    delay(time_delay);
    A_phase(1);
    B_phase(2);
    C_phase(0);
    Serial.println("4");
    delay(time_delay);
    A_phase(0);
    B_phase(2);
    C_phase(1);
    Serial.println("5");
    delay(time_delay);
    A_phase(2);
    B_phase(0);
    C_phase(1);
    Serial.println("6");
    delay(time_delay);
  


}

void A_phase(int phase) { //0:float 1:GND 2:HIGH
  if (phase == 0) { //float
    digitalWrite(A_enc, LOW);
  } else if (phase == 1) {
    digitalWrite(A_enc, LOW);
    digitalWrite(A_in1, LOW);
    digitalWrite(A_in2, HIGH);
    digitalWrite(A_enc, HIGH);
  } else if (phase == 2) {
    digitalWrite(A_enc, LOW);
    digitalWrite(A_in1, HIGH);
    digitalWrite(A_in2, LOW);
    digitalWrite(A_enc, HIGH);
  }
}

void B_phase(int phase) {
  if (phase == 0) { //float
    digitalWrite(B_enc, LOW);
  } else if (phase == 1) {
    digitalWrite(B_enc, LOW);
    digitalWrite(B_in1, LOW);
    digitalWrite(B_in2, HIGH);
    digitalWrite(B_enc, HIGH);
  } else if (phase == 2) {
    digitalWrite(B_enc, LOW);
    digitalWrite(B_in1, HIGH);
    digitalWrite(B_in2, LOW);
    digitalWrite(B_enc, HIGH);
  }
}

void C_phase(int phase) {
  if (phase == 0) { //float
    digitalWrite(C_enc, LOW);
  } else if (phase == 1) {
    digitalWrite(C_enc, LOW);
    digitalWrite(C_in1, LOW);
    digitalWrite(C_in2, HIGH);
    digitalWrite(C_enc, HIGH);
  } else if (phase == 2) {
    digitalWrite(C_enc, LOW);
    digitalWrite(C_in1, HIGH);
    digitalWrite(C_in2, LOW);
    digitalWrite(C_enc, HIGH);
  }
}
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?