PIC12F1822は、5ビット(32レベル)のDAC(デジタルアナログコンバータ)モジュールを内蔵しています。
構造の略図を下に示します。簡単な使い方を説明します。
ラダー型のDA変換器の+電源は、FVR(バッファを介して)、VDDそしてVREF+から選択できます。その選択は
DACCON0レジスタのbit3-bit2(DACPSS)で行います。
00 = VDD
01 = VREF+
10 = FVR+BUFFER
11 = 使用不可
です。
DACを有効にするのには、DACCON0のbit7(DACEN)をセットします。
DACの電圧を外部に出力するには、DACCON0のbit5(DACOE)をセットします。電圧は、RA0に出力されます。
DACの出力レベルの選択は、DACCN1のbit4-bit0(DACR)にデータをセットすることによって行います。
5ビットですから0~31までの32段階の出力が可能です。
FVRのBUFFERは、FVRCONのbit3-bit2を10として、×2を選択します。
DACR=0b00010000=16として、+電源の1/2の電圧を出力してみます。
main関数を次のようにしました。(PLLEN ONでクロックは32MHzです)
void main() {
OSCCON = 0b01110000 ; // 内部クロック8MHz
ANSELA = 0b00000000 ; // アナログPORTを使わない
TRISA = 0b00001000 ; // RA3は入力、他はは出力
PORTA = 0b00000000 ; // PORTの初期化
OSCCON = 0b01110000 ; // 内部クロック8MHz
ANSELA = 0b00000000 ; // アナログPORTを使わない
TRISA = 0b00001000 ; // RA3は入力、他はは出力
PORTA = 0b00000000 ; // PORTの初期化
/* DAC関係の設定 */
DACCON0 = 0b10101000; //DACEN=1,DACOE=1,VSOURCE+=FVR
DACCON1 = 0b00010000; //DACR=10000=16
FVRCON = 0b10001000; //FVR有効,CDAFVR=10=FVR*2=2.048V
while(1){
}
}
DACCON0 = 0b10101000; //DACEN=1,DACOE=1,VSOURCE+=FVR
DACCON1 = 0b00010000; //DACR=10000=16
FVRCON = 0b10001000; //FVR有効,CDAFVR=10=FVR*2=2.048V
while(1){
}
}
DACの出力電圧を測定してみました。
2.048 / 2 = 1.024Vですから、1.03Vは誤差1%程度でOKだと思います。
次に、DACRの値を連続して変化させてみます。例として鋸歯状波を発生させてみます。
main関数を次のようにします。(PLLEN ONでクロックは32MHzです)
void main() {
OSCCON = 0b01110000 ; // 内部クロック8MHz
ANSELA = 0b00000000 ; // アナログPORTを使わない
TRISA = 0b00001000 ; // RA3は入力、他はは出力
PORTA = 0b00000000 ; // PORTの初期化
OSCCON = 0b01110000 ; // 内部クロック8MHz
ANSELA = 0b00000000 ; // アナログPORTを使わない
TRISA = 0b00001000 ; // RA3は入力、他はは出力
PORTA = 0b00000000 ; // PORTの初期化
/* DAC関係の設定 */
DACCON0 = 0b10100000; //DACEN=1,DACOE=1,VSOURCE+=VDD
unsigned char count = 0;
while(1){
DACCON1 = count;
count ++;
if(count >= 0b00100000){
count = 0;
}
}
DACCON0 = 0b10100000; //DACEN=1,DACOE=1,VSOURCE+=VDD
unsigned char count = 0;
while(1){
DACCON1 = count;
count ++;
if(count >= 0b00100000){
count = 0;
}
}
波形をpico scopeで見てみました。
プログラムのcount++;の前に10usのdelay(__delay_us(10);)を入れてみました。
斜め部分がほぼ直線になりました。周期は、約350usです。32レベルのギザギザもそれほど目立ちません。
以上から、比較的正確な電圧を外部に出力することができます。また、DACを連続的に変化させることにより、あまり高くない周波数であれば、いろいろな波形を作り出すことができると思います。