int analogIn = A3; int digitalIn = 7; int analogVal = 0; unsigned long myTime[5]; int index = 0; void setup() { Serial.begin(9600); pinMode(analogIn, INPUT); pinMode(digitalIn, INPUT); } void loop() { while(not digitalRead(digitalIn)) { } Serial.println("Start!"); for(index = 0; index < 5; ++index) { myTime[index] = micros(); analogVal = analogRead(analogIn); } for(index = 0; index < 5; ++index) { Serial.println(myTime[index]); Serial.println("_"); } delay(500); }
こんなプログラムでアナログピンの読み取り速度を計測してみた。
結果は最初の一回~二回目が212μ秒、残りの3回が112μ秒
112μ秒を時定数CR、今持ってる抵抗の最大値1MΩを使うとして
1.0e6C=112x1.0e-6
C=112x1.0e-12
112pFだと1ステップで電圧が36%にまで落ち込んでしまう、あかん全然足らん。
ちなみにanalogRead()をコメントアウトすると4μ~8μ。
myTime[0] = micros(); for(index = 0; index < 1000; ++index) { analogVal = analogRead(analogIn); } myTime[1] = micros();
として時間計測するとanalogRead()一回当たり112μ秒。なので最初の212μ秒が例外っぽい。
CR以外で何かいい測定方法ないものか。
デジタルピンだと1000回ループで平均4.2μ秒。アナログはAD変換あるから遅いのか。
抵抗分圧して複数のデジタルピンで読み取るとか、じゃなかった拡大させないといけないのか。
コンデンサ充放電をくりかえしhighからlowになる時間を調べて大体の予測をつける。
忘れてたけど壊れて抵抗値0のコンデンサ対策もしないと。
これは面白いな。抵抗分圧で作った基準電位に達する時間をオペアンプ開放させて調べてるのか。真似しよう。けど1pFなんて無理だぞ