Phoenix FPGAインターフェース編

はじめに

本回路はFPGAが5つ全てのモーターの制御を担っている。普通、MCUでBLDCモーターを制御しようとしてもPWM本数やエンコーダ入力数の制約でせいぜい2つのモーターを回すのが限界である。しかしFPGAは制御ロジックの自作という山さえ乗り越えればI/O本数が許す限りのモーターを回せるのである。

別の案としてMCU+FPGAの組み合わせでFPGAはPWM出力とエンコーダ入力をするだけという手もあったのだが。あるいはMCU単体にインテリジェントなモータードライバとシリアル出力のエンコーダを繋げる手も。

FPGAにはCyclone 10 LPを採用した。このチップはIntelのFPGAにしてはかなり安価なのが決め手であった。

JetsonとGreenPAKとの接続

Jetson NanoおよびGreenPAKとは以下の信号線で接続されている。

Jetson NanoとはMOD_SLEEP#、CONFIG#、割り込み、SPI、UARTが接続されている。

SPIはUARTと比べてビットレートを高くできるためこれをデータの送受信に用いることを想定している。UARTもデバッグ用途やFPGAが主導でデータを送信したいときに役立つだろう。割り込み信号はFPGAからJetson Nanoに割り込みをかけてリアルタイムな処理をさせる用に用意した。GPIOなので別の用途に転用することもできる。CONFIG#はFPGAをリコンフィギュレーションするための信号でリモートアップデートの際に用いることがあるかもしれない。MOD_SLEEP#はJetson Nanoがスリープに入ったときにLに引き下げられ、その際にFPGAは安全のためモーターを止めなくてはいけない。

GreenPAKからはFPGA_STOP#の信号が送られる。これは48Vレギュレータの出力がオフのときにモーター駆動を禁止することをFPGAに指示するための信号である。FPGAはADC2を通じて48Vレギュレータの出力電圧を監視できるが念のためである。


FPGAとJetson Nano, GreenPAKとの接続図

IMUとの接続

IMUはJetson NanoではなくFPGAにSPIで接続されている。ICM-42688-Pには数10kHzのクロックを入力するとそれに合わせてセンサーの値を出力する機能がある。


FPGAとIMUとの接続図

IMUの測定座標軸は基板に対して以下の図のようになっている。


ADC1との接続

ADC1は各モーターの相電流の測定を行うADCである。以下に接続図を示す。


FPGAとADC1との接続図

このADCはLTC2320-12という8チャンネル同時サンプリングADCで、分解能は12ビットだがこれは符号ビットを含めない数字なので完全差動アンプで駆動すれば13ビットの実力がある。残念ながら本回路では疑似差動なので12ビット分の力しか発揮できないが。変換速度は最大1.5Mspsである。

相電流からADC入力電圧への変換はMAX40056Fが行う。このICはPWM除去機能を持つカレントセンスアンプで今回のように相電流を直接測定する用途にうってつけである。

LTC2320のリファレンス電圧は2.048V、MAX40056Fのゲインは50倍、シャント抵抗は3mΩなので相電流\(I_s\)とADC出力値の関係は次の式で表される。

\begin{eqnarray} \mathrm{DATA_x} &=& I_x \times \mathrm{3 m \Omega} \times 50 \div 2.048 \times 2^{12} \\ &=& 300 \times I_x \end{eqnarray}

ADC2との接続

以下にADC2との接続図を示す。ADC2はドリブル用のモータードライバー5に流れるグランド電流と48Vレギュレータの出力電圧を測定する。


FPGAとADC2との接続図

ADC2はADS1015というPGAを内蔵したI2C接続の12ビットADCである。

モータードライバ5のグランド電流はシャント抵抗に生じる電位差を差動入力モードのAIN0,AIN1で測定する。ADS1015の入力電圧範囲FSRを最小の±0.256Vに設定すればシャント抵抗\(R_S\)は10mΩなのでグランド電流\(I_S\)とADC出力値との関係は次の式で表される。

\begin{eqnarray} \mathrm{DATA_{IS}}&=& I_S \times \mathrm{10 m \Omega} \div 0.256 \times 2^{11} \\ &=& 80 \times I_S \end{eqnarray}

48Vレギュレータの出力電圧は分圧抵抗を介してAIN2で測定する。FSRを±4.096VにすればADC出力値は以下の式で表される。

\begin{eqnarray} \mathrm{DATA_{48V}}&=& \mathrm{V_{48V}} \div 21 \div 4.096 \times 2^{11} \\ &=& 23.81 \times \mathrm{V_{48V}} \end{eqnarray}

モータードライバ等との接続

以下にモータードライバおよびモーター関連のセンサー、モーターのステータス表示LEDの接続を示す。


FPGAとモータードライバ等との接続図

モータードライバにはDRV8312という統合型モータードライバを用いている。このICは3相6本のPWM入力と2つのフォルト出力を持つ。

ホールセンサーとエンコーダへの給電はMIC2090というロードスイッチを介して行われる。このICはモーター基板やエンコーダ基板上で電源がショートした場合にPhoenix基板を保護するためのものである。48Vとのショート対策のために直列ダイオードも入れておけば良かったかもしれない。

ホールセンサーとエンコーダの出力は5VトレラントのロジックICを用いて3.3Vにレベル変換してからFPGAへ入力される。ホールセンサーは変化頻度が低いので74LV165を使って他のモーターのホールセンサーの出力も合わせてシリアライズしてFPGAに入力することでI/Oピンを削減している。一方、エンコーダ出力は高頻度で切り替わるため74LVC541というバッファICを介して念のため1本ずつFPGAに入力している。この際、FPGA側は入力専用のCLKピンに割り当てることでI/Oを有効活用している。

LEDはモーターやモータードライバの異常を表示するためのものである。

コンフィギュレーションインターフェース

FPGAにはコンフィギュレーション用のフラッシュメモリが接続されている。FPGA起動時にはアクティブシリアルコンフィギュレーションによりこのフラッシュメモリからビットストリームがロードされFPGAが起動する。接続されているのはQSPIメモリだがCyclone 10 LPのコンフィギュレーションロジックはQSPIに非対応なのでコンフィギュレーション時は通常のSPIモードで動作することになる。

このフラッシュメモリにはFPGA起動後にユーザーロジックからもアクセスできるので、Nios IIのプログラムをロードしたり格納されているビットストリームをユーザーロジックからアップデートしたりと活用法は色々あるだろう。

なお、このフラッシュメモリは1.8Vで動くがCyclone 10 LPは2.5V~3.3Vで動くフラッシュメモリからの起動しかサポートしていない。そのためこのフラッシュメモリが接続されているI/Oピンは便宜的にQuartus上では2.5V以上のVCCIOだとして宣言してごまかしている。


FPGAとコンフィギュレーションメモリとの接続図

FPGAの開発時にはJTAGインターフェースにお世話になるだろう。コンフィギュレーションするだけでなく、Nios IIのプログラムをデバッグしたり、SignalTap II ロジックアナライザで内部信号を観測したり、Avalon-MMバスにアクセスしたり大抵のものはここから触れる。普通のJTAGコネクタは2.54mmピッチだが本回路にそれを置くスペースは残されていないため代わりに1.27mmピッチのコネクタが配置されている。なおJTAGのI/O電圧は1.8Vである。


FPGAのJTAGインターフェース

PSRAMとの接続

Cyclone 10 LPの内蔵ブロックメモリーは近代的なマイコン等と比べれば少ないためQSPI接続のPSRAMも搭載できるようにパターンだけ用意した。PSRAMは2つ搭載できるため2つ合わせてオクタルSPIメモリーとして扱えば帯域幅を確保できる。


FPGAとPSRAMとの接続図

0 件のコメント :

コメントを投稿