エンジニア風味 (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変換できるようにしようとしました。

f:id:engineer-paju:20190202215618p:plain

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

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

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

f:id:engineer-paju:20190202220559j:plain
デフォルト状態

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

analogReference(EXTERNAL);

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

f:id:engineer-paju:20190202221022j:plain
外部リファレンス状態

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

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

ちなみに、

analogReference(INTERNAL);

だと、

f:id:engineer-paju:20190202222352j:plain
内部リファレンス状態
となり、約1.1Vとなっていました。