LPC810M021FN8 (8) -- SCT を PWM として使う (5)

今回は、

  • NXP 社の表現で「Double Edge PWM mode」
  • STmicroelectronics 社の表現で「Center Aligned PWM mode」

と呼ばれる、デューティーに応じて PWM 波の立ち上がり/立ち下り両エッジが互いに反対方向に変位して「重心位置」を不変に保つ方式の話です。
以前に示したタイミング・チャートを下に再掲します。

この図では、「同相」(非反転) つまりデューティーの設定値が小さいとき (平滑後の) PWM 出力電圧も低く、設定値が大きいとき出力電圧も高くなるように設定した場合を示しています。
「同相」の場合はカウントの上り坂 (アップ・カウント) でのコンペア・マッチにより PWM 出力を「0」にし (CLR 動作)、カウントの下り坂 (ダウン・カウント) でのコンペア・マッチにより PWM 出力を「1」にします (SET 動作)。
素朴に考えれば、SET 用と、CLR 用のふたつのイベントを定義することになりますが、SCT では、「Bidirectional output control」という機能があって、ひとつのイベントの定義で共用することができます。
ここで、「bidirectional」というのは、アップ/ダウン・カウンタの「双方向カウント」のことで、「入出力」という意味の双方向ではありません。
語順として「bidirectional output ... 」となっているので、ちょっとまぎらわしいです。
この機能のコントロールは、「OUTPUTDIRCTRL」レジスタ (LPC_SCT->OUTPUTDIRCTRL) に、各 CTOUT 出力に対して 2 ビットずつ割り当てられており、その 2 ビットの値に応じて

  • 0x0 : 出力値の決定はカウント方向に依存しない
  • 0x1 : L 側カウンタがダウン・カウントのとき、SET/CLR の意味が互いに反対になる
  • 0x2 : H 側カウンタがダウン・カウントのとき、SET/CLR の意味が互いに反対になる
  • 0x3 : 予約ずみ (設定不可)

という動作をします。
ここで、「SET/CLR の意味が反対」というのは

ということです。
したがって、L 側カウンタを使う場合、

  • アップ・カウント方向の動作として CLR レジスタの対応するビットマップに「1」をセット
  • SET レジスタの対応するビットマップには「0」をセット
  • OUTPUTDIRCTRL レジスタの対応する 2 ビットを「0x1」にセット

しておけば、ダウン・カウント時には、あたかも SET レジスタに値がセットされているかのように動作し、上のタイミング・チャートに示すような動作となります。
具体的なプログラムの断片を示すと、イペント「k」を「n」番の CTOUT に作用させる場合、

    LPC_SCT->OUT[n].CLR    |= (1 << k);
    LPC_SCT->OUTPUTDIRCTRL |= (1 << (2*n));

となります。 (リセット後のデフォルトでは、SET/CLR レジスタの全ビットは「0」クリアされているので、SET レジスタのクリアは省略しました。)
アップ・カウントと、タウン・カウントとは同時には起こり得ず、したがって SET/CLR が同時に発生することはないので、「コンフリクト」は全く発生しません。
また、「リミット」動作のタイミング自体は PWM 波形の生成に関しては影響をおよぼしません。
マッチ・レジスタのリロードは (カウント値 == 0) のタイミングで行われ、そこがデューティー値更新の最適タイミングになりますが、このタイミングで割り込みを起こすには、イベントおよびマッチ・レジスタを割り当てて実現する必要があります。
時間的マージンは半分になりますが、リミット動作のタイミングを割り込み発生に使えば、追加のイベント/マッチ・レジスタの「消費」はありません。 「割り込み」ならば要因発生後すぐに処理できるので、時間的マージンが少なくても特にデメリットにはなりません。
あと、「境界値」について調べると、PWM 周期を「N」、リミット・レジスタに設定する値を (N - 1) とすると、リミット発生、つまり (N - 1) および 0 が検出された時点でカウント方向が切り替わることに注意すると、

  • マッチ・レジスタ値 == 0 に対しては、アップ・カウント時にしかマッチが発生しないので、出力に対して CLR 動作しか発生せず、PWM 出力は連続の「0」となる (デューティー 0 %)
  • マッチ・レジスタ値 == (N - 1) に対しては、ダウン・カウント時にしかマッチが発生しないので、出力に対して SET 動作しか発生せず、PWM 出力は連続の「1」となる (デューティー 100 %)

ことが分かります。
次回は「Single Edge PWM mode」について述べます。