LPC810M021FN8 (14) -- ディジタル SCR (2)

SCT (State Configurable Timer) の H 側カウンタがまるまる空いているといっても、「ディジタル SCR」を実現するためには、以下のようなリソースが必要です。

  • コンパレータ入力 (アナログ入力) のための入力ピン 2 本あるいは 1 本
  • SCT イベント 2 個
  • SCT 入力 CTIN 1 個
  • SCT 出力 CTOUT 1 個
  • マッチ・レジスタ 1 本

このうち最も制約されるのがパッケージのピンで、全部で 6 ピンしか入出力用途に使えません。
コンパレータの反転入力と非反転入力の両方を割り当てると 2 ピン消費しますが、外部から電圧を細かく調整する必要がなければ、内部の

  • バンドギャップ基準電圧 (0.9 V)
  • Vdd を 31 段階に抵抗ラダーで分圧したもの

のいずれかをコンパレータ入力として使えるので、1 ピン節約できます。
コンパレータ出力と SCT 入力である CTIN との間の接続も必要ですが、これは「スイッチ・マトリクス」の機能により、出力と入力を同じ「ピン」に割り当てれば、チップ内部で接続されます。
さらに、この「ピン」は実際にパッケージに引き出されている「実在」のピンである必要はなく、チップ内部にしか存在しない「非実在」のピンを使えば、「実在」のピンを消費しなくて済みます。
ただし、P0_10 および P0_11 については、プルアップ抵抗なしのオープン・ドレイン出力なので、チップ内部では「H」レベルを実現できず、使用できません。 これは実験して確かめてあります。
後に示すプログラムでは、コンパレータ出力と CTIN の接続に P0_17 を利用しています。 存在しない P0_18 を指定すると機能しないことも確かめてあります。
「マッチ・レジスタ」については、16 ビット × 2 モード (非 UNIFY モード) では H 側と L 側が独立になるので、H 側のマッチ・レジスタ 5 本がまるまる空いています。
イベントについては、PWM のセットアップで全 6 個中の 5 個を使用しているので、完全にフリーなのは 1 個だけです。
また、CTOUT については、PWM のセットアップで全 4 個中の 4 個全部を使用しています。
つまり、イベント、 CTOUT 出力ともに 1 個ずつ不足しているので、PWM セットアップで設定している 4 ch 分の PWM のうち、1 ch 分を設定し直して「ワンショット・タイマ」として利用します。
具体的には、「CTOUT_3」と「イベント 3」を確保しています。
SCT の本来の動作モードとして「ワンショット・タイマ」が用意されているわけではないので、下のタイミング・チャートに示すような形で実現しています。

まず、ワンショットのパルス幅に相当する周期で繰り返すようなタイマの設定にします。
タイマの「リミット」時には特に割り込みを発生させたりする必要はなく、「オート・リミット」機能を利用して H 側のマッチ・レジスタ 0 に (周期 - 1) を設定するだけですませています。
H 側のマッチ・レジスタ 3 に適当な値を設定しておき、カウント値が一致したらカウンタを (一時) 停止させ、CTOUT_3 をセットするようなイベントを定義しておきます。
この状態がアイドル状態として、コンパレータからのトリガがない限り、ずっと続くことになります。
また、CTIN_3 からコンパレータ出力 (ACMP_O) の値を受け取り、「H」レベルを検出したらカウンタのスタートと、CTOUT_3 のクリアを実行するイベントを定義しておきます。
次のようなプロセスで、目的のパルス幅を持った負極性のパルスが CTOUT_3 に発生します。

  1. コンパレータからのトリガにより、カウント再開のイベントが発生
  2. CTOUT_3 が「L」レベルにドライブされ、カウントが再開
  3. 途中、オート・リミットによりカウンタが 0 リセットされる状態を経由
  4. カウント値がマッチ・レジスタ 3 の値と一致するイベントが発生
  5. 再びカウントがストップし、CTOUT_3 は「H」レベルにセットされる

8 ビット AVR 版のプログラムでは、AVR のコンパレータ出力による割り込みトリガが「エッジ」しか有効にできず、何らかの原因でタイミング・コンデンサが「充電側」いっぱいに「スタック」してしまった場合に「自力」では回復できず、ウォッチドッグ・タイマを併用してスタック状態を抜け出させる必要がありました。
LPC8xx の SCT では、外部入力の「レベル」をイベントのトリガとして定義できるので、他の補助なしに自力でスタック状態から抜け出すことができます。
ソース・プログラムの追加/変更部分については次回に説明します。