今回は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線化しました。

そのままSPIのMISOとMOSIを接続すると、
PushPullのため、マイコン側の出力が短絡してしまいます。
そのため、抵抗を挟んで対処しました。
また、MISO側の抵抗を1k、MOSI側を10kに設定することで
マイコン側の出力とエンコーダ側の出力で
エンコーダ側を優先できるようにしてあります。
※マイコンの出せる電流値とエンコーダの電流値のバランスで決まるため、
マイコンに応じてオシロでHighとLowの電圧値を確認すること。
STM32F303では上記でHigh2.8V前後のいい感じになりました。
今回の試食ではTLE5012Bを2つ接続して、
CSで2つを切り替えて取得してみました。
CS以外のSCK、MOSI,MISOは共通配線です。
また磁石はAS5048A、AS5047D同様、こちらの磁石が使用可能です。
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,1);//CS A HIGH
asm("NOP");
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3,1);//CS B HIGH

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();
}
}
{
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);
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_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
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);
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_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);
HAL_Delay(300);
}
下記のように2つのTLE5012Bでそれぞれのエンコーダ値を取得することができました。

ちょっと癖のあるSSC通信ですが、
SPI通信ベースに実装できました。
TLE5012BはAS5048Aなどのように有名ではないようで、
Web上で調べてもほとんど情報がありませんでした。
メーカのHPではSPI互換といっているが、
どのような実装を想定しているのか少し疑問です。
今回は高速周期でのテストはしていませんが、
ロボットに組込んでどれくらい性能に差があるか
今後、実験してみたいと思います。