Arduinoマイクロコントローラの電圧測定性能の向上


APDahlen Applications Engineer

今日のマイクロコントローラのほとんどはアナログデジタルコンバータ(ADC)を備えていますが、これはアナログチェーンの一部にすぎません。密接に関連する回路には、測定対象の特定信号を選択するアナログマルチプレクサ、測定される電圧の「スナップショット」を取るサンプル・アンド・ホールド、ADCを動作させるクロック回路、そしておそらく最も重要な部品の1つであるアナログ電圧リファレンスが含まれます。

この短い記事では、外部電圧リファレンスを追加することでArduino Nano Everyマイクロコントローラの性能がどのように向上するかを示します。このレッスンは一般的にすべてのマイクロコントローラに適用できます。

図1: Analog Devices LT1009 シャント電圧リファレンスを備えたブレッドボード上の Arduino Nano Every。レギュレータのトリムリードはフローティングになっていることに注意してください。

Arduino Nano Everyのデフォルト設定は?

Arduinoはデフォルトでレールをリファレンスとした電圧を測定するように構成されています。これは、5V DC I/Oを備えたArduino Nano Everyが5V DCリファレンスでありうることを意味します。これは良い開始点といえるでしょう、なぜならば、analogRead()関数が0~1023のレール内電圧読み取り値を返すからです。ここで、レール内という用語は、グランドと5V DC電圧レールによって制限されるADC入力電圧を意味します。これとは対照的なレール外電圧測定については、以前の記事を参照してください。

このデフォルトの接続には、高精度の電圧測定の観点からはまだ不十分な点が多くあります。繰り返しになりますが、ADCの性能は電圧リファレンスと直結した関数であることを思い出してください。この記述には、絶対電圧レベルだけでなく、望ましくないドリフトやノイズも含まれます。

このデフォルト設定では、電圧リファレンスは、Arduinoの5V DCレールを駆動しているものから得られます。多くの場合、電圧リファレンスはコンピュータからのUSBポートです。また、バッテリや電圧レギュレータを使用することもあります。これらのオプションは、いずれも高精度の範疇には入りません。例えば、USBの電圧はコンピュータによって異なります。また、一般的なUSBコードでは、プロジェクトからの電流の引き込み量に応じて電圧が降下します。その結果として、お使いのマルチメータと確実に一致しない、予測不可能な電圧測定となってしまうでしょう。

電圧測定のデバッグ手法

デバッグが目的の場合、生のADC値(0から1023までの2進数)を、0.0から5.0V DC(float型)の間の人間が読みやすい値に変換するのが便利です。マッピング関数は便利な変換方法を提供します。残念ながら、Arduinoのmap( )関数は整数で動作します。しかし、このコードを使用して簡単にfloat型で動作するように修正できます。

float fmap(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

コードは次のように呼び出すことができます。

float val = analogRead(ANALOG_PIN);
float humanReadableVoltage = fmap(val, 0.0, 1023.0, 0.0, 5.0); // Use 5.0 or 3.3 as appropriate for the given voltage rail.

この方法は、変換を実行するための最も洗練され、高速、またはエネルギー効率の高い方法ではありません。しかし、十分に機能し、問題がソフトウェアまたはハードウェア内にあるかどうかを素早く判断できます。プログラマーとしては、性能を向上させるためにコードをリファクタリングする必要があるかもしれません。ただし、出発点およびデバッグ ツールとして、このソリューションに勝るものはそうそうないでしょう。

技術的なヒント: すべての読者は、レシオメトリック測定の概念をよく知っている必要があります。この用語は、ソース(センサ)とADCが共通の電圧リファレンスを共有することを意味します。たとえば、ポテンショメータは、ADCのデフォルト構成とともにArduinoの5V DCレールに接続できます。その後、ポテンショメータのワイパーがADCによって読み取られます。この状況では、電源の変動は両方のデバイスに共通します。したがって、1/4回転(10ビットADCの場合は2進数256)に設定されたポテンショメータは、レール電圧がドリフトしても同じ値を読み取り続けます。レシオメトリックセンシングアプリケーションがいくつかあることにご注意ください。例としては、センサの励起電圧がADCと共有されるRTDがあります。

ADCの性能を向上させる簡単な方法

電圧測定の性能を向上させる簡単な方法の1つは、電圧レールから離れることです。他のほぼすべてのリファレンスは性能を向上させることができます。1つの良い解決策は、マイクロコントローラの内部リファレンス電圧を使用することです。これは、analogReference(INTERNAL); というステートメントを使用して簡単に実行でき、通常、setup()関数内で行われます。

初心者のミスを避ける

ArduinoのADCリファレンスが変更されると、フルスケール入力値も変更されます。デフォルト構成では5V DC レールが使用されていることを思い出してください。0~5V DC のレール内電圧は許容可能でした。しかし、新しい内部リファレンス電圧では、この範囲が変わります。たとえば、内部リファレンスが1.1V DCに設定されている場合、マイクロコントローラは0~1.1V DC の実際の電圧を受け入れるようになります。適切なマッピングステートメントは次のようになります。

float val = analogRead(ANALOG_PIN);
float humanReadableVoltage = fmap(val, 0.0, 1023.0, 0.0, 1.1);

1.1V DCを超える電圧はADCを飽和させることに注意してください。マッピング操作の後には、1.1V DC として読み取られます。もう一度、抵抗の選択についてはこの前の記事を参照してください。適切な高精度抵抗のペアを使用すると、1.1V DC を超える電圧を読み取ることができます。

技術的なヒント: Arduino analogReference( )関数はハードウェア固有のものです。Arduinoの傘下にある各マイクロコントローラは、独自な内部構造を持っています。その構造は、内部ADC構造とADCの電圧リファレンスの多重化オプションにまで及びます。マイクロコントローラによっては、1.1、2.0、2.5、さらには 2.56V DC の内部リファレンスを選択できる場合があります。

外部リファレンスを使用して性能をさらに向上させる

マイクロコントローラの内部リファレンスは、電圧レールを使用するよりも大幅に優れています。ただし、完璧ではありません。実際、マイクロコントローラ設計チームはアナログセクションのコストと性能のバランスを慎重にとったと言えます。さまざまな設計上の制約があるため、完璧ではないものの良好な性能特性を備えた内部電圧リファレンスを見つけることができると考えるべきです。そうしないと、汎用マイクロコントローラのコストが犠牲になります。

マイクロコントローラの性能を向上させるために、専用の外部リファレンス電圧を使用することができます。一例として、図1に示すAnalog Devices LT1009IZ#PBF があります。これは、+/-0.2%の許容誤差を持つ2.5V DCリファレンスを提供するシャントレギュレータです。

リファレンス電圧はツェナーダイオードレギュレータのように動作します。図2に示すように、このアクティブ素子は制限内で2.5V DC出力を維持するために必要な電流を消費します。シャント抵抗は必須の部品です。 図2では、3.6kΩの抵抗が使用されています。図1では、1 kΩ 1%の抵抗を使用したことがわかります。図1とArduino Nano Everyのピン配置を注意深く見ると、シャントレギュレータが3.3V DCピンから電力を供給されていることがわかります。このアプリケーションでは、レギュレータは800uAの電流を消費しています。

I_{reg} = \dfrac{3.3 \ – \ 2.5}{1000} = 800 \ uA

選択された1kΩの抵抗器は、図2に示されている5.0V DCアプリケーションよりもわずかに多くの電流が生成されます。図1に示されている許容誤差1%の抵抗は必要ないことに注意してください。これは、便宜上使用されました。なぜならば、そのような抵抗器がArduinoが2.5V DCより高い電圧を読み取るための電圧分圧器に必要だったからです。

このアプリケーションではトリム調整は使用されていないことに注意してください。図1では、調整ワイヤがブレッドボードの上に浮いているのが見えます。

この特定のアプリケーションでは、LT1009 はオーバースペックです。制限要因は、図1の背景に示されている 1%許容誤差の抵抗器です。また、10ビットのArduino ADCも制限要因です。ただし、抵抗を少し調整することで、測定された電圧はFluke 87電圧計で得られる電圧の10mV以内になります。

** Figure 2**: The LT1009 required a series resistor as shown in this schematic.

図2: LT1009には、この回路図に示すような直列抵抗が必要でした。

技術的なヒント: 電圧リファレンスでは金銭的な制約が一番大きく関わります。実用的な観点から見ると、ハイエンドのコストはADCのビット幅によって制限されます。ADCのステップ解像度よりもはるかに優れた電圧リファレンス性能は、無駄なリソースとなります。これは、古いパワー不足のエンジンを維持したまま、車のトランスミッションを継続的に改良するようなものです。

最高の性能は外部ADCを使用することで得られます

内部ADCのビット幅が制限要因となっている段階に達しました。性能を向上させるには、ビット幅を増やした外部ADCが必要です。前述したように、私たちは性能対コストのスパイラルに入っています。ADCのビット幅が増加すると、ADCの性能も向上する必要があります。設計によっては、ADCと電圧リファレンスのソリューションに20ドルから150ドル程度の費用がかかる場合もあります。更なる性能向上に伴い、通常の機器温度の変動による影響を緩和するために、電圧リファレンスをオーブンで保温制御する必要がでてくる場合があるかもしれません。統合された一例として、 Analog Devices LTZ1000 シリーズ の超高精度電圧レギュレータがあります。このデバイスには、密閉されたTO-99パッケージ内にヒータ素子が内蔵されています。

まとめ

Arduinoなどのマイクロコントローラの電圧測定性能は、内部または外部ADC電圧リファレンスに移行することで改善される可能性があります。最高の性能を得るために、外付けの高ビット幅ADCとそれに対応する高精度電圧リファレンスを追加すると、回路のコストと複雑さが急速に増加します。

慎重に選択してください。なぜならオーバースペックの電圧測定システムとは、0.01インチの許容誤差を持つ部品が使用できる場合に、0.001インチの許容誤差を持つ部品を要求するようなものであるためです。

馬はコースに応じて走らせましょう。

ご健闘をお祈りします。

APDahlen

著者について

Aaron Dahlen 氏、LCDR USCG(退役)は、DigiKeyでアプリケーションエンジニアを務めています。彼は、技術者およびエンジニアとしての27年間の軍役を通じて構築されたユニークなエレクトロニクスおよびオートメーションのベースを持っており、これは12年間の教育によってさらに強化されました(経験と知識の融合)。ミネソタ州立大学Mankato校でMSEEの学位を取得したDahlen氏は、ABET認定EEプログラムで教鞭を取り、EETプログラムのプログラムコーディネーターを務め、軍の電子技術者にコンポーネントレベルの修理を教えてきました。彼はミネソタ州北部の自宅に戻り、このような記事のリサーチや執筆を楽しんでいます。 LinkedIn | Aaron Dahlen - Application Engineer - DigiKey




オリジナル・ソース(English)