手持ちのArduinoDueでDACとADCを測定してみた

 だいぶ前買ったDue(互換品を注文したつもりが正規品が来た感じ)が手元にあったので、DAC0→A0直結して測定してみた。参考データ的な扱いですね。

 うちには標準測定器はないので正確な値は測定できない。相対値でも真面目に測定するんだったらACサーボ法とかで測定する必要があるんだろうけど、今のところガチに単調性が必要とかはないのでProcessingとArduinoの習得がてら、ということで。部屋の温度計読み25.6℃で測定。

 ADとDAの方式なんでしょうね?隣接コード差分で、基本的なアーキの典型的なパターンが出てないように見える。逐次なんかな?時間のある時に調べてみよう。

 ※DAC1→A0の隣接コード差分結果とDAC0,1を重ね書きしたものを追記

画像1

 結構ゲインエラーが出ている感じですな。少しオフセットも出てるのかな?電圧は別途測定してみるかな。

画像2

画像3

画像4

 意外とDNL悪い感じ。おまけの12bだからしょうがないといえばしょうがない気もする。デフォルトは10bなんで、10bで使う分には多分単調性とか保証されてそう。そこそこ使えそうだけど。DAC1→A0も見てみたけどおんなじかちょっと悪い。で、飛びがDAC0とDAC1がばらけているので、A0ではない成分がいるのかも。まあ外来ノイズかもだけど。
 ガチの12bを搭載すると値段上がるしね。

Arduino Due側のコード

int setval;
void setup() {
 Serial.begin(9600);
 setval = 0;
 analogWriteResolution(12);
 analogReadResolution(12);
}

int val;
void loop() {

 analogWrite(DAC0, setval);
 delay(500);
 val = analogRead(A0);
 Serial.print(setval);
 Serial.print(",");
 Serial.println(val);

 setval = (setval + 1) % 4096;
}

Processing側のコード

import processing.serial.*;
Serial port;
String value;
PrintWriter output;
int []data = new int [2];
int count = 1;

void setup() {
 size(255,255);
 port = new Serial(this,"COM5", 9600);
 port.clear();
 output = createWriter("logDA0AD0.txt");
}

void draw(){
if(data[0] == 4095){
  output.flush();
  output.close();
  exit();
 }
}
 void serialEvent(Serial p){
 if(port.available() > 0){

    value = port.readStringUntil('\n');
    if(value != null){
      value = trim(value);
      data =int(split(value,','));
    println( value );
    output.println( value );
    }
  }
}

出力

前略
2353,2230
2354,2230
2355,2231
2356,2231
2357,2231
後略

てな感じでファイルに保存できるようにした。Processingは初めてだけどなんか動いた。とりあえずOK。ただ、データの頭にゴミデータが表示されるのをなんとかせねば。

この記事が気に入ったらサポートをしてみませんか?