編集履歴一覧に戻る
uchanのアイコン画像

uchan が 2025年07月09日06時13分53秒 に編集

初版

タイトルの変更

+

CH32V003 に水晶を外付けして発振余裕度を測ってみる

タグの変更

+

CH32V003

+

水晶振動子

+

発振回路

+

プリント基板

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

本文の変更

+

[マイコン内蔵 RC 発振器の周波数は不安定](https://elchika.com/article/3b15d3d1-d2f6-4740-a8c1-351a4999f562/)だということが分かったので、CH32V003 の動作クロックを安定なものとするため、水晶振動子を使おうと思いました。発振回路は設計が雑だとうまく発振しないことがあると聞くので、色々と情報を調べて設計しているところです。 ## 負荷容量 負荷容量(Load Capacitance)は水晶振動子を発振させるために重要な値です。同じ周波数・同じシリーズの水晶振動子でも様々な負荷容量を持つ製品があるので、欲しい容量を指定して買います。 今回、実験用に 2 つの水晶振動子を選びました。それぞれ負荷容量が 20pF と 10pF です。 | 型番 | 周波数 | 負荷容量 | 等価直列抵抗 (max) | 並列容量 (max) | |------|--------|----------|--------------------|----------------| | 24M20P2/XT324-10/10 | 24MHz | 20pF | 40Ω | 3pF | | RH100-24.000-10-3030-TR | 24MHz | 10pF | 60Ω | 3.5pF | 「[発振回路の設計について | セイコーインスツル株式会社 水晶事業部](https://www.sii.co.jp/jp/quartz/circuit-design/)」によれば、発振回路に用いるコンデンサ(資料図 10 の Cg と Cd)の値によって周波数が変わるそうです。水晶振動子の規格値(24MHz)で発振させるには次の式を満たすようにコンデンサ容量を決めればいいようです。(ちなみに、CgやCdは負荷容量そのもの**ではありません**。「負荷容量」は水晶振動子から発振回路側を見たときの容量を意味します。) $$C_L=\frac{C_g\cdot C_d}{C_g+C_d}+C_s$$ $C_s$は回路の浮遊容量で、「[水晶振動子 仕様の用語解説 | 多摩デバイス](https://tamadevice.co.jp/crystal-units-kaisetu.htm)」によれば「目安として 3~10pF の間」になるそうです。また別の記事「[水晶発振器の負荷容量の選択 | DigiKey TechForum](https://forum.digikey.com/t/topic/6738)」では「多くの場合 2pF から 5pF の範囲」と書いてあります。基板を組み立てて測定してみないと正確な値は分かりません。 普通はCgとCdには同じ値を使うと思います。それをCXとすると、次の式になります。 $$C_L=\frac{C_X^2}{2C_X}+C_s=\frac{C_X}{2}+C_s$$ $C_X$について解くと $$C_X=2(C_L-C_s)$$ となります。仮に Cs=5pF とすると、CL=20pF の水晶であれば CX=30pF となります。もし浮遊容量が大きめで Cs=10pF なら CX=20pF となります。結構差が出ますね。 ## 負性抵抗 調べる中で、どうやら「発振余裕度」を高くすることが安定な発振のためには重要だと分かりました。「[発振回路の設計について | セイコーインスツル株式会社 水晶事業部](https://www.sii.co.jp/jp/quartz/circuit-design/)」によれば、発振余裕度は「回路の負性抵抗」と「振動子の等価直列抵抗」の比率で計算できて、その比が 5 倍以上となることが推奨されています。 上記の資料を参考にして、次のような負性抵抗測定回路を作りました。CMOS インバータの代わりにマイコン CH32V003 を使っています(なぜなら、そもそも CH32V003 の動作クロックの安定性を改善するのが目的だからです)。 ![CH32V003を用いた水晶発振回路の負性抵抗測定回路](https://camo.elchika.com/6f96186598406ebdf6f603e54b70d5802a1f2506/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f65643731393338612d396161332d343630632d386665612d326434643166303864323861/) RV1 がポイントです。この抵抗値を変えて、発振の開始・停止が切り替わる点を探します。その抵抗値を Rx とすると、負性抵抗 |-R| は次式で求められるそうです。 $$|-R|=R_x+R_e$$ Re は水晶振動子の発振時の実効抵抗で、$R_e=R_1(1+C_0/C_L)^2$ で求められるそうです。 - $R_1$: 等価直列抵抗(Series Resistance) - $C_0$: 並列容量(Shunt Capacitance) - $C_L$: 負荷容量 水晶振動子 24M20P2/XT324-10/10 の場合、R1=40Ω、C0=3pF、CL=20pFなので、$R_e=40\times(1+3/20)^2=52.9$と計算できます。 RH100-24.000-10-3030-TR の場合、R1=60Ω、C0=3.5pF、CL=10pFなので、$R_e=60\times(1+3.5/10)^2=109.35$と計算できます。 ## 負性抵抗の測定 実際に負性抵抗を測ってみた結果を次表に示します。 | 水晶振動子の型番 | Re (Ω) | CX (pF) | 測定回 | Rx (Ω) | 負性抵抗 (Ω) | 発振余裕度 | | ----------------------- | ------- | ------- | --- | ------ | -------- | --- | | 24M20P2/XT324-10/10 | 52.9 | 30 | 1 | 117 | 169.9 | 4.2 | | 24M20P2/XT324-10/10 | 52.9 | 30 | 2 | 65 | 117.9 | 2.9 | | 24M20P2/XT324-10/10 | 52.9 | 22 | 1 | 158 | 210.9 | 5.3 | | 24M20P2/XT324-10/10 | 52.9 | 22 | 2 | 162 | 214.9 | 5.4 | | 24M20P2/XT324-10/10 | 52.9 | 22 | 3 | 165 | 217.9 | 5.4 | | RH100-24.000-10-3030-TR | 109.35 | 10 | 1 | 599 | 708.35 | 11.8 | | RH100-24.000-10-3030-TR | 109.35 | 10 | 2 | 626 | 735.35 | 12.3 | 同じ回路でも測定したタイミングによって違いが出ました。特に CX=30pF の場合に差が激しかったです。測定方法がいい加減だからなのか、CX が大きいと差が出やすかったりするのか。ちょっと分かりません。 負性抵抗の具体的な測り方は次の手順です。 1. CH32V003 に LED を 0.1 秒間隔で点滅させるプログラムを書いておく。 2. RV1 を 0Ω 付近にしておく。 3. 回路に電源を入れ、LED が点滅することを確認する。 4. LED の点滅が止まるまで RV1 を徐々に大きくする。 5. 回路の電源を切り、RV1 の抵抗値をテスターで測る。 ## 発振余裕度 発振余裕度は「回路の負性抵抗」と「振動子の等価直列抵抗」の比です。ということで、計算した値を先ほどの表に記入してあります。 発振余裕度が 5 倍以上であれば十分に余裕があるということみたいです。そう考えると、24M20P2/XT324-10/10 の場合に CX の計算値 30pF では発振余裕度が足りません。もしかしたら回路の浮遊容量が 5pF より大きく、CX=30pF では大きすぎたのかもしれません。 RH100-24.000-10-3030-TR と CX=10pF の組み合わせの発振余裕度がかなり高くなりました。 ## 小話 負性抵抗を測定して発振余裕度を計算するという記事の主旨に直接は関係しませんが、紹介しておきたかったことを書きます。 ### 負性抵抗測定装置 記事の本筋ではありませんが、作った測定装置の外観を紹介します。まずは表面から。金色のツマミが付いた青い部品が可変抵抗 RV1 です。 ![負性抵抗測定基板の表面にはピンヘッダと可変抵抗が見える](https://camo.elchika.com/cbf5859cf793002e98c4424a74d36771bd6a6874/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f64353234646163302d636663392d343663392d383531312d376130313733623439316662/) この基板は CNC フライスで銅張積層板を削って作りました。そのためレジスト等の処理がされていません。今回のような実験基板を素早く作れるので重宝しています。 ![負性抵抗測定基板の裏面にはマイコンと水晶振動子が実装されている](https://camo.elchika.com/fc302e02b4b21c9aed0f6296f77a0db3efec8b9c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f30613234333966342d373733312d343664612d386330382d616631343039663938636366/) 切削加工データは KiCad と FlatCAM で作り、切削は KitMill でやりました。基板の作り方は「[KiCad + FlatCAM で KitMill 用の基板切削データを作る](https://elchika.com/article/3bfd48b8-24e8-4455-b2dd-c3b582fd0c23/)」にまとめています。 ### クロックの自動変更 可変抵抗を回して LED の点滅が止まる点を探る際、不思議な現象に出会いました。点滅が止まるのではなく、半分程度の点滅速度になることがあったのです。必ずではなく、半分くらいの確率で。 CH32V003 のリファレンスマニュアルを読むと「クロック安全システム」というのがあるようです。HSE クロックが故障(fail)した際に、システムクロックが外付けクロック(HSE)からマイコン内蔵 RC 発振器に切り替わる機能のようです。内蔵 RC に切り替わるついでに PLL も無効化されるとのことです。私が使っているライブラリ [ch32fun](https://github.com/cnlohr/ch32fun) のデフォルト設定でクロック安全システムが有効化されているようでしたので、私が出会った現象はこの機能によるものだと思って良さそうです。 ### CH32V003 の推奨値 CH32V003 のデータシートから表 3-10「High-speed external clock generated from a crystal/ceramic resonator」を引用します。この表は HSE に水晶振動子を用いる場合の電気的特性です。 | Symbol | Parameter | Condition | Min. | Typ. | Max. | Unit | | ------------------- | ------------------------------------------------------------------------------------ | ------------------------------------ | ---- | ---- | ---- | ---- | | $F_\mathrm{OSC\_IN}$ | Resonator frequency | | 4 | 24 | 25 | MHz | | $R_\mathrm{F}$ | Feedback resistance | | | 250 | | kΩ | | $C$ | Recommended load capacitance and corresponding crystal series impedance $R_\mathrm{S}$| $R_\mathrm{S}$ = 60Ω [^note1] | | 20 | | pF | | $I_\mathrm{2}$ | HSE drive current | $V_\mathrm{DD}$ = 3.3V, 20p load | | 0.32 | | mA | | $g_\mathrm{m}$ | Oscillator transconductance | Startup | | 6.8 | | mA/V | | $t_\mathrm{SU(HSE)}$ | Startup time | $V_\mathrm{DD}$ is stable, 24M crystal| | 2 | | ms | [^note1]: _It is recommended that the ESR of 25M crystal should not exceed 60 Ω, and it can be relaxed if it is lower than 25M._ この表によれば、水晶振動子の負荷容量は 20pF が標準(Typ)だそうです。今回の実験では負荷容量 10pF の水晶でも問題なく動作しましたが、特に制約するものが無ければ 20pF の水晶を使っておいた方が安心かもしれません。 また、等価直列抵抗は 60Ω と記載されています。ちょうど 60Ω という意味か 60Ω 以下であれば良いのかがハッキリしませんが、Note 1 を考慮すると「60Ω以下」と思って良い気がします。 HSE 駆動電流の標準値は $I_\mathrm{2}$=0.32mA だそうです。24M20P2/XT324-10/10 の実効抵抗は Re=52.9Ω ですから、ドライブレベルは $I_2^2\cdot R_e=5.42\mathrm{\, \mu W}$ と計算されます。この振動子のデータシートによれば、ドライブレベルは 10μW (typ)、100μW (max) と規定されています。最大値より小さいので振動子が破壊されることはなさそうです。標準値より小さいのが少し心配ですが。