クレア工房 | 電子工作 | AVR | AVR の ADC

AVR の ADC

ビット幅

読むだけなら 10bit 分あります。 CPU から見て 16bit word として読める値は左詰め (MSB aligned) にするか、右詰め (LSB aligned) にするかのどちらかを選ぶことができ、 8bit として扱うなら左詰めを指定します。

シングル・エンドなので Aref vs. GND をフルスケールとして電圧を測ります。 Aref は外部供給、AVcc (approx 5V)、内部供給 (approx 1.1V) のいずれかを選べます。

電圧を読む

ADC は最初に初期化する必要があります。 mux は入力に使う ADC ピン番号です。 REFS0, REFS1 は Vref を決定します。 制御レジスタのビット割り当ての都合上、 アナログ・マルチプレクサで変換対象とする端子を変えるたびに ADC を再初期化するイメージでコーディングすることになります。

  /* disable digital input component */
  DIDR0  = 0b00111111;
  /* Vref = Vcc, left aligned */
  ADMUX  = _BV(REFS0) | _BV(ADLAR) | mux;
  ADCSRB = 0;
  /* start conversion */
  ADCSRA = _BV(ADEN) | _BV(ADSC) | 0b111;

変換が終わるのを待ちます。 連続変換モードではなく単発変換モードを指定したので、ADSC ビットが寝るまで待ちます。

  /*
   * wait for conversion
   */
  while (ADCSRA & _BV(ADSC))
    ;

変換が終わったら値を読みます。

  adv = ADCL;
  adv |= ADCH << 8;

ロジックの実装中であれば、 読んだ値をシリアル・コンソールに書き出せばデバッグしやすいかも。

  com0_putch(hextab[(adv >> 12) & 15]);
  com0_putch(hextab[(adv >>  8) & 15]);
  com0_putch(hextab[(adv >>  4) & 15]);
  com0_putch(hextab[(adv >>  0) & 15]);
  com0_putch(' ');

Copyright © 2013 clare. All rights reserved. 本ページに掲げたサンプルプログラムは、 筆者の著作に帰すべき部分についてpublic domainに準じます。 筆者は運用結果にいかなる責任も負いません。