先日MT6701のI2C版基板をArduinoで動作確認が取れたのでSPIライクなSSI接続でも使えるように改造してみた。I2C接続だと双方向通信だけども、SSIだと受信のみしかできないのでパラメータの書き換えとかはできないけど高速に通信できるらしい。
まずはMT6701を剥がしてみた。どうやら8番ピンがVCCに直結になっているのでこれをCSとして出さないといけない。PWM/Analog出力は使う予定がないので、ICの下のパターンをカットしてPWM/AnalogのところにCSを出してみた。
画像でいうと赤い線を2箇所カットしてMT6701を実装したところで8番Pinを真ん中の端子にジャンパした感じ。
これでI2CとSSIが使える基板となった。CS(改造後の真ん中のPin)をVCCに接続して、SCLとSDAをプルアップすればI2Cとして使えるし(Internal Pullupでもいいし)、SSIとして使う場合はCSとMISO(SDAのピン)とCLK(SCLのピン)の3本をマイコンに接続すれば良い。
#include <SPI.h> #define CS_PIN PA15 SPIClass SPI_1(PB5, PB4, PB3); //MOSI=PB5, MISO=PB4, SCK=PB3 void setup() { Serial.begin(115200); SPI_1.begin(); pinMode(CS_PIN, OUTPUT); digitalWrite(CS_PIN, HIGH); Serial.println("MT6701 SSI Angle Reader Start"); } void loop() { digitalWrite(CS_PIN, LOW); SPI_1.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE1)); delayMicroseconds(1); uint16_t raw = SPI_1.transfer16(0xFFFF);//ダミーデータ送信 SPI_1.endTransaction(); digitalWrite(CS_PIN, HIGH); uint16_t angle = raw >> 2; float degrees = (angle * 360.0) / 16384.0; uint8_t mg = raw & 0b11; Serial.print("Raw: "); Serial.print(angle); Serial.print(", Degrees: "); Serial.print(degrees, 2); Serial.print(", Status: "); switch (mg) { case 0b00: Serial.println("OK"); break; case 0b01: Serial.println("Too Strong"); break; case 0b10: Serial.println("Too Weak"); break; case 0b11: Serial.println("Error"); break; } delay(200); }
こんな感じでArduno上のBluepillのSPI1のAlternativeピンを使用して読み込んでみた。とりあえずI2C同様問題なく読み込めた。SimpleFOCとかでも使えるようなのでこれならモータ制御で問題なく使えるのかなぁ。
DOに10kのプルアップがあるとより安定するとかなんとか。
SSIだとMT6701には書き込みができないので同じピン配置でなにかデータを書き込んだり設定変更する場合はCSをHighにした状態でInternal Pullupを使ってソフトウェアI2Cを使えば書き込めるかも?