手持ちのArduinoDueでDACとADCを測定してみた
だいぶ前買ったDue(互換品を注文したつもりが正規品が来た感じ)が手元にあったので、DAC0→A0直結して測定してみた。参考データ的な扱いですね。
うちには標準測定器はないので正確な値は測定できない。相対値でも真面目に測定するんだったらACサーボ法とかで測定する必要があるんだろうけど、今のところガチに単調性が必要とかはないのでProcessingとArduinoの習得がてら、ということで。部屋の温度計読み25.6℃で測定。
ADとDAの方式なんでしょうね?隣接コード差分で、基本的なアーキの典型的なパターンが出てないように見える。逐次なんかな?時間のある時に調べてみよう。
※DAC1→A0の隣接コード差分結果とDAC0,1を重ね書きしたものを追記
結構ゲインエラーが出ている感じですな。少しオフセットも出てるのかな?電圧は別途測定してみるかな。
意外と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。ただ、データの頭にゴミデータが表示されるのをなんとかせねば。
この記事が気に入ったらサポートをしてみませんか?