インターフェイス不用の計測プログラム
1990年

【周波数測定プログラム】

 理科の実験等で計測にマイコンを利用できればと考える人は多いはずである。しかしこの様な場合に必ずつきまっとてくるのがインターフェースの問題で、結局あきらめてしまうのがほとんどではなかろうか。そこで特別にハードを必要としない計測用のプログラムを作製した。

 マイコンはデジタル量しか取り扱えないが、多くの場合物理量はアナログ量であり、マイコンに入力する場合A/D変換器が必要になると考えがちである。しかし、周波数の測定を考えると、単位時間に何回オンオフするかを測定することだから、一定時間内に1か0かの判断をすればよいのでデジタル的に扱える物理量である。

 マイコンは命令を水晶発振器の信号に同期して逐次実行するために、命令の実行回数からかなり正確な時間を逆算できる。従って周波数を測定する場合の一定時間間隔は命令の実行回数から求めることが可能である。

 以上のことより、周波数を測定する場合を考えると、外部から測定信号を入力するのにデジタル入力ポートの1ビットを用意すればよく、大概の場合標準で装備されているポートを流用できる。例えばPC-9801VM2の場合RS-232CのCS信号入力ピン(アドレス33H、ビット6)が使える。また一定時間間隔を求めるために、パルスの数を数えるプログラムの命令実行回数より計算できるので、ケーブルを作る以外全く特別なハードを必要とはしない。なお、この測定プログラムのアルゴリズムの概略は次の図のようになる。  

 上の回路図は信号入力用のケーブルに組み込む保護回路である。TTLレベル以上の信号が入った場合に備えてのリミッターをLEDとダイオードを使って組み立てた。この回路の出力はRS-232Cリバースケーブルの4番ピンと1番ピンに接続すればよい。なお入力信号のレベルがTTLレベル以下の場合は適当な増幅器(ラジカセ等)を用いて増幅したものを接続する必要がある。

 

【プログラムリスト】

 次に示したリストが周波数を測定するBASICのサブルーチンである。機械語データ、及び測定データは第2テキストVRAM、アトリビュートエリアに格納されるので、メモリーの実装状態等に依存しないが、CPUの速度によって測定時間間隔が変化する。従って周波数のわかっている信号を使って調整する。

1000 DIM ARREY%(256)            'データを保存する配列の宣言
1010  GOSUB *INIT.COUNTER         '機械語データのセット
1020  SAMPL.T=.1             'ゲート時間の設定
1030  S.COUN=100             '測定回数の設定
1040  GOSUB *COUNTER           '計測サブルーチンへ
1050 STOP
10000 '********************************************************
10010 '周波数測定プログラム
10020 '--------------------------------------------------------
10030 'S.COUN  -> 測定回数      (0 ~ 256回)
10040 'SAMPL.T  -> 測定時間間隔(秒)  (0 ~ 0.8秒)
10050 'ARREY%() -> 測定結果を保存する配列
10060 '--------------------------------------------------------
10070 ' *INIT.COUNTER  ->  機械語プログラムのセット
10080 ' *KAISI      ->  波形変化のセンス、測定開始
10090 ' *SOKUTEI     ->  周波数測定の開始
10100 ' *SET.DATA    ->  バッファーから配列へデータセット
10110 '--------------------------------------------------------
10120 *COUNTER
10130 'S.COUN=BC%
10140 'SAMPL.T=GATE
10160  IF S.COUN > 256 THEN RETURN    '測定回数範囲確認
10170  IF SAMPL.T >.8 THEN RETURN     '時間間隔確認
10180  GOSUB *KAISI
10190  GOSUB *SET.DATA
10200 RETURN
10210 '**************************
10220 '測定開始処理 波形変化待ち
10230 '**************************
10240 *KAISI
10250  I=INP(&H33)
10260  J=INP(&H33) :IF I=J THEN 10260   '波形変化待ち
10270  LOCATE 10,10 :PRINT "START"
10280  GOSUB *SOKUTEI
10290 RETURN
10300 '**************************
10310 'バッファから配列へデータセット
10320 '**************************
10330 ' ARREY()へデータセット
10340 '-------------------------
10350 *SET.DATA
10360  DEF SEG=&HA110
10370  FOR I=0 TO S.COUN-1
10380   ADD.L=I*2 :ADD.H=ADD.L+1
10390   DATA.L=PEEK(ADD.L) :DATA.H=PEEK(ADD.H)
10400   ARREY%(I)=DATA.H*256+DATA.L
10410  NEXT
10420 RETURN
10430 '**************************
10440 '周波数測定サブルーチン
10450 '**************************
10460 'S.TIME -> サンプリング時間(カウント)
10470 'S.COUN -> 測定回数
10480 'S.TIME=1 -> 12.575マイクロ秒 (9801VM2,10MHz)
10490 'S.TIME=SAMPL.T/125.75E-7
10500 'SAMPL.T ->サンプリング時間(秒)
10510 '-------------------------
10520 *SOKUTEI
10530  DEF SEG=&HA100
10540  S.TIME=SAMPL.T/1.2575E-05      'サンプリング時間の計算
10550  LB=S.TIME-256*INT(S.TIME/256)    '1.2575E-05はCPUによって調整する。
10560  HB=INT(S.TIME/256)
10570  LK=S.COUN MOD 256   
10580  HK=S.COUN \ 256           'S.COUN:測定回数
10590  POKE &HF,LB    :POKE &H10,HB   '遅延時間設定
10600  POKE &H14,LK   :POKE &H15,HK   '測定回数設定
10610   COUNT=&H0
10620   CALL COUNT
10630 RETURN
10640 '**************************
10650 '周波数カウンター初期設定
10660 '**************************
10670 *INIT.COUNTER
10680  DEF SEG=&HA100
10690  FOR I=0 TO &H54
10700      READ D$
10710      D=VAL("&H"+D$)
10720      POKE I,D
10730  NEXT
10740 RETURN
10750 DATA FB,50,53,51,52,56,57,55,1E,B8,10,A1,8E,D8
10760 DATA B9,00,A0            'ディレイタイムの設定
10770 DATA 8B,F1
10780 DATA BB,0A,00            '測定回数
10790 DATA BA,33,00,BF,00,00,BD,00,00,49,83,F9,00,74,13
10800 DATA EC,24,40,74,F5,49,83,F9,00,74,08,EC,24,40,75
10810 DATA F5,45,EB,E7,8B,C5,89,05,47,47,4B,83,FB,00,74
10820 DATA 07,8B,CE,BD,00,00,EB,D5,1F,5D,5F,5E,5A,59,5B
10830 DATA 58,FA,CF
 

【応用】

 この様に簡単なプログラムで周波数を測定することができるようになる。従って色々な物理量を周波数の形に変換する装置を組み立てればマイコンにデータを取り込むことができるようになる。例えば、A/D変換器を実現したければV/F変換器(電圧に比例した周波数を発振する装置)を作り接続すればよい。この場合このプログラムは最高約40KHzの周波数に応答するので、8ビット精度のA/D変換器とする場合フルスケール電圧の変換を6mSで終了する。さらに変換速度が遅くてもよい場合、V/F変換器をOPAMPで注意深く設計すれば16ビット精度のA/D変換器を実現することも比較的簡単である。

 このプログラムの応用として、連続した時間ごとの速度を測定する装置を作ったことがあるので紹介する。物体の運動を記録タイマーと同じ様に測定できる。

 テープで音楽を聞いていると、音程のがふらつくことがあるが、テープ速度に比例して周波数が変化するためである。そこで一定周波数の音を録音したテープを再生すれば、再生された周波数からテープ速度を計算することが可能になる。(録音した時のテープ速度に対する比率としてもとまる)

 そこで一定周波数の正弦波を録音したテープを運動する物体に取り付け、テープレコーダーでテープを再生するように、テープの音を磁気ヘッドで読みだし周波数を測定すれば現時点の物体の速度が周波数として計測できることになる。この原理を使って記録タイマーと同じ形式に、しかも高い測定精度で物体の運動の様子を測定することができる。

 テープにはオープンリールの磁気テープを用い、波長が1mm(テープ速度19cm/Sで190Hzの正弦波を録音する)となるように予め正弦波を録音したものを用意して、記録タイマーの紙テープの代わりに測定しようとする物体に取り付け次の図の様な磁気ヘッドを取り付けた装置に通し、TTLレベルまで増幅してマイコンに入力すれば、周波数の時間変化より物体の速度の時間的な変化を連続して測定することができる。下の様な増幅回路を設計製作したがラジカセ等の磁気ヘッドをそのまま引き出して使えばそのままでも利用可能なはずである。