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