同じ2次フィルタでも結果が異なる理由
一言でいうと
フィルターが2段だからといって、同じ2次応答になるわけではありません。接続による負荷と極の配置を区別し、周波数応答とステップ応答を一緒に確認して初めて、設計を選べます。
なぜ必要なのか
前の単元で、温室のファンの875Hzの妨害を減らしながら、125Hzの信号を保存できる単一のRCはないという結論を得ました。そこで、設計会議で3つの提案が出ます。同じRCをもう1つ付けよう、途中にバッファーを入れよう、まったく別の2次フィルターを使おう、です。どれもコンデンサを2つ使うのに、結果も同じでしょうか。
条件を変えて成功の数字を作る代わりに、回路の構造が伝達関数をどう変えるかを確認します。望む125Hzのゲインは0.9以上、妨害875Hzのゲインは0.1以下という既存の要求を維持します。そこに、1Vのステップ入力のオーバーシュート電圧≤0.05V、観測した2%整定時間≤10msという、時間の要求を追加します。通常の急激な変化に大きく反応しすぎるセンサーは、周波数の2点だけを見て採用するのが難しいからです。
この実験は、理想的な線形フィルターです。バッファーは、ngspiceの制御電圧源であり、実際のオペアンプの帯域幅・電源・出力制限・スルーレートを持ちません。今回のステップで選んだ回路を、実物の回路の部品値の推奨や、動作の保証に拡大しません。
どう動くのか
AC解析の数字は時間波形ではない
AC解析は、周波数ごとに入力と出力の複素電圧を求めます。実部と虚部は、別々のセンサーの値ではなく、1つの電圧の大きさと位相を表す、2つの成分です。伝達関数H=Vout/Vinを先に計算してから、ゲインは|H|、電圧ゲインのdBは20log10|H|、位相はatan2(Im H,Re H)を度に変換した値です。
ngspice制御言語チュートリアルは、AC出力で複素ベクトルが、実部・虚部の列として記録される形式を示しています。今回のファイルは、周波数、入力の実部、入力の虚部、出力の実部、出力の虚部の5列です。ヘッダーにv(in)とv(out)がそれぞれ2回出てくるのは、重複のエラーではありません。
提供される入力は、AC振幅0.5・1・2Vと、位相23度です。入力で割らなければ、振幅を変えたときにゲインまで変わり、入力の位相もフィルターの位相に混ざります。1V入力の出力の大きさだけがたまたま合う実装を避けるために、別の振幅も検査します。10log10は、ここでは電圧比に適用する式ではありません。また、atan(Im/Re)だけを使うと、実部が負の区間の象限を失います。
観測は、10Hz–10kHz、ディケードあたり80区間の241点です。125Hzと875Hzは、別の小さな線形の観測で、正確に含めます。対数スイープで最も近い点を、要求周波数として置き換えません。出力がちょうど0なら、ゲインは0ですが、対数と位相は意味のある有限の数ではないので、レポートではnullとして残します。
2つのRCをつなぐときに生じる新しい項
R=1kΩ、C=1/(2πRf₀)、p=jf/f₀とします。1つのRCは、H=1/(1+p)です。理想バッファーで分離した同じRC2つは、H=1/(1+p)²で、分母を展開すると、1+2p+p²です。各段が他の段の負荷を見ないので、2つの伝達関数を掛けられます。
バッファーなしで直接つなぐと、2つ目のRとCが、1つ目の出力の負荷になります。中間ノードの電圧を別に置いて、電流の和を立てると、H=1/(1+3p+p²)が得られます。追加されたpの項が、減衰と時間応答を変えます。Analog DevicesのRC直列接続の実験も、この負荷効果のせいで、個別の応答の単純な積が、実際の接続と違うことがあると説明しています。
f=f₀では、3つの回路のゲインが、それぞれ1/√2、1/2、1/3です。後ろの2つの回路は、どちらも2次で、この周波数で位相も−90度ですが、振幅は同じではありません。次数だけで、通過帯域の形や減衰の速さを、すべての周波数で決めることはできません。高い周波数で近づく傾きと、遷移帯域の実際の値は、区別しなければなりません。
Sallen–Keyは次数だけでなくQも選ぶ
今回のunity-gain Sallen–Keyは、入力から中間ノードへR1、そのノードからバッファーの入力へR2、中間ノードからバッファーの出力へC1、バッファーの入力から接地へC2を接続します。バッファーは、入力を読んで出力にそのまま出す、理想モデルです。R1=R2=R、C1=2QC、C2=C/(2Q)に設定すると、H=1/(1+p/Q+p²)です。
Q=1/√2のとき、2次のButterworth応答です。Analog Devicesの位相応答の解説は、Qによって2次応答の形と位相シフトが変わる点を扱っています。また、同じ1次フィルター2つをつないだ応答を、Butterworth2次と混同しないように区別します。今回の授業では、これを同じf₀の回路ファイルで比べます。
ここでのf₀は、すべての回路の−3dB周波数を意味しません。rc1と2次のButterworthではその意味が合いますが、他のQや、負荷のあるRCには、そのまま適用できません。そのため、設定のフィールドもcutoff_hzではなく、f0_hzです。名前から区別すれば、レポートで誤った物理的な意味を付けることを減らせます。
f₀=220Hzで直接計算し、シミュレーションと突き合わせる代表的な値は、次のとおりです。次のラボは、表をそのまま返す関数ではなく、実際のファイルを読む関数を求めます。
| 回路 | 125Hzのゲイン | 875Hzのゲイン | 1Vステップのオーバーシュート量 |
|---|---|---|---|
| RC 1つ | 約0.869 | 約0.244 | 約0V |
| RC 2つ、直接接続 | 約0.545 | 約0.053 | 約0V |
| RC 2つ、理想バッファー | 約0.756 | 約0.059 | 約0V |
| Sallen–Key、Q=1/√2 | 約0.952 | 約0.063 | 約0.043V |
| Sallen–Key、Q=1.4 | 約1.267 | 約0.066 | 約0.301V |
高いQは、望む周波数のゲインが1より大きくなります。今回のAC要求は、最小値だけを決めているので、2つの周波数の条件だけを見れば、これを通過させられます。しかし、ステップ入力の5%オーバーシュート制限では脱落します。これは、試験をごまかす例外ではなく、要求リストで何を漏らしたかを示す事例です。平坦度やゲインの上限が重要なら、それも別の要求として宣言しなければなりません。
最初に帯域に入ったからといって、整定したわけではない
入力は、1msまで0V、次の1µsで1Vに上昇し、50msまで維持されます。ステップの上昇が終わった1.001msから、10µs間隔で4900個の標本を線形補間します。この格子で、1Vを超えた最大量が、overshoot_vです。0.98–1.02Vの外にある最後の標本を探し、その次の標本の時刻を、上昇完了を基準にした相対時間として記録します。
最初に1Vを通過した時刻を選ぶと、リンギングが後でもう一度帯域の外へ出ることを見逃します。最後の標本まで外なら、settled_at_sはnullで、すべての標本が内側なら0です。2%帯域の境界は含みます。観測は、絶対時間の49.991msまでしか続かないので、このレポートは、その有限の観測区間と、10µsの格子の中での整定です。その後、永遠に安定するという証明や、連続時間の最大値の認証ではありません。
回路計算の最大時間間隔は、5µsと2.5µsで、それぞれ実行します。同じ10µsの観測時刻で、2つの結果の最大の差が10µV以下かどうかを突き合わせます。AC伝達関数は、すべての241点と、要求周波数の2点で、解析モデルと複素数で比べます。振幅だけが同じで位相が間違っている回路は、この検査で拒否されます。収束とモデルの一致と設計要求が、すべて満たされて初めて、最終候補に入れます。
現場での姿
アナログ検証職の自動化は、数字をきれいに描く作業だけではありません。どんな入力を入れ、実際の回路が何であり、仕様のどの項目に対して、どんな余裕があったかを、あとで探し出せなければなりません。AC結果と過渡応答を一緒に残せば、ノイズ除去用のフィルターが、通常の信号の急激な変化にどう反応するかも説明できます。
NXPのアナログ検証職の求人で確認した、Pythonによる自動化・基本的なアナログ量・検証計画・データ分析の要求を、この課題のファイル処理と条件の判定につなげました。実際の計測器の運用や、温度・プロセス別の実物の検証まで、このラボで代用するわけではありません。
次のラボですること
設定の検証 → 複素ACファイルの読み込み → ボード線図の数値 → 伝達関数 → ステップの観測 → 総合的な要求の判定 → ファイルの分析 → 比較CLIの、8つのステップを書きます。最後には、元のネットリスト・設定・ログ・ACファイル・ステップファイルを、そのまま保管したまま、選んだ理由を報告します。失敗した条件を消して最終候補を作る代わりに、候補から外れた理由を、各フィールドに残してください。