TB6605FTG Brushless Motor Kit for Arduinoをラズパイで利用する(7)

 コントローラTB6605FTGを使って任意の角度まで回転し止める、という位置決めの動作をしたいがため、角度検出回路を追加します。最初、コンパクトな磁気式エンコーダAS5601を利用しましたが、数千rpmではデータが間に合わなかったのであきらめました。
 ここでは、高速回転に対応したAS5147Pを利用します。メーカの用意している評価ボードAS5147P-TS_EK_ABをDigi-keyから入手しました。データシートは、こちらからダウンロードできます。

  https://ams.com/ja/as5147padapterboard/#tab/description

 

AS5147Pのおもなスペック

  • 動作電圧 5Vもしくは3.3V
  • 回転数 28krpmまで対応
  • 角度の分解能 14ビット(SPI)
  • 出力 SPI、ABI、UVW,、PWMが選択できる

 データシートは、こちらからダウンロードできます。

  https://ams.com/ja/as5147p

接続

 SPIインターフェースで利用します。マニュアルには3線式(MISOを接続しない)の例がありますが、初期化のコマンドが送れないので、4線式で接続します。
 評価ボード上の3.3V-5V選択ピンヘッダは取り付け時にじゃまになるので、ピンをニッパで切りとり、3.3V-中央ピンをはんだでショートしました。

 ピンヘッダは2段ですが、SPI関連は片方の列だけを利用します。付属の2列ピンヘッダは取り付け時にじゃまになるので、90度折れ曲がったピンヘッダを用意しました。

AS5147P ラズパイ
5V 3.3V
3V3 3.3V
NC  -
CSn 24  CE0
CLK 23  CLK
MOSI 19  MOSI
MISO 21  MISO
GND GND

モータへの取り付け

 モータのお尻側に付属のネオジム磁石を取り付けられればスマートなのですが、実験なので、L型の補助板を対向させ、ナイロンねじで固定しました。
 磁石は、アルミニウムのカプラの中央にちょうどよいおおきさの穴があったので埋め込みました。磁石とICの表面の距離はほぼ1mmです。マニュアルには3mm以内と書かれています。

プログラム

 データシートに、SPIインターフェースは最大10MHz、mode=1と書かれています。実験は1MHzで行いました。10MHzでも動作します。

 利用する手順が、データシートにフローチャートで示されています。最初は、SETTINGS1(0x0018)とSETTINGS2(0x0019)を初期設定し、データ・レジスタANGLECOM(0x3FFF)を読み、ゼロ点の設定をします。
 SETTINGS1、SETTINGS2ともにSPIに関連する部分はないので、何も設定せずにANGLECOMを読むと、0x0000もしくは0x8000が読めるだけでした。SETTINGS1、SETTINGS2ともにデフォルトは0x0000です。最上位ビットが偶数パリティなので、どちらも0x0000を書き込みました。

 ゼロ点の設定は行いませんでした。

 読み出したデータの最上位ビットは偶数パリティ、その次のビットはRead/Writeフラグなので、上位バイトを0b001111でマスクしました。読み出した14ビットのデータのフォーマットはマニュアルには書かれていません。2^14で割って360を乗じると、0~360のデータが得られました。

 最初の読み出し命令の実行の結果は、次の読み出し命令時に読み取られます。プログラム例は連続読み出しです。最初のデータは捨てます。

import spidev
import time

spi = spidev.SpiDev()
spi.open(0,0) # CE0
spi.max_speed_hz = 10000000 # 10MHz
spi.mode = 0b01

spi.xfer2([0x00,0x18])
spi.xfer2([0x00,0x00])
spi.xfer2([0x00,0x19])
spi.xfer2([0x00,0x00])

while 1:
    angle = spi.xfer2([0x3f,0xff])
    time.sleep(0.001)
    data = ((angle[0] & 0b00111111) << 8) | angle[1]
    print(data, round((data/16384*360),1) , "`")

 実行している様子です。ラズパイのOSは2020/8/20版からカーネルは5.xに上がっています。