【概要】
analogReference() は、マイクロコントローラのADC(アナログ・デジタル変換器)における基準電圧(Reference Voltage)を動的に設定するための関数です。ADCは入力されたアナログ電圧をデジタル値へと変換しますが、その変換における「最大電圧」を規定するのが基準電圧です。この関数を適切に使用することで、測定対象の電圧範囲に合わせてADCの分解能を最適化することが可能になります。
【仕様】
- 関数シグネチャ:
void analogReference(ReferenceType type) - 引数:
type: 基準電圧のソースを指定する列挙型(ReferenceType)。DEFAULT: ボード固有の標準設定(例:Arduino Unoでは5V、Leonardoでは3.3V)。INTERNAL: マイクロコントローラ内部の基準電圧(例:ATmega328Pでは1.1V)。EXTERNAL: 外部のAREFピンから供給される電圧を基準とする。
- 戻り値: なし(void)
- データ型:
ReferenceType(内部的には整数の列挙型として処理される) - 初期状態: 各ボードのハードウェア仕様に基づいたデフォルト値で初期化される。
【技術的特徴】
- 量子化分解能の制御:
ADCの分解能(例:10ビット)は、基準電圧 $V_{ref}$ に依存します。基準電圧を低く設定するほど、低電圧領域における分解能(感度)が向上します。 - レジスタ操作: この関数は、ADCモジュールの基準電圧選択レジスタ(AVCCまたは内部基準選択)を直接操作します。
- ハードウェア依存性: 使用するマイコン(AVR, SAMD, ESP32等)によって、利用可能な
ReferenceTypeやその実際の電圧値は異なります。
【注意点】
- 外部基準電圧(EXTERNAL)の制限:
外部AREFピンを使用する場合、印加する電圧はマイコンの動作電圧(VCC)を超えてはなりません。これを超えるとADC回路やマイコンの入出力ピンに過大な電圧がかかり、破損の原因となります。 - 内部基準電圧(INTERNAL)の精度:
内部基準電圧は温度変化や製造誤差の影響を受けやすいため、極めて高い精度(ミリボルト単位)を求める測定には、外部の精度保証された電圧基準IC(Voltage Reference IC)の使用を検討すべきです。 - 動的な変更:
プログラム実行中にanalogReference()を呼び出すことは可能ですが、ADCの変換プロセス(analogRead())の最中に呼び出すことは避けてください。変換完了まで待機してから設定を変更することが推奨されます。 - 電圧変動の無視:
基準電圧が変動する環境(例:不安定な電源供給)では、ADCの読み取り値も同様に変動します。正確な測定には安定した基準電圧の確保が不可欠です。
【サンプルコード】
/*
* 内部基準電圧(1.1V)を使用して、低電圧センサーを
* 高分解能で読み取るサンプルコード。
*/
void setup() {
Serial.begin(9600);
// 基準電圧を内部の1.1Vに設定
// これにより、0V〜1.1Vの範囲を0〜1023の範囲でスキャン可能になる
analogReference(INTERNAL);
Serial.println("Reference set to INTERNAL (1.1V)");
}
void loop() {
// A0ピンの電圧を読み取る
int rawValue = analogRead(A0);
// 電圧換算式: (読み取り値 * 基準電圧) / 1023.0
float voltage = (rawValue * 1.1) / 1023.0;
Serial.print("Raw: ");
Serial.print(rawValue);
Serial.print(" | Voltage: ");
Serial.println(voltage);
delay(500);
}
【活用例】
- 低電圧センサーの精密測定: 1.1V以下の出力を有する高精度センサーを、分圧回路によるノイズ混入を避けて測定したい場合に、内部基準電圧への切り替えを使用します。
- 複数電圧系の統合: システム内で5V系と3.3V系の両方の電圧をADCで測定する必要がある場合、必要に応じて基準電圧を切り替える、あるいは外部電源による高精度な基準電圧供給を切り替える制御に使用します。


コメント