アナログシンセの VCO ブロック (43) -- 温度補償回路(9)

温度補償回路の温度特性を測定してみて、効果があることが確認できました。
予備実験として、トランジスタ・アレイ内のトランジスタを「ヒーター」として利用して温度設定する方法も試してみたのですが、差動ペアのトランジスタ間に無視できない温度勾配が生じ、実用的ではないと判断し、自然の気温変化を利用する方法にしました。
一日の中での気温変化 (日較差) ですから変化範囲は広くは取れず、今回は 6 ℃程度のスパンとなりました。

測定方法は、左の図のように、VCO のトランジスタ・アレイの DIP パッケージ上に温度センサの LM35 を両面テープで貼り付け、PC および Pakurino (Arduino) を利用してデータ収集を行いました。
PC と Pakurino との間は、シリアル MIDI の転送速度である 38.4 kbps に設定した RS232C で接続し、送信データを PIC VCO 側に分岐して、MIDI ノートオン・メッセージにより希望の周波数の音を発振させます。
温度測定および VCO の周波数の測定は、Pakurino 上で行い、PC にデータを送ります。
PC では、「TeraTerm」のマクロ機能を利用して、220 Hz を発振させるノートオン・メッセージと、440 Hz を発振させるノートオン・メッセージを交互に送出するとともに、Pakurino 側から送られてくるデータを PC 上に約 30 秒間隔でロギングしています。 
オクタープ・スパンの測定結果を下に示します。

横軸はセッ氏での温度です。 LM35 の出力電圧を 10 回測定して平均した値そのもので、未較正の値です。
ちなみに、この測定は冷房のない無人の部屋で行ったので、測定のために暑いのを我慢していたわけではありません。
縦軸はセント単位で表現したオクターブのスパンです。 誤差のない完全なオクターブは 1200 セントになります。
赤い点は測定データの「散布図」で、青い曲線は、gnuplot の「fit」機能を使って最小2乗法により求めた、2 次曲線による推定値のグラフです。
本来は、温度補償の中心温度は、差動ペアのベース間の「オフセット電圧」を目標温度での「熱電圧」 VT に調整することで設定します。
この電圧設定が 1 % 狂えば、温度としては 3 ℃ の誤差になります。
26 mV 程度である熱電圧を高い絶対精度で測定できる機器は持ち合わせていないので、オフセット電圧は特に調整していません。
幸運にも、中心温度は 35 ℃ 程度となっており、今回の測定の温度範囲の中におさまっていました。
推定値の青い曲線から読み取ると、5 ℃ 程度の温度変化で、オクターブ・スパンの変動は 0.3 セント程度以下となっています。
温度補償がなければ
1200 [cent] * 5 [k] / 300 [K] = 20 [cent]
の変動となるはずですから、温度補償の効果は十分にあると言えると思います。
オクターブ・スパンの変動は少ないのですが、全体のピッチに対する温度補償は何も行っていないので、温度変化により絶対ピッチは変動します。
220 Hz の温度変動のグラフを下に示します。

測定開始は温度 35 ℃、周波数 221.5 Hz 付近の点で、その後は気温が上昇していき、38 ℃ 超でピークを迎え、その後は温度が下降し、32 ℃ 程度で最小値となり、再び温度が上昇して、33 ℃、220.5 Hz 程度の点で測定終了しているのですが、なぜか「ヒステリシス」が生じていて、温度上昇時と下降時の軌跡が重なっていません。
「気温変化」を利用しているので、すべての構成要素が温度変化に晒されており、何がヒステリシスの原因なのか分かりません。
念のため、38 ℃ 超から 32 ℃ 程度までの温度下降時のデータだけに限ってプロットしたものを下に示します。

これを見ると、推定値の 2 次曲線も含め、全データを使った場合とほとんど変わりがなく、オクターブ・スパンについてはヒステリシスの影響はないことが分かります。