マイコンのUARTが「たまに化ける」謎——犯人は外付けコンデンサだった
試作基板でSTM32のUART通信を動かしたら、9600bpsでは安定するのに115200bpsにすると1000バイトに1回くらい文字化けする。ロジアナで見るとクロックが微妙にずれている。水晶のデータシートには「CL=20pF」と書いてあるのに、とりあえず22pFを両側に付けていた——これが偏差の原因だった。
このツールは、水晶振動子のCL(負荷容量)とIC入力容量・浮遊容量を入力するだけで、外付けコンデンサC1・C2の値をE12系列で算出する。周波数偏差(ppm)もリアルタイムに表示されるから、通信に影響するレベルかどうかが一目でわかる。
なぜ負荷容量計算ツールを作ったのか
開発のきっかけ
水晶振動子のデータシートに「CL=20pF」と書いてあるのを見て、「じゃあ20pFのコンデンサを2個付ければいいのか」と思ったのが最初の失敗だった。実際にはCLは外付けコンデンサの直列合成値+浮遊容量+IC入力容量の合計なので、C1=C2=20pFだと実効CLが30pF近くになり、10pF以上のオーバーシュートになる。
ネット上には「とりあえず22pFを付けておけ」という情報が溢れているが、32.768kHzのRTC用水晶でCL=7pFのときに22pFを付けたらどうなるか考えてほしい。実効CLが18pFを超え、160ppm以上の周波数偏差が発生する。RTCなら1日あたり14秒もずれる計算だ。
こだわった設計判断
E12系列への自動丸め: 計算値が13.2pFと出ても、その値のコンデンサは売っていない。E12系列の実在する値(12pF or 15pF)に丸め、丸め後の実効CLと周波数偏差まで表示する。どちらを選ぶべきか、数値で判断できる。
マイコン別プリセット: STM32、ATmega328P、ESP32、PIC、RP2040の5種類に対応。IC入力容量と想定浮遊容量がワンタップで自動入力されるので、データシートを毎回引く手間が省ける。
非対称配置モード: 基板レイアウトの都合でC1とC2を異なる値にしたい場面がある。C1を固定してC2を逆算する非対称モードも搭載した。
水晶発振回路と負荷容量(CL)とは何か
水晶振動子の圧電効果と等価回路
水晶振動子は、水晶(石英 SiO₂)の結晶を薄く切り出した素子だ。水晶に電圧をかけると機械的に変形し(圧電効果)、その変形が電気信号に変換される。この「電気→機械→電気」のサイクルが特定の周波数で共振し、極めて安定したクロック信号を生む。
たとえ話で言えば、ブランコを思い浮かべてほしい。ブランコには「自然に揺れやすい周波数」がある。タイミングよく背中を押せば大きく揺れるが、タイミングがずれると振幅が小さくなる。水晶振動子も同じで、等価回路で表現すると直列共振と並列共振の2つのモードを持つ。マイコンの発振回路で使われるのは主に並列共振モードだ。
負荷容量(CL)の意味
等価回路の並列共振周波数は、外部に接続される容量(負荷容量CL)によって微妙に変化する。水晶メーカーは「この値のCLを外部に接続したとき、公称周波数で振動する」という条件を指定しており、それがデータシートに記載されるCL値だ。
CLの計算式は以下の通り:
CL = (C1 × C2) / (C1 + C2) + Cstray + Cin
C1, C2: 外付けコンデンサ
Cstray: 基板パターンの浮遊容量(通常1〜5pF)
Cin: ICのXTAL端子の入力容量(通常3〜10pF)
C1とC2は直列に接続されるため、合成容量は各値より小さくなる。ここが初学者の混乱ポイントで、「CL=20pFだから20pFを2個」とすると、直列合成は10pFにしかならず、浮遊容量を足しても不足するケースが出てくる。
負荷容量 CL 求め方——対称と非対称
C1=C2の対称配置なら式はシンプルになる:
CL = C1/2 + Cstray + Cin
→ C1 = C2 = 2 × (CL - Cstray - Cin)
C1≠C2の非対称配置では:
Cnet = CL - Cstray - Cin
C2 = Cnet × C1 / (C1 - Cnet)
非対称配置はC1を先に決めてC2を逆算する。C1がCnetより小さいとC2が負になり成立しない。
なぜ負荷容量の正確な設定が重要なのか
周波数偏差がもたらす実害
負荷容量がずれると、水晶の発振周波数が公称値からずれる。ずれ幅はppm(百万分の一)で表され、1pFの容量ずれで概ね10〜20ppmの偏差が生じる(水晶のCLカーブ傾斜による)。
具体的にどの程度困るか:
- UART通信: 115200bpsの場合、許容偏差はおよそ±2%(±20,000ppm)と余裕があるように見えるが、送受信双方がずれると合算される。送信側+50ppm・受信側-50ppmなら合計100ppmの差が生じ、長いフレームで化けることがある
- USB 2.0: クロック精度±500ppm以内が規格要件。CL不整合で±100ppmもずれると、温度変動と合わせて規格ギリギリになる
- RTC(32.768kHz): 20ppmのずれは1日あたり約1.7秒のドリフト。1年で10分以上ずれる計算になる。CL=7pFの水晶に22pFを付けると160ppm以上の偏差が出て、1日14秒もずれる
規格・基準
IEC 60122-1は水晶振動子の特性と測定方法を規定しており、負荷容量の条件下で公称周波数を保証する仕組みだ。マイコンメーカーのデータシート(STM32のAN2867、ATmega328Pのデータシート等)でも推奨CL範囲と外付けコンデンサの選定ガイドラインが記載されている。
マイコン基板設計でCL計算が活躍する場面
新規マイコン基板の設計
STM32やESP32でカスタム基板を設計するとき、最初に決めるのがクロック回路だ。HSE(高速外部発振器)やLSE(低速外部発振器)の水晶を選定し、外付けコンデンサを決める。このツールならデータシートのCL値を入力するだけで推奨コンデンサが決まる。
RTC回路の時刻精度改善
32.768kHz水晶のCLは6〜12.5pFと小さく、浮遊容量の影響が相対的に大きい。「RTCが毎月5分ずれる」という場合、まず外付けコンデンサの値を見直すべきだ。
Arduino互換基板の自作
ATmega328Pを使ったArduino互換機を自作する場合、16MHzの水晶に「とりあえず22pF」が定番だが、ICの入力容量と浮遊容量を考慮すると最適値は異なることがある。
USB機器の安定動作
USB用12MHzまたは48MHzクロックは精度要件が厳しい。CL不整合による周波数偏差がUSBデバイスの認識不良につながるケースは珍しくない。
基本の使い方
水晶のデータシートとマイコンの回路図を手元に用意すれば、3ステップで完了する。
Step 1: 水晶振動子のCLを入力する
データシートから負荷容量(CL)を確認し、数値入力欄に入れる。よく使われる水晶(8MHz/16MHz/32.768kHz等)はプリセットからワンタップで選べる。
Step 2: IC入力容量と浮遊容量を設定する
マイコンプリセット(STM32/ATmega/ESP32等)を選ぶと、IC入力容量と浮遊容量が自動入力される。正確な値がわかればカスタム入力に切り替えてみて。
Step 3: 推奨コンデンサ値を確認する
C1/C2の計算値がE12系列の推奨値とともに表示される。実効CLと目標CLの差分から算出した周波数偏差(ppm)で、通信に影響するレベルかどうかを確認できる。
具体的な使用例(検証データ)
ケース1: STM32 + 8MHz水晶 (CL=18pF)
入力値:
- 負荷容量 CL: 18 pF
- IC入力容量 Cin: 5 pF(STM32プリセット)
- 浮遊容量 Cstray: 2 pF
計算結果:
- C1 = C2 = 2 × (18 - 2 - 5) = 22.0 pF
- E12推奨: 22 pF
- 実効CL: 22/2 + 2 + 5 = 18.0 pF
→ 解釈: ぴったり18pFに一致。STM32の標準構成ではAN2867の推奨値とも合致する。偏差0ppmで理想的。
ケース2: ATmega328P + 16MHz水晶 (CL=20pF)
入力値:
- CL: 20 pF、Cin: 6 pF、Cstray: 2 pF
計算結果:
- C1 = C2 = 2 × (20 - 2 - 6) = 24.0 pF
- E12推奨: 22 pF(24は非E12のため切り捨て)
- 実効CL: (22×22)/(22+22) + 2 + 6 = 19.0 pF
- 周波数偏差: 15 × (19.0 - 20) = -15.0 ppm
→ 解釈: -15ppmは一般用途なら問題ないレベル。UART通信には影響しない。
ケース3: ESP32 + 40MHz水晶 (CL=10pF)
入力値:
- CL: 10 pF、Cin: 5 pF、Cstray: 3 pF
計算結果:
- C1 = C2 = 2 × (10 - 3 - 5) = 4.0 pF
- E12推奨: 3.9 pF
- 実効CL: (3.9×3.9)/(3.9+3.9) + 3 + 5 = 9.95 pF
- 周波数偏差: 15 × (9.95 - 10) = -0.8 ppm
→ 解釈: ほぼ偏差なし。ただし4pFクラスは浮遊容量の影響が大きいため、基板パターンの長さに注意。
ケース4: RTC 32.768kHz水晶 (CL=7pF)
入力値:
- CL: 7 pF、Cin: 5 pF、Cstray: 2 pF
計算結果:
- Cnet = 7 - 2 - 5 = 0 pF
- 外付けコンデンサ不要(浮遊容量+IC入力容量で既にCLに到達)
→ 解釈: IC入力容量と浮遊容量だけでCLを満たしている。外付けコンデンサを付けると過負荷になり、時刻が遅れる方向にずれる。
ケース5: USB用 12MHz水晶 (CL=20pF)
入力値:
- CL: 20 pF、Cin: 5 pF、Cstray: 2 pF
計算結果:
- C1 = C2 = 2 × (20 - 2 - 5) = 26.0 pF
- E12推奨: 27 pF
- 実効CL: (27×27)/(27+27) + 2 + 5 = 20.5 pF
- 周波数偏差: +7.5 ppm
→ 解釈: USB 2.0の要件(±500ppm)に対して十分な精度。+7.5ppmはまったく問題ない。
ケース6: 非対称配置(C1=15pF固定)
入力値:
- CL: 20 pF、Cin: 5 pF、Cstray: 2 pF
- C1固定: 15 pF
計算結果:
- Cnet = 20 - 2 - 5 = 13 pF
- C2 = 13 × 15 / (15 - 13) = 97.5 pF
- E12推奨: 100 pF
→ 解釈: C1が小さいとC2が極端に大きくなる。C1=15pFだとCnet=13pFに近いため、C2が急激に増加する。C1にはCnetより十分大きい値を選ぶべき。
仕組み・アルゴリズム
採用している計算方式
水晶発振回路の負荷容量は、等価回路モデルに基づく直列合成の公式から導出する。候補として2つのアプローチがある:
- 解析解(直接計算): CL = C1*C2/(C1+C2) + Cstray + Cin の逆算。対称配置なら一次方程式、非対称でも分数式1本で解ける
- 数値探索(ブルートフォース): E12系列の全組み合わせを試し、CLに最も近いペアを選ぶ
本ツールは方式1(解析解)+ E12系列への丸めを採用した。理由は単純で、閉じた式で厳密解が得られるのに数値探索する意味がないから。丸めは計算後に1回だけ行い、丸め後の実効CLから偏差を逆算する。
参考: Pierce oscillator - Wikipedia
具体的な計算フロー
入力: CL=20pF, Cin=5pF, Cstray=2pF(対称配置)
Step 1: 正味負荷容量を算出
Cnet = CL - Cstray - Cin = 20 - 2 - 5 = 13 pF
Step 2: 外付けコンデンサ値を算出(対称)
Cx = 2 × Cnet = 2 × 13 = 26 pF
Step 3: E12系列に丸め
E12系列: ...22, 27, 33...
26に最も近いのは27 pF
Step 4: 実効CLを逆算
actualCL = (27×27)/(27+27) + 2 + 5 = 13.5 + 7 = 20.5 pF
Step 5: 周波数偏差を推定
Δf = 15 × (20.5 - 20) = +7.5 ppm
E12系列丸めの影響
E12系列は1桁あたり12段階(1.0, 1.2, 1.5, 1.8, 2.2, 2.7, 3.3, 3.9, 4.7, 5.6, 6.8, 8.2)。隣接する値の比率は約1.2倍で、最大で±10%程度の丸め誤差が発生する。コンデンサの容量公差(±5%〜±20%)と同程度なので、実用上はE12丸めによる偏差よりも部品公差の方が支配的になることが多い。
ppm推定の根拠
周波数偏差の推定には、負荷容量感度として15ppm/pFの定数を使用している。これは一般的なATカット水晶(数MHz〜数十MHz帯)の典型的な値だ。実際のCL感度は水晶の等価回路パラメータ(C0, C1, L1)に依存するが、データシートにCL感度が明記されていない場合の目安として広く使われている。
参考: AT cut crystal - 村田製作所 技術資料
「とりあえず22pF」との決別——このツールの違い
データシート準拠の正確な計算
ネット上の「22pFを付ければOK」は、STM32+8MHz(CL=18pF)+Cin=5pF+Cstray=3pFという特定条件でたまたま合っているだけだ。水晶やマイコンが変われば最適値も変わる。このツールは任意のCL/Cin/Cstrayに対応する。
E12系列と周波数偏差の同時表示
計算値を出すだけのツールは他にもあるが、「E12に丸めたら周波数がどれだけずれるか」まで表示するものは少ない。通信用途で偏差が許容範囲内かどうかをその場で判断できる。
スマホでサッと使える
基板設計の現場でPCを開かなくても、スマホのブラウザでサッと計算できる。プリセットを選ぶだけなら10秒で結果が出る。
水晶発振にまつわる豆知識
32.768kHzはなぜ「時計用」なのか
32,768 = 2^15。15段の分周器(フリップフロップ)で割ると正確に1Hzが得られる。1960年代にセイコーがクオーツ腕時計を開発したとき、2のべき乗で分周しやすいこの周波数が選ばれた。以来、RTCの標準クロックとして世界中で使われている。
ATカットとBTカットの違い
水晶の切り出し角度(カット角)によって温度特性が大きく変わる。ATカットは-40〜+85°Cの範囲で周波数変動が±25ppm以内に収まり、最も広く使われている。BTカットは安価だが温度特性が劣るため、精度が重要な用途にはATカットが選ばれる。
参考: Crystal oscillator - Wikipedia
負荷容量計算を使いこなすコツ
Tip 1: 浮遊容量は実測するのが理想
データシートに浮遊容量は書かれていない。典型値として2〜3pFが使われるが、基板パターンが長いと5pF以上になることもある。最も確実なのは、水晶を付けずにXTAL端子とGND間の容量をLCRメーターで測ること。
Tip 2: E12の上下両方を試す
計算値が2つのE12値の中間にある場合、両方で周波数偏差を比較してみて。偏差が小さい方を選ぶのが基本だが、発振開始性(起動時間)を考慮して容量が大きい方を選ぶケースもある。
Tip 3: 温度公差を考慮する
セラミックコンデンサは温度で容量が変化する。C0G(NP0)特性なら±30ppm/°Cと安定だが、X7RやX5Rは容量変化が大きい。水晶回路にはC0G特性のコンデンサを推奨する。
Tip 4: 基板パターンは短く
XTAL端子から外付けコンデンサまでのパターンは極力短くし、GNDベタに近接させる。パターンが長いと浮遊容量が増加し、計算値から乖離する。
よくある質問
Q: 対称配置と非対称配置、どちらを選ぶべき?
基本は対称配置(C1=C2)を推奨する。回路の対称性が高いほど発振が安定し、ノイズ耐性も向上する。非対称配置は、基板レイアウトの制約でC1側のパターンが長くなり浮遊容量が偏る場合や、特定のE12値しか在庫がない場合に限って使うのが一般的だ。
Q: IC入力容量がデータシートに載っていない場合は?
汎用CMOS ICの場合、XTAL端子の入力容量は3〜10pFが一般的だ。データシートに明記されていなければ、5pFを仮の値として計算し、実測で微調整するのが現実的。高精度が必要なら、ICメーカーのFAQやアプリケーションノートを確認してみて。
Q: 周波数偏差が大きい場合、どう対処する?
まずE12系列の上下候補で偏差が小さい方を選ぶ。それでも不足なら、浮遊容量の正確な測定、C0G特性コンデンサへの変更、基板パターンの短縮を検討する。それでも足りなければ、TCXO(温度補償水晶発振器)への切り替えも選択肢だ。
Q: コンデンサの公差は結果にどう影響する?
一般的なセラミックコンデンサの公差は±5%(C0G)〜±20%(X5R/X7R)。22pFのコンデンサが±10%なら19.8〜24.2pFの範囲でばらつく。pF帯では数pFの差が10〜30ppmの偏差に相当するため、精度が重要な用途ではC0G(NP0)の±5%品を選ぶべきだ。
Q: 入力データはサーバーに送信される?
すべての計算はブラウザ内(JavaScript)で完結している。入力値がサーバーに送信されることは一切ない。
まとめ
水晶発振回路の外付けコンデンサ選定は、「とりあえず22pF」ではなく、CL・Cin・Cstrayから正確に逆算すべきだ。このツールなら10秒で計算でき、E12推奨値と周波数偏差まで一目で確認できる。
プルアップ抵抗の選定が気になった人はプルアップ抵抗計算ツールも試してみて。基板のパターン設計にはプリント基板パターン幅計算ツールが役立つ。
不具合や要望があれば、X (@MahiroMemo)から気軽に教えて。