LGT8F328PのDACを使ってみる

LGT8F328PのDACを使ってみました。ATmega328Pの互換MCUであるLGT8F328Pには、機能追加が施されています。追加された機能の一つがDACです。分解能は8ビットで、高性能とは言えません。しかし、簡易な信号発生器としては使えると思います。
今回は、LGT8F328Pを搭載したArduino NANO互換機で、DACを使用するスケッチを描いて、動かしてみます。
ボードマネージャーについて
スケッチを作るために、Arduino IDEを使用します。しかし、素のArduino IDEでは、LGT8F328P用のスケッチを作ることはできません。そこで、LGT8F328P用のボードマネージャーを追加する必要があります。
LGT8F328Pのボードマネージャーは複数あります。LGT8F328P製造元が配布しているボードマネージャーもあります。しかし、ここではArduinoとの互換性が高い、GitHubのLGT8Fxプロジェクトのものを使用します。
LGT8F328PのDACを使用するための基礎知識:基準電圧
DACを使うには、基準電圧について知っておく必要があります。DACを使用する場合、フルスケールでの出力電圧を決めなければなりません。LGT8F328P内蔵DACは8ビットです。つまり、16進数で0x0~0xFF(10進数で0~255)を出力することができます。
DACポートをフルスケール(255)にした時に、出力ピンが何ボルトになるのかを決めるのが基準電圧です。LGT8F328Pは、3つの基準電圧を内蔵しています。その他、リファレンスピンの電圧を使う方法と、電源電圧(VCC)を基準電圧とする方法が用意されています。
スケッチ上では、あらかじめ用意されたキーワードを、analogReference関数の引数に設定するだけです。あらかじめ用意されたキーワードと、基準電圧の対応は以下のとおりです。
定義済みキーワード | 基準電圧 |
DEFAULT | VCC(通常は5Vです) |
EXTERNAL | REFピンに印加した電圧 |
INTERNAL1V024 | 1.024V |
INTERNAL1V1 | LGT8F328Pでは使用不可 |
INTERNAL2V048 | 2.048V |
INTERNAL2V56 | LGT8F328Pでは使用不可 |
INTERNAL4V096 | 4.096V |
LGT8F328PのDACを使用するための基礎知識:DACの出力ピン
LGT8F328P搭載Arduino互換機での、DAC出力ピンはD4ピンです。通常、D4ピンはデジタル出力ピンです。そのため、DAC出力ピンとして使用するためには、pinMode関数でのモード設定が必要です。
ピンモード設定は以下の様にします。
pinMode(DAC0,ANALOG);
pinMode関数に与えるピン番号には、D4ではなくDAC0と記述しますので、注意してください。
階段波を出力するスケッチ
試しに、LGT8F328PのDACを使用して、階段波を出力するスケッチを作成してみました。
#define SAMPLES 10
byte table[SAMPLES];
void setup(){
int step=256/(SAMPLES-1);
for (byte i=0;i<SAMPLES;i++){
table[i]=step*i;
}
analogReference(EXTERNAL);
// analogReference(EXTERNAL); // REF PIN voltage
// analogReference(DEFAULT); // VCC Voltage
// analogReference(EXTERNAL); // REF PIN Voltage
// analogReference(INTERNAL4V096); // 4.096V
// analogReference(INTERNAL2V048); // 2.048V
// analogReference(INTERNAL1V024); // 1.024V
pinMode(DAC0,ANALOG);
}
void loop() {
// put your main code here, to run repeatedly:
byte i;
for(i=0;i<10;i++){
analogWrite(DAC0,table[i]);
delay(1);
}
}
LGT8F328Pからの出力波形
出来上がったスケッチを書き込み、出力波形を見てみましょう。
出力波形の観察は、こんな感じで行いました。

出てきた波形がこれです。

出力電圧を10段階に変化させ、各段の出力電圧を1ミリ秒保持するスケッチを描きました。そのため、1サイクル10ミリ秒で実行されます。その結果、100Hzの階段波が出力されています。
基準電圧をEXTERNALとし、3.3VのピンとREFピンをショートしましたので、最大振幅は3.3Vになるはずでした。しかし、測定結果を見ると、最大振幅は3.18Vでした。本来3.3Vになるはずです。しかし、数値の丸め誤差により最大値が252/255となっています。また、NANO互換機の3.3Vレギュレーター出力は、実測3.26Vでした。これら、二つの要因により、出力はすこし低めとなっています。
ちなみに、内蔵の基準電圧で実施した結果を見てみましょう。基準電源の設定をINTRTNAL4V049に変更して測定してみました。

測定結果を見る限り、内蔵基準電圧を使用した方が正確なようです。
LGT8F328P内蔵DACは使い物になるか?
色々と試してみましたが、内蔵の基準電圧が思っていた以上に正確でした。しかし、DACのピット数は限定的です。また、DACの動作速度は、あまり速くありません。そのため、高速動作時に歪が大きくなる傾向が見られました。したがって、音声信号の出力には向いていないと思います。
しかし、アナログ入力と組み合わせて、簡易なマルチメーターを作ることができるかもしれません。その他、FETと組み合わせて、電子ボリュームなんかも作れそうです。色々と応用できそうです。