PIC16F1705は、8bit(0~255)のDAコンバータ(DAC)を内蔵しています。
そのDACを利用して、1000Hzの三角波を作り、内蔵OPアンプ1(ボルテージフォロア接続)に接続して、出力してみます。
正確なクロックを得るために外部クロックとし、20MHzのクリスタルオシレータの信号をRA5(CLKIN)に入れます。
TMR2割り込みを利用して、10us(100KHz)ごとに割り込みを発生させ、割り込みごとにDACのデータ(DACR)をインクリメント、ディクリメントして、三角波を発生させます。
DACの構造です。(PIC16F1705の説明書より)
DACの設定は、DAC1CON0レジスタで行います。bit7(DAC1EN)=1として、DACを使えるようにします。bit3:2=DAC1PSS=00として、VSOURCE+=VDD(5V)とします。bit0=DAC1NSS=0として、VSOURCE-=Vssとします。DAC1OUT1とDACOUT2は、0として、ピンには出力しません。DAC1_Outputは、OPA1に接続します。
つまり、DAC1CON0=0b10000000 とします。
次に、OPA1の設定です。OPアンプの使い方(ボルテージフォロア)は、当ブログのこちらを参照してください。
OPA1の正入力は、DAC_Outputとしますので、OPA1CH=10としますので、
OPA1CON = 0b10010010 とします。
プログラムです。
---------------------------------------------------------------
#include <stdlib.h>
#include <xc.h>
#pragma config FOSC = ECH //外部クロックHigh Power mode(4?20MHz)
#pragma config WDTE = OFF //ウォッチドックタイマー無効
#pragma config PWRTE = ON //パワーアップタイマーを有効にする
#pragma config MCLRE = OFF //MCLRピンをRA3として使用する
#pragma config CP = OFF //プログラムメモリを保護しない
#pragma config BOREN = ON //ブラウンアウトリセットを有効にする
#pragma config CLKOUTEN = OFF //クロック出力を無効とし、RA4ピンとして使用する
#pragma config IESO = OFF //内部・外部クロックの切り替えでの起動を行わない
#pragma config FCMEN = OFF //外部クロックを監視しない
#pragma config WRT = OFF //フラッシュメモリを保護しない
#pragma config PPS1WAY = OFF //ロック解除シーケンスで何度でもPPSLOCKをセット/クリアできる
#pragma config ZCDDIS = ON //ゼロクロス検出回路無効
#pragma config PLLEN = OFF //×4PLLを動作させさない
#pragma config STVREN = ON //スタックオーバーフローリセットを行う
#pragma config BORV = HI //ブラウンアウトリセット電圧を高(2.7V)に設定
#pragma config LPBOR = OFF //低消費電力ブラウンアウトリセット無効
#pragma config LVP = OFF //低電圧プログラミングを行わない
unsigned char i = 0;
unsigned char j = 0;
TMR2IF = 0; //TMR2IFクリア
DAC1CON1 = j;
if(i <= 50){
j++;
}else{
j--;
}
i++;
if(i == 100){
i = 0;
j = 0;
}
ANSELA = 0b00000000 ; // AN0-AN3は使用しない
ANSELC = 0b00000000 ; // AN4-AN6は使用しない
TRISA = 0b00100000 ; // RA5は入力、他は出力
TRISC = 0b00000000 ; // PORTCは全て出力
PORTA = 0b00000000 ; // PORTA初期化
PORTC = 0b00000000 ; // PORTC初期化
/* OPアンプ1設定 */
OPA1CON = 0b10010010; // OPA1EN=1,OPA1UG=1,OPA1CH=10=DAC
/* DAC設定 */
DAC1CON0 = 0b10000000; // DAC1EN=1,DAC1OE1=0,DAC1OE2=0,DACPSS=00=Vdd
TMR2IE = 1; //TMR2割り込み許可
PEIE = 1; //周辺割り込み許可
GIE = 1; //全割り込み許可
/* PR2の計算
* PR2=(Fosc/(Fout×4×TMR2 Prescaler Value))-1
* =((20000000/(100000×4×1))-1
* =49
*/
PR2 = 49; //TMR2出力周波数100KHz
T2CON = 0b00000100; //prescaller 1:1,postscaler1:1, TMR2 start
while(1){
}
}
---------------------------------------------------------------
TMR2から10usごとに割り込みがかかり、その都度jの値をインクリメントします。jが50を超えたらディクリメントします。iは割り込みの度にインクリメントされi=100になったら、i=0,j=0とします。これで三角波ができます。
DACの出力電圧の最高値は、5.0×(50/256)=0.98Vです。
実際に発生した波形です。
一部を拡大してみます。ピークは、0.97Vです。
階段状になると思ったのですが、かなりギザギザしています。
周波数を測定してみました。
1周期は、10us×100=1000us=1msですから、1000Hzです。実測値も1000Hzです。
工夫すれば、いろいろな波形を作れそうです。
※コメント投稿者のブログIDはブログ作成者のみに通知されます