目次

D/A処理

 AmForthインタプリタを動かすATmegaチップには
 D/A変換器が内蔵されていません。

 外部に8ビットD/A変換IC(DAC)を接続し、Forthで制御してみます。

 D/A変換ICは、デジタル値を渡すため、インタフェースを
 パラレルかシリアルのどちらかを選ばないといけません。

 ピン数の少ないATmegaチップでは、シフトレジスタICを
 利用し、パラレルインタフェースをシリアルに変換して
 扱うことに。

 パラレルインタフェースのD/A変換IC(DAC)は、手持ちの
 あったAD558JNを使ってみます。



 シフトレジスタに、74HC164を使った基板は以下。



 D/A変換ICにデータを渡すために、2つの処理が必要。

 シフトレジスタ74HC164は、データ入力にA、Bの2ピンを
 持っています。A、Bの2ピンには、同じデータを与えます。

 データシフトにはクロックが必要なので、データとクロック
 の2信号をATmegaチップの2ピンに接続。

 結線は、以下。



 74HC164が出力している8ビットデータを
 D/A変換ICに転送するには、2信号が必要。

 結線は、以下。



 D/A変換した電圧を出力するためのシーケンスは
 次のようにすればよいでしょう。
  1. DACのnCS、nCE(PB3,PB2)をともに'H'に設定
  2. PB0、PB1を利用し、8ビットデータを74HC164に転送
  3. DACのnCS、nCEをともに'L'に設定
  4. DACのnCEを'H'(PB2)に設定
  5. DACのnCSを'H'(PB3)に設定
 ポートBを、すべて出力に設定するため、ワードを定義。 : init.pb $03 PORTB c! $ff DDRB c! ;  8ビットデータを74HC164へ転送するワードを定義します。  8ビットをMSBからLSBにむけてシフトしながらPB0に印加。  1ビットをPB0に出力後、PB1にL→H→Lでクロックを印加。 : put.dac 8 0 do i 7 - abs \ calculate (7-i) over \ (x 7-i -- x 7-i x) swap rshift 1 and \ get target bit PORTB c@ $fe and or PORTB c! \ send 1 bit to PB0 PORTB c@ $02 or PORTB c! \ send 'H' to PB1 PORTB c@ $fd and PORTB c! \ send 'L' to PB1 loop drop ;  シフトレジスタへのデータ転送用ワードができたなら  シーケンスを実行するワードを定義します。 : send.dac init.pb PORTB c@ $0c or PORTB c! \ (PB3,PB2)=(H,H) put.dac PORTB c@ $0c xor PORTB c! \ (PB3,PB2)=(L,L) PORTB c@ $04 or PORTB c! \ (PB3,PB2)=(L,H) PORTB c@ $08 or PORTB c! \ (PB3,PB2)=(H,H) ;  使い方は、以下。 127 send.dac{enter}  出力電圧は、DACに与える参照電圧になります。  次のように電圧を与えることに。  回路図は、以下。  三角波をDACから出力したいようなときには、0から255を  直線的に増加させる処理と255から0まで減少させる処理を  ワードで定義することになります。  テーブル参照方式でワードを書くと、以下。 : snd.tri 0 send.dac 1 ms 1 send.dac 1 ms 3 send.dac 1 ms 7 send.dac 1 ms 15 send.dac 1 ms 31 send.dac 1 ms 63 send.dac 1 ms 127 send.dac 1 ms 255 send.dac 1 ms 127 send.dac 1 ms 63 send.dac 1 ms 31 send.dac 1 ms 15 send.dac 1 ms 7 send.dac 1 ms 3 send.dac 1 ms 1 send.dac 1 ms ; : gen.tri begin snd.tri key? until :  もう少しエレガントな方法は、cellを利用した配列を  確保して、値を格納してから、ワードsend.dacを利用  します。  知っている内容だけでのワード組合せで対応できる  スキルを磨く方が、後々、応用が利きますが。  三角波を生成する他に、D/A変換器で電圧を10Vくらいから  下げていくと、VCO(Voltage Controlled Oscillator)を  実現できます。  回路は、以下。  バリキャップ(可変容量ダイオード)に与える逆電圧を  変化させることで、発振周波数を変化させられます。  電圧の変化が必要な部位にD/A変換器を接続して  アナログからデジタルに制御方法を変えます。  アナログ回路の制御をデジタルで担当する応用には  D/A変換器を使うのが、最も簡単。  R-2Rの抵抗ラダーとOPアンプの組合せでも  精度を気にしなければ、D/A変換が可能です。  D/A変換器を実現するには、8ビットから16ビットほどの  レジスタを用意すると、そのレジスタへの値転送の方法  を考えることが、Forthのプログラムを扱うことと等価。

目次

inserted by FC2 system