LPC810M021FN8 (19) -- アナログ・コンパレータ (4)

LPC800 ユーザ・マニュアル (UM10601) に掲載されているアナログ・コンパレータの図を簡略化したものを下に示します。
ハードウェア信号が直接に受け渡しされる系統に限り表示してあり、割り込みやレジスタ経由での信号出力の系統については省略してあります。
また、コンパレータ入力のアナログ・マルチプレクサは実際は 8 入力ですが、そのうち 4 入力は「予約」であり信号が割り付けられていないので、下の図では有効な 4 入力だけに限って図示してあります。

コンパレータ入力のアナログ・マルチプレクサは、反転入力 (- 入力) 側と非反転入力 (+ 入力) 側とが、それぞれ同等の構成となっており、

  • 32 ステップ電圧ラダー出力
  • ACMP_I1 入力
  • ACMP_I2 入力
  • 内蔵 0.9 V バンドギャプ・リファレンス電圧

のいずれかを選択できます。
出力信号論理の反転機能はありませんが、+ 入力側と - 入力側とが全く同等の構成なので、必要であれば両者の信号選択を入れ替えれば出力信号の極性も入れ替わります。
電圧ラダー (Voltage ladder) 回路は、31 個の抵抗を直列につないだ、実質は抵抗ストリング方式の DA コンバータです。
ラダー回路のリファレンス電圧の (0/31) から (31/31) までの等間隔の 32 ステップの電圧を発生できます。
31 本の抵抗を全直列にした抵抗値は約 1 MΩ で、コンパレータ入力との接続に限られ、外部には取り出せません。
また、ラダー回路のリファレンス入力は 16 ピン / 20 ピンのデバイスではパッケージに引き出されていますが、DIP 8 ピン・パッケージの LPC810M021FN8 では利用できないので、リファレンス = VDD に限られます。
ラダー回路の応答速度としては、スペック上では、ラダー回路の電源オンから目的値の 99 % まで達するまでのセトリング・タイムが最大 30 μs で、ラダーの「タップ」を切り換えてから目的値の 99 % に達するまでのセトリング・タイムが最大 15 μs となっています。
99 % までのセトリング・タイム 15 μs を時定数に換算すると約 3.3 μs となり、 1 次 RC LPF 回路のカットオフ周波数としては約 49 kHz で、VDD 電源に乗るオーディオ帯域のノイズに対しての低減効果はありません。
コンパレータ出力は、直接出力するか、周辺クロックと同期化して出力するかを選択できます。
SCT (State Configurable Timer) の外部入力として「エッジ」でトリガする場合には、必ずどこかで周辺クロックと同期化する必要があります。 そうしないと、1/2 に近い確率でエッジを取りこぼします。
SCT の外部入力側にもクロック同期化の機能はあるので、それを利用することにして、コンパレータのブロックでは同期化は行わないことにしました。
アナログ・コンパレータの初期化のための関数を下に示します。

void LPC8xx_acmp_setup(ACMP_POS_INPUT_T vp_sel,  // pos in 
                       ACMP_NEG_INPUT_T vm_sel,  // neg in
                       int              lad_sel) // ladder value
{
// initailize (power ON, bus clock ON and reset)	
  LPC_SYSCTL->PDRUNCFG &= (~SYSCTL_SLPWAKE_ACMP_PD);
  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_ACOMP);
  Chip_SYSCTL_PeriphReset(RESET_ACMP);
// Analog Comparator control register
  LPC_CMP->CTRL = ( ACMP_EDGESEL_FALLING // EDGESEL = fall
                  | vp_sel               // +input select
                  | vm_sel               // -input select
                  | ACMP_HYS_5MV      // hysteresis = 5 mV
                  );  
// setup voltage laddr if used
  if ((ACMP_POSIN_VLO == vp_sel) || (ACMP_NEGIN_VLO == vm_sel)) { 
    LPC_CMP->LAD = ( ACMP_LADENAB_BIT  // ladder enable
                   | (ACMP_LADSEL_MASK & (lad_sel << 1))    // ladder value
                   );
  } // if (lad_sel)
} // void LPC8xx_acmp_setup()

実質的には下に示す

  • アナログ・コンパレータ・モジュールのパワーダウン解除
  • アナログ・コンパレータ・モジュールへのクロック供給
  • アナログ・コンパレータ・モジュールのリセット
  • 入力マルチプレクサ / ヒステリシスなどの設定
  • 電圧ラダーを使用する場合にラダー回路の設定

の 5 つを実行しているだけです。
チップのリセット後のデフォルトではアナログ・コンパレータ回路は「パワーダウン」されているので、まずそれを解除して「電源を入れる」ところから始めます。
LPC8xx_acmp_setup() 関数に渡す引数としては、+ 入力、- 入力へ接続する信号の選択と、電圧ラダー回路のステップ指定のみとしました。
他のヒステリシス量などの指定については、必要があれば LPC8xx_acmp_setup() 関数自体をいじることとします。
実際のピンと信号との接続は下に示す LPC8xx_pin_setup() 関数で行います。

void LPC8xx_pin_setup( void )
{ 
  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_IOCON);
  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);
// disable pull-up/pull-down on ACMP_I1 (P0_0)
  LPC_IOCON->PIO0[IOCON_PIO0] &= ~PIN_MODE_MASK;
// disable pull-up/pull-down on ACMP_I2 (P0_1)
  LPC_IOCON->PIO0[IOCON_PIO1] &= ~PIN_MODE_MASK;
// enable ACMP_I1 on P0_0 (pin8 of DIP8, fixed assign)  
  Chip_SWM_EnableFixedPin(SWM_FIXED_ACMP_I1);
// enable ACMP_I2 on P0_1 (pin5 of DIP8, fixed assign)  
  Chip_SWM_EnableFixedPin(SWM_FIXED_ACMP_I2);
// enable ACMP_O  on P0_4 (pin2 of DIP8)  
  Chip_SWM_MovablePinAssign(SWM_ACMP_O_O,  4);	 
} // void LPC8xx_pin_setup()

この関数では、

  • ACMP_I1、ACMP_I2 ピンのプルアップ/プルダウン解除
  • ACMP_I1、ACMP_I2 ピンの設定、ACMP_O 信号のピンへの割り当て

を行っています。
ACMP_I1、ACMP_I2 は、それぞれ DIP8 パッケージの 8 番ピン、5 番ピンに固定で他のピンに割り当てることはできません。 (fixed assign)
デフォルトではピンへの割り当ては無効になっているので有効にします。
コンパレータ出力 ACMP_O は任意のピンへ割り当てることができます。 (movable assign)
上の例では P0_4 (DIP8 の 2 番ピン) へアサインしています。
ポートのプルアップ/プルダウンはアナログ入力を選択したからと言って自動的にはオフにならないので、IO_CON モジュールの設定で、デフォルトのプルアップ有効からプルアップ/プルダウンなしの設定にします。