2023年12月31日日曜日

MT6701のI2C基板をSSIで使ってみた。

 先日MT6701のI2C版基板をArduinoで動作確認が取れたのでSPIライクなSSI接続でも使えるように改造してみた。I2C接続だと双方向通信だけども、SSIだと受信のみしかできないのでパラメータの書き換えとかはできないけど高速に通信できるらしい。

MT6701

まずはMT6701を剥がしてみた。どうやら8番ピンがVCCに直結になっているのでこれをCSとして出さないといけない。PWM/Analog出力は使う予定がないので、ICの下のパターンをカットしてPWM/AnalogのところにCSを出してみた。
画像でいうと赤い線を2箇所カットしてMT6701を実装したところで8番Pinを真ん中の端子にジャンパした感じ。

MT6701

これで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 件のコメント:

コメントを投稿