GWいかがおすごしですか?
さて、今日はGW中の簡単な工作としてMAX11300PMB1をexStickにつないでみます。20本のADC/DACを備えたIOポートをNetworkで制御できるようになりますよ。
MAX11300PMB1とは
MAX11300PMB1はMAXIMから発売されているMAX11300の評価ボードです。MAX11300は20ポートのデジタル/アナログプログラマブルI/OのICで、設定によってADCやDAC、TTLレベルの信号生成と多彩なI/Oポートとして利用できます。
評価ボードの詳細は こちら を、ICの詳細は こちら を参照してください。
評価ボードの物理的なI/FはPMODなのでDigilentのFPGAボードやexStickに簡単に接続できます。ただし、I/Oポートを有効にするためにはSPIによる初期設定が必要なので、若干使い始めは面倒かもしれません。
MAX11300用のコンフィグレーション
SPIなので、もちろんHDLで記述できますが、特段、速度が必要というわけでもないのでJavaで書いてSynthesijerで合成してしまうことにします。
読み書きのインターフェースクラスは、こんな感じ。MAX11300Iface.java
たとえば、レジスタから値を読み出すために、次のようなメソッドを定義しています。このメソッドでは、一つ目のループで、SPIのCLKをぱたぱたしながらアドレスを出力し、二つ目のループでデータを取りこみます。
public int read(int addr){ int v = 0; int a = (addr << 1) + 1; // LSB should be '1' to read sclk.flag = true; sclk.flag = true; sclk.flag = false; sclk.flag = false; cs.flag = true; for(int i = 0; i < 8; i++){ // addr + R/W B sclk.flag = false; dout.flag = (a & 0x80) == 0x80; sclk.flag = true; a = a << 1; } sclk.flag = false; for(int i = 0; i < 16; i++){ sclk.flag = true; v = v << 1; v = (din.flag) == true ? v + 1 : v; sclk.flag = false; } sclk.flag = false; cs.flag = false; return v; }
MAX11300を叩いてみる
用意したI/Fクラスを使ってMAX11300を叩いてみます。たとえばポート19をDACモードに設定し、のこぎり波を作るには、
- ポート19の設定レジスタ(0x33)に0x5100を指定(+10V~0VのDACモードに設定)
- ポート19のデータレジスタ(0x73)にカウンタ値をセット
すればよいでしょう。
Javaで書くとこんな感じ。 MAX11300Test.java
obj.write(0x33, 0x5100); // port 19 while(true){ for(int i = 0; i < 0x1000; i++){ obj.write(0x73, i); for(int j = 0; j < 100; j++){;} } }
ちなみに、データシートではデバイスIDの値が0x0024と書いてありましたが、実際に読めた値は0x0424でした。
UDPコアとつなげばネットワーク対応汎用I/Oのできあがり
exStick付属のIPコアを使えば、簡単にネットワークから制御可能なI/Oができあがります。MAX11300はあまり高速に値を制御することはできませんが、10V幅でデータを制御できるようになると、アプリケーションの範囲も広がりそうですね。
コメント