先日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を使えば書き込めるかも?


0 件のコメント:
コメントを投稿