目次

スロースキャンコンピュータ

 製鉄化学プラントの反応動作をシミュレーションする
 ため、スロースキャンコンピュータを考えます。

 商用電源トランスを利用すると、交流100Vから交流10Vに
 下げて、周波数50Hzか60Hzの正弦波を使うことが可能に。



 ブリッジダイオードの入力には交流10Vの正弦波、出力には
 交流10Vの矩形波が得られます。

 下の写真のダイオードを並べている先に、フォトカプラを
 入れて、交流10V正弦波出力端子を基板上に用意します。



 アナログは中国語の表現では「相似」なので、周波数で
 見ると、低い周波数で動作確認し、徐々に周波数を上げ
 より高い周波数で動作させるようにもっていきます。

 OPアンプの実用になる周波数の上限は100kHz程度として
 1kHzで動作を確認し、5kHz→10kHz→20kHz→50kHz→100kHz
 と周波数を高くしていきます。

 3端子レギュレータで電圧を安定化したので、フォトカプラ
 の出力側の電源電圧に利用します。

 安定した電圧が出力されているかは、パイロットLEDの点灯で
 確認できます。



 クロックの振幅は最大5V近くになるので、必要ならば増幅器を
 入れ、システムレベルに見合う振幅まで引き上げます。



 クロックは同相であればよく、矩形波のままでよいので
 飽和状態を作っても問題ないでしょう。

 非反転増幅回路なので、入力インピーダンスが高く、出力
 インピーダンスは低いので、一段バッファを挟みます。

 スロースキャンというからには、50Hzや60Hzの周波数よりも
 さらに低周波のクロックが必要な場面も考えられます。
 カウンタを使った分周器を用意します。



 電子回路の場合、より高速なクロックで動作させる場面が
 多いですが、化学プラントのように反応速度が時間単位の
 場合、より低速なクロックが求められます。

 OPアンプのコンパレータによる発振器では、フィードバック
 抵抗やキャパシタの値を大きくすると、低速クロックを生成
 できますが、値を大きくするのにも限界があります。

 抵抗で1MΩ、キャパシタで1000uFが入手できる部品の
 限界なので、カウンタを利用した分周器を利用します。

 矩形波でよければ、大きな抵抗値や静電容量の大きな
 キャパシタを用意しないで、分周した方が簡単です。

 抵抗値は抵抗を直列にして増やし、キャパシタは並列に
 接続して静電容量を増やすことが可能ですが、微調整の
 範囲と考えるべきでしょう。

 スロースキャンコンピュータは、次のように構成します。



 カウンタを利用して、ある値のときにトリガーを出力します。
 トリガーは0→1、1→0のような単純な電圧変化を担当する
 こともあれば、複雑な波形生成も担当するデバイスとします。

 アナログシンセサイザーの中にある回路でADSRの波形を生成
 することも可能なデバイスをトリガージェネレータとします。



 ADSRの波形が、積分回路、微分回路、遅延回路が組合わされて
 構成されていることがわかります。

 任意の波形出力は、トリガーを出力して、各回路を指定時間だけ
 動作させると考えれば、スイッチングが最も簡単。

 スイッチングには、アナログスイッチを利用できます。



 OPアンプを使う回路は、電源電圧が正負であり、電圧範囲も
 3Vから12V程度と幅が広いので、CMOSアナログスイッチの利用
 となります。

 どのタイミングで複数ある回路の出力を切り替えるのかを
 決めるとして、クロックの周波数を固定していたとします。

 この場合、実機に近い周波数でカウンタを動かせるよう
 スイッチャーによる分周器出力を切替える構成します。



 スイッチャーによる分周器出力を切替えるのは、単純にビットで
 ON/OFFとすれば対抗できるでしょう。

 ビット数が少なければ、ROMを利用して対応可能。

 手元には、パラレルのSRAMがあるので、これを使います。




 このSRAM2114は、1kx4ビットであるので、4ビットで使う
 ことも可能。ビット数が少ないときには、デバイスとしては
 1個だけで済ませられます。

 1kはアドレスでは10ビットなので、そのうちの7ビットを
 使えば128通りの使うことが可能です。128通りは、4ビット
 ですから、128ステージx4ビットという組合せと計算でき
 ます。

 SRAM2114は入手性が良くないので、次のHM6116を使ってます。



 D/A変換器が必要な場合、8ビット程度でよければR-2Rの
 抵抗を組み合わせた簡易タイプを使います。




 アナログコンピュータがシミュレートする内容は、精度よりも
 大まかな現象なので、多少の誤差には目をつぶると考えないと
 デジタルコンピュータを利用することになります。

 ROMは容量が小さければ、マイコンで代用。



 上の回路であれば、アドレスが5ビットあるので、最大32の
 8ビット情報を扱えます。

 32を超えた情報を利用するには、UVEEPROMの出番です。

 最近は、2764、27128、27256というマルチICでデジタル
 コンピュータを実現する場合の定番ROMを見かけなくなり
 ましたが、探せばジャンク品扱いで入手できます。

 自分は、知人から廃棄するというので大量に貰えました。

 ROMライターは現在でも入手できますが、これもジャンク
 かオークションで入手すればよいでしょう。

 ROMに格納する情報は、次のAWK(スクリプト言語)を利用
 して、HEXファイルを作成します。

#
function s2v(x) {
  #default
  result = 0
  #
  if ( x == "1" ) { result = 1 }
  if ( x == "2" ) { result = 2 }
  if ( x == "3" ) { result = 3 }
  if ( x == "4" ) { result = 4 }
  if ( x == "5" ) { result = 5 }
  if ( x == "6" ) { result = 6 }
  if ( x == "7" ) { result = 7 }
  if ( x == "8" ) { result = 8 }
  if ( x == "9" ) { result = 9 }
  if ( x == "A" ) { result = 10 }
  if ( x == "B" ) { result = 11 }
  if ( x == "C" ) { result = 12 }
  if ( x == "D" ) { result = 13 }
  if ( x == "E" ) { result = 14 }
  if ( x == "F" ) { result = 15 }

  return result
}

# 
function s2d(x) {
  # default
  result = 0
  # upper
  dh = s2v(substr(x,1,1))
  # lower
  dl = s2v(substr(x,2,1))
  # judge
  result = dh * 16 + dl

  return result
}

# bit inverse
function xinverse(x) {
  # default
  result = 0 
  # judge
  if ( x == 0 ) { result = 1 }

  return result
}

# 1's compliment
function bnot(x) {
  # copy
  tmpx = x
  # separate
  x0 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x1 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x2 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x3 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x4 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x5 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x6 = int( tmpx % 2 ) ; tmpx = tmpx / 2 ;
  x7 = int( tmpx % 2 ) ;
  # inverse
  x0 = xinverse(x0) ; x1 = xinverse(x1)
  x2 = xinverse(x2) ; x3 = xinverse(x3)
  x4 = xinverse(x4) ; x5 = xinverse(x5)
  x6 = xinverse(x6) ; x7 = xinverse(x7)
  # calculate
  result = 0 ;
  result = result * 2 + x7 ; result = result * 2 + x6
  result = result * 2 + x5 ; result = result * 2 + x4
  result = result * 2 + x3 ; result = result * 2 + x2
  result = result * 2 + x1 ; result = result * 2 + x0

  return result
}

{
  # get 8 bytes data
  dats = $1
  # calculate data
  sum = 0 
  for ( i = 0 ; i < 8 ; i++ ) {
    stmp = substr(dats,2*i+1,2)
    sum += s2d( stmp )
  }
  # generate entry address
  xadr = 8 * (NR-1)
  xadrh = xadr / 256
  xadrl = xadr % 256
  # data count
  sum += 8
  # address high
  sum += xadrh
  # address low
  sum += xadrl
  # get 8 bits
  sum %= 256
  # 2's complement
  sum = bnot(sum)+1
  # get 8 bits
  sum %= 256
  # show
  printf(":08%04x00%s%02X\n",xadr,dats,sum)
}

 1行に16進で16個のデータを並べたテキストファイルから
 インテルHEXファイルを生成します。作成したHEXファイル
 をROMライターに転送すると、スロースキャンコンピュータ
 で利用する信号を生成できます。

 スロースキャンコンピュータは、時間をROMのアドレスに
 置換してしまえば、任意の時刻に希望の信号を生成して
 システムとしての振舞いをシミュレートできるでしょう。

 カウンタとデコーダを利用したアナログ電圧出力の
 ステップシーケンサもスロースキャンコンピュータ
 に利用できます。




目次

inserted by FC2 system