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幅でデータを制御できるようになると、アプリケーションの範囲も広がりそうですね。

コメント