なんか諸事忙殺されたり体調悪かったりして間空いたんですが、ステッピングモータを回すシリーズ、さらに続きます (^_^;)
前回は、ステッピングモータをユニポーラ駆動で回してみました。ステッピングモータはジャンク箱にあったミネベアミツミの PM42L-048 と思われる代物です。
今回はこいつをバイポーラ駆動してみましょう。
えーと、ユニポーラとかバイポーラとか、はい、すみません、ググって下さい m(_ _;)m
バイポーラ駆動回路
全体の回路図です。
上部は 2 組の H ブリッジ駆動回路です。下部は、左から電源回路、Arduino 、H ブリッジ制御回路となっています。
電源回路と Arduino 回りは説明するまでもないですね。
以下、H ブリッジ駆動回路とその制御回路について、毎度の備忘録的解説です。
H ブリッジ駆動回路
H ブリッジ駆動回路は、同じものが 2 組あります。下図は A 側コイルの駆動回路の部分です。モータの右は B 側コイルの駆動部ですが、まったく同じ回路です。
H ブリッジ駆動回路のローサイドは Nch-MOSFET 2SK4017 (60V 5A) を使っています。ユニポーラ駆動回路で使ったものと同じ、普通のスイッチング回路です。
2SK4017 は 4V 駆動なので、Arduino の出力で駆動可能です。
ハイサイドは Pch-MOSFET 2SJ681 (60V 5A) です。
これを駆動する場合、ゲート電圧が 12V で OFF 、8V 以下で ON となりますから、ゲート駆動回路が必要になります。それが 2SC1815 (Q12) と 2SA1015 (Q13) のプッシュプル回路になっています。
前段の 2SC1815 (Q11) は、制御回路の 5V をモータ駆動回路の 12V に昇圧するための回路です。また、HIGH – LOW を反転させる NOT 回路も兼ねています。
プッシュプル回路をなくして、Q11 から直接ゲートを駆動するという方法もアリです。が、その場合は、コレクタの抵抗を小さくしないとゲートを十分に駆動できませんし、Q11 に無駄な電流を流すことになりますので、おススメではないです。
これで、入力 A1 と A4 を HIGH (5V) にすると、コイルの A_1 から A_3 へ電流が流れます。A2 と A3 を HIGH にすると、A_3 から A_1 へと逆方向の電流が流れることになります。
H ブリッジ制御回路
この部分は、まぁ、なくてもよいですが。
この制御回路を作った理由は 2 つあります。
1 つは、H ブリッジ駆動回路のインターロックをとるため。
H ブリッジ駆動回路では A1 と A3 とを、または A2 と A4 とを同時に HIGH にしてはいけません。電源が GND へショートしてしまいます。
そこで、こうした入力を禁止するためのインターロックを設けておきたいと考えました。
2 つ目は Arduino の出力ピン数を減らし、プログラムを簡素化するため。
H ブリッジ駆動回路の入力は 8 あります。ステッピングモータの励磁シーケンスに応じて、それぞれを制御するのは、けっこう面倒です。
この制御回路を設けることで、あたかもモータドライバ IC を使ったような制御ができ、プログラムが簡素化できます。
お上手な諸兄はチャチャッとプログラム書いて下されば OK です。
ただね、後で書きますが、こうすることでユニポーラ駆動で使ったスケッチがそのまま利用できるという特典があるんですよ (^_^;)
H ブリッジ制御ロジック
H ブリッジ制御回路では、NAND ゲート IC 74HC00 と、シュミットインバータ IC 74VHCT14A を利用しています。
74HC00 は汎用品です。74VHCT14A は部品箱にあったジャンク品です。シュミットである必要はないでしょうから、適当なインバータなり NAND ゲートなりを利用して下さい。ただし、ローサイドの MOSFET を駆動していますので、出力電流 (20mA 以上) と HIGH レベル電圧 (4V 以上) は要チェックです。
さて、ここは回路図見ててもチンプンカンプンですよね (^_^;)
制御回路は左図のように、A 側と B 側の 2 つの同じロジック回路で構成されています。
A 側の真理値表を下に示します。B 側も同様です。
FA_IN | RA_IN | A1 | A2 | A3 | A4 |
0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 0 | 0 | 0 |
FA_IN が HIGH になると A1 と A4 とが HIGH (正転) に、RA_IN が HIGH になると A2 と A3 とが HIGH (逆転) になるという、それだけです。出力にその他の組み合わせはなく、インターロックされます。
これをロジック回路にしたものが上の回路。駆動回路の 8 の入力に対してインバータを 1 つずつ割り当てています。インバータがシュミットである理由は、ないです。部品箱にあったものを使っただけです。
バイポーラ駆動のスケッチ
さて、回路ができましたので、スケッチを書きましょう。
が、じつは、前回ユニポーラ駆動で使ったスケッチがそのまま利用できちゃいます。
Arduino からの制御出力が 4 つで、それぞれをステッピングモータの励磁シーケンスにしたがって順番にオンオフするという仕組みは、ユニポーラもバイポーラも変わらないんです。
今回のバイポーラ励磁シーケンスは 2 相励磁とします。励磁シーケンスは下表のとおりです。
FA_IN | RA_IN | FB_IN | RB_IN | |
1 | 1 | 0 | 0 | 1 |
2 | 1 | 0 | 1 | 0 |
3 | 0 | 1 | 1 | 0 |
4 | 0 | 1 | 0 | 1 |
よくみると、励磁シーケンスもユニポーラ駆動と同じです。だから 1 相励磁も同じです。ただし、1-2 相励磁はうまくいきません。シーケンスを変更してやればいけるのかもしれませんが、面倒くさかったので試してません (;´Д`)
- #define SWITCH_ON LOW
- #define SWITCH_OFF HIGH
- const byte FA_IN = 8;
- const byte RA_IN = 9;
- const byte FB_IN = 10;
- const byte RB_IN = 11;
- const byte forwardSwitchPin = 15;
- const byte reverseSwitchPin = 16;
- byte sequence[] = {B1001, B1010, B0110, B0101};
- byte numberOfPhase = sizeof(sequence) / sizeof(sequence[0]);
- void setup() {
- pinMode(FA_IN, OUTPUT);
- pinMode(RA_IN, OUTPUT);
- pinMode(FB_IN, OUTPUT);
- pinMode(RB_IN, OUTPUT);
- }
- void loop() {
- static bool forward = false;
- static bool reverse = false;
- static int phase = 0;
- static unsigned long period = 50;
- static unsigned long previousTime = millis();
- if((SWITCH_ON == digitalRead(forwardSwitchPin)) && !reverse) {
- forward = true;
- } else if((SWITCH_ON == digitalRead(reverseSwitchPin)) && !forward) {
- reverse = true;
- } else {
- forward = false;
- reverse = false;
- }
- if(forward && !reverse) {
- if(period < millis() - previousTime) {
- previousTime = millis();
- phase++;
- if((numberOfPhase - 1) < phase) phase = 0;
- }
- digitalWrite(FA_IN, sequence[phase]>>3&1 ? HIGH : LOW);
- digitalWrite(RA_IN, sequence[phase]>>2&1 ? HIGH : LOW);
- digitalWrite(FB_IN, sequence[phase]>>1&1 ? HIGH : LOW);
- digitalWrite(RB_IN, sequence[phase]>>0&1 ? HIGH : LOW);
- } else if(!forward && reverse) {
- if(period < millis() - previousTime) {
- previousTime = millis();
- phase--;
- if(0 > phase) phase = numberOfPhase - 1;
- }
- digitalWrite(FA_IN, sequence[phase]>>3&1 ? HIGH : LOW);
- digitalWrite(RA_IN, sequence[phase]>>2&1 ? HIGH : LOW);
- digitalWrite(FB_IN, sequence[phase]>>1&1 ? HIGH : LOW);
- digitalWrite(RB_IN, sequence[phase]>>0&1 ? HIGH : LOW);
- } else {
- digitalWrite(FA_IN, LOW);
- digitalWrite(RA_IN, LOW);
- digitalWrite(FB_IN, LOW);
- digitalWrite(RB_IN, LOW);
- }
- }
出力ピンに対応する変数名だけは、脳内変換では混乱しますので、変更しています。それ以外はユニポーラ駆動で使ったスケッチとまったく同じです。
前回同様、11 行目が励磁方式の指定です。励磁シーケンス表にしたがってデータを入力すれば、そのとおりに励磁出力されます。
ブレッドボード
ブレッドボードです。
上段は H ブリッジ駆動回路。左側が A 側コイル、右側が B 側コイルの回路です。
下段左側の DIP IC と変換基板に載った SSOP IC が、それぞれ 74HC00 が 1 個と 74VHCT14A が 2 個です。この部分が H ブリッジ制御回路になります。
下段中央は 5V 電源のレギュレータ。12V 電源は AC アダプタです。
右のタクトスイッチが、正転用と逆転用の押しボタン。
一番下は Arduino UNO 、左端に見えるのがステッピングモータです。
謎の電流値
今回は、ステッピングモータをバイポーラ駆動で回してみました。思ったよりも簡単でしたね。これで、駆動回路をモータドライバに置き換えれば、回路はすっきり、小型化もできると思います。
さて、このジャンク箱にあったステッピングモータに付けられていたメモを改めて見たのですが、「0.9A」という電流値が書かれていました。規格の電源電圧は 24V です。コイルの抵抗の実測値は 12Ω ですから、電流値は 2A になるはず。
これまで気にもしてなかった、0.9A って何?
で、ふと気が付いた。これって、モータに 0.9A 流しなさい、ということじゃぁないかと。
これまで試してみたのは、ユニポーラもバイポーラも「定電圧駆動」です。モータに流れる電流値は、電源電圧によって変化します。電源電圧 12V で実験してましたので、電流値は 1A 。いい線いってたんじゃね?
電流値を 0.9A にするということは「定電流駆動」ってこと。メーカーの規格には「バイポーラチョッパー駆動」と書かれています。チョッパーとはつまり、そーゆーことです。
では、次回はこの回路を拡張して「バイポーラチョッパー駆動」をやってみましょう。ん〜、できるかなぁ (^_^;)