PR

12Vや24Vをマイコンで測るには?分圧回路の設計と誤差の計算

ソフトウェア

バッテリー電圧や24V電源をマイコンで監視したい場面はよくあります。しかしマイコンのADCが受けられるのは、3.3Vや5Vまでです。そこで使うのが、抵抗2本の分圧回路です。

  • 抵抗値はどうやって決めればよいのか?
  • 抵抗は大きいほうがよいのか、小さいほうがよいのか?
  • 抵抗の誤差は、測定値にどれくらい影響するのか?
  • 過電圧からマイコンをどう守るのか?

回路そのものは単純ですが、抵抗値の選び方で測定の質が大きく変わります。この記事では、設計の考え方をQ&A形式で整理します。

先に結論

  • 分圧比は、想定される最大電圧でもADCの上限を超えないように決めます。
  • 抵抗値は、2本を並列にした値が10kΩ程度以下になるようにし、ADCのピンとGNDの間にコンデンサを入れます。
  • 誤差1%の抵抗では、測定値に最大で約1.8%の誤差が出ます。12bit ADCの1LSBよりはるかに大きいので、校正するか高精度の抵抗を使います。
  • 上側の抵抗が電流を制限してくれるので、分圧回路自体がある程度の保護になります。

Q1. なぜ12Vや24Vを直接つなげないのか?

A. マイコンの入力ピンが耐えられる電圧は、電源電圧より少し高い程度までだからです。

入力ピンの絶対最大定格は、多くのマイコンで「電源電圧+0.3〜0.5V」程度です。3.3Vで動くマイコンのピンに12Vを直接入れると、内部の保護ダイオードに大きな電流が流れて壊れます。

そこで、入力電圧を抵抗で分けて、ADCが受けられる範囲まで小さくします。

Q2. 抵抗値はどうやって決めるのか?

A. 「想定される最大電圧」を入れたときに、ADCの上限を超えない分圧比にします。

Vin ----[ R1 ]----+-------- ADC
                  |
               [ R2 ]
                  |
GND --------------+

ADCのピンに現れる電圧は次の式で決まります。

ピンの電圧 = Vin × R2 ÷(R1 + R2)

ここで大事なのは、公称の電圧ではなく最大の電圧で考えることです。12Vの鉛バッテリーは充電中に14V以上になりますし、24V電源も無負荷では高めに出ることがあります。

3.3VのADCで受ける場合の例を2つ示します。

12V系24V系
R1(上側)47kΩ100kΩ
R2(下側)10kΩ10kΩ
分圧比約1/5.71/11
公称電圧でのピン電圧12V → 約2.11V24V → 約2.18V
高めの電圧でのピン電圧16V → 約2.81V30V → 約2.73V
測定できる上限約18.8V約36.3V
12bit ADCの1LSB(入力換算)約4.6mV約8.9mV

余裕を大きく取るほど安全ですが、その分だけADCのレンジを使い切れなくなります。上の例では、公称電圧でレンジの3分の2ほどを使う設定にしています。

Q3. 抵抗値は大きいほうがよいのか、小さいほうがよいのか?

A. どちらにも問題があります。目安は「R1とR2を並列にした値が10kΩ程度以下」です。

小さすぎる場合

分圧回路には常に電流が流れます。R1とR2の合計が1.1kΩなら、24Vで約22mA、0.5W以上を消費します。電力の無駄ですし、抵抗が発熱して値が変わります。

大きすぎる場合

ADCは変換のたびに、内部の小さなコンデンサに入力電圧を取り込みます。信号源の抵抗が大きいと、このコンデンサを時間内に充電しきれず、測定値が本来より低く出たり、直前に測った別チャンネルの値に引きずられたりします。

ここで効いてくるのは、ADCのピンから見た分圧回路の抵抗で、R1とR2を並列にした値になります。R1+R2ではない点に注意してください。

  • 100kΩと10kΩの並列:約9.1kΩ
  • 47kΩと10kΩの並列:約8.2kΩ

たとえばATmega328Pのデータシートでは、ADCは出力インピーダンスが約10kΩ以下の信号に最適化されているとされています。許容値はマイコンによって違うので、使うマイコンのデータシートで確認してください。

もうひとつ、入力ピンにはわずかな漏れ電流があります。漏れ電流が100nA、分圧回路の抵抗が91kΩ(1MΩと100kΩの並列)なら、ピンの電圧は約9mVずれます。分圧比1/11で入力に換算すると約0.1Vの誤差です。

コンデンサを追加する

R2と並列に、0.1µF程度のコンデンサを入れるのが定番です。

Vin ----[ R1 ]----+-------- ADC
                  |
               [ R2 ]  [ C ]   ← R2とCを並列に接続
                  |
GND --------------+

効果は2つあります。

  • ADCが電圧を取り込む瞬間に必要な電荷を、コンデンサが供給してくれます。ADC内部のコンデンサは十数pF程度なので、0.1µFあれば電圧はほとんど下がりません。
  • 抵抗と組み合わさってローパスフィルタになり、高い周波数のノイズを減らします。100kΩ、10kΩ、0.1µFの組み合わせなら、カットオフ周波数は約175Hzです。

代わりに、入力電圧の変化への応答は遅くなります。この例では、変化が落ち着くまでに5ミリ秒ほどかかります。電源電圧の監視なら問題になりませんが、速い変化を見たい用途には向きません。その場合は、分圧回路の後ろにオペアンプのバッファを入れます。

電池で動かす場合

電池駆動では、分圧回路に流れ続ける電流が気になります。24Vで110kΩなら約0.2mAです。抵抗を10倍にすれば電流は10分の1になりますが、前述の漏れ電流の影響が大きくなります。測るときだけトランジスタで分圧回路をつなぐ方法もあります。

Q4. 抵抗の誤差は、測定値にどれくらい影響するのか?

A. 誤差1%の抵抗を2本使うと、最悪で約1.8%の誤差になります。ADCの分解能よりずっと大きな誤差です。

100kΩと10kΩの組み合わせで、R1が1%大きく、R2が1%小さい場合を計算すると、分圧比は約1.8%小さくなります。24Vを測っているなら約0.44Vのずれです。

抵抗の誤差分圧比の誤差(最悪値)24V測定時のずれ12bit ADCで何LSB分か
±5%約±9%約±2.2V約370LSB
±1%約±1.8%約±0.44V約74LSB
±0.1%約±0.18%約±0.044V約7LSB

12bit ADCの1LSBは、フルスケールの約0.024%です。1%の抵抗を使った時点で、誤差は分解能の70倍以上になります。ADCのbit数を上げても、この誤差は小さくなりません。

対策1:校正する

正確に分かっている電圧を入力し、計算値とのずれから補正係数を求めて、プログラムに持たせます。抵抗の初期誤差はこれで取り除けます。

対策2:高精度の抵抗を使う

校正の手間をかけられない場合は、誤差0.1%の抵抗を使います。

温度による変化

校正しても残るのが温度による変化です。一般的なチップ抵抗の温度係数は±100ppm/℃程度で、温度が50℃変わると抵抗値は最大0.5%変わります。ただし、R1とR2が同じ方向に同じ割合で変われば分圧比は変わりません。同じメーカーの同じシリーズの抵抗を、近くに並べて配置するのが有効です。

基準電圧も忘れずに

抵抗をいくら良くしても、ADCの基準電圧がずれていれば同じだけ測定値がずれます。3.3V電源をそのまま基準にしている場合、電源の誤差がそのまま乗ります。

Q5. 過電圧やサージからマイコンをどう守るのか?

A. 上側の抵抗R1が電流を制限するので、分圧回路そのものが最初の保護になります。足りない分をダイオードで補います。

R1が電流を制限する

100kΩと10kΩの回路に、一時的に100Vがかかったとします。ピンの電圧はマイコン内部の保護ダイオードで電源電圧より少し高いところに抑えられ、そのときダイオードに流れる電流は1mA未満です。保護ダイオードに流してよい電流はマイコンごとに決まっているので、データシートの「注入電流」の項目で確認します。

R1自体の耐電圧にも注意が必要です。小さなチップ抵抗は、かけられる電圧が数十V程度までのものがあります。

外付けのダイオードで補強する

内部の保護ダイオードに頼りたくない場合は、ADCのピンから電源へショットキーダイオードを追加します。順方向電圧が低いので、内部のダイオードより先に電流を逃がしてくれます。マイナスの電圧が入る可能性があれば、GND側にも入れます。

ツェナーダイオードで抑える方法もありますが、ツェナーダイオードは規定の電圧より低いところから少しずつ電流が流れ始めます。抵抗値の高い分圧回路では、この漏れ電流が測定誤差になるので注意が必要です。

マイコンの電源が切れているとき

見落としやすいのが、マイコンの電源が切れているのに測定対象の電圧だけがかかっている状態です。保護ダイオードを通じて、入力からマイコンの電源ラインへ電流が回り込みます。R1が十分に大きければ電流はわずかですが、マイコンが中途半端に動き出すなどの不具合につながることがあります。

Q6. 測定値から元の電圧を計算するには?

A. ピンの電圧を求めてから、分圧比の逆数を掛けます。

// R1 = 100kΩ、R2 = 10kΩ、基準電圧3.3V、12bit ADCの場合
const float VREF = 3.3;
const float R1   = 100000.0;
const float R2   = 10000.0;
const float CAL  = 1.000;   // 校正用の係数

float toInputVoltage(int raw) {
  float vPin = raw * VREF / 4096.0;   // ピンの電圧
  return vPin * (R1 + R2) / R2 * CAL; // 分圧前の電圧に戻す
}

CALは校正用の係数です。たとえばテスターで24.00Vと確認した電圧を入れて、計算結果が23.70Vだったなら、CALを24.00÷23.70=1.0127にします。

Q7. 分圧回路では測れないのは、どんな場合か?

A. 測定対象とマイコンのGNDが共通でない場合です。

分圧回路は、測りたい電圧とマイコンが同じGNDを基準にしていることが前提です。次のような場合は、別の方法が必要になります。

  • GNDから浮いた2点間の電圧を測りたい:差動アンプを使います。
  • 別系統の電源や、安全上つないではいけない回路を測りたい:絶縁アンプや絶縁型のADCを使います。

まとめ

  • 分圧比は、公称値ではなく最大電圧で決める。
  • R1とR2の並列値を10kΩ程度以下にし、R2と並列に0.1µF程度のコンデンサを入れる。
  • 1%の抵抗では約1.8%の誤差が出る。校正するか、0.1%の抵抗を使う。
  • R1とR2は同じシリーズの抵抗を使い、近くに配置する。
  • R1による電流制限が基本の保護になる。必要に応じてショットキーダイオードを追加する。
  • GNDが共通でない電圧は、分圧回路では測れない。

参考資料

コメント

タイトルとURLをコピーしました