2010年
8月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

セットアップ日記


2010年08月05日 微妙なgain

_ tiny261のADコンバーター

AVRのADコンバーターの使い方も少しずつ分かってきて、いろいろと試している。0.3Vぐらいの電圧を精度良く測定しようとしているのだが、意外に難しい。まずは、ADコンバーターを初期化する。
void ad_init(){
  setbit(ADCSRB,REFS2); // 2.56V
  setbit(ADMUX,REFS1);  // 2.56V
  clearbit(ADMUX,REFS0); //2.56V
  clearbit(ADMUX,ADLAR); // bit0-9
  setbit(ADCSRB,MUX5); // ADC0-1
  clearbit(ADMUX,MUX4); // ADC0-1
  clearbit(ADMUX,MUX3); // ADC0-1
  clearbit(ADMUX,MUX2); // ADC0-1
  clearbit(ADMUX,MUX1); // ADC0-1
  setbit(ADMUX,MUX0); // ADC0-1
  setbit(ADCSRB,GSEL); // gain 8
  setbit(ADCSRA,ADPS2); // CK/128 
  setbit(ADCSRA,ADPS1); // CK/128
  setbit(ADCSRA,ADPS0); // CK/128
  setbit(ADCSRA,ADEN); // enable
  setbit(ADCSRA,ADIE); // interupt enable
}
ちなみに、ヘッダーでは
#define setbit(PORT,BIT) PORT|=_BV(BIT)
#define clearbit(PORT,BIT) PORT&=~_BV(BIT)
#define checkbit(PORT,BIT) (PORT&_BV(BIT))
と定義しておく。そして、割り込みで結果を受け取る。
ISR(ADC_vect){
  unsigned int c;
  c=ADCL;
  c|=(unsigned int)ADCH<<8;
}
最初は1.1Vを基準電圧にして、シングルエンド入力にしていたが、10bitだと1mVの精度しかないことになる。gainを上げようと思ったが、シングルエンド入力だと、gainが1しか選べない。そこで、片側をGNDにつないで、差動入力にしてからgainを8にした。すると、0.3Vが2.4Vになるので、基準電圧を2.56Vにする必要がある。しかし、0.32Vまでしか測れないことになってしまった。理想的には、gainを2で1.1Vを基準電圧にするか、gainが4で基準電圧が2.56Vだと、精度がそれなりに出る。しかし、tiny261のgainは、8,20,32からしか選べない。一方、基準電圧は、1.1Vと2.56VとVccと外部電圧が選べる。Vccは正確な電圧は分からないし、特別な外部電圧を準備するのも面倒だ。もっといろいろなgainが選べれば、うまくいくのだが。
[]