シュミットトリガとは?ヒステリシスコンパレータのしきい値の導出と実装

夕暮れどきに自動で点灯する街灯を見たことがあると思います。明るさセンサの出力が「点灯すべき暗さ」のしきい値をまたいだ瞬間にランプを点ける、という単純な回路で作れそうに見えます。ところが実際にそう作ると、日没直前の数分間、街灯が点いたり消えたりを猛烈な速さで繰り返します。木の葉が揺れる、雲が流れる、センサ自身の熱雑音が乗る — こうした小さな揺らぎが、しきい値のすぐそばでは何度も符号を変えてしまうからです。リレーが使われていればカチカチと鳴り続け、寿命はあっという間に尽きます。

原因は明快です。比較器(コンパレータ)は「増幅率が無限大の増幅器」であり、入力の差がマイクロボルト単位でも出力を電源電圧まで振り切らせます。ノイズを区別する能力はまったく持っていません。ここで必要になるのが、一度切り替わったら簡単には元に戻らない「不感帯」 です。この不感帯を回路に持ち込む仕掛けがシュミットトリガ(Schmitt trigger)、別名ヒステリシスコンパレータです。

しきい値が1つの単純比較器と、しきい値を2つ持つシュミットトリガに同じ雑音入りセンサ出力を通したときの出力波形の違いを示す概念図

同じ入力を与えているのに、境目の作り方だけで出力の質がまったく変わってしまうことが一目でわかります。上のルートは境目が1つしかないため、信号が境目付近を通るあいだ揺らぎがそのまま出力に転写されています。下のルートは境目を2つ持ち、そのあいだでは前の判定を保持するので、出力は本来あるべき1回の反転だけに収まっています。この記事では、この「境目を2つ持つ」仕掛けを抵抗2本でどう作るのかを、しきい値の式まで含めて追いかけます。

シュミットトリガを理解すると、次のような場面で設計の見通しが一気によくなります。

  • センサ信号の2値化・波形整形: 光センサ・温度センサ・近接センサの緩やかなアナログ出力を、チャタリングのないきれいなデジタル信号に変換します。なまった波形やノイズの乗ったクロックを叩き直す用途にも使われます
  • 方形波発振器(弛張発振器): シュミットトリガの出力でコンデンサを充放電させると、外部の水晶やLC共振なしに方形波が生まれます。タイマIC 555 の非安定動作、マイコンの内蔵RC発振器、PWMキャリア生成の基礎です
  • スイッチのチャタリング除去とデジタル入力: 74HC14 のようなシュミットトリガ入力のインバータは、なまった信号や機械接点のバウンスをそのまま受け止められます
  • ヒステリシス制御(bang-bang制御): DC-DCコンバータのヒステリシス制御、サーモスタット、クラスDアンプの自励発振など、「行き過ぎたら戻す」制御の中核です

本記事の内容

  • 単純比較器がノイズに負ける仕組みと、その被害の定量的な見積り
  • ヒステリシス(不感帯 + 記憶)という処方箋の直感
  • 非反転型シュミットトリガの上側/下側しきい値 $V_{TH}, V_{TL}$ の重ね合わせによる導出
  • 反転型シュミットトリガと帰還率 $\beta$ による簡潔な表現
  • 正帰還のループ利得が 1 を超えると双安定になる理由(単極点モデルによる再生の解析)
  • ヒステリシス幅をノイズ標準偏差の何倍にすべきかの設計指針($Q$ 関数による定量化)
  • 弛張発振器の周期 $T = 2RC\ln\frac{1+\beta}{1-\beta}$ の導出
  • 実装上の落とし穴($V_{OH}/V_{OL}$ の変動、オープンコレクタ出力、信号源インピーダンス)
  • Python 実装: 誤遷移率曲線、ヒステリシスループ、弛張発振器の周期の理論値との照合

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

単純比較器はなぜノイズに負けるのか

比較器の動作は一行で書けます。入力電圧 $V_{in}$ を基準電圧 $V_{ref}$ と比べて、大きければ出力を上側の飽和電圧 $V_{OH}$ に、小さければ下側の飽和電圧 $V_{OL}$ にする、それだけです。

$$ V_{out} = \begin{cases} V_{OH} & (V_{in} > V_{ref}) \\ V_{OL} & (V_{in} < V_{ref}) \end{cases} $$

これはオペアンプを裸で(帰還をかけずに)使ったときの振る舞いそのものです。オペアンプの開ループ利得 $A_0$ は $10^5$ 程度あるので、入力差が $100\,\mu\mathrm{V}$ もあれば出力は $10\,\mathrm{V}$ 動いてしまい、実質的に上式の符号関数として振る舞います。

問題は、現実の入力が「信号 $V_s(t)$ + ノイズ $n(t)$」という形をしていることです。

$$ V_{in}(t) = V_s(t) + n(t) $$

信号 $V_s$ がしきい値から十分離れているうちは、$n$ が多少乗っても符号は変わりません。しかし $V_s$ がしきい値の近くを通過するあいだ、つまり $|V_s – V_{ref}|$ がノイズの標準偏差 $\sigma$ と同程度かそれ以下になる時間帯では、出力の符号は事実上ノイズが決めます。

もっとも極端な状況として、入力がちょうどしきい値上に静止している場合を考えてみましょう。ノイズが平均 0 の対称な分布に従うなら、各サンプル時刻で $n > 0$ になる確率と $n < 0$ になる確率はどちらも $1/2$ です。連続する $N$ サンプルのあいだに出力が反転する回数の期待値は、隣り合うサンプルの符号が異なる確率が $1/2$ なので、

$$ \mathbb{E}[\text{遷移回数}] = \frac{N}{2} $$

となります。サンプリング周波数 $20\,\mathrm{kHz}$ で 1 秒間しきい値上に留まれば、期待値は 1 万回です。実際には比較器の応答速度で制限されますが、「しきい値の近傍では出力が回路の限界速度で暴れる」という結論は変わりません。

この暴れ方はチャタリングと呼ばれ、下流の回路に実害をもたらします。カウンタは 1 回のイベントを何十回も数え、リレーやモータドライバは無駄な開閉を繰り返し、Hブリッジでは上下のスイッチが同時オンになる貫通電流の危険まで生じます。ソフトウェアで「一定時間出力が安定するまで待つ」という後処理をかける手もありますが、遅延が増えるうえ、そもそもアナログ段の問題をデジタルで拭っているだけです。

雑音を含む正弦波がしきい値をまたぐ瞬間を拡大し、単純比較器の出力が0.12秒間に529回反転する様子を示したグラフ

上段を見ると、灰色の生波形は青い元信号のまわりを $\pm\sigma$ 程度の幅で常に揺れており、元信号が赤い破線(しきい値)を横切る $0.50\,\mathrm{s}$ 付近では、生波形が赤線の上下を何十回も行き来していることがわかります。下段の比較器出力はその符号をそのまま写し取っており、この $0.12$ 秒という短い区間だけで 529 回も反転しています。信号自体は 1 回しか境目を越えていないのに、出力は数百回の「イベント」を作り出してしまっているわけです。

ここで注意したいのは、この問題が「比較器の性能が悪いから」起きているのではない、という点です。むしろ逆で、比較器が理想的に鋭いからこそノイズを忠実に拾ってしまう。したがって解決策は「鈍らせる」方向、それも単に応答を遅くするのではなく、一度決めた判定を積極的に守る方向に求めるべきです。次節では、その仕掛けを日常の例から掘り起こしていきます。

ヒステリシス — 「戻りにくさ」を回路に持たせる

部屋のドアのラッチを思い浮かべてください。ドアを閉めるにはある程度の力で押し込む必要があり、いったんラッチがかかると、少し引いたくらいでは開きません。開けるにはノブを回すという別の操作が要ります。「閉める条件」と「開く条件」が非対称になっているおかげで、ドアは風でパタパタしません。

エアコンのサーモスタットも同じです。設定温度 $22^\circ\mathrm{C}$ちょうどでオン・オフを切り替えると、室温が設定値付近で揺れるたびにコンプレッサが起動と停止を繰り返します。そこで実際の制御は「$23^\circ\mathrm{C}$ を超えたら冷房オン、$21^\circ\mathrm{C}$ を下回ったらオフ」のように、2つのしきい値を使います。

この「切り替わる条件が進行方向によって違う」性質をヒステリシス(履歴現象)と呼びます。磁性体の $B$-$H$ 曲線が代表例で、磁界を上げていくときと下げていくときで磁束密度の経路が違い、囲まれた面積がヒステリシス損として現れます。

サーモスタットを設定温度1つで制御した場合と上下2つのしきい値で制御した場合の室温とコンプレッサ入切回数の比較

左は設定温度 $22^\circ\mathrm{C}$ ちょうどで切り替える制御で、室温は設定値にぴったり張り付いているように見えますが、その代償としてコンプレッサは 8 時間で 380 回も入切を繰り返しています。右は $23^\circ\mathrm{C}$/$21^\circ\mathrm{C}$ の2つのしきい値を使った制御で、室温は $\pm 1^\circ\mathrm{C}$ の帯のなかをゆっくり往復するかわりに、入切はわずか 4 回に落ちています。制御量の精度をわずかに犠牲にして、切り替え回数を2桁減らすというのがヒステリシスの本質的なトレードオフです。

回路に落とし込むと、比較器の動作は次のように書き換わります。上側しきい値を $V_{TH}$、下側しきい値を $V_{TL}$($V_{TH} > V_{TL}$)として、

$$ V_{out}(t) = \begin{cases} V_{OH} & (V_{in} > V_{TH}) \\ V_{OL} & (V_{in} < V_{TL}) \\ V_{out}(t^-) & (V_{TL} \le V_{in} \le V_{TH}) \end{cases} $$

3行目が本質です。入力が2つのしきい値のあいだ(不感帯)にいるとき、出力は直前の自分の値を保持します。つまりこの回路は1ビットの記憶を持っています。入出力の関係が入力だけでは決まらない多価関数になり、入出力特性を描くと長方形のヒステリシスループが現れます。

不感帯の幅をヒステリシス幅と呼び、

$$ \Delta V = V_{TH} – V_{TL} $$

と定義します。$\Delta V = 0$ なら単純比較器に戻ります。$\Delta V$ をノイズの振幅より十分大きく取れば、いったん上側に切り替わった出力を下側に戻すにはノイズが $\Delta V$ 分の逆方向の振れを作らねばならず、確率的にほとんど起こらなくなります。

では、この「2つのしきい値と記憶」を、オペアンプと抵抗2本だけでどう作るのでしょうか。鍵は正帰還です。出力の一部を非反転入力に戻すと、出力が上に振れているときはしきい値が上に、下に振れているときはしきい値が下に、自動的に移動してくれます。次節でその配線と、しきい値の値を厳密に導きます。

非反転型シュミットトリガのしきい値の導出

まず非反転型(入力が上がると出力も上がる型)から見ていきます。回路は次のように組みます。

  • 入力 $V_{in}$ を抵抗 $R_1$ を通してオペアンプの非反転入力($+$ 端子)へ接続する
  • 出力 $V_{out}$ を抵抗 $R_2$ を通して同じ非反転入力へ戻す(これが正帰還)
  • 反転入力($-$ 端子)には基準電圧 $V_{ref}$ を与える(対称動作させたいときは $V_{ref}=0$、単電源なら電源の中点)

出力が $+$ 端子に戻っている点が、通常の増幅回路($-$ 端子に戻す負帰還)との決定的な違いです。

非反転型シュミットトリガの回路図。入力がR1経由で非反転入力へ、出力がR2経由で同じ非反転入力へ戻る正帰還構成

回路図で確認すべき点はただ1つ、赤い帰還経路が $-$ 端子ではなく $+$ 端子に戻っていることです。$R_1$ と $R_2$ の接続点(節点 $V_+$)に入力と出力の両方がぶら下がっている構造になっており、この節点の電位が $V_{ref}$ を上回るか下回るかで出力が決まります。$V_{ref}$ は $-$ 端子に独立に与えられているので、後で見るように「幅は $R_1/R_2$、中心は $V_{ref}$」という直交した2つのつまみとして働きます。

重ね合わせによる $V_+$ の計算

$+$ 端子の電位 $V_+$ を求めます。オペアンプの入力端子には電流が流れ込まない(入力インピーダンス無限大)と仮定すると、$+$ 端子は $R_1$ と $R_2$ の接続点そのものです。この節点には $V_{in}$ が $R_1$ 経由、$V_{out}$ が $R_2$ 経由でつながっているだけなので、重ね合わせの原理が使えます。

まず $V_{out}=0$(出力を接地)として $V_{in}$ 単独の寄与を求めます。$R_1$ と $R_2$ の直列分圧なので、

$$ V_+^{(1)} = V_{in}\cdot\frac{R_2}{R_1+R_2} $$

次に $V_{in}=0$(入力を接地)として $V_{out}$ 単独の寄与を求めます。今度は $R_2$ と $R_1$ の分圧になるので、分子に来る抵抗が入れ替わります。

$$ V_+^{(2)} = V_{out}\cdot\frac{R_1}{R_1+R_2} $$

両者を足し合わせると、$+$ 端子の電位が得られます。

$$ \begin{equation} V_+ = \frac{R_2 V_{in} + R_1 V_{out}}{R_1+R_2} \end{equation} $$

この式を眺めるだけで、正帰還の効き方が読み取れます。$V_{out}$ が正の大きな値を取っているとき、$V_+$ は $V_{in}$ が本来作る値よりも上に持ち上げられます。すると $V_+ > V_{ref}$ の状態がより強固に維持され、出力は正のまま居座ります。逆も同様です。出力が自分の判定を自分で補強する — これがヒステリシスの正体です。

しきい値の条件

出力が切り替わる瞬間は、オペアンプの入力差がゼロになる点、つまり $V_+ = V_{ref}$ です。式 (1) にこれを代入します。

$$ \frac{R_2 V_{in} + R_1 V_{out}}{R_1+R_2} = V_{ref} $$

両辺に $(R_1+R_2)$ を掛けて分母を払うと、

$$ R_2 V_{in} + R_1 V_{out} = (R_1+R_2)V_{ref} $$

これを $V_{in}$ について解けば、「そのときの出力状態 $V_{out}$ に対応するしきい値」が求まります。両辺から $R_1V_{out}$ を引き、$R_2$ で割ると、

$$ \begin{equation} V_{in} = \frac{(R_1+R_2)V_{ref} – R_1 V_{out}}{R_2} \end{equation} $$

ここで重要なのは、$V_{out}$ が連続値ではなく $V_{OH}$ か $V_{OL}$ の2値しか取らないという点です。したがってしきい値も2個だけ現れます。

上側しきい値 $V_{TH}$(出力が低い状態から高い状態へ移る境目): このとき現在の出力は $V_{out}=V_{OL}$ なので、式 (2) に $V_{OL}$ を代入して、

$$ \begin{equation} V_{TH} = \frac{(R_1+R_2)V_{ref} – R_1 V_{OL}}{R_2} = \left(1+\frac{R_1}{R_2}\right)V_{ref} – \frac{R_1}{R_2}V_{OL} \end{equation} $$

下側しきい値 $V_{TL}$(出力が高い状態から低い状態へ移る境目): 現在の出力は $V_{out}=V_{OH}$ なので、同様に $V_{OH}$ を代入して、

$$ \begin{equation} V_{TL} = \left(1+\frac{R_1}{R_2}\right)V_{ref} – \frac{R_1}{R_2}V_{OH} \end{equation} $$

出力が高い状態と低い状態で非反転入力の電位V+を表す直線が平行移動し、基準電圧との交点として2つのしきい値が生じることを示すグラフ

式 (1) は $V_{in}$ について1次式なので、$V_+$ を $V_{in}$ の関数として描くと直線になります。傾き $R_2/(R_1+R_2)$ は出力状態によらず一定で、変わるのは切片だけ — つまり出力が高いか低いかで直線が上下に平行移動します。しきい値は「この直線が $V_{ref}$ の水平線と交わる点」なので、直線が2本あれば交点も2つ、というのがしきい値が2個現れる幾何学的な理由です。2直線の縦方向のずれ $\frac{R_1}{R_1+R_2}(V_{OH}-V_{OL})$ を傾きで割ったものが横方向のずれ、すなわち $\Delta V$ になります。

ヒステリシス幅

式 (3) から式 (4) を引くと、第1項の $V_{ref}$ を含む項が完全に消えます。

$$ \begin{equation} \Delta V = V_{TH} – V_{TL} = \frac{R_1}{R_2}\left(V_{OH} – V_{OL}\right) \end{equation} $$

この結果は設計上とても扱いやすい形をしています。読み取れることを3点挙げます。

  1. 幅は抵抗比 $R_1/R_2$ だけで決まる。$V_{ref}$ には一切依存しません
  2. 幅は出力の振幅 $V_{OH}-V_{OL}$ に比例する。電源電圧が変われば幅も変わってしまうので、精度が要るなら出力をツェナーダイオードなどでクランプします
  3. 中心位置は $V_{ref}$ で独立に動かせる。実際、$V_{TH}$ と $V_{TL}$ の平均を取ると

$$ V_{ctr} = \frac{V_{TH}+V_{TL}}{2} = \left(1+\frac{R_1}{R_2}\right)V_{ref} – \frac{R_1}{R_2}\cdot\frac{V_{OH}+V_{OL}}{2} $$

となり、$V_{ref}$ に対して単調です。つまり「幅を $R_1/R_2$ で決め、中心を $V_{ref}$ で合わせる」という2段階の設計ができます。

対称電源で $V_{ref}=0$、$V_{OH}=+V_{sat}$、$V_{OL}=-V_{sat}$ とすると式は劇的に簡単になります。

$$ V_{TH} = \frac{R_1}{R_2}V_{sat}, \qquad V_{TL} = -\frac{R_1}{R_2}V_{sat}, \qquad \Delta V = \frac{2R_1}{R_2}V_{sat} $$

しきい値が原点対称に $\pm (R_1/R_2)V_{sat}$ の位置に立つ、というきれいな形です。

非反転型は入力電流が $R_1$ を通って流れるため、入力インピーダンスが有限(おおむね $R_1$ 程度)になります。信号源のインピーダンスが無視できない場合はこれが誤差要因になりますが、この点は後の実装上の注意で扱います。次は、入力インピーダンスの高さで有利な反転型を見ていきましょう。

反転型シュミットトリガと帰還率 $\beta$

反転型では、配線を次のように変えます。

  • 入力 $V_{in}$ をオペアンプの反転入力($-$ 端子)へ直接(あるいは抵抗 $R_{in}$ 経由で)接続する
  • 非反転入力には、出力 $V_{out}$ と接地のあいだに置いた抵抗分圧の中点をつなぐ。接地側が $R_1$、出力側が $R_2$

$-$ 端子には電流が流れないので、$R_{in}$ には電圧降下が生じず $V_- = V_{in}$ です。一方 $+$ 端子は単純な分圧なので、

$$ V_+ = V_{out}\cdot\frac{R_1}{R_1+R_2} $$

ここで帰還率

$$ \begin{equation} \beta = \frac{R_1}{R_1+R_2} \end{equation} $$

を定義すると、$V_+ = \beta V_{out}$ と一行で書けます。$\beta$ は「出力の何割が $+$ 端子に戻ってくるか」を表す 0 から 1 のあいだの無次元量で、負帰還増幅回路で利得が $1/\beta$ になるのと同じ $\beta$ です。

反転型シュミットトリガの回路図。入力は反転入力に直結し、出力をR2とR1で分圧した中点を非反転入力へ戻す構成

非反転型との違いは配線の2箇所だけです。入力が $-$ 端子に直結しているので入力インピーダンスは実質無限大になり、信号源の出力抵抗がしきい値をずらす心配がありません。また帰還経路は $R_2$ と $R_1$ の単純な分圧になっているので、$+$ 端子の電位は入力に一切依存せず $\beta V_{out}$ の2値だけを取ります。しきい値の計算が「直線の交点」ではなく「2つの定数」で済むのが、反転型の式が簡潔になる理由です。

切り替わりの条件は $V_- = V_+$、すなわち $V_{in} = \beta V_{out}$ です。ここでも $V_{out}$ は2値しか取らないので、しきい値も2個です。対称電源($V_{OH}=+V_{sat}$, $V_{OL}=-V_{sat}$)なら、

$$ \begin{equation} V_{TH} = \beta V_{sat}, \qquad V_{TL} = -\beta V_{sat} \end{equation} $$

ヒステリシス幅は差を取って、

$$ \Delta V = \beta\left(V_{OH}-V_{OL}\right) = 2\beta V_{sat} $$

非反転型の $\Delta V = (R_1/R_2)(V_{OH}-V_{OL})$ と比べると、係数が $R_1/R_2$ から $R_1/(R_1+R_2)$ に変わっただけです。$R_2 \gg R_1$ の領域では $R_1/(R_1+R_2)\approx R_1/R_2$ なので、両者はほぼ同じ設計式になります。

しきい値の中心を動かしたい場合は、分圧の接地側端子を接地ではなく基準電圧 $V_{ref}$ につなぎます。すると重ね合わせにより、

$$ V_+ = \beta V_{out} + (1-\beta)V_{ref} $$

となり、しきい値は $V_{ref}$ を中心に $\pm\beta(V_{sat}-V_{ref})$ 相当だけ広がります。単電源回路では $V_{ref}$ に電源の中点を与えるのが定石です。

反転型と非反転型の違いを整理しておきます。

項目 反転型 非反転型
入出力の極性 入力が上がると出力は下がる 入力が上がると出力も上がる
入力インピーダンス 高い($-$ 端子直結なら実質無限大) 有限(おおむね $R_1$)
ヒステリシス幅 $\beta(V_{OH}-V_{OL})$, $\beta=\frac{R_1}{R_1+R_2}$ $\frac{R_1}{R_2}(V_{OH}-V_{OL})$
しきい値中心の調整 分圧の下端を $V_{ref}$ に $-$ 端子を $V_{ref}$ に
$V_{ref}$ と幅の独立性 幅が $V_{ref}$ に依存する 幅は $V_{ref}$ に依存しない
典型用途 弛張発振器、なまった波形の整形 センサ出力の高インピーダンス受け以外の一般用途

弛張発振器では反転型を使います。理由は後で明らかになりますが、要は「出力が上がるとコンデンサを充電し、しきい値を超えたら出力を下げる」という負のフィードバック経路を、RCの遅れを通して作りたいからです。

ところで、ここまで「正帰還をかけると2つのしきい値ができる」と話を進めてきましたが、なぜ正帰還が出力を2つの飽和状態のどちらかに固定するのでしょうか。回路が中間の値でふらふらしない保証はどこから来るのでしょう。次節でその機構を、ループ利得の観点から詰めます。

なぜ正帰還が双安定を生むのか

ループ利得の符号

帰還回路の基本形を思い出しましょう。増幅器の利得を $A$、帰還率を $\beta$ とし、入力 $V_{in}$ と帰還信号を足し合わせて増幅器に入れる構成では、閉ループ利得は

$$ G = \frac{A}{1 \mp A\beta} $$

と書けます。分母の符号は帰還の向きで決まります。負帰還なら $G = A/(1+A\beta)$ で、$A\beta \gg 1$ のとき $G \to 1/\beta$ に落ち着きます。増幅器の利得ばらつきが吸収され、動作は安定します。

正帰還では分母が $1-A\beta$ になります。ここでループ利得 $T = A\beta$ が 1 を超えると分母は負になり、閉ループ利得の符号が反転します。$A\beta = 1$ ちょうどでは分母がゼロ、つまり利得が発散します。これは「入力がなくても出力が立ち上がる」状態、すなわち線形動作が成り立たなくなる境界です。

オペアンプの開ループ利得は $A_0 \sim 10^5$ です。$\beta$ を $0.01$ 程度に取っただけでも $A_0\beta = 10^3 \gg 1$ なので、実用的なシュミットトリガでは常に $A_0\beta \gg 1$ が成り立っています。

単極点モデルによる再生の解析

「発散する」だけでは、実際に何が起きるかが見えません。時間領域で追いかけてみましょう。オペアンプを1次遅れ系(単極点モデル)で近似します。開ループ直流利得 $A_0$、時定数 $\tau$ として、

$$ \tau\frac{dV_{out}}{dt} + V_{out} = A_0\left(V_+ – V_-\right) $$

反転型シュミットトリガでは $V_+ = \beta V_{out}$、$V_- = V_{in}$ ですから、これらを代入すると

$$ \tau\frac{dV_{out}}{dt} + V_{out} = A_0\left(\beta V_{out} – V_{in}\right) $$

$V_{out}$ を含む項を左辺に集めます。右辺の $A_0\beta V_{out}$ を移項すると、

$$ \tau\frac{dV_{out}}{dt} = \left(A_0\beta – 1\right)V_{out} – A_0 V_{in} $$

両辺を $\tau$ で割ると、$V_{out}$ に関する1階線形微分方程式が得られます。

$$ \begin{equation} \frac{dV_{out}}{dt} = \frac{A_0\beta-1}{\tau}V_{out} – \frac{A_0}{\tau}V_{in} \end{equation} $$

$V_{out}$ の係数の符号が決定的です。負帰還なら係数は負で、解は平衡点へ指数的に収束します。ところが正帰還で $A_0\beta > 1$ のとき係数はになり、平衡点からのずれは

$$ V_{out}(t) \propto \exp\!\left(\frac{t}{\tau_{regen}}\right), \qquad \tau_{regen} = \frac{\tau}{A_0\beta – 1} $$

指数的に発散します。この暴走が再生(regeneration)です。発散はどこまでも続くわけではなく、出力が電源レールに達したところで飽和して止まります。だから最終状態は必ず $V_{OH}$ か $V_{OL}$ のどちらか — 双安定になるわけです。

再生の速さも見積もれます。単極点モデルでは利得帯域幅積 $\mathrm{GBW} = A_0/(2\pi\tau)$ なので、$\tau = A_0/(2\pi\,\mathrm{GBW})$ です。$A_0\beta \gg 1$ のとき $A_0\beta-1 \approx A_0\beta$ と近似できるので、

$$ \tau_{regen} \approx \frac{A_0/(2\pi\,\mathrm{GBW})}{A_0\beta} = \frac{1}{2\pi\beta\,\mathrm{GBW}} $$

$A_0$ が消えるのが面白いところです。$\mathrm{GBW}=1\,\mathrm{MHz}$、$\beta=0.5$ なら $\tau_{regen}\approx 0.318\,\mu\mathrm{s}$ となります。実際に式 (8) を数値積分して初期値 $1\,\mathrm{mV}$ からの成長を指数フィットすると $0.318\,\mu\mathrm{s}$ が得られ、この近似がよく当たることが確認できます。実回路ではスルーレート制限のほうが先に効くことが多いものの、「正帰還を強くする($\beta$ を大きくする)ほど切り替わりが速い」という定性的な傾向はそのまま成り立ちます。

単極点モデルの数値積分による再生の様子。初期値1mVのずれが正帰還では指数的に増大してレールで飽和し、負帰還では減衰する

左のグラフは対数軸なので、正帰還の3本がいずれも直線に見える=厳密な指数増大であることが読み取れます。$\beta$ が大きいほど傾きが急で、$\beta=0.9$ では $1.7\,\mu\mathrm{s}$ ほどで $12\,\mathrm{V}$ のレールに到達しています。比較のために描いた負帰還(灰色の破線)は逆に指数減衰しており、同じ回路方程式でも係数の符号ひとつで挙動が正反対になることがわかります。右のグラフでは数値積分の指数フィットが近似式 $1/(2\pi\beta\,\mathrm{GBW})$ の曲線にぴったり乗っており、$\beta=0.5$ では $0.318\,\mu\mathrm{s}$ と一致しました。$A_0$ を式から消せるという主張が数値的にも確かめられたことになります。

3つの解と2つの安定点

静的な見方でも同じ結論に至ります。入力 $V_{in}$ を固定したとき、飽和を考慮した出力の自己無矛盾条件は

$$ V_{out} = \mathrm{sat}\!\left[A_0\left(\beta V_{out} – V_{in}\right)\right] $$

です。ここで $\mathrm{sat}[\cdot]$ は $\pm V_{sat}$ で頭打ちになる関数です。$V_{in}$ が不感帯の中にあるとき、この方程式には3つの解があります。$V_{out}=+V_{sat}$、$V_{out}=-V_{sat}$、そして線形領域内にある中間解です。中間解は式 (8) の係数が正であることから不安定で、微小な擾乱があれば必ずどちらかのレールへ滑り落ちます。ボールを丘の頂上に置いたようなもので、理屈の上では釣り合っていても現実には留まれません。残る2つが安定な平衡点であり、どちらに落ち着くかは「それまでの履歴」が決めます — これが記憶の実体です。

飽和を考慮した自己無矛盾条件のグラフ。増幅器の応答曲線と直線が3点で交わり、両端の飽和解が安定、中間解が不安定であることを示す

左のグラフでは、飽和付きの応答曲線(青)と直線 $V_{out}=V$(灰色の破線)が確かに3点で交わっています。線形領域の傾き $A_0\beta$ が 1 より大きいために応答曲線が直線より急になり、交点が3つできるという構図です。右のグラフは出力の変化の向き($\tau\,dV/dt$ に比例する量)を描いたもので、中間解より右では常に正、左では常に負になっています。つまり中間解はどちらの側に微小変位しても押し戻されるどころか押し出されるので、実際の回路が取りうる状態は両端の2つだけです。

正帰還が双安定を生む機構が見えました。では実務的にいちばん知りたい問い、「ヒステリシス幅は具体的にどれだけ取ればよいのか」に進みましょう。

ヒステリシス幅はどれだけ必要か — ノイズ耐性の定量化

$\Delta V$ を大きくすればノイズには強くなりますが、その分しきい値の判定がずれ、応答も遅れます。最適点を知るには、$\Delta V$ と誤遷移の確率を結ぶ式が必要です。

入力信号が不感帯の中心付近に静止しており、そこに標準偏差 $\sigma$ の白色ガウス雑音が乗っている状況を考えます。現在の出力が低い(つまり次に狙うのは上側しきい値)としましょう。中心から上側しきい値までの距離は $\Delta V/2$ です。1サンプルでこの距離を超える確率は、標準正規分布の上側確率 $Q(\cdot)$ を使って

$$ \begin{equation} p = Q\!\left(\frac{\Delta V}{2\sigma}\right), \qquad Q(x) = \frac{1}{\sqrt{2\pi}}\int_x^{\infty}e^{-u^2/2}\,du = \frac{1}{2}\mathrm{erfc}\!\left(\frac{x}{\sqrt{2}}\right) \end{equation} $$

で与えられます。出力が高い状態からの誤遷移も対称性から同じ確率 $p$ です。$N$ サンプルのあいだの誤遷移回数の期待値は、$p$ が十分小さければ

$$ \mathbb{E}[\text{誤遷移回数}] \approx N\,p = N\,Q\!\left(\frac{\Delta V}{2\sigma}\right) $$

と近似できます。$\Delta V=0$ では $Q(0)=1/2$ なので $N/2$ となり、前に求めた単純比較器の結果と一致します。

$Q$ 関数は引数に対して指数関数より急速に減衰するので、$\Delta V/\sigma$ を少し増やすだけで誤遷移は劇的に減ります。代表的な値を挙げると次の通りです。

$\Delta V/\sigma$ $Q(\Delta V/2\sigma)$ $N=2\times10^5$ での期待誤遷移回数
0 $5.0\times10^{-1}$ 100000
2 $1.59\times10^{-1}$ 31731
4 $2.28\times10^{-2}$ 4550
6 $1.35\times10^{-3}$ 270
8 $3.17\times10^{-5}$ 6.3
10 $2.87\times10^{-7}$ 0.057

実務でよく使われる目安は $\Delta V \ge 6\sigma$、余裕を見るなら $8\sigma$ から $10\sigma$ です。ノイズの $\sigma$ をオシロスコープの実効値測定などで見積もり、そこから逆算して $R_1/R_2$ を決める、という手順になります。

ただし、大きすぎる $\Delta V$ には代償があります。しきい値が信号の中心から $\pm\Delta V/2$ ずれる分、検出タイミングが遅れるのです。振幅 $A$、周波数 $f$ の正弦波が原点を横切る場合、しきい値 $h=\Delta V/2$ に到達するのは位相 $\arcsin(h/A)$ の時点なので、遅れ時間は

$$ t_d = \frac{1}{2\pi f}\arcsin\!\left(\frac{\Delta V}{2A}\right) $$

です。$A=1\,\mathrm{V}$、$f=1\,\mathrm{Hz}$、$\Delta V=0.9\,\mathrm{V}$ なら $t_d = 74.3\,\mathrm{ms}$、周期の 7.4% に相当します。ゼロクロス検出のように位相精度が要る用途では致命的です。

もう一点、対称な入力に対してデューティ比は崩れないという性質も押さえておきましょう。正弦波が上側しきい値 $+h$ を上向きに横切るのは位相 $\theta_1=\arcsin(h/A)$、下側しきい値 $-h$ を下向きに横切るのは位相 $\theta_2=\pi+\arcsin(h/A)$ なので、出力が高い区間の位相幅は $\theta_2-\theta_1=\pi$ ちょうどです。つまり両エッジが同じだけ遅れるので、比率は 50% のまま保たれます。歪むのは入力が非対称なときだけです。

正弦波入力に対する検出の遅れとデューティ比の関係。両エッジが等しく遅れるため出力が高い区間はちょうど半周期になることを示す

左のグラフでは、出力の立ち上がりが入力のゼロクロスより $74.3\,\mathrm{ms}$ 遅れている一方で、出力が高い区間の長さは $0.500\,\mathrm{s}$、すなわち周期のちょうど半分になっています。立ち上がりと立ち下がりが同じ量だけ後ろにずれるので、波形全体が平行移動するだけでデューティ比は影響を受けない、という先ほどの議論がそのまま見えています。右のグラフは遅れを $\Delta V/(2A)$ の関数として描いたもので、$\arcsin$ の形状から、しきい値が振幅に近づくほど遅れが急激に増えることが読み取れます。逆に $\Delta V/(2A)$ が $0.2$ 以下なら遅れは周期の 3% 程度に収まるので、位相精度と雑音耐性を両立させたいときの目安になります。

$\Delta V$ の設計指針が固まりました。ここからは視点を変えて、ヒステリシスを「ノイズ対策」ではなく「積極的に発振させる道具」として使う応用に進みます。

弛張発振器 — ヒステリシスで方形波を作る

反転型シュミットトリガの出力から、抵抗 $R$ を通して反転入力へ戻し、その反転入力と接地のあいだにコンデンサ $C$ を入れます。正帰還($R_1, R_2$ による分圧)はそのまま残します。すると外部の共振素子なしに方形波が発振します。これが弛張発振器(relaxation oscillator)です。

動作の物語は単純です。出力が $+V_{sat}$ なら、コンデンサは $R$ を通して $+V_{sat}$ に向かって充電されていきます。コンデンサ電圧 $V_C$ が上側しきい値 $+\beta V_{sat}$ に達した瞬間、反転入力が非反転入力を上回るので出力は $-V_{sat}$ へ反転します。同時にしきい値も $-\beta V_{sat}$ へ飛び移ります。今度はコンデンサが $-V_{sat}$ に向かって放電し、$-\beta V_{sat}$ に達したら再び出力が反転する — この繰り返しです。

周期の導出

半周期分の時間を求めます。出力が $V_{out}=+V_{sat}$ に切り替わった直後、コンデンサ電圧は下側しきい値 $-\beta V_{sat}$ にいます。RC回路の充電の方程式は

$$ RC\frac{dV_C}{dt} = V_{out} – V_C = V_{sat} – V_C $$

これは1階線形微分方程式で、初期条件 $V_C(0) = -\beta V_{sat}$ のもとでの解は、定常値 $V_{sat}$ と初期値の差が指数減衰する形になります。

$$ V_C(t) = V_{sat} – \left(V_{sat} + \beta V_{sat}\right)e^{-t/RC} = V_{sat}\left[1 – (1+\beta)e^{-t/RC}\right] $$

上側しきい値に到達する時刻 $t = T_1$ を求めます。$V_C(T_1) = \beta V_{sat}$ とおくと、両辺の $V_{sat}$ が約分されて

$$ \beta = 1 – (1+\beta)e^{-T_1/RC} $$

$e^{-T_1/RC}$ について解きます。移項して $(1+\beta)$ で割ると、

$$ e^{-T_1/RC} = \frac{1-\beta}{1+\beta} $$

両辺の自然対数を取り、符号を整理すると(右辺の逆数を取ると対数の符号が反転します)、

$$ T_1 = RC\,\ln\frac{1+\beta}{1-\beta} $$

放電側の半周期も、対称性からまったく同じ値になります($V_{sat}\to -V_{sat}$、しきい値も符号反転するだけなので式の形が保存されます)。したがって周期は

$$ \begin{equation} T = 2T_1 = 2RC\,\ln\frac{1+\beta}{1-\beta}, \qquad \beta = \frac{R_1}{R_1+R_2} \end{equation} $$

この式には $V_{sat}$ が現れません。飽和電圧が電源変動で揺らいでも周期は変わらない、という嬉しい性質です。しきい値も充電の目標値もどちらも $V_{sat}$ に比例するので、比を取ると消えてしまうためです。

もっとも使われる設計は $R_1 = R_2$、すなわち $\beta = 1/2$ です。このとき

$$ T = 2RC\ln\frac{1.5}{0.5} = 2RC\ln 3 \approx 2.197\,RC $$

という覚えやすい形になります。$R=10\,\mathrm{k\Omega}$、$C=10\,\mathrm{nF}$ なら $T = 219.7\,\mu\mathrm{s}$、周波数は $4.55\,\mathrm{kHz}$ です。

$\beta$ を変えたときの挙動も見ておきましょう。$R_2=10\,\mathrm{k\Omega}$ を固定して $R_1$ を振ると、

$R_1$ $\beta$ $T$ $f$
4.7 kΩ 0.3197 132.5 μs 7.55 kHz
10 kΩ 0.5000 219.7 μs 4.55 kHz
22 kΩ 0.6875 337.3 μs 2.96 kHz
47 kΩ 0.8246 468.4 μs 2.14 kHz
100 kΩ 0.9091 608.9 μs 1.64 kHz

$\beta$ を 1 に近づけると $\ln\frac{1+\beta}{1-\beta}$ が対数発散するので周期は伸び続けますが、同時にしきい値が飽和電圧のすぐそばに来るため、実際にはオフセット電圧や飽和電圧のばらつきに周期が敏感になります。$\beta = 0.3$ から $0.6$ あたりが実用的な範囲です。

デューティ比を 50% から変えたい場合は、充電経路と放電経路を分ければよく、$R$ に直列のダイオードと別の抵抗を逆向きに並列接続します。充電は $R_a$、放電は $R_b$ を通るようにすれば、高い時間と低い時間をそれぞれ $R_aC\ln\frac{1+\beta}{1-\beta}$、$R_bC\ln\frac{1+\beta}{1-\beta}$ に設定できます。タイマIC 555 の非安定動作もこれと同じ発想で、内部に $V_{CC}/3$ と $2V_{CC}/3$ の2つのしきい値(つまりヒステリシス)を持ち、充電と放電で経路を分けています。

理論と設計式が揃いました。次は、実際に回路を組むときにつまずきやすい点を確認しておきましょう。

実装上の注意点

出力飽和電圧のばらつき: これまで $V_{OH}, V_{OL}$ を定数として扱いましたが、汎用オペアンプの飽和電圧は電源電圧より1〜2 V内側で、しかも負荷電流や温度で動きます。式 (5) が示す通り $\Delta V$ はこの差に比例するので、ヒステリシス幅の精度が要る場合は出力にツェナーダイオードや抵抗分圧を入れて振幅を規定するか、レールtoレール出力のデバイスを使います。

オペアンプとコンパレータの違い: 汎用オペアンプは負帰還で使う前提のため位相補償されており、スルーレートが遅く(典型 $0.5\,\mathrm{V}/\mu\mathrm{s}$)、飽和からの回復にも時間がかかります。高速に切り替えたいなら LM339 や LM393 のような専用コンパレータを使います。ただし多くのコンパレータはオープンコレクタ(オープンドレイン)出力なので、プルアップ抵抗 $R_{pu}$ が必須です。このとき $V_{OH}$ はプルアップ先の電圧で決まり、帰還抵抗 $R_2$ がプルアップ抵抗と並列に効くため、しきい値の式に補正が要ります。

正帰還抵抗の大きさ: $R_2$ を極端に大きく(数 MΩ 以上)すると、入力バイアス電流や基板のリーク電流が作る電圧降下が無視できなくなり、しきい値がずれます。逆に小さすぎると出力に無駄な電流が流れます。$10\,\mathrm{k\Omega}$ から $1\,\mathrm{M\Omega}$ 程度が実用範囲です。

信号源インピーダンス: 非反転型では入力が $R_1$ を通って $+$ 端子につながるため、信号源の出力抵抗 $R_s$ が $R_1$ に直列に加わります。実効的に $R_1 \to R_1 + R_s$ となるので、$\Delta V$ が設計値より広がります。$R_s$ が無視できないなら、前段にボルテージフォロワを挟むか、反転型を選びます。

スピードアップコンデンサ: 帰還抵抗 $R_2$ に数十 pF のコンデンサを並列に入れると、切り替わりの瞬間だけ帰還が強くなり、遷移が鋭くなります。ただし入れすぎると寄生発振を招くので、実測しながら決めます。

単電源での中点バイアス: 単一の $V_{CC}$ で動かす場合、$V_{ref}$ には $V_{CC}/2$ を分圧で作って与え、入力側もカップリングコンデンサ経由で同じ中点にバイアスします。分圧点にはパスコンを入れ、電源ノイズがしきい値に乗らないようにします。

ヒステリシスの取りすぎ: 前節で見た通り $\Delta V$ は遅れとして跳ね返ります。「とりあえず大きめ」は禁物で、ノイズの $\sigma$ を実測して $6\sigma$ から $10\sigma$ の範囲で決めるのが筋の通ったやり方です。

これらを踏まえて、実際の数値設計を1つ通してみましょう。

具体例: 5 V 単電源、光センサ用シュミットトリガの設計

仕様: 電源 $V_{CC}=5\,\mathrm{V}$。フォトトランジスタとプルダウン抵抗が作るセンサ出力($0\,\mathrm{V}$ から $5\,\mathrm{V}$ を緩やかに動く)を、$2.5\,\mathrm{V}$ を中心に2値化する。センサ出力に乗るノイズの実効値は $\sigma = 50\,\mathrm{mV}$。出力は $V_{OH}=4.9\,\mathrm{V}$、$V_{OL}=0.1\,\mathrm{V}$(レールtoレール出力オペアンプ)。

ステップ1: ヒステリシス幅を決める。$\Delta V/\sigma = 10$ を狙うと $\Delta V = 0.5\,\mathrm{V}$ です。このとき1サンプルあたりの誤遷移確率は $Q(5) = 2.87\times10^{-7}$ となり、$20\,\mathrm{kHz}$ サンプリングで観測しても誤遷移の発生率は毎秒 $5.7\times10^{-3}$ 回、つまり平均しておよそ 3 分に 1 回です。

ステップ2: 抵抗比を求める。式 (5) より、

$$ \frac{R_1}{R_2} = \frac{\Delta V}{V_{OH}-V_{OL}} = \frac{0.5}{4.9-0.1} = \frac{0.5}{4.8} = 0.1042 $$

$R_1 = 10\,\mathrm{k\Omega}$ とすると $R_2 = 96\,\mathrm{k\Omega}$。E24系列で $100\,\mathrm{k\Omega}$ を選ぶと $R_1/R_2 = 0.1$ となり、実際のヒステリシス幅は $\Delta V = 0.1\times 4.8 = 0.48\,\mathrm{V}$ です。仕様に対して 4% の誤差で、十分許容できます。

ステップ3: 中心を合わせる。中心を $V_{ctr}=2.5\,\mathrm{V}$ にしたいので、中心の式を $V_{ref}$ について解きます。$k = R_1/R_2 = 0.1$ として、

$$ V_{ref} = \frac{V_{ctr} + k\cdot\frac{V_{OH}+V_{OL}}{2}}{1+k} = \frac{2.5 + 0.1\times 2.5}{1.1} = 2.5\,\mathrm{V} $$

ちょうど $2.5\,\mathrm{V}$ になりました。これは偶然ではなく、$(V_{OH}+V_{OL})/2 = 2.5\,\mathrm{V}$ すなわち出力振幅の中点が目標中心と一致しているためです。実装は $100\,\mathrm{k\Omega}$ 2本の等分圧で作れます。

ステップ4: 検算。式 (3), (4) に代入します。

$$ V_{TH} = (1+0.1)\times 2.5 – 0.1\times 0.1 = 2.75 – 0.01 = 2.74\,\mathrm{V} $$

$$ V_{TL} = (1+0.1)\times 2.5 – 0.1\times 4.9 = 2.75 – 0.49 = 2.26\,\mathrm{V} $$

$\Delta V = 2.74 – 2.26 = 0.48\,\mathrm{V}$、中心 $= 2.50\,\mathrm{V}$。仕様通りです。

設計手順が一通り確認できたところで、ここまでの理論式が本当に成り立つかを Python で検証していきましょう。

Python での実装と検証

単純比較器とシュミットトリガの波形比較

まず、ノイズの乗った正弦波を単純比較器とシュミットトリガに通し、出力の遷移回数を数えます。

import numpy as np
import matplotlib, matplotlib.pyplot as plt

for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
    if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
        plt.rcParams["font.family"] = cand
        break
plt.rcParams["axes.unicode_minus"] = False

def schmitt(v, vth, vtl, s0=-1):
    """ヒステリシス付き比較器。状態を保持しながら1サンプルずつ判定する"""
    out = np.empty(v.size, dtype=int)
    s = s0
    for i, x in enumerate(v):
        if s == -1 and x > vth:      # 下側状態 → 上側しきい値を超えたら反転
            s = 1
        elif s == 1 and x < vtl:     # 上側状態 → 下側しきい値を割ったら反転
            s = -1
        out[i] = s
    return out

def n_trans(y):
    """出力の遷移(切り替わり)回数を数える"""
    return int(np.sum(y[1:] != y[:-1]))

# 信号: 振幅1V・1Hzの正弦波 + 標準偏差0.15Vのガウス雑音
fs, T_obs, f_sig, A, sigma = 20000.0, 2.0, 1.0, 1.0, 0.15
t = np.arange(0, T_obs, 1 / fs)
clean = A * np.sin(2 * np.pi * f_sig * t)
vin = clean + np.random.default_rng(0).normal(0, sigma, t.size)

simple = np.where(vin > 0, 1, -1)          # 単純比較器(しきい値1つ)
dV = 6 * sigma                             # ヒステリシス幅 = 6σ
sch = schmitt(vin, dV / 2, -dV / 2)        # シュミットトリガ

print("理想(無雑音)の遷移回数:", n_trans(np.where(clean > 0, 1, -1)))
print("単純比較器の遷移回数    :", n_trans(simple))
print("シュミットトリガの遷移回数:", n_trans(sch))

実行すると、理想(無雑音)が 4 回、単純比較器が 2175 回、シュミットトリガ($\Delta V = 6\sigma$)が 6 回となります。単純比較器は本来の 500 倍以上の遷移を出しており、これがまさにチャタリングです。一方 $6\sigma$ のヒステリシスを入れるだけで 6 回まで落ち、余計な遷移は 2 回に抑えられました。しきい値をまたぐ瞬間の統計的なゆらぎを、不感帯がほぼ吸収しているのがわかります。

続いて、この3つの波形を並べて描きます。

fig, axes = plt.subplots(3, 1, figsize=(11, 8), sharex=True)

axes[0].plot(t, vin, lw=0.5, color="0.6", label="雑音を含む入力")
axes[0].plot(t, clean, lw=1.8, color="C0", label="元の信号(雑音なし)")
axes[0].axhline(dV / 2, ls="--", color="C3", label="上側しきい値 $V_{TH}$")
axes[0].axhline(-dV / 2, ls="--", color="C2", label="下側しきい値 $V_{TL}$")
axes[0].axhspan(-dV / 2, dV / 2, color="C1", alpha=0.15)
axes[0].set_ylabel("入力電圧 [V]"); axes[0].legend(loc="upper right", fontsize=8)
axes[0].set_title("雑音を含む入力と2つのしきい値(帯が不感帯)")

axes[1].step(t, simple, where="post", lw=0.8, color="C3")
axes[1].set_ylabel("出力"); axes[1].set_ylim(-1.5, 1.5)
axes[1].set_title(f"単純比較器の出力:遷移 {n_trans(simple)} 回(チャタリング)")

axes[2].step(t, sch, where="post", lw=1.5, color="C0")
axes[2].set_ylabel("出力"); axes[2].set_xlabel("時間 [s]"); axes[2].set_ylim(-1.5, 1.5)
axes[2].set_title(f"シュミットトリガの出力:遷移 {n_trans(sch)} 回($\\Delta V=6\\sigma$)")

plt.tight_layout(); plt.show()

雑音を含む入力と2つのしきい値、単純比較器の出力(遷移2175回)、シュミットトリガの出力(遷移6回)を3段に並べた比較グラフ

3段のグラフを比べると違いは一目瞭然です。上段のオレンジの帯が不感帯で、雑音の振れ幅がこの帯におおむね収まっていることが読み取れます。中段の単純比較器はゼロ交差のたびに黒く塗りつぶされたように細かく振動し、下段のシュミットトリガはほぼ理想的な方形波を保っています。またシュミットトリガの立ち上がりが入力のゼロ交差よりわずかに遅れている点にも注目してください。これがヒステリシスの代償である遅れ時間 $t_d$ です。

ヒステリシス幅と誤遷移回数の関係

次に、$\Delta V/\sigma$ を振って誤遷移回数がどう減るかを調べます。

import numpy as np
import matplotlib.pyplot as plt

ratios = np.arange(0, 8.5, 0.5)
n_seed = 5
means = []
for r in ratios:
    counts = []
    for k in range(n_seed):
        v = clean + np.random.default_rng(100 + k).normal(0, sigma, t.size)
        counts.append(n_trans(schmitt(v, r * sigma / 2, -r * sigma / 2)))
    means.append(np.mean(counts))
means = np.array(means)

plt.figure(figsize=(9, 5))
plt.semilogy(ratios, np.maximum(means - 4, 1e-1), "o-", color="C0",
             label="余分な遷移回数(実測・5試行平均)")
plt.axhline(1e-1, ls=":", color="0.5")
plt.axvline(6, ls="--", color="C3", label="設計目安 $\\Delta V = 6\\sigma$")
plt.xlabel("ヒステリシス幅 / 雑音標準偏差  $\\Delta V/\\sigma$")
plt.ylabel("余分な遷移回数(対数軸)")
plt.title("ヒステリシス幅を広げると誤遷移は指数的に減る")
plt.grid(alpha=0.3, which="both"); plt.legend(); plt.tight_layout(); plt.show()

対数軸でほぼ直線に落ちていくのが読み取れます。$\Delta V/\sigma = 0$ では 2172 回あった余分な遷移が、$2\sigma$ で 466 回、$4\sigma$ で 47 回、$6\sigma$ で 1.4 回、$7.5\sigma$ 以上では 0 回になります。$\Delta V$ を線形に増やすだけで誤遷移が指数関数的に減る — これが $Q$ 関数のガウス裾の効き方であり、「$6\sigma$ 程度取っておけばまず大丈夫」という実務の経験則を裏づけています。

ヒステリシス幅と誤遷移回数の関係。左は入力を不感帯中心に固定したときの実測と理論NQ(ΔV/2σ)の一致、右は正弦波入力での余分な遷移回数の減少

右のグラフが上のコードの結果で、$\Delta V/\sigma$ に対して余分な遷移回数が対数軸上でほぼ直線に落ちています。左のグラフは次項で扱う「入力を不感帯の中心に固定した」条件での比較で、赤い実測点が理論曲線 $N\,Q(\Delta V/2\sigma)$ の上に $10^5$ から $10^0$ まで 5 桁にわたって乗っていることが確認できます。正弦波入力(右)のほうが同じ $\Delta V/\sigma$ でも遷移が少ないのは、信号が不感帯を通過する時間が限られているためで、静止条件(左)が最悪ケースの見積りを与えていることになります。

理論式 $N\,Q(\Delta V/2\sigma)$ との照合

上の実験では正弦波が不感帯を通過する時間が限られていたため、式 (9) の理論値と直接比べにくい形でした。入力を不感帯の中心に固定した条件で照合します。

import numpy as np
from math import erfc, sqrt

Q = lambda x: 0.5 * erfc(x / sqrt(2))   # 標準正規分布の上側確率

N = 200000
v_dc = np.random.default_rng(7).normal(0, 1.0, N)   # σ=1に正規化、入力DC=0
print(" ΔV/σ    実測遷移数      理論 N·Q(ΔV/2σ)")
for r in range(0, 9):
    c = n_trans(schmitt(v_dc, r / 2, -r / 2))
    print(f" {r:4d} {c:12d} {N * Q(r / 2):18.1f}")

出力は、$\Delta V/\sigma=0$ で実測 100196 / 理論 100000、$2$ で 31470 / 31731、$4$ で 4619 / 4550、$6$ で 257 / 270、$8$ で 5 / 6.3 となります。5桁にわたって実測と理論がよく一致しており、$N\,Q(\Delta V/2\sigma)$ という単純な見積り式が実用に足ることが確認できます。誤遷移が 100 回を切るのは $\Delta V/\sigma \approx 6.5$ 付近で、ここが設計上の分水嶺です。

入出力特性のヒステリシスループ

次に、非反転型シュミットトリガの入出力特性を、入力をゆっくり往復させて描きます。しきい値の理論値と照合します。

import numpy as np
import matplotlib.pyplot as plt

R1, R2, VOH, VOL, Vref = 10e3, 100e3, 4.9, 0.1, 2.5
k = R1 / R2
VTH = (1 + k) * Vref - k * VOL      # 式(3)
VTL = (1 + k) * Vref - k * VOH      # 式(4)
print(f"理論しきい値: VTH={VTH:.3f} V, VTL={VTL:.3f} V, ΔV={VTH-VTL:.3f} V")

# 入力を 1.8V → 3.2V → 1.8V とゆっくり往復させる
up = np.linspace(1.8, 3.2, 600)
sweep = np.concatenate([up, up[::-1]])

out, s = [], VOL
for x in sweep:
    Vp = (R2 * x + R1 * s) / (R1 + R2)   # 式(1)
    s = VOH if Vp > Vref else VOL        # 比較器の判定
    out.append(s)
out = np.array(out)

plt.figure(figsize=(8, 5.5))
n = len(up)
plt.plot(sweep[:n], out[:n], lw=2.5, color="C3", label="入力を上げていくとき")
plt.plot(sweep[n:], out[n:], lw=2.5, ls="--", color="C0", label="入力を下げていくとき")
plt.axvline(VTH, ls=":", color="C3"); plt.axvline(VTL, ls=":", color="C0")
plt.annotate(f"$V_{{TH}}$={VTH:.2f}V", (VTH, 2.0), xytext=(VTH + 0.06, 2.0), color="C3")
plt.annotate(f"$V_{{TL}}$={VTL:.2f}V", (VTL, 3.0), xytext=(VTL - 0.5, 3.0), color="C0")
plt.xlabel("入力電圧 $V_{in}$ [V]"); plt.ylabel("出力電圧 $V_{out}$ [V]")
plt.title("非反転型シュミットトリガの入出力特性(ヒステリシスループ)")
plt.grid(alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()

非反転型シュミットトリガの入出力特性。入力を上げる経路は2.74Vで跳ね上がり、下げる経路は2.26Vまで粘る長方形のヒステリシスループ

理論しきい値は $V_{TH}=2.740\,\mathrm{V}$、$V_{TL}=2.260\,\mathrm{V}$、$\Delta V=0.480\,\mathrm{V}$ と表示され、前節で手計算した設計例と完全に一致します。グラフでは、入力を上げていく赤い経路が $2.74\,\mathrm{V}$ で跳ね上がり、下げていく青い経路が $2.26\,\mathrm{V}$ まで粘ってから落ちる、という長方形のループが描かれます。同じ入力電圧 $2.5\,\mathrm{V}$ に対して出力が2通りありうる — 入出力関係が一意でないこと、すなわち回路が記憶を持っていることが視覚的に確認できます。

弛張発振器の波形と周期の検証

最後に、反転型シュミットトリガ + RC の弛張発振器を数値積分し、周期が式 (10) と一致するかを確かめます。

import numpy as np
import matplotlib.pyplot as plt

R, C, Vsat = 10e3, 10e-9, 12.0
R1, R2 = 10e3, 10e3
beta = R1 / (R1 + R2)
T_th = 2 * R * C * np.log((1 + beta) / (1 - beta))   # 式(10)

fs = 2e6                       # 数値積分のサンプリング
dt, n = 1 / fs, int(round(4.5 * T_th * fs))
vc, vout, events = 0.0, Vsat, []
tt, vcs, vos = np.zeros(n), np.zeros(n), np.zeros(n)
for i in range(n):
    if vout > 0 and vc >= beta * vout:      # 上側しきい値に到達 → 反転
        vout = -Vsat; events.append(i * dt)
    elif vout < 0 and vc <= beta * vout:    # 下側しきい値に到達 → 反転
        vout = Vsat;  events.append(i * dt)
    vc += (vout - vc) / (R * C) * dt        # RC充放電のオイラー積分
    tt[i], vcs[i], vos[i] = i * dt, vc, vout

T_meas = 2 * np.mean(np.diff(events)[1:])
print(f"β = {beta:.3f}")
print(f"理論周期 T = 2RC·ln((1+β)/(1-β)) = {T_th*1e6:.2f} μs  (f = {1/T_th/1e3:.2f} kHz)")
print(f"実測周期                          = {T_meas*1e6:.2f} μs")
print(f"相対誤差 = {abs(T_meas-T_th)/T_th*100:.3f} %")

出力は $\beta = 0.500$、理論周期 $219.72\,\mu\mathrm{s}$($4.55\,\mathrm{kHz}$)、実測周期 $220.00\,\mu\mathrm{s}$、相対誤差 $0.126\%$ となります。誤差はオイラー積分の時間刻み($0.5\,\mu\mathrm{s}$)に起因するもので、刻みを細かくすれば単調に減ります。$T = 2RC\ln 3 \approx 2.197RC$ という解析解が正しいことが数値的に裏づけられました。

波形も見ておきましょう。

plt.figure(figsize=(11, 5))
plt.plot(tt * 1e6, vos, lw=1.5, color="C3", label="出力 $V_{out}$(方形波)")
plt.plot(tt * 1e6, vcs, lw=2.0, color="C0", label="コンデンサ電圧 $V_C$(充放電)")
plt.axhline(beta * Vsat, ls="--", color="0.4", label="しきい値 $\\pm\\beta V_{sat}$")
plt.axhline(-beta * Vsat, ls="--", color="0.4")
for e in events[1:3]:
    plt.axvline(e * 1e6, ls=":", color="0.7")
plt.xlabel("時間 [μs]"); plt.ylabel("電圧 [V]")
plt.title(f"弛張発振器の動作(β={beta:.2f}, T={T_th*1e6:.1f}μs, f={1/T_th/1e3:.2f}kHz)")
plt.grid(alpha=0.3); plt.legend(loc="upper right", fontsize=9); plt.tight_layout(); plt.show()

弛張発振器の動作波形。コンデンサ電圧が±βVsatのしきい値に達するたびに出力方形波が反転し、周期220マイクロ秒で発振する様子

コンデンサ電圧が指数曲線を描いて $\pm\beta V_{sat}$ のしきい値に向かい、到達した瞬間に出力が反転して曲線の向きが折り返される様子が読み取れます。$V_C$ は $\pm V_{sat}$ を目指して充電されるものの、その手前の $\pm 6\,\mathrm{V}$ で打ち切られるので、指数関数の初期の比較的直線に近い部分だけを使っています。これが波形が三角波に似て見える理由です。$\beta$ を小さくすればさらに直線に近づき、大きくすれば曲線らしさが強く出ます。

$\beta$ による周波数制御

最後に、$\beta$ を振ったときの周期を理論と実測で比較します。

import numpy as np
import matplotlib.pyplot as plt

def sim_period(beta, R=10e3, C=10e-9, Vsat=12.0, fs=2e6):
    T_th = 2 * R * C * np.log((1 + beta) / (1 - beta))
    dt, n = 1 / fs, int(round(4.5 * T_th * fs))
    vc, vout, ev = 0.0, Vsat, []
    for i in range(n):
        if vout > 0 and vc >= beta * vout:   vout = -Vsat; ev.append(i * dt)
        elif vout < 0 and vc <= beta * vout: vout = Vsat;  ev.append(i * dt)
        vc += (vout - vc) / (R * C) * dt
    return T_th, 2 * np.mean(np.diff(ev)[1:])

R1_list = np.array([4.7e3, 10e3, 22e3, 47e3, 100e3]); R2 = 10e3
betas = R1_list / (R1_list + R2)
th, me = zip(*[sim_period(b) for b in betas])
th, me = np.array(th), np.array(me)

b_fine = np.linspace(0.05, 0.95, 200)
plt.figure(figsize=(9, 5))
plt.plot(b_fine, 2*10e3*10e-9*np.log((1+b_fine)/(1-b_fine))*1e6, color="C0",
         label="理論 $T=2RC\\ln\\frac{1+\\beta}{1-\\beta}$")
plt.plot(betas, me * 1e6, "o", ms=9, color="C3", label="数値シミュレーション")
for b, m in zip(betas, me):
    plt.annotate(f"{1/m/1e3:.2f}kHz", (b, m*1e6), xytext=(b-0.06, m*1e6+30), fontsize=9)
plt.xlabel("帰還率 $\\beta = R_1/(R_1+R_2)$"); plt.ylabel("発振周期 $T$ [μs]")
plt.title("帰還率と発振周期の関係(R=10kΩ, C=10nF)")
plt.grid(alpha=0.3); plt.legend(); plt.tight_layout(); plt.show()

帰還率βと弛張発振器の発振周期の関係。理論曲線T=2RCln((1+β)/(1-β))の上に5点の数値シミュレーション結果が乗っているグラフ

5点すべてで実測が理論曲線の上に乗り、相対誤差は最大でも 0.35%($\beta=0.32$ の点)に収まります。曲線は $\beta \to 1$ で対数的に立ち上がっており、$\beta$ を 1 に近づけるほど周期が急激に伸びることが読み取れます。ただしこの領域はしきい値が飽和電圧のすぐそばに来るため、実回路ではオフセットや $V_{sat}$ のばらつきに周期が極端に敏感になります。安定した発振周波数が欲しいなら $\beta$ は $0.3$ から $0.6$ の緩やかな領域に置き、周波数の調整は $R$ か $C$ で行うのが定石です。

まとめ

本記事では、シュミットトリガ(ヒステリシスコンパレータ)を、単純比較器の破綻という具体的な問題から出発して解説しました。

  • 単純比較器はしきい値近傍でノイズに支配される。入力がしきい値上に留まると遷移回数の期待値は $N/2$ に達し、実験でも本来 4 回で済むところが 2175 回に膨れ上がりました
  • 処方箋はヒステリシス — 上側 $V_{TH}$ と下側 $V_{TL}$ の2つのしきい値を持たせ、そのあいだでは直前の出力を保持する。回路は1ビットの記憶を獲得します
  • 非反転型では重ね合わせから $V_+ = \frac{R_2V_{in}+R_1V_{out}}{R_1+R_2}$ が得られ、$V_+=V_{ref}$ の条件に $V_{out}=V_{OL}, V_{OH}$ を代入して $V_{TH}, V_{TL}$ が決まります。幅は $\Delta V = \frac{R_1}{R_2}(V_{OH}-V_{OL})$ で、$V_{ref}$ に依存しません
  • 反転型では帰還率 $\beta = R_1/(R_1+R_2)$ を使って $V_{TH,TL} = \pm\beta V_{sat}$ と簡潔に書けます。入力インピーダンスが高いのが利点です
  • 双安定の起源は正帰還のループ利得。単極点モデルから $\frac{dV_{out}}{dt} = \frac{A_0\beta-1}{\tau}V_{out} – \frac{A_0}{\tau}V_{in}$ が導かれ、$A_0\beta>1$ で係数が正になり指数的な再生が起きます。再生時定数は $\tau_{regen}\approx 1/(2\pi\beta\,\mathrm{GBW})$
  • 設計指針は $\Delta V \ge 6\sigma$。誤遷移回数の期待値は $N\,Q(\Delta V/2\sigma)$ でよく予測でき、実測と5桁にわたり一致しました。ただし遅れ時間 $t_d = \frac{1}{2\pi f}\arcsin\frac{\Delta V}{2A}$ という代償を伴います
  • 応用として弛張発振器。RC充放電と組み合わせると周期は $T = 2RC\ln\frac{1+\beta}{1-\beta}$ となり、$\beta=1/2$ で $T=2RC\ln 3$。数値検証では誤差 0.35% 以内で一致しました。周期が $V_{sat}$ に依存しないため、電源変動に強い発振器になります

シュミットトリガは、たった抵抗2本の正帰還で「記憶」と「ノイズ耐性」を同時に手に入れる、アナログ回路のなかでも屈指のコストパフォーマンスを持つ回路です。ここで見た「正帰還のループ利得が 1 を超えると系が双安定になる」という構図は、フリップフロップやSRAMセル、さらには非線形力学のサドルノード分岐まで、分野を越えて何度も現れます。

次のステップとして、以下の記事も参考にしてください。