PCMCIA の汎用 A/D 変換器のハードウェアと Linux/FreeBSD デバイスドライバの セットです。
アナログ入力は一部を平衡(differential)、一部を不平衡(singke-ended)という使いか たはできません。同様に、一部をバイポーラ、一部をモノポーラという使い方もできま せん。理由は単一の A/D 変換器を入力部のマルチプレクサで切り替えているためです。
複数の入力チャネルを使うときは、使用する最初と最後のチャネルをプログラムで 指定すると、サンプリング毎に入力チャネルを切り替えてゆき、最後に達すると 最初に戻るという動作になりますので、チャネル毎のサンプリング・レートは 同時に使用するチャネル数に反比例して低下します。
内部メモリは最大 2^15 bit のサイズまで、2^n (n = 8, 9, 10, .. 15) byte の間で プログラムでそのサイズを変更することができ、FIFO モードで使う場合は、 コンピュータ側が追い付く限り、連続変換ができます。トリガ条件を指定できる、 BURST モードについては、最大 16 K サンプルしかできません。トリガレベル、 エッジ/レベルの選択、トリガ波形の方向(POSITIVE/NEGATIVE)はプログラム可能です。
内部メモリに記憶された変換結果は、4 bit のチャネル番号と 12 bit のアナログ データの値から構成されます。
デジタル入力は TTL レベル、デジタル出力は TTL レベルで 4mA の駆動能力 があります。
デバイスドライバ、ライブラリ、サンプルプログラムはソースコードのみの供給です。
A/D 変換については、ioctl で変換条件を指定し、read で変換結果を読み込むだけ の簡単なプログラムで使えますが、さらにプログラムを簡略化するために、 入力レンジやトリガ条件を現実の値から DAQ チップの内部形式に変換したり、 変換結果のバイナリデータを現実の数値に変換するための、ライブラリが付属 しています。
#include <stdio.h> #include <sys/ioctl.h> #include <daqi508.h> #define BUFSIZE 512 int fd; char buf[BUFSIZE]; main(argc, argv) char **argv; { int conf, i, n; if ((fd = open("/dev/daq0", 2)) < 0) error("can't open %s", "/dev/daq0"); /* 200kHz sampling, 10V bipolar range, single-ended input channel 0 */ conf = daq_fifo_setup(fd, 200e3, 10.0, 0, 0, DAQ_BIPOLAR|DAQ_SINGLEEND); if ((n = read(fd, buf, 2)) < 0) error("read() error.", (char *)0); printf("% g\n", daq_real_val(buf, conf, NULL)); return close(fd); } error(s, t) char *s, *t; { perror(""); fprintf(stderr, s, t); fprintf(stderr, "\n"); exit(1); }
#include <stdio.h> #include <sys/ioctl.h> #include <daqi508.h> #define BUFSIZE 32768 nt fd; char buf[BUFSIZE]; main(argc, argv) char **argv; { int conf, i, n; char *s; if ((fd = open("/dev/daq0", 2)) < 0) error("can't open %s", "/dev/daq0"); /* 200kHz sampling, 10V bipolar range, single-ended input channel 0 */ conf = daq_fifo_setup(fd, 200e3, 10.0, 0, 0, DAQ_BIPOLAR|DAQ_SINGLEEND); if ((n = read(fd, buf, 32768)) < 0) error("read() error.", (char *)0); n /= 2; for (i = 0, s = buf; i < n; i++, s += 2) printf("%g\n", daq_real_val(s, conf, NULL)); return close(fd); }
#include <stdio.h> #include <sys/ioctl.h> #include <daqi508.h> #define BUFSIZE 32768 int fd; char buf[BUFSIZE]; main(argc, argv) char **argv; { int conf, i, j, n; char *s; if ((fd = open("/dev/daq0", 2)) < 0) error("can't open %s", "/dev/daq0"); /* 20kHz sampling, 10V bipolar range, single-ended input channel 0 */ conf = daq_fifo_setup(fd, 20e3, 10.0, 0, 0, DAQ_BIPOLAR|DAQ_SINGLEEND); for (i = 0; i < 5; i++) { if ((n = read(fd, buf, 32769)) < 0) error("read() error.", (char *)0); else if (n == 0) break; n /= 2; for (j = 0, s = buf; j < n; j++, s += 2) printf("%g\n", daq_real_val(s, conf, NULL)); } return close(fd); }
#include <stdio.h> #include <sys/ioctl.h> #include <daqi508.h> #define BUFSIZE 32768 int fd; char buf[BUFSIZE]; main(argc, argv) char **argv; { int conf, i, n; char *s; if ((fd = open("/dev/daq0", 2)) < 0) error("can't open %s", "/dev/daq0"); /* 200kHz sampling, 10.0V bipolar range, single-ended input, 1 pre-trigger, 0.0V level positive edge trigger */ conf = daq_trig_setup(fd, 200e3, 10.0, 0, 0, DAQ_BIPOLAR|DAQ_SINGLEEND, 0.0, 1, 0); if ((n = read(fd, buf, 32768)) < 0) error("read() error.", (char *)0); n /= 2; for (i = 0, s = buf; i < n; i++, s += 2) printf("%g\n", daq_real_val(s, conf, NULL)); return close(fd); }
#include <stdio.h> #include <sys/ioctl.h> #include <daqi508.h> int fd; main(argc, argv) char **argv; { int i; if ((fd = open("/dev/daq0", 2)) < 0) error("can't open %s", "/dev/daq0"); /* Configure IOPIN0-3 for outout, IOPIN4-7 for input */ daq_dir(fd, 0x07); for (i = 0; i < 1000; i++) { /* output to IOPIN */ daq_out(fd, (i & 0x0F)); digital_in(); sleep(1); /* Inout from IOPIN */ digital_in(); sleep(1); daq_out(fd, ~(i & 0x0F)); digital_in(); sleep(1); } return close(fd); } digital_in() { int i, v; v = daq_in(fd); printf("%02x\n", v); printf("DIGITAL INPUT:"); for (i = 0; i < 8; i++) printf(" %d", (v & (0x80 >> i)) ? 1 : 0); printf("\n"); }