目次
前
次
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つの処理が必要。
- シフトレジスタに8ビットデータを転送
- 8ビットデータをD/A変換ICに転送
シフトレジスタ74HC164は、データ入力にA、Bの2ピンを
持っています。A、Bの2ピンには、同じデータを与えます。
データシフトにはクロックが必要なので、データとクロック
の2信号をATmegaチップの2ピンに接続。
結線は、以下。
74HC164が出力している8ビットデータを
D/A変換ICに転送するには、2信号が必要。
結線は、以下。
D/A変換した電圧を出力するためのシーケンスは
次のようにすればよいでしょう。
- DACのnCS、nCE(PB3,PB2)をともに'H'に設定
- PB0、PB1を利用し、8ビットデータを74HC164に転送
- DACのnCS、nCEをともに'L'に設定
- DACのnCEを'H'(PB2)に設定
- 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のプログラムを扱うことと等価。
目次
前
次