GID-ADCのPC-UNIX(Linux,FreeBSD)用のサンプルプログラム「tstgidadc」を少し改良?

トランジスタ技術2000年9月で紹介されていたA/DコンバータGID-ADCを見て興味を持ち、製作してみたのですが、そこで使われていたサンプルプログラムtstgidadcはDOS版をただLinux,FreeBSDで動く様にしただけらしくダミーループを使っており、topで見ると

PID USERNAME PRI NICE SIZE  RES STATE TIME   WCPU    CPU COMMAND
232 root      64    0  88K 476K run   1:02 99.05% 99.02% tstgidadc
という恐ろしいプログラムでした。
そこで、tstgidadc.c中の関数testにある2行
if ( difftime(t_end, t_start) < 1.0 ) /* Wait while 1 second. */
   goto retry ;
をコメントアウトし

sleep(1);

に置き換えることで(usleepも可)
PID USERNAME PRI NICE SIZE  RES STATE TIME   WCPU    CPU COMMAND
260 root      10    0  88K 476K run   0:10 10.92% 10.89% tstgidadc
とまあとりあえず使えそうなプログラムになりました。

ちなみにtstgidadcをNetBSDで動作させるにはgidadcctl.cに

#include <machine/pio.h>

を追加、FreeBSD用としてコンパイルするだけです。

  • リアルタイムにグラフ表示
  • ここではUNIXらしく、シェルのパイプ機能を使いデータをプロットツールに渡してグラフ表示させることにしましょう。
    パイプを使うということで、まずtstgidadcを実行した時はじめに表示されるCopyrightなどを消すためtstgidadc.cの該当部分をコメントアウトします。次に、関数testにある

    printf(" %10ld, %5d,%5d,~~~~~~, buf[7]);



    printf(" %d, %d\n",i+1L, buf[0]);

    に書き換えます。(buf[0]の数字はチャンネルです)
    そして関数mainの最後の方

    test();

    の上にでも

    setlinebuf(stdout);

    を入れておきましょう。これは、バッファがデータを溜め込まないで即座に吐き出すようにするための設定です。あとはこれをコンパイルしてできたtstgidadc(改)をプロットツールgraphと組み合わせるだけです。graphはGNUのplotutilsに含まれています。

    ./tstgidadc -n10000 |graph -T X -x 0 10000 -y 0 5000 -w 0.7 -h 0.7 --max-line-length 1 -X 'Times' -Y 'Volt'

    と実行してみて下さい。


    図1 コンデンサの充放電

    もどる