ATtiny10 用プログラム (16)

「scr_tn10.asm」プログラムについて、いくつか補足の説明をしたいと思います。
まず、「SYNC_MODE = 2」、つまり、外部 SYNC 入力モードの場合の波形写真を下に示します。

上のトレースが外部 SYNC 入力に供給している波形で、1 月 6 日の記事でボーレート・クロックとして Arduino に発生させている 600 Hz の方形波を利用しています。
下のトレースが、のこぎり波出力の波形です。 のこぎり波が「曲がって」いるのは、簡単のため、定電流出力ではなく単なる抵抗で充電電流を設定しているせいです。
「SYNC_POL = 0」、つまり、外部 SYNC 入力のネガティブ・エッジが有効な設定になっているので、その部分で、のこぎり波にリセットが掛かっていることが分かります。
SYNC 入力はデューティー 50 % の方形波で、細いパルスにはなっていませんが、「レベル」には関係なく、「エッジ」部分のみ有効ですから、SYNC 入力波形を細いパルスに整形する必要はありません。
逆にいえば、外部 SYNC 入力で、本来のリセット・パルス幅を超えて連続的に波形をリセットし続けるようなことはできません。
基本的なプログラムの処理としては、

  • のこぎり波のレベルが設定したスレシホールドを横切る
  • アナログ・コンパレータ割り込みが発生する
  • 割り込み処理ルーチン内で放電用端子を一定時間 ON にする

という流れになっています。
コンパレータ割り込みは、コンパレータ出力が変化したエッジで掛かりますから、正常に発振している場合には問題はないのですが、電源投入時など、のこぎり波がスレシホールドをすでに過ぎた状態から始まると、いつまでたっても割り込みが掛からない状態になってしまいます。

特に、左の回路のように、OP アンプによる積分器を使っている場合には、OP アンプ自体も正常動作範囲から外れてしまいます。
「リワインド」が掛からないまま長い時間が経過すると、アンチログ電流出力によりタイミング・コンデンサが充電されていき、やがて、OP アンプで出力可能な最大の電圧値に到達します。
その時点を過ぎると、もはや OP アンプは正常な動作をしなくなり、入力端子間の「バーチャル・ショート」も成立せず、コンデンサのもう一方の端子が接続されている OP アンプのマイナス入力の電圧は下がっていきます。
そして、最終的には、アンチログ回路で出力可能な最小の電圧値のところで落ち着くことになります。
この状態になると、リセット/リワインド・パルスが 1 発や 2 発ぐらい出たところで OP アンプの正常動作範囲には戻らない可能性があります。
実際の 555 や LM331 などのハードウェア回路では、ワンショットの後にセット・リセット FF があって、ワンショット期間が過ぎても対象の電圧が戻らない場合にはリセット/リワインド出力は連続して出っ放しになり、正常動作範囲に引き戻す働きがあります。
scr_tn10 プログラムでは、ソフトウェアが原因となるジッタを減らすために、メイン側はスリープして割り込みを待機して、割り込み応答時間を一定にしています。
ここに、コンパレータ出力の「レベル」を監視する処理を、他に影響を与えないように組み込むのは難しく、代わりに

  • CPU リセット時に約 25 ms ディスチャージ出力をオンにする
  • ウォッチドッグ・タイマを使って、約 4 秒以上の間出力が張り付いている場合にも約 25 ms のディスチャージ出力オン

という処理を行っています。
上の回路での電源投入時の OP アンプ出力の波形写真を下に示します。 水平軸は 25 ms/div です。

入出力レイル・ツー・レイル OP アンプ (NJU7043) を使用しています。
電源電圧は約 3.3 V で、当然、電源投入前の出力は 0 V です。
電源オンのあと、ATtiny10 ではパワーオン・リセット状態が標準値で約 64 ms 持続します。
この間、各ピンはハイインピーダンス状態に置かれますから、籍分器でコンデンサが充電し続けられ、上の写真のように OP アンプ出力は電源レイルまで上昇し、そこに貼りつきます。
パワーオン・リセットが解除されると、プログラムの実行が開始され、約 25 ms の間ディスチャージ端子がオンになり、今度はコンデンサを充電する電流の向きが逆になり、OP アンプ出力は下降し続け、GND レイルまで達して、そこに貼りつきます。
そして、ディスチャージ期間が終わると、正常に発振を開始します。
この「25 ms」という値は、8 ビット・レジスタ 2 個を使ったディレイ・ループで、256 × 256 = 65536 回のループを回した場合にディレイ値が 25 ms になったというだけで、特に根拠のある数字ではありません。
たいていの場合は、この電源投入時のディスチャージで発振を開始しますが、たとえばブレッドボードで通電中にコンデンサを差し替えるなどして発振が停止した場合、電源を再投入するのは面倒なので、ウォッチドッグ・タイマを周期的な割り込み源として使い、約 4 秒間コンパレータが反転しなかった場合に 25 ms のディスチャージを行うようにしてあります。
そのため、発振周期 4 秒以上の発振をさせたい場合には、ウォッチドッグ・タイマを 8 秒の設定にするか、あるいは禁止する必要があります。