はじめに
モータードライバを電圧制御するため、DACを搭載しているArduino DUEを使用しています。
電圧制御するにあたり、このDUEのDAC、精度がどの程度あるのかを調べてみました。
(というよりも、DACに0設定しても0V出力となっていなさそうだったので・・・)
環境
接続はDAC0端子とA0端子の直結です。
コード
10bit精度で0~992まで32dec刻みでanalogWriteしてみます。
analogWrite→500ms待機→analogRead→Serial.printの繰り返しです。
『DAC0書き込み値 / A0読み出し値』を10進数で表示しています。
int setval;
void setup() {
Serial.begin(9600);
setval = 0;
analogWriteResolution(10);
}
int val;
void loop() {
Serial.print("setval / readval = ");
analogWrite(DAC0, setval);
delay(500);
val = analogRead(A0);
Serial.print(setval);
Serial.print(" / ");
Serial.println(val);
setval = (setval + 32) % 1024;
}
結果
analogWriteで0を書き込んでもDA結果は0V付近ではないですね。。
DUEは3.3V駆動なので、
オフセット誤差は165dac = 0.53V付近
フルスケール(じゃないけど)誤差は(992-829)dec = 0.52V付近
でしょうか。
setval / readval = 0 / 165
setval / readval = 32 / 186
setval / readval = 64 / 208
setval / readval = 96 / 229
setval / readval = 128 / 251
setval / readval = 160 / 272
setval / readval = 192 / 293
setval / readval = 224 / 315
setval / readval = 256 / 337
setval / readval = 288 / 358
setval / readval = 320 / 380
setval / readval = 352 / 401
setval / readval = 384 / 422
setval / readval = 416 / 444
setval / readval = 448 / 465
setval / readval = 480 / 487
setval / readval = 512 / 508
setval / readval = 544 / 530
setval / readval = 576 / 550
setval / readval = 608 / 572
setval / readval = 640 / 594
setval / readval = 672 / 615
setval / readval = 704 / 637
setval / readval = 736 / 658
setval / readval = 768 / 679
setval / readval = 800 / 701
setval / readval = 832 / 723
setval / readval = 864 / 743
setval / readval = 896 / 765
setval / readval = 928 / 787
setval / readval = 960 / 808
setval / readval = 992 / 829
グラフにするとこんな感じ