デジタル信号の周波数を取り扱う際には、定期的に振動する発振回路を実装する必要があります。その中核となるのが水晶振動子(Crystal Oscillator)です。
水晶振動子は、水晶(石英, SiO$_2$)の圧電効果を利用して、極めて安定した周波数の電気信号を生成する素子です。コンピュータのクロック信号から通信機器の基準周波数まで、あらゆるデジタル機器で使われています。
本記事の内容
- 圧電効果の原理
- 水晶振動子の等価回路モデル
- 共振周波数と反共振周波数の導出
- Pythonでのインピーダンス特性シミュレーション
圧電効果とは
圧電効果(Piezoelectric Effect)とは、特定の結晶に機械的な力を加えると電圧が発生し、逆に電圧を加えると結晶が変形する現象です。
水晶は圧電体の代表例であり、以下の2つの効果を持ちます。
- 正圧電効果: 応力 → 電圧が発生
- 逆圧電効果: 電圧 → 応力(変形)が発生
逆圧電効果により水晶に交流電圧を加えると機械的振動が生じ、正圧電効果によりこの振動が電気信号に変換されます。この機械電気的なフィードバックにより、安定した発振が実現されます。
水晶振動子の等価回路
水晶振動子の電気的特性は、次の等価回路で表されます。
直列枝と並列容量 $C_0$ から構成されます。
- $L_1$: 等価インダクタンス(機械的慣性に対応)
- $C_1$: 等価容量(機械的弾性に対応)
- $R_1$: 等価抵抗(機械的損失に対応)
- $C_0$: 並列容量(電極間の静電容量)
インピーダンス
等価回路のインピーダンス $Z(\omega)$ は次のように表されます。
直列枝のインピーダンスは、
$$ Z_{\text{series}} = R_1 + j\omega L_1 + \frac{1}{j\omega C_1} $$
全体のインピーダンスは直列枝と $C_0$ の並列結合で、
$$ Z(\omega) = \frac{Z_{\text{series}} \cdot \frac{1}{j\omega C_0}}{Z_{\text{series}} + \frac{1}{j\omega C_0}} $$
共振周波数と反共振周波数
直列共振周波数 $f_s$
直列枝のインピーダンスがゼロとなる周波数で、$L_1$ と $C_1$ の共振です。
$$ f_s = \frac{1}{2\pi\sqrt{L_1 C_1}} $$
この周波数ではインピーダンスが最小(ほぼ $R_1$)になります。
並列共振(反共振)周波数 $f_p$
インピーダンスが最大となる周波数で、
$$ f_p = f_s \sqrt{1 + \frac{C_1}{C_0}} $$
通常 $C_1 \ll C_0$ であるため、$f_p$ は $f_s$ よりわずかに高い値となります。
$$ \frac{f_p – f_s}{f_s} \approx \frac{C_1}{2C_0} $$
この比率は水晶振動子のキャパシタンス比 $r = C_0/C_1$ で特徴づけられます。
Q値
水晶振動子の特徴は極めて高いQ値(品質係数)です。
$$ Q = \frac{1}{R_1}\sqrt{\frac{L_1}{C_1}} = \frac{2\pi f_s L_1}{R_1} $$
一般的な水晶振動子のQ値は $10^4$ から $10^6$ に達し、LC回路(Q値数十から数百)と比較して桁違いに高い周波数安定性を実現します。
Pythonでのシミュレーション
import numpy as np
import matplotlib.pyplot as plt
# 水晶振動子の等価回路パラメータ(10 MHz水晶の例)
L1 = 10.0e-3 # 等価インダクタンス [H]
C1 = 25.3e-15 # 等価容量 [F]
R1 = 5.0 # 等価抵抗 [Ohm]
C0 = 5.0e-12 # 並列容量 [F]
# 共振周波数の計算
f_s = 1 / (2 * np.pi * np.sqrt(L1 * C1))
f_p = f_s * np.sqrt(1 + C1 / C0)
Q = 2 * np.pi * f_s * L1 / R1
print(f"=== 水晶振動子の特性 ===")
print(f"直列共振周波数 fs = {f_s/1e6:.6f} MHz")
print(f"並列共振周波数 fp = {f_p/1e6:.6f} MHz")
print(f"周波数差 (fp-fs)/fs = {(f_p-f_s)/f_s*1e6:.1f} ppm")
print(f"Q値 = {Q:.0f}")
print(f"キャパシタンス比 r = C0/C1 = {C0/C1:.0f}")
# インピーダンス特性の計算
f = np.linspace(f_s * 0.999, f_p * 1.001, 10000)
omega = 2 * np.pi * f
# 直列枝のインピーダンス
Z_series = R1 + 1j * omega * L1 + 1 / (1j * omega * C1)
# 並列容量のインピーダンス
Z_C0 = 1 / (1j * omega * C0)
# 全体のインピーダンス(並列結合)
Z_total = Z_series * Z_C0 / (Z_series + Z_C0)
# 可視化
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# インピーダンスの大きさ(対数スケール)
axes[0, 0].semilogy(f / 1e6, np.abs(Z_total), 'b-', linewidth=1)
axes[0, 0].axvline(f_s / 1e6, color='red', linestyle='--', label=f'fs = {f_s/1e6:.4f} MHz')
axes[0, 0].axvline(f_p / 1e6, color='green', linestyle='--', label=f'fp = {f_p/1e6:.4f} MHz')
axes[0, 0].set_xlabel('Frequency [MHz]')
axes[0, 0].set_ylabel('|Z| [Ohm]')
axes[0, 0].set_title('Impedance Magnitude')
axes[0, 0].legend()
axes[0, 0].grid(True)
# 位相
phase = np.degrees(np.angle(Z_total))
axes[0, 1].plot(f / 1e6, phase, 'r-', linewidth=1)
axes[0, 1].axvline(f_s / 1e6, color='red', linestyle='--', alpha=0.5)
axes[0, 1].axvline(f_p / 1e6, color='green', linestyle='--', alpha=0.5)
axes[0, 1].set_xlabel('Frequency [MHz]')
axes[0, 1].set_ylabel('Phase [deg]')
axes[0, 1].set_title('Impedance Phase')
axes[0, 1].grid(True)
# リアクタンス(虚部)
axes[1, 0].plot(f / 1e6, np.imag(Z_total), 'g-', linewidth=1)
axes[1, 0].axhline(0, color='black', linewidth=0.5)
axes[1, 0].axvline(f_s / 1e6, color='red', linestyle='--', alpha=0.5, label='fs')
axes[1, 0].axvline(f_p / 1e6, color='green', linestyle='--', alpha=0.5, label='fp')
axes[1, 0].set_xlabel('Frequency [MHz]')
axes[1, 0].set_ylabel('Reactance [Ohm]')
axes[1, 0].set_title('Reactance (Imaginary Part of Z)')
axes[1, 0].legend()
axes[1, 0].grid(True)
# Q値と周波数安定性の関係
Q_values = np.logspace(2, 6, 100)
# 帯域幅 BW = f_s / Q
BW = f_s / Q_values
stability_ppm = BW / f_s * 1e6
axes[1, 1].loglog(Q_values, stability_ppm, 'b-', linewidth=2)
axes[1, 1].axvline(Q, color='red', linestyle='--', label=f'This crystal (Q={Q:.0f})')
axes[1, 1].set_xlabel('Q factor')
axes[1, 1].set_ylabel('Frequency Stability [ppm]')
axes[1, 1].set_title('Q Factor vs Frequency Stability')
axes[1, 1].legend()
axes[1, 1].grid(True)
plt.tight_layout()
plt.show()
まとめ
本記事では、水晶振動子の仕組みと等価回路について解説しました。
- 水晶振動子は圧電効果を利用して安定した発振を実現する
- 等価回路は直列RLC枝と並列容量 $C_0$ で構成される
- 直列共振周波数 $f_s = 1/(2\pi\sqrt{L_1 C_1})$ と反共振周波数 $f_p$ の2つの共振を持つ
- Q値は $10^4$ から $10^6$ に達し、極めて高い周波数安定性を実現する
- $f_s$ と $f_p$ の間の領域は誘導性を示し、発振回路で利用される