home1.gif

next1.gif
back1.gif
 

D/A converter

 

基礎編
 PORT入出力
 シリアル通信
 タイマー機能
 A/Dコンバータ
 D/Aコンバータ
 外部割り込み
 液晶モニタ

応用編
 アウトプットコンペア
 インプットキャプチャ
 SRAM増設

Tips
 関数集
 シリアルEEPROM
 20桁×4行液晶モニタ
  (SC2004C)
 加速度センサを読む

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を独立に制御
    }

 

 
home1.gif
 next1.gif back1.gif