クリスタル発振回路をシミュレーションしてみる。いまさら感があるけど、なんとなくやってみたくなった。最近は素子の加工精度が上がったことから基本波発振の発振子が普通になってきて、動けばだいたいOKなので、そんなに一所懸命やることもなくなった(昔はMHz以上からはオーバートーンで使うことが多くて、異常発振とかが多くの設計者を悩ませていたに違いない)昨今、、、まぁメモなんよ。こういうのできるとか、こういうのなんでやろとか、書いとくんよここに。
で、今回はたわいもない内容なのでngspiceを直で使うことにする(GUI苦手なんよねーGUIは右の人差し指に作業が集中するのでじじいにはこたえるんよ)。で、まずはインバーターをどうするか。通常は発振回路評価とかで74HCU04とかを使うわけで、この記述を探すっと、LTspiceにあるらしいじゃないか、、、いや、すばらしい。ここ(https://github.com/texane/power_inverter/tree/master/ltspice/logic/74hc)にあるので、ありがたく頂いてくる。
で、まずはインバーターとしてちゃんと動くことを確認する。
まぁ、こんなかんじで。で、 ngspiceを起動して、
source inverter_74hcu04.cir
で、実行。すると、
となるので、インバーターとして動作していることがわかる。
で、どんな特性なのかいちおう調べておくってことで、パルスの代わりにPWLで三角波をいれることでリサージュっぽいものを見てみる。
まぁ、こういう特性のモデルらしい。
では、32.768kHzのクリスタルを発振させてみる。クリスタルの等価回路定数はあまり公開されていないので、実測する必要があるけど、EPSONは32.768kHzクリスタルの等価回路定数を公開しているので、これでやってみる。 まぁ、こんなかんじ。
なんやけど、実は発振させるのにかなり苦労した。結局、負荷容量を実際に使用する値(10pF前後)よりもかなり大きくして、シミュレーション時間をとんでもなく長くしてやっと発振した。で、
こんなかんじ。現実は結構簡単に発振開始するけど、シミュレーションではなかなか難しい。でさらに、発振開始時間ってけっこう神のイカヅチ(.icで初期状態を入れているところ)によってかわる。高い電圧だと、早く発振開始する。発振開始時間って結局現物で繰り返し評価するしかないって現実をやっぱそうかーって受け入れる。が、もっと現実に近い発振開始時間にするにはどうしたらいいのか。
、、、メンドクサくなってきたので、今日はこのくらいにしておく。
で、今回はたわいもない内容なのでngspiceを直で使うことにする(GUI苦手なんよねーGUIは右の人差し指に作業が集中するのでじじいにはこたえるんよ)。で、まずはインバーターをどうするか。通常は発振回路評価とかで74HCU04とかを使うわけで、この記述を探すっと、LTspiceにあるらしいじゃないか、、、いや、すばらしい。ここ(https://github.com/texane/power_inverter/tree/master/ltspice/logic/74hc)にあるので、ありがたく頂いてくる。
で、まずはインバーターとしてちゃんと動くことを確認する。
-
* inverter_74hcu04.cir
-
.title inverter_74hcu04
-
-
.include 74hc.lib
-
-
XU1 1 2 3 0 74HCU04 vcc1=3.3 speed1=1.0 tripdt1=1e-9
-
VCC 3 0 DC 3.3
-
VIN 4 0 PULSE ( 0 3.3 0 0 0 0.5ms 1ms 10)
-
R1 2 0 1k
-
R2 4 1 10k
-
-
.control
-
tran 0.01ms 20ms
-
plot v(1) v(2) v(4)
-
.endc
-
.end
source inverter_74hcu04.cir
で、実行。すると、
となるので、インバーターとして動作していることがわかる。
で、どんな特性なのかいちおう調べておくってことで、パルスの代わりにPWLで三角波をいれることでリサージュっぽいものを見てみる。
-
* char_74hcu04.cir
-
.title char_74hcu04
-
-
.include 74hc.lib
-
-
XU1 1 2 3 0 74HCU04 vcc1=3.3 speed1=1.0 tripdt1=1e-9
-
VCC 3 0 DC 3.3
-
VIN 4 0 PWL(0 0 10ms 4 20ms 0)
-
R1 2 0 1k
-
R2 4 1 10k
-
-
.control
-
tran 0.01ms 20ms
-
plot v(1) v(2) v(4)
-
.endc
-
.end
では、32.768kHzのクリスタルを発振させてみる。クリスタルの等価回路定数はあまり公開されていないので、実測する必要があるけど、EPSONは32.768kHzクリスタルの等価回路定数を公開しているので、これでやってみる。 まぁ、こんなかんじ。
-
.title xtal_osc
-
* xtal_osc_study_002.cir
-
-
.include 74hc.lib
-
-
XU1 1 2 5 0 74HCU04 vcc1=3.3 speed1=1.0 tripdt1=1e-9
-
R2 1 2 10MEG
-
-
L1 1 3 2986.16
-
C1 3 4 7.9e-15
-
R1 4 2 40e3
-
C2 1 2 1.5e-12
-
C3 1 0 680e-12
-
C4 2 0 680e-12
-
VCC 5 0 DC 3.3
-
.ic v(1)=3.3
-
*.options abstol=1e-12
-
*.options pivtol=1e-13
-
*.options reltol=0.003
-
*.options vntol=1e-6
-
*.options chgtol=1e-14
-
*.options trtol=7
-
-
.options abstol=1e-12
-
.options pivtol=1e-13
-
.options reltol=0.003
-
.options vntol=1e-6
-
.options chgtol=1e-14
-
.options trtol=5
-
-
.control
-
tran 10us 10000ms
-
plot v(2) v(1)
-
.endc
-
.end
こんなかんじ。現実は結構簡単に発振開始するけど、シミュレーションではなかなか難しい。でさらに、発振開始時間ってけっこう神のイカヅチ(.icで初期状態を入れているところ)によってかわる。高い電圧だと、早く発振開始する。発振開始時間って結局現物で繰り返し評価するしかないって現実をやっぱそうかーって受け入れる。が、もっと現実に近い発振開始時間にするにはどうしたらいいのか。
、、、メンドクサくなってきたので、今日はこのくらいにしておく。
コメントをお書きください