2017年01月21日

磁気エンコーダTLE5012B

今回はInfineon製の磁気エンコーダTLE5012Bに試食について
紹介させて頂きます。


環境は、
・STM32F303K8
 +SW4STM32(System Workbench for STM32)
 +STM32CubeMX(F3_1.6.0)
です。


ProjectionBall等のロボット制御では
これまでAMS製磁気エンコーダAS5048AやAS5047Dなどが
性能に優れるため、好んで使用してきました。


ただ、値段が安く更に高性能化できないかと
色々なメーカの磁気エンコーダを探していました。


ちょっとシリアル通信に癖があるものの、
現行のAMS製AS5048AやAS5047Dなどに比べて
少し性能が高く、安いエンコーダを見つけたため、
試食してみました。



性能比較
◆AMS製AS5048A、AS5047D
-分解能:14bit (16384bit/rev)
-サンプリング周期:100us
-通信:SPI
-最大エラー角:0.7~1.4°
-価格:約900円/1個

◆Infineon製TLE5012B
-分解能:15bit (32768bit/rev)
-サンプリング周期:42.7us
-通信:SSC
-最大エラー角:1.0°
-価格:約600円/1個



単純な比較では性能はほとんど同じですが、
注目すべきはTLE5012Bのサンプリング周期が
42.7usということです。


アナログエンコーダやインクリメンタルエンコーダであれば、
制御周期の上限はないようなものですが、
シリアルエンコーダの場合はエンコーダのサンプリング周期で
制御周期が決まるといっても過言ではありません。

エンコーダのサンプリング周期以上に制御周期を速くしても、
同じ位置を返してしまうため、意味がありません。
TLE5012Bのサンプリング周期が42.7usと非常に高速なため、
他の性能が同様であれば、
サンプリング周期だけでも大幅に性能向上が期待できます。



ただ、TLE5012Bの問題点は少し癖のあるインタフェースということです。
SPIでなく、SSCというインタフェースを採用しています。

SCKやCSはSPIと同様ですが、
MISOとMOSIがそれぞれ1線でなく、1線で送信と受信を行います。
まるでSPIとI2Cを掛け合わせたような仕様です。


ただ、I2CのようなACK等はありません。
そのため、SPIのドライバを使用して通信します。
IOを入力と出力とその都度、切り替えては処理が遅くなるため、
下記のようにハードウェアで1線化しました。

TLE5012B_.png

そのままSPIのMISOとMOSIを接続すると、
PushPullのため、マイコン側の出力が短絡してしまいます。
そのため、抵抗を挟んで対処しました。


また、MISO側の抵抗を1k、MOSI側を10kに設定することで
マイコン側の出力とエンコーダ側の出力で
エンコーダ側を優先できるようにしてあります。
※マイコンの出せる電流値とエンコーダの電流値のバランスで決まるため、
マイコンに応じてオシロでHighとLowの電圧値を確認すること。
STM32F303では上記でHigh2.8V前後のいい感じになりました。


今回の試食ではTLE5012Bを2つ接続して、
CSで2つを切り替えて取得してみました。
CS以外のSCK、MOSI,MISOは共通配線です。

また磁石はAS5048A、AS5047D同様、こちらの磁石が使用可能です。

SPIの設定は下記の通り。
ポイントは16bitデータ転送、SPI_PHASE_2EDGEです。




static void MX_SPI1_Init(void)
{

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }

}



while(1){

   /* Encoder A*/
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,0);//CS A LOW
     
   sData[0]=0x8021;//SSC Command to read the angle value
      HAL_SPI_TransmitReceive(&hspi1,sData,rData,1,100);
     
   sData[0]=0x0000;//Empty Data     
     HAL_SPI_TransmitReceive(&hspi1,sData,rData,1,100);
      res=rData[0]&0x7FFF;//15bit

      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,1);//CS A HIGH
      asm("NOP");
   
   /* Encoder B*/
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3,0);//CS B LOW
     
   sData[0]=0x8021;//SSC Command to read the angle value
      HAL_SPI_TransmitReceive(&hspi1,sData,rData,1,100);
     
   sData[0]=0x0000;//Empty Data
      HAL_SPI_TransmitReceive(&hspi1,sData,rData,1,100);
      res1=rData[0]&0x7FFF;//15bit

      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3,1);//CS B HIGH
   


   printf("POS: %d %d\n",res,res1);
      HAL_Delay(300);
}



下記のように2つのTLE5012Bでそれぞれのエンコーダ値を取得することができました。


TLE5012B-uart.png


ちょっと癖のあるSSC通信ですが、
SPI通信ベースに実装できました。


TLE5012BはAS5048Aなどのように有名ではないようで、
Web上で調べてもほとんど情報がありませんでした。
メーカのHPではSPI互換といっているが、
どのような実装を想定しているのか少し疑問です。




今回は高速周期でのテストはしていませんが、
ロボットに組込んでどれくらい性能に差があるか
今後、実験してみたいと思います。


posted by Crescent at 00:00| Comment(0) | TrackBack(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック