ステッピングモータードライバ(L6470)を動かしてみます
〔マイコンのトップに戻る〕
今回の実験は、2相バイポーラステッピングモータ制御 ICのL6470を動作させて見たいと思います。
前にユニポーラタイプのステッピングモータは、こちらの(PIC編/Arduino編)ページで回して見ましたね。
尚、2相ステッピングモータユニポーラ駆動用IC SLA7078MPRT の記事はこちらを参照下さい。
DCモータの基本動作
通常のモータを正転/逆転させる場合は、
電池の+/-を入れ替えれば回転方向が
変わりますが、スイッチで行う場合は、
左の様な回路が必要になります。
左の様に、スイッチの1と4をONさせ、スイッチ
の2と3をOFFにするとモータの緑線側か
ら黄線側に電気が流れ正回転します。
今度はスイッチの2と3をON、スイッチの1と4をOFFにするとSW2からモータに流れSW3を通り電池に
戻り逆回転します。
ですので、モータを正転逆転させるのにはスイッチ(FET)が4個要る事になり、この回路をHブリッジ回路
と言います。
バイポーラとユニポーラの比較
|
バイポーラタイプ |
ユニポーラタイプ |
シ │ ケ ン ス |
 |
 |
配 線 図 |

1つの巻線に対し双方向に電流を流す方式で
両端2本結線のモータです。 |

1つの巻線に対し常に一定方向に電流を流す
方式でセンタタップを設けた3本結線のモータ
です。 |
駆 動 回 路 |
上記の"DCモータの動作基本"と同じ回路構成
なので、1相当たりFETが4個で2相なので8個の
ドライバ回路と複雑になります。 |

1相当たりFETが2個で2相なので4個のドライバ
回路でシンプルな回路構成となります。 |
ト ル ク |
巻線の利用効率がよく、低速回転時の
出力トルクは高くなります。 |
巻き線が半分になるので、巻線の利用効率が
悪く低速回転時の出力トルクが低くなります。 |
注意)モータの接続線の色はステッピングモータにより異なります。
[ステッピングモータ励磁方式]
2相ステッピングモータは、巻線への電流の与え方を変える事により特性を変える事が出来ます、
下記の4つの方式が有ります。
・1相励磁
常に巻線一相のみに電流を流す方式、角度精度がよく、消費電流が小さいですが、
減衰運動が残りやすく脱調などの同期外れを起こしやすくなります。
・2相励磁(フルステップ動作)
二相の巻線に電流を流す方式、一相励磁の約2倍の出力トルクが得られますが消費電流も
2倍です。また、減衰運動は小さく、広い範囲のパルス幅(速度)に応答します。
・1-2相励磁(ハーフステップ動作)
一相と二相を交互に切り替えて電流を流す方式、一相励磁と二相励磁の場合のステップ角度の
半分にする事が出来るので、滑らかな回転が得られます。
・マイクロステップ駆動
巻線への電流を上記励磁方式の様に単純なON/OFFではなく、二つの巻線の電流比率を細かく
変えて行く事で、より細かいステップ角度が得られるので更に滑らかですが、トルクは小さいです。
オリエンタルモーターHPのこことここのページを参考にして下さい。
こんな感じでぇ、バイポーラステッピングモータは回路やシーケンスがめんどいので、ドライバIC(L6470)
を使いバイポーラステッピングモータを回して見る事にします。
L6470について
[特徴]
・1相をフルステップ、ハーフステップ、1/4 1/8 1/16 1/32 1/64 1/128 マイクロステップで動作可能。
・SPIインタフェイスで2相バイポーラステッピングモータの正・逆転、加・減速、ブレーキ、速度制御、
位置制御が出来ます。
・センサーレスモーターストール検出機能と過電流、過熱、低電圧の保護機能内蔵です。
・モータ動作電源電圧:8V〜45V(マイコンとのインタフェイスは内部の3Vを使用、
又は外部から3.3/5V)
・出力電流:3.0A(ピーク出力電流が大きい7A)。
・内蔵パワーMOSFETのオン抵抗が低い。
・高性能DSP内蔵でモータの細かな制御が可能です。
・モータの電源電圧の変動をキャンセルする機能の為のA/Dコンバータを内蔵しています。
SPIインタフェイスのコマンドで、一定速度コマンド、移動コマンド、絶対位置指定コマンド、
ストップコマンドに、外部信号によるステップクロックモード等が有りますが、
ここでは、、一定速度コマンド、移動コマンド、ストップコマンドのみ対応します。
又、L6470は機能が盛り沢山なのでレジスタや設定が沢山あります、ここではあまり詳しくは書きません
のでデータシートを参照下さい。
L6470のデータシートはこちら(STマイクロエレクトロニクス)からダウンロードして下さい。
又、こちらにデータシートの一部を翻訳したHPが有ります。(第6〜9章)
尚、レジスターとコマンドをGoogleで日本語翻訳した物(L6470MANUAL.pdf)を付けて置きます。
[秋月電子のドライバモジュール]
L6470はかなり熱を持つICらしく、モジュールの基板に熱対策された高熱伝導性基板(ECOOL)を
使っています。
ICのピンは全て(28P)モジュール基板に引き出されていて自由度が有るのですがぁ...
周辺部品が必要で、モジュール外部で回路を構成しないとダメです。
[ストロベリーリナックスのドライバモジュール]
こちらは周辺回路もモジュール内部に配線済みで、必要なピンのみ引き出されていてお手軽に
利用可能ですが、お値段が少し高いです。
それと、基板は熱対策基板でないのでICは熱を持ちます、たぶん。
ここでは、秋月電子のドライバモジュールでの実験記事です。
PS. こちらに秋月電子でも周辺回路内蔵モジュールが有りました。
《 配線図 》
左図は、18F26K22のピン構成です。
今回のPIC側の電源は5.0Vとします。
モータ側の電源8.0V-45V(今回12V)です。
L6470はSPI(MSSP1)で接続し、SS(CS)はPICのRC2ピン
(13番)を使う事にします。
RB5(SW)とRB4(BUSY)はプルアップ抵抗が必要ですが、
PIC内蔵を利用します。
アラームの回路を追記 *1)
L6470の"FLAG"24番ピンからPICの"RB0"ピンへ配線し、INT0の立下り割込み機能を使います。
PICの"RC0"ピンにLEDを制限抵抗100Ωを介して配線し、アラーム発生時の表示に使います。
アラームの発生を知りたい場合は、下記の回路に追加しましょう。
尚、ここで使用したステッピングモータはSM-42BYG011です。

L6470の周辺回路について
CP/VBOOTピン
チャージポンプを動作させる為のコンデンサーとダイオードを取り付ける必要が有ります。
D1はショットキーバリアダイオードを使いましたが、手持ちでこちら(1A)を使いました。
秋月のこちらの回路を参照すると”BAV99(高速スイッチングタイプ)”が使われています。
周辺回路を構成する場合の参考にすると良いでしょう。
VREGピン
L6470の内蔵電圧レギュレータから3.0Vが出力されます、外の回路に供給出来ますが、
最大40mAまでです。又、この場合は47uFコンデンサーでGNDに落とします。
5.0V外部電源を使う場合は、このピンには接続出来ませんが、3.3Vを使用する場合にこのピンに接続
すれば内蔵電圧レギュレータがOFFになり、消費電力が抑えられるらしい。
(今回は無接続です)
OSCIN/OSCOUTピン
内蔵発信器の16MHzで、OSCOUTからクロックが出力可能ですが、外部発信器(8/16/24/ 32MHz)が
取付け出来ます。(今回は、内蔵発信器使用でOSCOUTの出力は無しで設定)
ADCINピン
モータ電源電圧補償を有効にする場合は、モータ側電源を分圧により約1.5V(VREG/2)をこのピン
から入力します。
尚、モータ電源電圧補償の有無はEN_VSCOMPビットで行う。無効の場合は、このピンに入力された
電圧をADC_OUTレジスタから読み出す事が出来ます。(今回は”無効”設定として、無接続)
SWピン
SW_MODE=1であれば、SWピン接続のスイッチを押せばモータを手動で停止させる、
ハード停止モード。(今回は、SW_MODE=1で設定だが、VDDに接続し無使用です)
SW_MODE=0であれば、絶対位置移動モード時のホームポジションを設定する為のスイッチ動作を
GoUntil/ReleaseSWコマンドで行うモード。
SWピンは内部でプルアップされているのでLOW(立下り)でONとなる。
BUSY/SYNCピン
SYNC_EN=1であれば、BUSY/SYNC出力はSYNC_SELパラメータに従って信号を提供します。
SYNC_EN=0であれば、コマンド実行時に強制的にローにされます。
(今回は、SYNC_EN=0に設定しコマンドの実行状態を見ています)
FLAGピン
アラームの発生を通知します、プルアップ接続します。
発生したアラームを知るには、STATUSレジスタを読みます。
マイコンの割り込みピンで受ければ良いでしょう。
PS. アラームの記事を追記しました。 *1)
STBY/RSTピン
LOWでスタンバイ&リセットが掛かるので通常はVDD接続、リセットする場合は10us以上はLOW
にする事。
STCKピン
このピンに入力されたステップ信号(パルス)でモータを回転させるステップクロックモードです、
このモードを利用する場合は、StepClock コマンドを発行しないとダメです。
(今回は、無接続/未実験です)
L6470ピンの概要

※ 〇印は要配線で、△は無配線でも可能。
《 サンプルプログラム 》
今回のPIC18F26K22のCPUクロックは64MHzで動作させています。
↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
L6470.zip ステップモード設定関数とアラーム回路に"v2.00"XC8対応 *1)
プログラムソースをダウンロードしたら、MPLAB X(v2.15/v5.30)にてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルとPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 1.32/2.00コンパイラを使用しています。
ダウンロードファイルを解凍すると下記の様なファイル構成です。
motor41.c・・・・・・・本体のサンプルソースプログラム(RUNコマンド) *1)
motor42.c・・・・・・・本体のサンプルソースプログラム(MOVEコマンド) *1)
motor43.c・・・・・・・本体のサンプルソースプログラム(アラーム回路) *1)
skL6470.c・・・・・・・L6470ステッピングモータドライバ関数ライブラリソースファイル *1)
skL6470.h・・・・・・・L6470ステッピングモータドライバ関数ライブラリのヘッダファイル *1)
skSPIlib.c・・・・・・・SPI通信を行う関数ソースファイル
skSPIlib.h・・・・・・・SPI通信を行う関数のヘッダファイル
L6470MANUAL.pdf・・・・L6470のレジスタとコマンド概要の翻訳
motor41.c
起動させるとRUNコマンドで回転(フルステップモード)します、速度は750step/sです。
その後にスイッチを押せば回転を停止(HARDSTOP)させるサンプルです。
motor42.c
起動させたらスイッチを押せば、Moveコマンドで1回転(フルステップモード)させるサンプルです。
もし、1/4マイクロステップモードにして起動させたら1/4回転して止まります。
モータは1回転200ステップですが、ステップモードにより1回転当たりのステップ数が異なります。
フルステップモード:200ステップで1回転
ハーフステップモード:400ステップで1回転
1/4マイクロステップモード:800ステップで1回転
1/128マイクロステップモード:25600ステップで1回転
(他に、1/8, 1/16, 1/32, 1/64マイクロステップモードが有ります)
”skL6470.c ”の”L6470_Init ”関数で
step_mode.STEP_SEL = FULL_STEP ; // フルステップに設定
が記述されているので、書き換えるだけです("L6470_SetStep()関数を使いましょう!")。
motor43.c *1)
アラームの発生を受けるサンプルです。
・プログラムのコンパイル(Build)と書き込み(Run)を行います。
・起動し5秒後に、無い操作コマンドをワザと送ります、LEDが点灯するでしょう。
・スイッチを押すと、アラームをクリアしLEDを消灯します、その後正常にRunコマンドを送るので
モータが回転します(回転動作は"motor41.c"と同じです)。
・更にスイッチを押してモータの回転が停止します。
skL6470.c
このライブラリはL6470ステッピングモータドライバにアクセスする為の関数集です。
この関数集では、現状Run/Move/Stopのコマンドのみ対応です、L6470には他に
ステップ・クロック・モードや絶対位置指定コマンドにモータの位置を初期化するコマンド等が有りますが現在未対応です。
L6470にアクセスを行う関数の使い方を説明します。
ans = L6470_Init( )
L6470の初期化を行う処理関数です。
なのでぇ、モータによりここのパラメータを書き換えます。
パラメータの内容は、データシートか送付書類を参考にして下さい。
ans:現在のSTATUS情報を返す(正常時は、"0x7C03"です) *1)
STATUSレジスタ(16ビット)の構造は次のとおりです。
15 14 13 12 11 10 9 8
[SCK_MOD] [STEP_LOSS_B] [STEP_LOSS_A] [OCD] [TH_SD] [TH_WRN] [UVLO] [WRONG_CMD]
7 6 5 4 3 2 1 0
[NOTPERF_CMD] [MOT_STATUS] [DIR] [SW_EVN] [SW_F] [BUSY] [HiZ]
HiZ[0]
HiZが ”1” 場合には、ブリッジ出力がハイインピーダンス状態で有る事を示しています。
BUSY[1]
BUSYピンの状態を反映し、一定速度コマンド、絶対位置指定コマンド、移動コマンドが
実行中の時、ピン出力がLOWになります。
SW_F[2]
SW_FフラグはSWピンの入力状態を報告します。
SW_EVN[3]
SW_EVNフラグはスイッチのターンオンイベント(立下りエッジ)を検出するとHIGHになる。
DIR[4]
現在のモーターの回転方向を示しています。0:逆転 1:正転
MOT_STATUS[6:5]
MOT_STATUSは、現在のモータの状態を示します。
0:停止 1:加速中 2:減速中 3:定速度
NOTPERF_CMD[7]
“1”で有れば、指示したコマンドが実行できない。
WRONG_CMD[8]
“1”で有れば、指示したコマンドは全く存在しない。
UVLO[9]
UVLOフラグは電源投入時及びリセット時に強制的にLOWになります。
モータ電源電圧がVsthoff電圧を下回ると、LOWになります。
TH_WRN[10]
熱警告閾値温度に達すると、閾値以下に温度が低下するまで、又はGetStatusコマンドが
送信されて来るまで、LOWになります。
TH_SD[11]
サーマルシャットダウン閾値に達するとLOWになります。
デバイスはシャットダウン状態になり、ブリッジ出力がOFFになりSTATUSレジスタの
HIZビットがHIGHになる。
OCD[12]
電流が過電流閾値(OCD_TH)を超えた場合にLOWになります。
デバイスはシャットダウン状態になり、ブリッジ出力がOFFになりSTATUSレジスタの
HIZビットがHIGHになる。
STEP_LOSS_A[13]/STEP_LOSS_B[14]
ストール検出閾値(STALL_TH)に達するとLOWになります。
モータ速度と負荷角特性に応じて、L6470は、プログラマブル電流コンパレータを用いて
モータ失速状態(脱調とは違うらしい)の検出を提供しています。
SCK_MOD[15]
STCK入力ピンを介してデバイスが、ステップ・クロックモードで動作していることを示す
ハイアクティブフラグです。
ans = L6470_ALARM( )
アラームの情報を読み込む処理関数です。
FLAGピンがLOWにてアラーム発生です、割り込みで受けましょう。
この関数は、”GetStatus”コマンドを発行しているのでアラームは解除されます。
ans:発生したアラーム情報を返す
0=アラームは発生していない
3=スイッチイベントを検出
7=コマンドが実行できない
8=コマンドが全く存在しない
9=定電圧を検出
10=熱警告を検出
11=サーマルシャットダウンを検出
12=過電流を検出
13=A相ストールを検出
14=B相ストールを検出
※FLAGピンに反映したくないアラームは”ALARM_EN”レジスタでマスクします。
L6470_SetStep(mode) *1)
レジスタにステップモードを書き込む処理関数です。
L6470_Init()でのデフォルト設定は"FULL_STEP"です。
mode:ステップモードを指定します
例)
L6470_SetStep(HALF_STEP) ;
L6470_Move(Forward,200) ;
ans = L6470_GetRegister(regadrs,num)
レジスタのデータを読み込む処理関数です。
レジスタアドレスが”0x19”の場合は、”GetStatus”コマンドを発行し、その他は
”GetParam”コマンドを発行しています。
regadrs:読み取りたいレジスタのアドレスを指定(0x01-0x1B)
num :レジスタの読み取るデータのバイト数(1-3byte)
ans :読み取ったデータをlong値で返す
L6470_Run(dir,speed)
モータを一定速度で回転させる処理関数です。
選択されているステッピングモードにより回転します。
dir :回転させる方向を指示します(0=逆転 1=正転)
speed:回転させる目標速度を指示します
0.015step/sの分解能で0-104166(15625step/s)のステップです。
MAX_SPEEDより低く、MIN_SPEEDより大きくなければなりません。
L6470_Move(dir,step)
モータを指定ステップ数まで回転させる処理関数です。
選択されているステッピングモードによりステップ当りの回転角度は変わります。
例えば、step=200でフルステップなら1回転(360度)です。
dir :回転させる方向を指示します(0=逆転 1=正転)
step:回転させる目標ステップ数を指示します(0-4194303:22bit)
L6470_Stop(mode)
モータを停止させる処理関数です。
Hizはモータを停止させた後、モータの出力をOFF(ハイインピーダンス)にします。
mode:停止モードを指定します
0 = SoftStop 減速しながらモータを停止させます、保持トルク有り。
1 = HardStop 即時にモータを停止させます、保持トルク有り。
2 = SoftHiz 減速しながらモータを停止させます、保持トルク無し。
3 = HardHiz 即時にモータを停止させます、保持トルク無し。
skSPIlib.h
SPI通信を行う関数のヘッダファイルです。
"skSPIlib.c"を利用する場合に
#include "skSPIlib.h" をプログラムの先頭で記述して下さい。
デフォルトではMSSP1を使う様になりますが、PICによってはMSSP2が有ります。
MSSP2側を使う場合は、"#define SPI_MSSP2_USE"を記述して下さい。
skSPIlib.c
このライブラリはSPI通信を行う為の関数集です。
この関数集は、PIC12F1822/PIC16F18xx/193x/PIC18F2xK22で使用出来ます。
SPI通信を行う関数の使い方を説明します。
SPI_Init(mode,divider,sdo)
SPIモードの設定と初期化を行う処理
mode :SPIの転送モードを設定します(クロック極性とクロック位相の組み合わせ)
SPI_MODE1 = クロック極性(0:LOW) クロック位相(0:アイドル0Vで、0V->5Vに変化で転送)
SPI_MODE0 = クロック極性(0:LOW) クロック位相(1:アイドル0Vで、5V->0Vに変化で転送)
SPI_MODE3 = クロック極性(1:HIGH) クロック位相(0:アイドル5Vで、5V->0Vに変化で転送)
SPI_MODE2 = クロック極性(1:HIGH) クロック位相(1:アイドル5Vで、0V->5Vに変化で転送)
divider :SPIの通信速度を設定します
SPI_CLOCK_DIV4 = Fosc/4 (PIC動作周波数の4分の1で動作)
SPI_CLOCK_DIV16 = Fosc/16 (PIC動作周波数の16分の1で動作)
SPI_CLOCK_DIV64 = Fosc/64 (PIC動作周波数の64分の1で動作)
SPI_CLOCK_DIVT2 = TMR2の出力の1/2 (タイマー2の速度で動作)
SPI_CLOCK_DIVADD = FOSC / ((SSPxADD + 1) * 4)
sdo :使用するSDO送信のピン番号を指定する
SPI_setDataMode(mode)
SPIの転送モード設定を行う処理
mode :SPIの転送モードを設定します(上記参照)
SPI_setClockDivider(divider,rate)
SPIの通信速度設定を行う処理
divider :SPIの通信速度を設定します(上記参照)
rate :SSPxADDに設定するクロック分周値(SPI_CLOCK_DIVADDを指定する場合に設定する値)
SPI_CLOCK_DIVADD = FOSC / ((SSPxADD + 1) * 4)
rate=0は指定不可です、”SPI_CLOCK_DIV4”を使いましょう。
ans = SPI_transfer(dt)
SPI通信でのデータ送信とデータ受信を行う処理
dt : 8ビットの送信するデータを指定します
ans: 8ビットの受信したデータを返します
《その他》
左図は、L6470とSM-42BYG011モータを使って
1軸ジンバルの実験を行った時の参考写真です。
実験時の見解を少々
ステッピングモータではジンバル動作に追従
させるには不向きな感じが結果です。
低速ではトルクが有り動作するのですがぁ
速度を上げると脱調したりします。
滑らかに動作させようとマイクロステップ
モードにするとトルク不足で脱調します。
ステッピングモータは2相にフルに電流が
流れている時がトルクが有る様で、1相や
電流制御時はトルク不足が否めません。
(もっとぉ、多相なモータにすると良いかも?)
もっとぉ、高速に回せてトルクが有りそうな
モータ(ブラシレスモータ?)が必要でしょう。
ステップモード設定関数とアラーム回路の追記(*1) 2021/07/24
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2016 Shigehiro Kimura All Rights Reserved.