Arduino:アナログ入力安定化


Arduinoのアナログ入力でセンサからの電圧を読ませる際に、できるだけ真値に近づけるため読み取った整数から電圧に戻す際に、Vcc=5.00Vとせずに、テスターを当てて実測したVccをスケッチ上変数として入れるようにはしていた。

しかし、PCのUSBを使って電源をとっていると、PCを操作してアプリを立ち上げたりすると読み取り値が変化する事で制御値が揺れる事は気が付いていた。

しかも、せっかくセンサや制御回路を作っても他のPCに接続したらまた電圧が違うので、現場で電圧測定して、スケッチを書き込んでと・・・しなければならない。

これを解消するに、素人としては、Vrefを内部基準にして1.1Vにしてあげて、抵抗をつかって分圧をかけて、5Vを1.1V以内にしてVccを読んであげれば・・・と考えていた(よくある手法らしい)

そこは先人の方々!ちゃんと対処法は見出してくださっている

http://radiopench.blog96.fc2.com/blog-entry-490.html?sp

(↑いつもお世話になっています・・)

何も外部回路をつけなくても、Vccを知る事ができる。テスターと比べた結果1%、40mV程度低くでる。しかし、真値が何か?なのだが、これ重要なのが、他のセンサの値も同じ基準で読むから、これをテスタに合わせる必要もない。必要なタイミングでVccを更新すればVccの変動に対しても安定にあるというお花h氏。



テストに使ったスケッチ

void setup() {

  // put your setup code here, to run once:

  Serial.begin(115200); 

}


void loop() {

  // put your main code here, to run repeatedly:

 float Vcc=ReadVcc();

 Serial.print("Vcc= ");

 Serial.println(Vcc,2);

 delay(500);

}


float ReadVcc(){

  long sum=0;

  //set up ADC

  ADMUX = B01001110;

  //bit  REFS1 REFS0 ADLAR - MUX3  MUX2  MUX1  MUX

  delay(2);

  ADCSRA |= ( 1 << ADEN);

  ADCSRA |= B00000111; 

 delay(8);

//read and average 

  for(int n=0; n < 100; n++){

    sum = sum + adc();        

  }

  return (1.1 * 102400.0)/sum;       

}


unsigned int adc(){                 

  unsigned int dL, dH;

  ADCSRA |= _BV(ADSC);          

  while(ADCSRA & ( 1 << ADSC) ){ //wait until convert

  }

  dL = ADCL; // read lower 8 bits

  dH = ADCH; //read higher 8 bits 

  return dL | (dH << 8);//use 2bits of higher ones

}

コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

ILI9341 240X320 Arduino

Attiny85 FuseRest