ADC の前の RC は大きければよいわけではない:サンプリング容量のキックバック
SAR ADC の入力ピンの中身は、数百Ω〜数kΩのサンプルスイッチと、数pF程度のサンプリング容量C_shだけです。これは信号源から見ると小さなRCフィルタで、サンプル期間のうちに1/2LSB以内まで整定しないと、そのまま測定誤差になります。「安全のために外付けCを足しておく」も、サイズを間違えると変換レートを桁違いに落とします。
サンプルスイッチとサンプリング容量:SAR ADC の入力ってどうなっているか
SAR(逐次比較)ADC のピンの内部は、たいていサンプルスイッチ(オン抵抗が数百Ω〜数kΩ)と、それにつながるサンプリング容量 Csh(MCU 内蔵で数pF程度)だけです。動作は2フェーズに分かれます。サンプル(取得)期間ではスイッチが閉じ、Cshがピンの電圧に向かって充電(または放電)します。ホールド(変換)期間ではスイッチが開き、SAR は外部から切り離された Csh の電圧だけを見て2進探索で数値化します。
つまり ADC が実際に測っているのは「入力電圧」そのものではなく、サンプル期間の終わりに Csh がどこまで整定できたかです。信号源に抵抗(分圧、センサの内部抵抗、フィルタのRなど)があると、これは信号源抵抗 R とCshによる1次RCの充電カーブそのものになります。整定しきれなかった分は、ノイズではなくそのまま系統誤差としてコードに現れます。
この記事では、この「サンプル期間内にどこまで整定すればよいか」を式と実際の数字で確かめたうえで、外付けコンデンサや外付けオペアンプを足すときに何が変わり、何が新たな制約になるかを見ていきます。
何τ待てば1/2LSBに収まるか:12bit なら 9τ
1次RCの充電カーブでは、目標値との差(誤差)は時間 t に対して e−t/τ(τ = R·C)で小さくなっていきます。分解能 N bit の ADC で1/2LSB以内に収めたいなら、フルスケール電圧を Vref として誤差が Vref / 2N+1 以下になればよいので、
e−t/τ ≤ 1 / 2N+1 つまり t / τ ≥ ln(2N+1) = (N+1)·ln2 が条件になります。node で 12bit(N=12)を計算すると ln(213) ≈ 9.01。「12bit なら 9τ」という目安はここから来ています。
| 分解能 N | 必要なτの数 | 目安 |
|---|---|---|
| 8bit | 6.24τ | 粗いモニタ、古いロガー |
| 10bit | 7.63τ | 一般的なマイコン内蔵ADC |
| 12bit | 9.01τ | 多くのマイコン内蔵ADC(本記事の例) |
| 14bit | 10.40τ | 高分解能SAR |
| 16bit | 11.78τ | 精密計測用SAR |
高抵抗の分圧を直結すると:100kΩ/100kΩ のバッテリ監視で何が起きるか
よくあるのは、リチウム電池の電圧を100kΩ/100kΩで分圧してADCに直結する回路です。分圧点から見た信号源抵抗(テブナン抵抗)は50kΩ。MCU のデータシートに書かれているサンプリング容量は数pFの桁で、ここでは Csh = 5pF とします。すると τ = 50kΩ × 5pF = 250ns、12bitで整定に必要な時間は 9τ ≈ 2.25µsです。
ところが「サンプル時間はできるだけ短くしたい」という理由で、多くのマイコンでは既定に近いサンプル時間として tacq = 1µs 程度が選ばれがちです。node で計算すると tacq/τ = 4、残る誤差は e−4 ≈ 1.83%。12bit(4096コード)に対して約75LSB、Vref = 3.3V なら約60mVもの誤差になります。
この誤差は乱数ではなくまだ整定しきっていない方向へ必ず寄る系統誤差なので、何回平均しても消えません。分圧抵抗そのものの許容差や負荷による誤差については抵抗分圧の誤差の記事で扱っていますが、ここで起きているのはそれとは別の、時間が足りないだけの誤差です。
MCU データシートの「許容信号源抵抗」表の読み方
多くの MCU のデータシートには、ADC の項目に「許容信号源抵抗 RAIN(MAX)」のような表があります。これは単独の絶対値ではなく、設定したサンプル時間(サイクル数)とセットで決まる値です。物理現象は前節と同じで、サンプル時間を長く取れば取るほど、許容できる RAIN は大きくなります。表を読むときは「このマイコンなら〇〇Ωまで平気」ではなく、「このサンプル時間を選ぶなら、信号源抵抗は〇〇Ω以下にする」という組み合わせの条件として見てください。
もう一つ見落としやすいのが、マルチプレクサでチャネルを切り替えるときです。チャネルを切り替えた直後は、Cshには前のチャネルの電圧が残っています。整定しなければならない「差」は、定常状態でのノイズのようなわずかな量ではなく、チャネル間の電圧差そのもの(最悪はフルスケール)になります。同じ式(9τ)を使うにしても、Vとして見積もる幅を大きく取る必要があります。
外付けコンデンサを足す:電荷分配の算数
サンプル期間を長く取れない、あるいは信号源抵抗を下げられない場合の定番の対策が、ADCピンのすぐ近くに外付けコンデンサ Cextを置くことです。狙いは、Cextを電荷の「リザーバ(貯め場所)」にして、スイッチが閉じた瞬間の速い電荷のやり取りを、信号源抵抗 R を通さずに済ませることです。
Cextと Cshのあいだの電荷共有は、電荷保存則から求まります。Cextが Cshよりずっと大きいとき、共有後にノードの電圧が動く割合はおよそ Csh / (Csh + Cext)。これを1/2LSB相当の 1/2N+1 以下にしたいので、Cext ≥ Csh·(2N+1 − 1) ≈ Csh·2N+1 が目安になります。12bit・Csh=5pFで node 計算すると Cext ≥ 約41nF。
実務では、この最低ラインより余裕を持たせて0.1µF(100nF)のような、手元にあるふつうのX7Rを選ぶことが多いです。比率で見ると Csh/(Csh+100nF) ≈ 5×10−5で、しきい値の 1/213 ≈ 1.22×10−4よりさらに小さく、余裕は2倍以上あります。
その C を充電し直す時間が、変換レートの上限になる
ここが「大きければよいわけではない」の核心です。共有で Cextから出ていった(あるいは入ってきた)わずかな電荷は、次のサンプルまでに信号源抵抗 R を通じて元の電圧まで戻しておく必要があります。この再充電の時定数は τ = R・Cext で、しかも今度は Cext自体が主役なので、Cshのときよりずっと大きくなります。
さきほどの例(R = 50kΩ、Cext = 100nF)で node 計算すると τ = 5ms。12bitで9τまで待つなら45ms必要です。つまりこの回路が保証できるサンプリングレートは、たったの約22SPSまで落ちます。
一方、外付けCなしで正しくサンプル時間を9τ(2.25µs)に設定するだけなら、理屈のうえでは最大444kSPSまで出せる計算です(実際にはMCU側の制約が先に効きますが、桁は大きく違います)。「なんとなく安心な大きめのC」を追加すると、外部信号源抵抗が高いケースではむしろ変換レートを2〜3桁落とす結果になり得ます。Cextを選ぶときは、単発の電荷共有誤差(前節)とこの再充電時間の両方を、想定する信号源抵抗とサンプリング周期に対して確認してください。
平均電流という見方:C_sh・V・fs は等価的な入力抵抗に見える
データシートによっては、瞬間的な整定時間ではなく平均的に見た入力インピーダンスで信号源の条件を示していることがあります。サンプルのたびに Cshが V まで充電され、それが fs 回/秒くり返されると考えると、信号源から見た平均電流は Csh·V·fs。これは、信号源から見て等価的な入力抵抗 Req = 1 / (Csh·fs)を接続しているのと同じに見えます。
node で Csh = 5pF、fs = 1MSPS を入れると Req = 200kΩ。この考え方は電源の設計(信号源側がどれだけの電流を供給し続けられるか)を見るときには便利ですが、1回のサンプルが期間内に整定するかどうかという前節までの話とは別物です。高分解能・高インピーダンス源では、たいてい整定時間(9τ)の条件のほうが厳しくなります。
オペアンプでバッファする:出力に直接大きな C を付けると発振しやすい
オペアンプでボルテージフォロワを組んで信号源とADCのあいだに入れると、閉ループの出力インピーダンスはループ利得の分だけ下がるので、ADCから見た「実効的な信号源抵抗」は小さくなります。ここまでは素直に効きます。問題は、その出力に外付けCを直接ぶら下げるときです。
オペアンプの開ループ出力抵抗を Ro、負荷容量を Cloadとすると、この2つで新しい極ができます。Ro = 50Ω、Cload = 0.1µFという、ありそうな値で node 計算すると極の周波数は 1/(2π·50Ω·0.1µF) ≈ 31.8kHz。この極が帰還ループの中(ユニティゲイン帯域に近いところ)にできると、位相余裕を大きく削り、リンギングや発振の原因になります。オペアンプ回路の誤差の記事で扱ったループ利得の話と根は同じです。
定番の対策は、オペアンプの出力とコンデンサ(=ADCピン)のあいだに数十Ω程度のアイソレーション抵抗(例として20〜100Ω)を1本入れることです。帰還をこの抵抗の手前(オペアンプの出力そのもの)から取れば、大きな負荷Cはフィードバックループの外側に置かれることになり、ループの安定性は影響を受けません。オペアンプの基本回路や帰還の取り方は反転・非反転・VCVSの記事も参照してください。
アンチエイリアスの RC と両立させる
アイソレーション抵抗とADCピン直近の小さなCは、そのまま簡単な1次のアンチエイリアシングフィルタとしても働きます。狙いどおりに使うには、そのRCのカットオフを、サンプリング周波数の1/2よりも十分低く、かつ気にしているノイズ帯域では十分な減衰量が出るところに置く必要があります。実際の減衰カーブと「何dB落とせば十分か」の考え方はRCフィルタの実効的な減衰の記事にまとめています。
ここまでの話とつながるのは、この段のCとCext(電荷リザーバ用の大きなC)を混同しないことです。アイソレーション抵抗(数十Ω)と組み合わせるCは、低インピーダンスなオペアンプ出力を駆動源にしているので、時定数が小さく高いfsでも問題になりません。逆に、信号源そのもの(高インピーダンス)に大きなCext を直付けする話は、前述のとおり再充電時間でfsに強い上限がつきます。同じ「RとC」でも、Rが信号源側にあるか、バッファの後ろにあるかで意味がまったく変わります。
| 用途 | 直列R | ADC直近のC | 備考 |
|---|---|---|---|
| 高インピーダンス源を直結 | 数百Ω〜数kΩ(センサ自身) | なし(内蔵Cshのみ) | サンプル時間を9τ以上に取れる場合だけ |
| 分圧・パッシブセンサ+電荷リザーバC | 源抵抗のまま(数十kΩ級もあり得る) | 1000pF〜0.1µF | fsは源抵抗×Cの再充電時間で頭打ちになる |
| オペアンプでバッファ | 20〜100Ω(アイソレーション) | 100pF〜1nF | 発振防止。fsはMSPS級も狙える |
| アンチエイリアスと兼用 | 100Ω〜数kΩ(バッファ後) | fcがfs/2より十分低くなるよう選ぶ | rc-filter-real-attenuationのロールオフを参照 |
実機で引っかかるところ
読み値が一定方向にずれる。整定不足の誤差は乱数ではないので、平均化やオーバーサンプリングでは消えません。電圧が本来より低く(あるいは前回値寄りに)出続けるなら、まずサンプル時間と信号源抵抗の組み合わせを疑ってください。
ボリュームやポテンショメータの位置でノイズやオフセットが変わる。分圧点のインピーダンスがワイパー位置で変わるため、同じ回路でも整定条件が位置によって変わります。
マルチプレクサでチャネルを切り替えた直後の1点目だけおかしい。Cshに前チャネルの電圧が残っているため、切り替え直後は「差」が大きく、通常のサンプル時間では整定しきれないことがあります。同じチャネルを2回連続でサンプルし、2回目だけ使うという回避策がよく使われます。
外付けCを足したらかえって遅い・古い値を引きずる。これはまさに本記事の主題です。Cextの再充電時間(R・Cextの9τ)が、想定しているサンプリング周期より長くなっていないか確認してください。
よくある質問
サンプル時間を目一杯長く設定すれば、外付けCなしの直結でも大丈夫ですか。
C_sh の値はデータシートのどこに書いてありますか。
外付けCを大きくしすぎると、具体的にどんな症状になりますか。
オペアンプのアイソレーション抵抗はいくつにすればよいですか。
マルチプレクサでチャンネルを切り替えるときも、同じ式(9τ)で計算してよいですか。
参考にした規格・資料
- Horowitz & Hill, The Art of Electronics — RC回路の時定数と整定時間、サンプル/ホールド回路の基礎
- Analog Devices, Op Amp Applications Handbook — 容量性負荷を駆動するオペアンプの安定性、アイソレーション抵抗の考え方
- 各マイコンメーカのADCデータシート/リファレンスマニュアル — サンプリング容量C_ADC、サンプルスイッチの抵抗、許容信号源抵抗R_AIN(MAX)とサンプル時間の関係