LPC810メモ:アナログコンパレータ(電圧ラダーの例)

アナログコンパレータで、電圧ラダーを使う例。

前提とする環境はこちら→LPC810メモ 共通の準備

  • 電圧ラダーを用いると、外部からの入力電圧2本を比較するのではなく、入力電圧1本と、内部で設定する電圧と比較することができる。
    • GNDからVddの間で、5bit(32段階)で設定可能
  • この例では、32段階に変化させながら、比較結果によってLED点灯、消灯することで、「電圧が高いほど点灯時間が長いLチカ」をやってみる

サンプルコード

#include "LPC8xx.h"

int main( void )
{
    //  SWMのclockを有効化
    // UM10601 4.6.13 System clock control register
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 7);

    // UM10601 9.5.10 Pin enable register 0
    // ACMP_I1_ENを立てて、
    // Analog comparatorを有効化。
    // pinは8番に固定されている。
    LPC_SWM->PINENABLE0 = 0xffffffbeUL;

    // UM10601 18.3 Basic configuration の手順に従った設定
    // Analog comparatorのclockを有効化
    // UM10601 4.6.13 System clock control register
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 19);

    // Analog comparatorのPower downを無効化
    // UM10601 4.6.32 Power configuration register
    LPC_SYSCON->PDRUNCFG &= ~(1 << 15);

    // Clear the analog comparator peripheral reset using the PRESETCTRL register
    // UM10601 4.6.2 Peripheral reset control register
    LPC_SYSCON->PRESETCTRL &= ~(1<<12);
    LPC_SYSCON->PRESETCTRL |= (1<<12);

    // The analog comparator interrupt is connected to interrupt #11 in the NVIC.
    // 本例は割り込みは使わない

    //  UM10601 18.3 Basic configuration の手順に従った設定ここまで

    // UM10601 .6.1 Comparator control register
    LPC_CMP->CTRL =
        (1 << 8)        // +inputはACMP_I1(8番pin)
        |  (0 << 11)       // -inputはVoltage ladder
        |  (1 << 25)      // hysteresis = 5 mV
        ;

    // UM10601 18.6.2 Voltage ladder register
    LPC_CMP->LAD |= (1 << 0);// ladder有効化

    // I/O configurationのclockを有効化
    // UM10601 4.6.13 System clock control register
    LPC_SYSCON->SYSAHBCLKCTRL |= (1 << 18);

    // Pull-up/Pull-downともに無効化
    // UM10601 6.5.17 PIO0_0 register
    // UM10601  6.5.12 PIO0_1 register
    LPC_IOCON->PIO0_0 &= ~(0x3 <<  3);
    LPC_IOCON->PIO0_1 &= ~(0x3 <<  3);

    // GPIOに対してclockを有効化
    // UM10601 4.6.13 System clock control register
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);

    // PIO0_2(すなわち4番pin)をoutputに設定
    // UM10601 27.1 Packages より、PIO0_0は8番
    // UM10601 7.6.3 GPIO port direction registers
    LPC_GPIO_PORT->DIR0 |= (1<<2);

    while(1) {
        for(uint32_t i = 0; i < 32; i++) {
            // UM10601 18.6.2 Voltage ladder register
            // 比較対象であるVoltage ladderを、 i * (Vdd / 31) に設定
            uint32_t lad = LPC_CMP->LAD;
            lad &= ~(31 << 1);
            lad |= i << 1;
            LPC_CMP->LAD = lad;

            // UM10601 18.6.1 Comparator control register
            // COMPSTATのbitを見て、
            if(LPC_CMP->CTRL & (1 << 21)) {
                // 立ってたら4番点灯
                LPC_GPIO_PORT->SET0 |= (1<<2);
            } else {
                // でなければ4番消灯
                LPC_GPIO_PORT->CLR0 |= (1<<2);
            }
            // 適当にループして間隔をあける
            for(volatile int i = 0; i < 10000; i++) {}
        }
    }
}

接続

  • 半固定抵抗を適当にいじると、LED点滅における点灯/消灯時間の割合が変わる。

補足/雑感

  • 前の例と大差ないとはいえ、何のトラブルもなく、書いたとたんに成功した。そういうの初めてでうれしい。

みっかぼの無料Androidアプリはこちら。