PIC16F1705内蔵D/Aコンバータ(DAC1)モジュール  英文マニュアルP235 22章

詳細なDAC1モジュール使用方法はマニュアルを読んで頂くとして、ここでは基本的な使用パターンを記述させて頂く事とします。
まずは、英文マニュアルP236 図22-1、図22-2を参照して下さい。
そして、この図を見ながら読んで下さい。

(1)D/Aコンバータの基本事項
 1)DAC1モジュールの入力・分解能・出力
   図の通り、Vsource-からVsource+までを256ステップの分解能で電圧出力します。
   DAC1入力である、「DAC1CON1」に8bitデータを書き込む事で、擬似正弦波等を発生させる事ができます。
   もちろんDAC1出力(DAC1OUTx)は高入力抵抗の電圧バッファで受ける必要があります。

 2)DAC1の出力電圧
  ①参照出力電圧 Vsource+
    プラス側電圧は、下記の3種類から選択できます。
   ・外部Vref+ピン
   ・VDD
   ・FVR出力(FVR BUFFER2)
  ②参照出力電圧 Vsource-
    マイナス側電圧は、下記の2種類から選択できます。
   ・外部Vref-ピン
   ・VSS

 3)DAC1制御レジスタ

  ①DAC1CON0:DAC1制御レジスタ0 (BANK2)

    bit7     DAC1EN:DAC1イネーブルビット
             1=DAC1を有効にする
             0=DAC1を無効にする
    bit6     未実装(read as 0)
    bit5     DAC1OE1:DAC1出力電圧1イネーブルビット
             1=DAC1電圧レベルをDAC1OUT1ピンにも出力する
             0=DAC1電圧レベルをDAC1OUT1ピンから切り離す
    bit4     DAC1OE2:DAC1出力電圧2イネーブルビット
             1=DAC1電圧レベルをDAC1OUT2ピンにも出力する
             0=DAC1電圧レベルをDAC1OUT2ピンから切り離す
    bit3-2   DAC1PSS:DAC1正入力選択ビット
            11= 予約
            10= FVRバッファ2出力
            01= Vref+ピン
            00=VDD
    bit1     未実装(read as 0)
    bit0     DAC1NSS:DAC1負入力選択ビット
             1= Vref-ピン
             0= VSS

  ②DAC1CON1:DAC1制御レジスタ1 (BANK2)

    bit7-0   DAC1入力データ


(2)オペアンプモジュール   英文マニュアルP232 21章
   PIC16F1705にはオペアンプが2個内蔵されています。(それぞれOPA1とOPA2と呼ぶ)
   こんなデジタルIC内部に高ゲインのアナログアンプが内蔵されている事に少々驚きましたが・・・
   今回はこれの内、OPA2をDAC1出力の電圧バッファとして使用します

 1)OPAx制御レジスタ

  ①OPAxCON:OPA1、OPA2制御レジスタ  (BANK10)
    bit7     OPAxEN:オペアンプ イネーブルビット
             1= OPAxを有効にする
             0= OPAxを無効にする
    bit6     OPAxSP:オペアンプ速度/消費電力選択ビット
             1= オペアンプを高GBWPモードで動作させる
             0= オペアンプを低GBWPモードで動作させる
    bit5     未実装(read as 0)
    bit4     OPAxUG:オペアンプ ユニティゲイン選択ビット
             1= オペアンプ出力を反転入力に接続する。OPAxIN-ピンは汎用I/Oとして使える
             0= 反転入力をOPAxIN-ピンに接続する
    bit3-2  未実装(read as 0)
    bit1-0   OPAxCH:非反転チャンネル選択ビット
            11= 非反転入力にFVRバッファ2出力を接続する
            10= 非反転入力にDAC1OUTPUT出力を接続する
            01= 非反転入力にOPAxIN+ピンに接続する
            00= 非反転入力にOPAxIN+ピンに接続する


(3)FVRモジュール(固定参照電圧モジュール)

 1)FVR制御
  ①FVRCON FVR制御レジスタ (BANK1)
    bit7     FVREN FVRイネーブルビット
             0= FVRを無効にする
             1= FVRを有効にする
    bit6     FVRRDY FVRレディ フラグビット(実際は読みだしても常に1のまま)
             0= FVRは安定していないか、無効
             1= FVRは使用可能
    bit5     TSEN 温度インジケータ イネーブルビット
             0= 温度インジケータを無効にする
             1= 温度インジケータを有効にする
    bit4    TSRNG 温度インジケータ レンジ選択ビット
             0= VOUT=VDD-2VT(Lowレンジ)
             1= VOUT=VDD-4VT(Highレンジ)
    bit3-2  CDAFVR FVR BUFFER2制御ビット(コンパレータ、DAC1への出力用)
            00= FVR BUFFER2 OFF
            01= FVR BUFFER2 出力 1.024V
            10= FVR BUFFER2 出力 2.048V
            11= FVR BUFFER2 出力 4.096V(VDD=5V時)

    bit1-0  ADFVR FVR BUFFER1制御ビット(ADCへ出力用)
            00= FVR BUFFER1 OFF
            01= FVR BUFFER1 出力 1.024V(ADCではサポートされていないが使える場合もある)
            10= FVR BUFFER1 出力 2.048V
            11= FVR BUFFER1 出力 4.096V(VDD=5V時)

 2)今回の使用設定
   DAC1出力の電圧バッファとして使用し、出力は約1Vppとしますので、下記の設定としました。
   出力はRC2からのアナログ出力となります。
  ① FVREN=1
  ② TSEN=0
  ③ CDAFVR=01
  ④ ADFVR=00

(3)今回のDAC制御 プログラムの実際の流れ

 1)DAC制御プログラム
  ①制御ルーチン
    DAC1制御ルーチンVer1.0を使用します
    よって、これは割り込み処理エリアに鎮座します。
    このISRと波形データの詳細はここを参照してください。
  ②DAC運用データ
    DAC出力はY軸(電圧軸)は256ドット、X軸(時間軸)は64ドットの分解能で動作させます。
    出力波形は擬似サイン波で、「TBL64」のラベルで指定されるデータ領域から持ってきます。
    これをTMR0によるインタバル割り込みでDACルーチンを駆動します。
    よって、割り込み時間間隔によって生成周波数が決定します。

 1)初期設定
   ①RC2、3を入力(TRIS bit2=1)でアナログ(ANSELC bit2=1)
   ②ADCON1の各ビット設定(前回とまったく同じ)
     ADFM=0 生成データは右詰で格納
     ADCS=010 Fosc=32MHZ、ADCクロック周期1us
     ADPREF=00 VREF=VDD(5V)
   ③FVRCONの各ビット設定
     FVREN=1   FVRをイネーブルにする
     FVRRDY=0
     TSEN=0    温度インジケータを無効
     TSRNG=0
     CDAFVR=01 DACへ1.024Vの電圧供給をする
     ADFVR=00  ADCへの電圧供給はOFF
   ④DAC1CON0の各ビット設定
     DAC1EN=1   DACをイネーブルにする
     DAC1OE1=0
     DAC1OE2=0
     DAC1PSS=10 DACの正入力をFVRにする
     DAC1NSS=0  DACの負入力をVSSにする
   ⑤OPA2CONの各ビット設定(OPA2出力はRC3ピンとなり、アナログ入力に設定しておきます)
     OPA2EN=1
     OPA2SP=1
     OPA2UG=1
     OPA2CH=10

 2)DAC1処理サブルーチン
    これはインタラプト・サービス・ルーチン(ISR)に記述します。
    ソースファイルのISR部を参照してください
   ①使用ワークレジスタ設定
     ここで使用する変数は共通RAMエリアの70H~7FHを使用します。
     DAC1CON0レジスタがBANK2にあるため、バンク切り替えを避けるためです。
    a)DCR:TMR0リスタートデータが保存されています。
           ISR終了時にこの値をTMR0に書き込みます。
    b)DCX:X軸カウンタ、0~DCM値までをカウントし、DCM値に達するとゼロに戻ります。
    c)DCM:X軸分解能設定値で、今回は64です。

   ②DAC1CON1へ書き込み
     DCX値からFSR1レジスタを使用して、TBL64からDACデータを読み込み、DAC1CON1に書き込み
     FSR1はISRに来る度に「TBL64」の間接アドレス先頭を指示してします。
     よって、FSR1とDCXを加算する事で、目的のDACデータを指示します。
     後はINDF1を介してデータを読み込み、すぐDAC1CON1に書き込みます
     DCX値のカウント処理を行います

   ③ISR終了処置
     TMR0にリスタートデータ、すなわちDCR値を書き込みます
     INTCONレジスタのTMR0IFフラグをクリアします。

ソースファイルの作成

前回のA/Dコンバータのソースファイルを「PIC_START_PROG02_ADC.asm」としていました
これを「PIC_START_PROG03_DAC.asm」とリネームして保存しました。
ここから、ISRの全書き換え、「TBL64」のデータ追加、その他小変更、で完成です。
動作は、「ボリウムを回すと生成周波数が変化する」、これだけです・・・
これを発展させたのが、「PIC_低周波生成器」、さらに発展させたのが、「PIC_MUSIC」となります。
それらもまだまだ発展途上のプログラムですが、興味がありましたら覗いてみてください。

(画像1) ソースファイルの作成

前回のソースファイルを名前を変えて保存
それを登録しました

(画像2) データRAMの定義

この辺は以前のままでもOKです。

(画像3) データRAMの定義

DAC制御用に70H~の共通RAM領域を使用します。
これが今回追加のRAM定義です。

(画像4) 割り込みルーチンのプログラム

以前の割り込みソースコードは削除します。
左記の様にプログラムします。

(画像5) レジスタ設定 その1

(画像6) レジスタ設定 その2

(画像7) レジスタ設定 その3

(画像8) メインプログラム

(画像9) DAC制御用の変数設定

(画像10) TBL64データ領域

擬似サイン波生成用のデータテーブルです。
全データはソースファイルを参照して下さい
TBL16~TBL128まで記載されていますが、TBL64のみ使用します
ここのデータを変えると、サイン波以外の波形も生成可能ですが・・・
アッセンブラ・ソースファイル

 PIC_START_PRG03_DAC.asm




(画像11) システム全体像

前回のLED制御からフルカラーLEDを外し、低周波アンプを付けただけ

(画像12) CPUモジュール

左側のRC3ピンにアンプ入力を接続
右側のRC2ピンにボリウムを接続(前回と変化なし)

(画像13) 実験用ミニパワーアンプ 5Vでも動作します。

言わずと知れたLM386で、最低限の(20dB)の利得で動作
その分回路は簡単で安定動作します。
高利得での動作は発振し易く、対策回路が必要です。
PICキット用アンプとしては低利得が良いです。
戻る  実験・製作の記録TOPへ戻る