|
D/Aコンバータ
イントロダクション 何度も言うように、マイコンはデジタルコンピュータです。そのチップに向かって「2Vちょうだい」と言ってもそれは無理な相談です。だから普通はD/A変換の専用チップが安い物では200円くらいで売られているのですが、これまた幸いにもH8/3048Fには2つだけですがD/Aコンバータが内蔵されています。
出力できる電圧は標準では0〜5V、しかるべき改造を施せば(VREFを設定する)特に制限は無くなります。分解能は8ビットです。A/D変換は10ビットなのにD/Aは8ビットって不思議ですね。ポート数も少ないし、オマケみたいな位置づけなのでしょうか。
至って手軽にアナログ電圧が出力できるのは嬉しいのですが、少々悲しい側面もあります。これもまた変換に結構時間が掛かってしまうのです。具体的数値で言うと、最大で10μsec必要です。せめてもの救いは、D/A変換の場合は出力のみの一方通行ですから、その間CPUの動作が止まってしまうわけではないと言うことでしょうか。ただ、やはり超高速性が求められる作業の時には外部接続のD/Aコンバータを使うことになるかも知れません。
D/Aコンバータを使う 同じようでいて全て種類の違うサンプルファイルを作るのって結構疲れますね。でも頑張って作りました。このファイルをダウンロードしてください。
今回はA/D変換の時よりもずっと簡単です。まずはメインルーチンから。
| main.c
void main(void) { P2.DDR
= 0x00; //
Port-2は入力設定 P2.PCR.BYTE
= 0xff; //
Port-2をプルアップ
initDAC();
//
D/Aポート初期化
while(1){ DA.DR0
= P2.DR.BYTE; //
DA0の出力 DA.DR1
= !P2.DR.BYTE; //
DA1の出力 } }
|
今度はPort-2に繋いだ8個のスイッチからの入力を8ビットの数値入力とし、それをD/Aポートの0番と1番(Port7-6,7)から出力します。両方そのまま出しても面白くないので、片方は数値を反転させてみました。
初期化ルーチンはこうなります。
| main.c
void initDAC(void) { DA.DR0
= 0x00; //
DA channel0の出力を0に設定 DA.DR1
= 0x00; //
DA channel1の出力を0に設定 DA.CR.BIT.DAOE1
= 1; //
DA channel0の出力を許可 DA.CR.BIT.DAOE0
= 1; //
DA channel1の出力を許可 DA.CR.BIT.DAE
= 0; //
DA channel0,1を独立に制御 }
|


|