Melexis社製の14bit磁気エンコーダMLX90316を試食してみました。
先日紹介した3線式SPI通信を使用して磁石の角度情報を読み込んでみました。
結論から言うとMLX90316はダイヤルといったインターフェース向けのエンコーダでモータ制御にはあまり向いていないようです。
Arduinoのサンプルプログラムでは動作しますが、STM32マイコンのSPI通信で実装すると思うように位置情報が読み込めない不具合に遭遇しました。原因を追うとデータシートにその答えがありました。
MLX90316データシートP.33から抜粋
データシートをよく見るとt1が最小2.3usということで最大クロックは300kHz程度です。さらにt2で1バイトごとに10us以上待機する必要があり、SPI通信で連続してバイトの読み書きができません。また、t5でCS=1状態で300us以上待機する必要があることが書かれています。数MHzのクロックで通信できるSPI通信のメリットがありません。
つまり、位置データ読み込みは数msに1回程度しか読み込めないということになります。MLX90316の仕様でSPI通信対応ということで細かい部分を見逃していました…
CubeMX上でClock Phaseを2Edgeに設定し、SPIのプリスケーラを256に設定してSPIのボーレートを31.25Kbit/sに設定すると正常に位置情報を読み込むことが確認できました。
uint8_t sdata[4];
uint8_t rdata[8];
uint16_t dat[4];
uint16_t res;
uint8_t halres;
sdata[0]=0xAA;
sdata[1]=0xFF;
SPI_1LINE_TX(&hspi1);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
halres=HAL_SPI_Transmit(&hspi1,sdata,2,0x1000);
if(halres !=HAL_OK) printf("Transmit Err:%d \n\r",halres);
SPI_1LINE_RX(&hspi1);
halres=HAL_SPI_Receive(&hspi1,rdata,8,0x1000);
if(halres !=HAL_OK) printf("Receive Err:%d \n\r",halres);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
uint8_t rdata[8];
uint16_t dat[4];
uint16_t res;
uint8_t halres;
sdata[0]=0xAA;
sdata[1]=0xFF;
SPI_1LINE_TX(&hspi1);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
halres=HAL_SPI_Transmit(&hspi1,sdata,2,0x1000);
if(halres !=HAL_OK) printf("Transmit Err:%d \n\r",halres);
SPI_1LINE_RX(&hspi1);
halres=HAL_SPI_Receive(&hspi1,rdata,8,0x1000);
if(halres !=HAL_OK) printf("Receive Err:%d \n\r",halres);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
dat[0] = (rdata[0]<<8) + rdata[1];
if((dat[0]&0x03)==2){
// Err Data
if ( dat[0] & (1 << 4)) {
// Err Data
if ( dat[0] & (1 << 4)) {
//printf("Magnetic Field is Too Strong!\n\r");
}
else if ( dat[0] & (1 << 5)){
}
else if ( dat[0] & (1 << 5)){
//printf("Magnetic Field is Too Weak!\n\r");
}
}
}
else if((dat[0]&0x03)==1){
res=(dat[0]>>2);//16bit Angle Data
printf("RES: %d \n\r",res);
}
else if((dat[0]&0x03)==1){
res=(dat[0]>>2);//16bit Angle Data
printf("RES: %d \n\r",res);
}
磁気エンコーダをモータ制御として使用する場合、少なくとも1msに1回、理想は100usに1回読み込みたいのでMLX90316の仕様は満足しないことが分かりました。ダイヤルといったインターフェース向けのエンコーダとしては低コストかつシンプルなコマンドで通信できるため、非常によいと思いました。
14bi磁気エンコーダとして癖がなく、高速な処理に対応しているのはやはりAMS社のAS5048Aが個人的にベストな磁気エンコーダだと改めて思いました。