8bit D/Aコンバータ 制御プログラム Ver1.0用 解説及び実測データ集

当局内の「PIC16F1705内蔵8bitDAC使用 低周波発生器」で使用している、Timer0割込みによる、DAC制御ルーチン用データ集です。
製作物と同時に公開すれば良かったのですが・・・年月が過ぎた今頃になってしまいました <(_ _)>

このデータの使用条件は下記の通りです。
制御プログラムを1コードでも変更すると、発生周波数が生成表からズレます。
逆に、X’TAL発振器を使い、その発振周波数を校正すると、結構正確な生成周波数となります。
また、生成周波数計算式と実測値は、ほぼ一致します。(アッセンブラのみ)

①PIC16F17xxシリーズの8bitDAC1モジュール(実験はPIC16F1705で行っている)
②システムクロックは32MHZ
③DAC制御用割込みルーチンVer1.0を使用している
④Timer0インタバル割込みを使用している


DAC出力相対電圧計算式

Y軸は出力電圧ですが、Vrefによって変わりますので、相対値となります。
X軸は1周期の分解能で360/128度、360/64度、360/32度、360/16度の4種類を用意
128分解能の場合、X軸は2度ずつ進行します。
64分解能の場合は、4度ずつ、32分解能では8度ずつ、16分解能では16度ずつと、だんだん租くなります

グラフは、 Y=127SIN(X-90)+127 で表します。
    ※ XはDegree

それぞれのX座標値に対するY座標値を予め計算値の近似値を求めています。(注1)
そのY座標近似値データを、「TBL128」、「TBL64」、「TBL32」、「TBL16」と言うラベルで、データテーブルを作成しています。
TBLxxxのデータはソースファイルを参照してください

注1)Yの値
   8bitDACなので、Yは0~255の整数となる
割込み処理ルーチン(ISR)内、DAC制御ソース コード Ver1.0

 INT
     MOVLB 02H           ←START (DAC関連レジスタのBANK)
     INCF   DCX,F         ←X軸進行カウンタ
     MOVF  DCX,W        
     ADDWF FSR1L,F       ←Y座標値を「TBLxxx」からアクセス(注1)
     MOVF  INDF1,W        間接アクセスは2cyc
     MOVWF DAC1CON1     ←Y座標値をDAC書込み
     MOVF  DCM,W        ←X軸分解能設定値
     XORWF DCX,W        ←X軸カウンタが分解能設定値に達したかのチェック
     BTFSC STATUS,Z      
     CLRF  DCX           
     MOVLB 0H            ←TMR0関連BANK
     MOVF  DCR,W        ←TMR0リスタート データ
     MOVWF TMR0          ←TMR0設定値書込み
     BCF   INTCON,TMR0IF  ←TMR0オーバーフローフラグ クリア
     RETFIE

注1)「TBLxxx」 Y座標値のアクセスについて
FSR1そのものは16bitですが、その下位ビットFSR1Lは8bitなので0~255です。
そのアドレス数値が8bit範囲からオーバーフローした場合はFSR1Hに桁上げしなければなりません。
所が8bitDACなので、Y座標値数は0~最大255までしかありません。
なので、「TBLxxx」アドレス開始位置を切り良くxx00Hからにする事等で、桁上げ処理を省略しています。


生成周波数の計算について

(1)割込みルーチン(ISR) 15インストラクション(INDFは2cyc) 0.125us/cyc(Fosc=32MHZ)

 A) 割り込みレイテンシ
  ↓ 3cyc
 B) START
  ↓ 7cyc A+B=10cyc
 C) DAC書込み
  ↓ 7cyc
 D) TMR0書込み(不感2cyc後にカウント開始)
  ↓
 E) その他ISR内処理(生成時間には関与しない)
  ↓
 F) TMR0カウントアップ(TMR0オーバーフロー割り込み発生)
  ↓
 G) 割り込みレイテンシ
  ↓ 3cyc
 H) START
  ↓ 7cyc
 I) DAC書き込み

(2)生成周波数計算方法

ここで、生成周波数は、(( C ~ I )×周期分解能)の逆数となる

TMR0カウント サイクルは、
 ((256-TMR0)×PS-1)
 PS値は1,2,4,8,16等の整数を代入(1/2、1/4では無い)

ISR内コード実行消費サイクルは、
 (C-I)間コード実行 17sys
 TMR0不感期間 2sys
 1sys=Fosc/4=0.125us

「TBLxxx」による1周期(1波形)完成するには、
 TBL128では128回ISR実行
 TBL64では64回ISR実行
 TBL32では32回ISR実行
 TBL16では16回ISR実行

以上より生成周波数(F)の計算式は、

 F = 1 ÷ ((((256-TMR0)PS-1)+17+2)0.125us)TBL

 F = 10の6乗 ÷ (((256-TMR0)PS+18)0.125)TBL

補足)
 TMR0値は、0から最大254までで、255は使えない、250程度までとするのが無難
 TBL値はTBL128の時は128、以下同様
 PS値はPS=1の時は1、PS=1/2の時は2、以下同様
生成周波数表(WORDファイル)


 PIC16F1705DAC_AF生成表.doc


補足事項
TMR0値:実際にTMR0レジスタにISRにて挿入する設定値
周波数 :これはIWATSU SS7821オシロスコープ内臓の5桁周波数カウンタで測定したものを表示
      上記計算値と、ほぼ整合します。
プログラム:pic16f1705_afgen01.asm内、DEBUG05で動作させて測定しています。
       詳細は「PIC16F1705内臓8ビットDAC使用 低周波発生器の製作」を参照してください
WORD:OFFICE2000のワードを使用しています・・・ 古くて恐縮です (-_-;)


戻る  実験・製作の記録TOPへ戻る