L6470でステッピングモータを動かす

随時更新中(2017.07.30 )

使ったもの

バイポーラ ステッピングモーター ST-42BYH1004

f:id:tyokota_0529:20170616191039p:plain:w300

バイポーラ ステッピングモーター ST−42BYH1004: パーツ一般 秋月電子通商 電子部品 ネット通販

主な仕様

項目 詳細
ステータ バイポーラタイプ
相数
基本ステップ角 0.9度±5%
1回転ステップ数 400
絶縁抵抗 100MΩ(500VDC
コイル抵抗 5.0±10%Ω/相
入力定格電圧 5V
定格電流 1.0A/相
静止トルク 4.4kgf・cm
重量 0.34kg
注意 軸を回さない。感電する

配線

配線
A(A相) Black
C(_A相) Green
B(B相) Red
D(_B相) Blue

L6470使用 ステッピングモータードライブキット

秋月電子で購入

f:id:tyokota_0529:20170620034854p:plain:w300

L6470使用 ステッピングモータードライブキット: 組立キット 秋月電子通商 電子部品 ネット通販

参考資料

SPI通信

L6470

(L6480の動かし方 [メモ][開発] ステッピングモータードライバL6470とL6480 ヤメ記者SEの徒然なるままに…/ウェブリブログ)

L6470でステッピングモータを動かす

ピンの役割

  • 制御はSPI通信によってマイコンから行われる

    • Master: Arduin UNO R3

    • Slave: L6470 Driver

Adruino側

SPI通信のためのピン

ピン番号 名称 役割
D11 MOSI
(Master Out Slave In)
マスタからスレーブへデータを送るライン
D12 MISO
(Master In Slave Out)
スレーブからマスタへデータを送るライン
D13 SCK
(Serial Clock, Output)
データ転送を同期させるためマスタより生成されるクロック信号
D10 SS
(Slave Serect pin, Output)
デジタル信号を渡すことでスレーブを選択する.
LOWが渡されたスレーブはマスタとの通信をおこなう.
HIGHが渡されたときマスタからのデータを無視する.

L6470側

SPI通信のためのピン

ピン番号 名称 分類
5 SDO (SPI Data Out) Logic output
6 CK (SPI Clock) Logic input
7 SDI (SPI Data In) Logic input
8 #CS (SPI Chip Serect, = Slave Srect) Logic input, 負論理

Arduinoとの接続

  • D11 (MOSI) <-> 7 (SDI)
  • D12 (MISO) <-> 5 (SDO)
  • D13 (SCK) <-> 6 (CK)
  • D10 (SS) <-> 8 (#CS)

その他のピン

  • 必要に応じて機能を足したいときに利用するものが多い
ピン番号 名称 分類 役割
1 #BUSY/SYNC Open Drain Output Busy Frag Mode(SYNC_EN bitがLOW(0)のとき, default)
・デフォルトの状態では,コマンド実行中はLOWになる.
・一定速度コマンド,絶対位置指定コマンド,移動コマンドが実行中の時、ピン出力がLOW
・コマンドが実行されたとき(目標速度、目標座標に到達),このBUSYピンは解放される

Synchronization Signal Mode(SYNC_EN bitがHIGH(1)のとき)
・このモードでのステップクロック信号は、SYNC_SELとSTEP_SELパラメータの組み合わせに応じて出力される
2 FRAG
(Status Frag)
Open Drain Output アラーム発生時にFRAGピンをGNDに接続する
(内部のオープンドレイントランジスタによる)
3 GND (Ground)
4 EXT-VDD
(External-VDD)
Power ロジック出力ピンの電圧範囲を設定.
VDDpinは内部でVregまたは3.3V電源に接続されていない
9 STCK
(Step-clock Input)
Logic Input Step-clock mode時に入力された信号によって
モータの動きが定義される
10 #STBY/#RST
(Stepby and Reset)
Logic Input LOW logic levelでlogicをリセット,デバイスをスタンバイモードに.使わない場合はVDDにつなげておく

ロジック電源の設定

  • L6470はモータを動かす電源の他に,MCUを動かすロジック電源が必要である

  • ジャンパピンの挿入によって,MCU(Micro Control Unit)の電源電圧の供給方法を設定する

    • MCU3.3~5Vの間で動作する
  • この電圧は,L6470から出力され,マイコンへ入力されるデジタル信号の信号電圧にもなる

  • L6470は内部のレギュレータによって,モータ電源から3Vの電圧をMCUに回すこともできる

    • しかし,Arduino5V駆動であるため,3Vで駆動させることは好ましくない

    • Arduinoの5VピンからEXT-VDDピンに電圧を供給してMCUを駆動させる


f:id:tyokota_0529:20170620112724p:plain:w500

SPIの設定

  • L6470を使う際には,初めにコマンドを送るためのSPI通信の設定を行う

    • SPI.begin()

    • SPI.setBitOrder( MSBFIRST )

    • SPI.setDataMode( SPI_MODE3 )

  • それに加え,L6470ではシフトするコマンドを8ビットごとに区切る必要がある

Bit Order

  • SPI.transfer()で送信する1バイト分の情報を,左端(最上位)と右端(最下位)のどちらから送信するかを決める

MSB (Most Significant Bit)とLSB (Most Significant Bit)

  • 2進数で表された情報において,

    • MSB: Most Significant Bit First = 最上位ビット

    • LSB: Least Significant Bit First = 最下位ビット

  • を指す(ここでは8bit=1byte)

7 6 5 4 3 2 1 0
MSB LSB

SPI.setBitOrder()の命令

  • SPI.setBitOrder( MSBFIRST )

    • 最上位ビット(MSB)から順にデータを送信する

    • 7→6→5→4→3→2→1→0

  • SPI.setBitOrder( LSBFIRST )

    • 最下位ビット(LSB)から順にデータを送信する

    • 0→1→2→3→4→5→6→7

Data Mode

  • クロック位相(clock phase)とクロック極性(clock polarity)という2つの要素を決定

    • クロック位相:シフトされたデータを読み取るタイミング

      • クロック信号の 立ち下がりエッジ or 立ち上がりエッジ
    • クロック極性:アイドリング(待機)状態を示すクロック信号の状態

      • HIGH状態 or LOW状態

SPI.setDataMode()の命令

  • SPI.getDataMode( SPI_MODE3 )

    • クロック信号の立ち上がりで送信(シフト)されたデータの読み取りを行う

    • また,クロック信号がHIGHの間をアイドリング状態とする

その他のSPI_MODE
立ち下がりエッジで読み取り 立ち上がりエッジで読み取り
LOW状態でアイドリング SPI_MODE0 SPI_MODE1
HIGH状態でアイドリング SPI_MODE2 SPI_MODE3

SPIの設定まとめ

f:id:tyokota_0529:20170622050557p:plain:w900

内部レジスタ

  • L6470には,モータの制御に関するパラメータが設定できる内部レジスタ(記憶回路)が多く存在する

    • レジスタは可変長,22ビットや4ビット等がある.各レジスタの内部アドレスは0x01~0x19まで

    • レジスタのパラメータには初期設定(デフォルト値)が決まっており,電源投入直後にはデフォルト値が設定される

    • 大体はデフォルトの値で動作する.変更が必要な場合もあり

  • レジスタの値を設定した後に,コマンド(回転・ストップ等)を送ってモータを制御する


f:id:tyokota_0529:20170623040712p:plain

コマンドの送り方

  • MSBファーストで8ビットずつ

  • 8ビットごとに,CSのHIGH->LOWを行う必要がある

SPI.begin()
SPI.setBitOrder( MSBFIRST )
SPI.setDataMode( SPI_MODE3 )

void L6470_send( unsigned char add_or_val ){
        while( !digitalRead(PIN_BUSY) ){ // BUSY(LOW状態)が解除されるまで待機する
        }
        digitalWrite( PIN_SPI_SS, LOW);
        SPI.transfer( add_or_val ); //1バイト(8ビット)のデータを送信
        digitalWrite( PIN_SPI_SS, HIGH);
}

SetParam()によるレジスタの値の設定

Run()による定速回転

コマンド:Run( DIR, Spd )

  • 回転方向DIR(Direction)と,目標速度Spd(Speed)を指定してステッピングモータを定速回転させる

  • 32ビットの情報を4回に分けて送信する

f:id:tyokota_0529:20170630200712p:plain

初めの8ビット

  • 定速回転のコマンド+回転方向の指定

Command binary code

7 6 5 4 3 2 1 0
0 1 0 1 0 0 0 DIR
16進数
定速正回転の場合(DIR = 1) 定速負回転の場合(DIR = 0)
2進数 01010001 01010000
16進数 0x51 0x50

残りの24ビット

  • 回転速度の指定

    • Speedレジスタ(現在のモータ速度を格納しているレジスタ)内のデータと同じ表現形式

    • 実際にはMAX_SPEEDレジスタの値より小さく,MIN_SPEEDレジスタより大きい値である必要がある

      • これが満たされない場合,MAX(MIN)_SPEEDの値で実行される
    • 目標速度に達するまでBUSY状態

モータ速度の表現

  • Speed,MAX_SPEED,MIN_SPEEDレジスタでほぼ同じ表現が用いられる

  • レジスタにはステップ/動作クロックで表された値が格納されている

  • 1秒あたりのステップ数(ステップ/秒)には,それぞれ以下の式で変換される

Speedレジスタ(20ビット)

\rm\large\displaystyle[ステップ/秒]=\frac{SPEED\times2^{-28}}{動作クロック}

  • 初期値は0(0ステップ/動作クロック,0ステップ/秒)

  • 動作クロックは250ns

MAX_SPEEDレジスタ(10ビット)

\rm\large\displaystyle[ステップ/秒]=\frac{SPEED\times2^{-18}}{動作クロック}

  • 初期値は041

  • 動作クロックは250ns

ステップ/動作クロックからステップ/秒への変換

\rm\displaystyle 041 → 65(step/tick)

  • \rm\displaystyle Max_{init} [ step/s ] = \frac{ 65 \times 2^{-18}}{250 \times 10^{-9}}

  • \rm\displaystyle Max_{init} = 991.82 [ step/s ]

MAX_SPEEDレジスタの最大値

  • 初期値041は7ビット

  • 10ビットの最大値1111111111は0x3FF, 1023

  • \rm\displaystyle Max_{max} [ step/s ] = \frac{ 1023 \times 2^{-18}}{250 \times 10^{-9}}

  • \rm\displaystyle Max_{max} = 155609.74 [ step/s ]

MIN_SPEEDレジスタ(13ビット)

\rm\large\displaystyle[ステップ/秒]=\frac{SPEED\times2^{-24}}{動作クロック}

  • 初期値は000(0ステップ/動作クロック,0ステップ/秒)

  • 動作クロックは250ns

バイスの初期化

  • Arduinoのvoid setup()内で,モータ駆動する前に以下の内容を実行する.
void L6470_resetDevice(){
   // nop命令
   L6470_send(0x00);
   L6470_send(0x00);        
   L6470_send(0x00);        
   L6470_send(0x00);
  // ResetDevice
   L6470_send(0xc0);
}
  • nop命令を4回(4byte分)送った後に,デバイスをリセットする(ResetDeviceコマンドを送る).

    • これは,L6470に一度に送る情報が最大で4byteであるため
  • nop命令を4回送ることで,前のコマンドを確実に終了させてからデバイスをリセットする

ResetDevice (Application commands)

  • L6470デバイスを電源投入後の状態にリセットする

    • パラメータの初期化等

Command binary code

7 6 5 4 3 2 1 0
1 1 0 0 0 0 0 0
16進数
  • 0xc0

    • SPI.transfer(0xc0)で初期化

NOP (Application commands)

  • Nothing is performed

    • 何もしない

Command binary code

7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
16進数
  • 0x00

    • SPI.transfer(0x00)で何もしない命令