エンジニア風味 (Engineer-taste)

電子系エンジニアのメモ帳

Arduinoのアナログ・リファレンスが使いにくい

Arduinoからアナログ入力して、A/D変換するというプログラムは、

void loop() {
  int X;
  X = analogRead(A0);

とか書いてしまえば、A/D変換したデータが取り込めてしまうので、便利でいいなあと思っていたところ、
デフォルトでは、0~5V(3.3V電源の場合は0~3.3V)の範囲を10bitで変換するそうです。

しかし、アナログ入力のリファレンス信号電圧は変えることが可能で、

analogReference(INTERNAL);

と書けば、内部リファレンスが使えて0~1.1Vの範囲でA/D変換ができ、

analogReference(EXTERNAL);

と書けば、リファレンス電圧入力ピンで上限電圧を指定できるそうです(範囲は0~5V)。

ということで、リファレンス電圧入力ピンと3.3V電源を直結して、0-3.3Vの範囲でA/D変換できるようにしようとしました。

ですが、これをやって、プログラムの書き込みしようとするとエラーで出るんですよ。
どうもデバイスが壊れたっぽい。

真面目に調べたところ、そういう使い方をすると破壊される可能性があるとのことです。
不注意にもほどがあるわけですが、まあ、安いボードでよかったです(これです)。
www.amazon.co.jp

で、リファレンスピンが、どういう状況になっているか調べてみました。
テスタでリファレンスピンの電圧をモニタしています。
まず、デフォルトの状態では、電源電圧(ここでは約5V)がそのまま出力されています。

デフォルト状態

この状態で、リファレンスピンを3.3Vに接続すると、3.3Vと5Vの間で過大電流が流れて、デバイスが壊れるようです。

analogReference(EXTERNAL);

で書き込みすると、リファレンスピンが外部電圧参照に切り替わり、電圧は一気に0Vに落ちます。

外部リファレンス状態

たぶん、この状態になってから3.3Vに接続すれば、破壊されることはないのでしょう。
ただ、タイミングを間違うと壊す、ということですね。もしくは何らかの原因でリファレンスがデフォルトに戻っても壊れると。

マニュアルには、「過大電流で壊さないために、5kΩの抵抗を介して電源に接続しなさい」と書いてあります。
ですが、ATmegaの内部抵抗が約32kΩなので、実際のリファレンス電圧は5kΩと32kΩで抵抗分割抵抗分割した値になります。
3.3Vを5kΩを介して接続すると、3.3V x 32/(5+32) = 2.854Vとかなります。半端ですよね。たぶん、内部抵抗もバラツキが多いと思いますし。
まあ、その程度の精度でいいよ、ということなんだと思います。

ちなみに、

analogReference(INTERNAL);

だと、

内部リファレンス状態
となり、約1.1Vとなっていました。




    <追記>     
コメントいただきました。ありがとうございます。

analogReference(EXTERNAL);
 X = analogRead(A0);

というように、analogReferenceを外部に設定してから、analogReadすれば、壊れることはないよ、ということです。
おっしゃる通りです。
ですが、analogReferenceを外部に設定しないで、analogReadすれば壊れます。
「だから!」と言われると思います。わかります。
しかし、Arduinoのリファレンスマニュアルには、わざわざ5kΩの外付け抵抗を入れる話が書いてあるのはなぜでしょうか。
私と同じようなバカ者が多くいて、リファレンス端子に直結で接続して壊したからだと思います。
Arduinoって、いろいろなスケッチをプログラムして実行し、また次のプログラムを書き込んで、というように使いますよね? それで、analogReadが前のプログラムに含まれていて(リファレンスはデフォルト)、AREF端子を3.3Vに接続して、外部電圧参照のプログラムを書き込もうとしたとします。プログラムを書き込む前にPCに繋いだ段階で、Arduinoのプログラム(前に書き込んだ)が動き出して、analogReadを実行すると、短絡して壊れます。
私の場合は、そういう形で不用意にanalogReadが実行されて、デバイスが壊れてしまったのです。
「壊れる」でなくて、「動作しない」くらいのトラブルだったら、直結でOKと私は思います。
が、「失敗すると壊れる」というのは最悪のケースであり、やはり避けたいです。
「ヘタレ」と言われても、自分は直結では使わないです。
Microchipのデータシートには、外部抵抗をつけて保護するという記述はありません。「ユーザが固定電圧源をAREFにつないで、外部基準電圧以外を選択すると短絡する」としか書いてありません。
ATmega328のADCの参照電圧端子の入力抵抗32kΩは、小さいと思います。なので、5kΩと直列に接続したときに5kΩの電圧降下が気になるレベルになります。しかし、短絡時の保護抵抗としてこれ以上小さくはできなかったのだと推察します。
いろいろと書きましたが、リファレンス電圧の電源直結は、フォールトトレラントではないと考えます。