DA変換

  1. DA変換

    1. DA変換とは

      DA変換はDigital Analog Cinversion で ディジタル値をアナログな電圧に変換します。AD 変換(Analog Digital Conversion )と逆の操作になります。 ディジタル処理された結果を人の五感で認知できるようにするにはこのDA変換が必要です。
       ディジタル記録されたスピーカで音にする、画像を可視化するにはこのDA変換が必要です。

    2. DA変換の実際

      8ビットのディジタル値を0〜5Vの電圧に変換する場合を考えます。ディジタル値の最小の値を00000000、最大の値を 11111111 とします。00000001 に対するアナログ電圧は、255種の8ビットのディジタル値を等分割した、5/255=0.0196=0.02[V] となります。01111111は127番目の値ですから、 5*127/255=2.49[V] となります。

      ディジタル アナログ(V)
      11111111 5
      11111110 4.98
      01111111 2.49
      00000001 0.02
      00000000 0

      このようにディジタル値に比例したアナログ値に変換することをDA変換といい、アナログ値を電圧で発生する回路をDA変換回路といいます。

    3. DA変換素子

      DA変換回路を集積化した素子があります。ここでは、DAコンバータとしてAD557を紹介します。これは、5V単一電源で動作する8ビットDAコンバータです。1ピンから8ピンにディジタル信号を接続します。ただし、8ピンがLSB(最低桁)ですからPICのRB0に接続します。BITの番号付けが逆ですから注意してください。11ピンと、12,13ピンに電源を接続します。電圧の範囲は4.5〜5.5、電流は20mA程度です。



      9,10はこのチップを有効にする制御信号で、共に0にすれば、ディジタル信号のアナログ値がVout(16ピン)に出力されます。VoutSENSEAとVoutSENSEBは出力のレベルを設定する場合使用します。ここでは、両者を Vout に接続します。この場合出力は 0Vから 2.5V の範囲になります。

  2. 正弦波生成システム

    1. 回路構成

      PICにAD557を接続します。PICのB7とAD557のBIT1を接続します。AD557のBITの順が逆になっていることに注意してください。AD557の電源は11ピンに5V、12,13ピンがグランドです。
       出力は、VOUT(16ピン)ですが、VoutSAとVoutSBもVOUTに接続します。VoutSAとVoutSBは出力の電圧範囲を調整する場合に使用します。この接続で、出力は0V〜2.5V の変化をします。


      出力をスピーカに接続して音として聴く場合は、VOUTをアンプ回路に接続します。

    2. プログラム


       ここでは、DA変換機能を利用して正弦波を出力します。まず、wav[65] の配列に1周期分の正弦波の値を記録しておきます。関数の sin() を利用しますから、#include <math.h> で関数定義を読み込んでおきます。
      sin()の値を127倍すると、-127〜+127 になります。これに、128を加えると、0〜255 の範囲の整数になります。実際には次のようなプログラムになります。

      for(i=0;i<=64;i++){ wav[i]=(int)(127.0*sin(2.0*3.14*i/64.0)+128.0); }

      この値は、予め、計算して配列に記録しておく必要があります。PIC873は、整数の掛け算回路もソフトで計算します。少数やsin()の計算もすべてプログラム処理になります。したがって、sin() の計算を行うには ミリ秒程度の計算時間がかかってしまいます。複雑な計算は予め行い、配列に記憶しておけば、実際の処理では配列の値を読むだけで値を取得できます。
       while() ループの中の for の繰り返しで予め計算した配列 wav[] の値を ポートB に出力します。この値は、ポートBni接続された AD557 でアナログ電圧に変換され正弦波として出力されます。正弦波の周期は、for() ループの中の遅延関数 delay_us(35) で決定されます。これは、35マイクロ秒の遅延で、64回の繰り返しで1周期ですから、2.24m秒 の周期です。これは周波数にすると、約440Hz(Hzはヘルツ:周波数の単位)になります。これは、音程ではラの音で時報の音の高さになります。

      //AD557 8bits DAConverter
      
      //PB7>D1 .. PB0>D0 注意:DACのBIT8をPB0へ
      //PA1>CE,PA2>CS,
      //Vout>VoutSemceA>VoutSenceB
      //Vout 0..2.5V
      
      #include <16F873A.h>
      #include <math.h>
      
      #fuses HS,NOWDT,NOLVP,BROWNOUT,PUT
      #use  delay(CLOCK = 20000000)
      #use fast_io(B)
      #use fast_io(A)
      
      int i;
      int wav[65];
      
      void main()
      {
      
        set_tris_b(0x00);
        set_tris_a(0xfe);
        
        for(i=0;i<=64;i++){
                wav[i]=(int)(127.0*sin(2.0*3.14*i/64.0)+128.0);
        }
        
        while(1){
              output_high(PIN_A0);
              
              for(i=0;i<=64;i++){
                output_b(wav[i]);
                delay_us(35);
              }
              
              output_low(PIN_A0);
        }
      }