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++) {} } } }