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が選べれば、うまくいくのだが。