google-site-verification: google3bd66dd162ef54c7.html
FC2ブログ

Arduino よもやま話-17 (アナログポートの未使用ピンの処置)

◆DIDR0 レジスタ
このところ Arduino の未使用ピンの処置方法についていろいろ調べています。ほぼ結論が出たと思っていたら、居酒屋ガレージ店主(JH3DBO)さんからコメントを頂き、アナログポートについては DIDR0 レジスタの設定でうまく処置出来るという情報を頂きました。そんな機能があるとは知らなかったので、さっそく試してみました。

◆測定の回路図
アナログ入力ピンに電圧印加
アナログポート (A0-5) を全部パラに接続し、テスト用の電圧を加えてその時のCPUの電源ピンの電流を測定しました。(CPUの電源はこの回路図には出てきません)
残りの信号ピンは、これまでの調査では何も接続せずオープンにしていたのですが、それでは電源電流が無駄に増えてしまって、良くないことが判りました。そこで、今回の調査ではプログラムで出力にアサインして LOW を出力しておきました。つまり、真面目に空き端子処理をやっておきました。

◆テスト用のプログラム
// 20200505 アナログ入力ピンのデジタル回路切り離し機能の効果測定プログラム
// DIDR0 レジスタを設定した場合の効果比較プログラム
void setup() {
// Serial.begin(115200);
pinSetup(); // D2-7, D8-13 を空きピン処理(全部LOW出力)A0-5は入力(何もしていない)
DIDR0 = 0b00111111; // digitalRead部切り離し(通常状態にするときはコメントアウト)
}

void loop() {
// Serial.println(PINC,BIN); // A0-5の状態確認
// delay(200);
}

void pinSetup() { // 空き端子処理
// 居酒屋ガレージ日記さんの書き方を真似した
// PORTBは全ピンLOW出力
PORTB = 0b00000000; // data/pull up
DDRB = 0b00111111; // I/O (0:in 1:out)
// |||||+---- PB0 IO8 out
// ||||+----- PB1 IO9 out
// |||+------ PB2 IO10 out
// ||+------- PB3 IO11 out
// |+-------- PB4 IO12 out
// +--------- PB5 IO13 out
// PORTDはTX,RD以外は全部LOW出力
// PORTCはデフォルトのまま(全部input)
PORTD = PORTD &= 0b00000011; // data/pull up (下位2ビット以外はLOW)
DDRD = 0b11111110; // I/O (0:in 1:out)
// |||||||+---- PD0 IO0 in RXD
// ||||||+----- PD1 IO1 out TXD
// |||||+------ PD2 IO2 out
// ||||+------- PD3 IO3 out
// |||+-------- PD4 IO4 out
// ||+--------- PD5 IO5 out
// |+---------- PD6 IO6 out
// +----------- PD7 IO7 out
}

◆測定結果
DIDR0レジスタの効果(入力電圧vs電源電流)
横軸がアナログポート(A0-5) に加えた電圧で、縦軸が CPU の電源ピンの電流です。

青色のプロットが DIDR0 レジスタに何も設定しない状態、つまり前の記事と同じ状態を再測定したものです。この場合 1/2Vcc を中心に消費電流が増えます。なお、今回の測定では残りのピンは全部LOW出力に設定して空きピン処理を行っているので、電流の値は前の記事より 1.5mAくらい少なくなっています。

オレンジ色のプロットが DIDR0 レジスタを設定 (0b00111111) した場合で、こちらは、入力ピンの電圧が変わっても電源電流には全く影響が出ていません。DIDR0 レジスタの目的は、アナログ入力ピンに、デジタル入力のシュミットトリガ回路の影響が出て、電圧/電流特性に非線形な影響が出ることを防ぐことで、そのためにアナログスイッチを使ってデジタル回路への接続を絶つと共に、デジタル入力を LOW レベルにクランプしています。

このような操作を行ったことによる別の効果として、電源電流が無駄に増加するという現象が解消出来る、ということになろうかと思います。ただ細かい話をすると、入力電圧がゼロの場合の電源電流を比較すると、DIDR0レジスタを使うより、LOW にクランプしておいた方が、電源の消費電流は約1mA 少なくなっています。

そんなことで、省電流化を狙う場合は出力 LOW で空き端子処理を行った方が良いのかも知れません。ただアナログ電圧の測定を行うピンではそんなことは出来ないので、やはり DIDR0 レジスタを設定するしか対策方法は無いでしょう。なお、Arduino で analogRead(An) とやる場合はおそらくそういう状態を作っているのだと思います。

◆データーシート
今回 DIDR0 レジスタの効果についてコメントで教えて頂きましたが、こういうことはデーターシートに書いてあるはずなので原文を確認してみました。("DIDR0" でPDFを文字列検索すると関係した部分を手早く発見出来ます)
datasheet of ATmega328P

すると、
ATmega328Pのデーターシート、9.10.6項

ATmega328Pのデーターシート、23.9.5項
確かにいろいろ書いてありました。

ここの説明は、アナログ入力ピンにパラに入っているデジタル入力回路の影響についての言及であって、デジタル入力ピンについては何も触れられていません。デジタル入力ピンの場合は切り離したりする機能は無いので、ここに書いてある影響がそのまま出るということだと思います。

◆まとめ
Arduino の空きピン処理も詳しく見るといろいろ難しいものです。ブレッドボードで一時的に組んで動作を試すような場合、空きピン処理などは気にしないで楽しんでしまえば良いと思います。この場合、CPUの消費電流が数mA増えているかも知れません。

一方で電池で長期間動かすような場合は、消費電力は重要なのできちっと空き端子処理を行った方が良いでしょう。あと、仕事で使うような場合は誘導ノイズなどで誤動作しては困るので、きっちりと空き端子処理を行っておく必要があります。

ところで、今回の記事では pinSetup() という関数を作って、ここでまとめて空き端子処理を行いました。しかし、この関数の中身を書くのがちょっと面倒です。例えば空き端子処理をしておきたい端子名を引数に列挙して呼び出せば、空き端子処理 (例えば出力で LOW) をやってくれるライブラリ、あるいは関数を作れば便利かも知れません。まあ逆に判りづらくなって変な問題のタネを蒔くだけになりかねないのですが。
関連記事

コメントの投稿

管理者にだけ表示を許可する

DIDR0レジスタ

analogRead()の処理、DIDR0レジスタを触っていないようなんですよ。
どうやら電流の増加は放置のようです。

re:DIDR0レジスタ

え、そうなんですか。

そうなると、ADCのリニアリティにも影響がありそうですよね。

re:DIDR0レジスタ

A/Dの入力と精度には関係しないでしょう。
内部のデジタル入力回路への信号を遮断するための機能ですから。
アナログ入力ピンの電流が増えるわけじゃありません。
これをしなくても、電源電流が変化するだけですから。

re2:DIDR0レジスタ

このデジタル回路は1/2Vcc付近で高抵抗で終端したように振る舞う、つまり電圧によって入力電流が変化するので、リニアリティが悪化するのではと思ったのですが、、

あと、データーシートの 9.10.6 項の下記の記述はそのことを言っているのではないかと思っているのですが、外してるかもです。
>An analog signal level close to VCC/2 on an inpu pin can cause
>significant current even in active mode.

まあ、CMOSの入力電流はめちゃめちゃ小さいので、ワーストの場合でしか問題にならないのかも知れませんね。

DIDR0レジスタ

このcurrentの意味するところ、デジタル入力バッファ部の電源電流増大のことじゃないかしら。
ピンそのものに流れる電流が増えるという意味じゃないでしょう。

A/D入力を使うなら、もともと「低インピーダンスで駆動せよ」です。
A/Dを働かせるとS/Hコンデンサの充放電が行われます。
A/Dピンに関してはこのインピーダンス変化のほうが大きいかと。

re3:DIDR0レジスタ

なるほど、そういう解釈もありますね。

ADCを駆動する側の出力インピーダンスは10kΩ以下が推奨されているので、めちゃ高いインピーダンスまで考慮する必要も無さそうです。

あと、analogRead() の意手続きを書いている場所にようやくたどり着きました。
hardware/arduino/avr/cores/arduino/wiring_analog.c
余計なことしないで結果を返しているだけなんですね。
カレンダー
06 | 2020/07 | 08
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード