PICキット スタートマニュアル9
アナログI/O制御の基本プログラミング その2
D/Aコンバータを使ってみる(アッセンブラ)編
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フラグをクリアします。
詳細な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」となります。
それらもまだまだ発展途上のプログラムですが、興味がありましたら覗いてみてください。
前回のA/Dコンバータのソースファイルを「PIC_START_PROG02_ADC.asm」としていました
これを「PIC_START_PROG03_DAC.asm」とリネームして保存しました。
ここから、ISRの全書き換え、「TBL64」のデータ追加、その他小変更、で完成です。
動作は、「ボリウムを回すと生成周波数が変化する」、これだけです・・・
これを発展させたのが、「PIC_低周波生成器」、さらに発展させたのが、「PIC_MUSIC」となります。
それらもまだまだ発展途上のプログラムですが、興味がありましたら覗いてみてください。
(画像10) TBL64データ領域
擬似サイン波生成用のデータテーブルです。
全データはソースファイルを参照して下さい
TBL16~TBL128まで記載されていますが、TBL64のみ使用します
ここのデータを変えると、サイン波以外の波形も生成可能ですが・・・
擬似サイン波生成用のデータテーブルです。
全データはソースファイルを参照して下さい
TBL16~TBL128まで記載されていますが、TBL64のみ使用します
ここのデータを変えると、サイン波以外の波形も生成可能ですが・・・
(画像13) 実験用ミニパワーアンプ 5Vでも動作します。
言わずと知れたLM386で、最低限の(20dB)の利得で動作
その分回路は簡単で安定動作します。
高利得での動作は発振し易く、対策回路が必要です。
PICキット用アンプとしては低利得が良いです。
言わずと知れたLM386で、最低限の(20dB)の利得で動作
その分回路は簡単で安定動作します。
高利得での動作は発振し易く、対策回路が必要です。
PICキット用アンプとしては低利得が良いです。