■ホビーロボット部品の製造・販売 
  モータコントローラ、センサ、音声、画像、無線モジュールなど、
■ホビーロボット制作記事のページ (各種マイコン、PCとの接続事例)
■特殊メイク、特殊材料の販売 ※特殊メイクのコーナーはこちらに移りました。
Top(お知らせ) 製品紹介 使い方とサンプルプログラム 通信販売 リンク ロボット掲示板 会社案内
 Easy Robotics for all enthusiastic people!!!  ---HOBBY ROBOT PARTS SHOP ASAKUSAGIKEN---   Since 2003...

A33F ステッピングモータの駆動
はじめに

 
ここではステッピングモータの駆動について説明します。
 

 ※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。

 ※以下の情報は2007年12月現在のものです。ご注意ください。


 ※このページではC言語の基本的な部分を理解している方向けに書いてあります。また、何回かMPLABの操作を行った方を対象にしています。それ以外の方はまず基本編を読んで下さい。



ステッピングモータ

 すでにDCモータについては説明しました。DCモータは電源を入れると回転するものですが、ステッピングモータは4〜6本の線が出ていて、あるパルスパターンを加えると一定の角度動いて”止まりつづける”、というものです。ということで、DCモータの仕様には回転中のトルクが表記されますが、ステッピングモータは停止時のトルクが表記されます。トルクについては浅草ギ研のサーボののページを参照してください。

 これは浅草ギ研で販売しているAA−STM15ステッピングモータです。線は4本出ています。大きさはマブチの130モータぐらいです。
  
 一回のパルスパターン変化で回転する角度、はステッピングモータによって違います。AA-STM15の場合は一回で18度回転します。つまり、20回のパターン変化で1周回転することになります。

 ステッピングモータからは4本の制御線が出ています。これに下のようなパターンを加えると、一定の角度、これをステップと呼びますが、1ステップづつ回転します。パターン変化を止めると、その位置で停止し、保持します。例えば、下の図でステップ1−>2−>3の3で止めたら、その位置を保持しつづけます。
 保持しつづけますが、減速ギアなどは内蔵されていないのでRCサーボよりも保持力は低いので注意して下さい。
 
 この図は概念を簡単に書いたものです。実際には図右のように極が4つということはありませんので、もっと細かい単位で回転します。図を見れば大体の原理はわかると思います。マイクロステップは、4つある線の出力を変えて、本来の角度よりも細かい角度で回転させる手法です。但し、マイクロステップ動作ができないステッピングモータもありますので注意して下さい。ちなみに、浅草ギ研で販売しているAA-STM15は上の図の2相励起(れいき)でしか駆動できません。

 RCサーボなどはサーボの中に位置センサがあって、その情報をフィードバック(サーボの中だけの話)しつつ位置を制御しますが、このような駆動方式を「クローズドループ(閉ループ)制御」と言います。ステッピングモータは、指示を出したら出しっぱなしで勝手に動くのですがこのような駆動方式を「オープンループ(開ループ)制御」と言います。ステッピングモータはそれだけで構成するとフィードバックがないのでオープンループ制御ということになります。
 クローズドループは回路が複雑で高価になりますが、常に位置を測定しているので停止位置は常に正しくなります。オープンループはセンサが無い分、簡単で安価になりますが、常に位置を測定しているのではないので、もしかすると意図した位置にとまっていないかもしれません。
 ステッピングモータが止まろうとする力を「静止トルク」で表します。動作中に静止トルク以上の力が外部から加わったり、また、ステップの移行が速過ぎて意図した位置に止まらないことを「脱調(だっちょう)」といいます。


バイポーラ型とユニポーラ型

 ステッピングモータには、コイルの電気的な構造によって「バイポーラ型」と「ユニポーラ型」に分けられます。

 DCモータの構造は、コイルに電流を流し、モータ内の磁石との相反作用で回転します(本当はその他に磁石やブラシ、ステータなどがありますが電気的な説明のみ。)。それを図で表すと次のようになります。
 DCモータ
 モータにつながった端子の電流の向きは、正流になったり逆流になります。電流が正負になるのでHブリッジ回路が必要です。

 ステッピングモータはこのコイルの部分が2つあるような構造になっています。尚、ここではあくまでも電気的な話だけですので、実際の回転する機構は違いますので概念的な部分だけ考えてください。バイポーラとユニポーラを次のような構造になります。
 ステッピングモータ

 バイポーラ型の場合は、モータ側の構造が簡単で、端子数も少ないので結線が楽ですが、1つの端子の極性を制御しないといけないので、駆動回路の方が複雑になります。

 ユニポーラ型の場合は逆に、モータ側の構造が複雑ですが、駆動する端子はONかOFFだけの制御で良いので駆動回路が簡単です。上の図ではユニポーラは6本線になっていますが、それぞれの−線(GND)がモータ内でつながっており外には1本しか出ていないタイプもあります。ということでステッピングモータから線が4本出ていたらバイポーラ、5か6本だったらユニポーラになります。

 と、言うのは一般的な話で、ロボットに使う場合を考えると、結線数の少ないバイポーラ型の方が向いていると私は考えています。駆動回路に関しては、モータドライバICを使えば2極制御は簡単に実現できます。A33FのオプションボードであるA33F-EX1にも2極制御可能なモータドライバICが付いています。1極制御も、マイコンなどでコイルを直接駆動はできないので、どのみちアンプ回路などが必要になってきますので回路規模はバイポーラでもユニポーラでも変わらないと思います。


A33Fとステッピングモータの接続

 ステッピングモータはバイポーラでもユニポーラでも A相 A-相 B相 B-相 の4つの端子が出ています。

 A33F-EXのモータドライバポートは次のようになっています。
 
 dsPIC33FのOC端子はモータドライバICを経由してこのポートにつながっています。それぞれの端子をONで+に、OFFで−になると考えてください。詳しくはDCモータ制御のページに書いてあります。なお、OC端子はPWMを生成するもので、汎用IOとしてはポートDになります。
 各端子の間の端子はGNDですので、ユニポーラの場合はGND(COMMと表示している場合もある)を真ん中のどこかにつないでください。GND同士はつながっていますのでどこにつないでも同じです。


 接続は次のようにします。

左のポート 右のポート
A相 OC5(RD4) OC1(RD0)
A-相 OC6(RD5) OC2(RD1)
B相 OC7(RD6) OC3(RD2)
B-相 OC8(RD7) OC4(RD3)

 どれがA相なのか、はステッピングモータを買ったところで聞けばわかります。

 ちなみに、AA−STM15は線が色別になっており、次のようになっています。
 


<同時にRCサーボを動かす場合の注意>

 RCサーボを動かす場合もオプションボードのA33F-EX又はA33F-EX2を使うことになりますが、A33F-EXの方はいくつかの端子がDCモータ駆動(又はステッピングモータ駆動)端子と共通になっています。以下の端子はDCモータ駆動時にはRCサーボ駆動には使えませんので注意して下さい。

基板上の表示 DCモータ端子と共通
D4 OC5(RD4)
D5 OC6(RD5)
D6 OC7(RD6)
D7 OC8(RD7)

 


AA-STM15を動かしてみる


 実際のステッピングモータの駆動は、単純につないだ端子をHIGH/LOWするだけなのでプログラム的には非常に簡単だと思います。

 接続は次のようになります。AA-STM15は5V動作なので、モータ用電源には5Vをつないでいます。
 



 プログラムは次のようになります。(右クリックで対象を保存)

 Stepper.c

 まず、相と端子の関係がわかりづらいので簡単な名称に定義しなおします。
 

 IOはRD0-3を出力なので、方向レジスタのTRISDの下4ビットを0にしてます。尚、方向レジスタは初期値が1で入力設定ですので注意して下さい。出力に設定するには設定を明記しないと出力になりません。
 

 ステッピングモータのドライブは単純に2相励起のパターンでON/OFFさせています。
 

 Nop(); ですが、これは1クロック間なにもしないという命令です。実は、始めはこれを入れないで連続してPORTDの出力を1ビットづつ操作するプログラムを書いていたのですが、特殊レジスタを設定する場合に連続した1ビットづつを1行づつのプログラムで書くときちんと値が反映されない場合がありました。よって、Nop();を入れています。
 ちなみに当初はこんな感じでした。
 
 実行するとA-相とB-相は問題なくパターンが生成されるのですがA相とB相が出力しません。壊れたかと個一時間チェックしましたが問題がありませんでした。以前、あるレジスタに1ビットづつ値を連続で変えたら問題が起きたことを思い出し、各操作の間にNop();を入れたら問題なく動いたという次第です。

 これはMPLABかC30のどちらかの問題だと思いますが、以前から起きていることなので改良するのは難しいのでしょう。ということで、このプログラムは良くない例として、特殊レジスタに値を設定するなら一度に行った方がよいです。上はわかりやすいかと思って名前を1ビットづつつけたのが敗因でした。

//Step1
PORTD = 0x05;
//Step2
PORTD = 0x03;
//Step3
PORTD = 0x06;
//Step4
PORTD = 0x0C;

のように書いても同じです。


 STM15は1ステップ18度なので、50mS間隔でステップを変化させると1秒で一周します。



2007年12月5日

 
(C)Copylight 2003. 有限会社浅草ギ研 | 通信販売の法規(訪問販売法第8条)に基づく通信販売業者の表示