LPC810メモ:アナログコンパレータ(比較結果をそのまま出力)
単純にアナログコンパレータを試してみた例。
前提とする環境はこちら→LPC810メモ 共通の準備
- 8番と5番の電圧を比較して、8番の方が高ければ4番がHIGHになる(4番につないだLEDが光る)
サンプルコード
#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,ACMP_I2_ENを立てて、 // Analog comparatorを有効化。 // pinは8番と5番に固定されている。 LPC_SWM->PINENABLE0 = 0xffffffbcUL; // ACMP_O_O を4番pinに設定 // UM10601 9.5.9 Pin assign register 8 LPC_SWM->PINASSIGN8 = 0xffff02ffUL; // 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 の手順に従った設定ここまで // UM19691 8.6.1 Comparator control register LPC_CMP->CTRL = (1 << 8) // +inputはACMP_I1(8番pin) | (2 << 11) // -inputはACMP_I2(5番pin) | (1 << 25) // hysteresis = 5 mV ; // PIO0_0(8番)とPIO0_1(5番)は、デフォルトでpull upされているらしい。 // 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); }
補足/雑感
- 入力は、ACMP_I1が8番、ACMP_I2が5番に固定されている。ACMP_I2が5番だと、開始時点でLOWだとISPモードになっちゃわない?
- 最後のpull-upの無効化。そもそもdefaultだとpull-upされているというのも知らなかったけど、本当に無効化必要なのかよくわかってない。この例だと、あってもなくても見た目に挙動変わらなかった。本当にこれで無効化できてるかもわからない。