반응형
LPCOMP는 저전압비교기인데,
여기서는 아날로그 입력2(AIN2)를 계속읽어들여
기준전압의 반(4/8)이하로 떨어지면
LPCOMP의 인터럽트가 발생되게 됩니다.
main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | int main(void) { LEDS_CONFIGURE(LEDS_MASK); LEDS_OFF(LEDS_MASK); nrf_gpio_cfg_output(WAVE_ON_PIN_NUMBER); // on this pin 2Hz wave will be generated #ifdef BSP_BUTTON_0 // configure pull-up on first button nrf_gpio_cfg_input(BSP_BUTTON_0, NRF_GPIO_PIN_PULLUP); #endif APP_GPIOTE_INIT(1); uart_config(); lpcomp_init(); printf("\n\rLPCOMP driver usage example\r\n"); while (true) { print_statistics(); LEDS_ON(BSP_LED_1_MASK); NRF_GPIO->OUTCLR = (1 << WAVE_ON_PIN_NUMBER); nrf_delay_ms(100); // generate 100 ms pulse on selected pin print_statistics(); LEDS_OFF(BSP_LED_1_MASK); NRF_GPIO->OUTSET = (1 << WAVE_ON_PIN_NUMBER); nrf_delay_ms(400); } } | cs |
Line 4~5 : LED 출력 설정후 모두 꺼줍니다.
Line 6 : PIN2를 출력으로 설정합니다.
Line 8~11 : 버튼0을 입력으로 설정합니다.
Line 17 : LPCOMP 초기화를 진행합니다.
1 2 3 4 5 6 7 8 9 10 | static void lpcomp_init(void) { uint32_t err_code; // initialize LPCOMP driver, from this point LPCOMP will be active and provided // event handler will be executed when defined action is detected err_code = nrf_drv_lpcomp_init(NULL, lpcomp_event_handler); APP_ERROR_CHECK(err_code); nrf_drv_lpcomp_enable(); } | cs |
7~8 : default값으로 LPCOMP를 설정합니다.
1 2 3 4 5 6 7 8 9 | /* LPCOMP */ #define LPCOMP_ENABLED 1 #if (LPCOMP_ENABLED == 1) #define LPCOMP_CONFIG_REFERENCE NRF_LPCOMP_REF_SUPPLY_FOUR_EIGHT #define LPCOMP_CONFIG_DETECTION NRF_LPCOMP_DETECT_DOWN #define LPCOMP_CONFIG_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW #define LPCOMP_CONFIG_INPUT NRF_LPCOMP_INPUT_2 #endif | cs |
9 : LPCOMP를 시작합니다.
LPCOMP 인터럽트 발생시 핸들러입니다.
1 2 3 4 5 6 7 8 9 | static void lpcomp_event_handler(nrf_lpcomp_events_t event) { if (event == NRF_LPCOMP_EVENTS_DOWN) { LEDS_INVERT(BSP_LED_0_MASK); // just change state of first LED voltage_falls_detected++; voltage_falls_total++; } } | cs |
첫번째 LED를 토글한 뒤, 카운트를 해줍니다.
Line 19 : UART로 시작되었음을 알립니다.
Line 23 : LPCOMP에서 Voltage falling event가 발생되었는지 체크합니다.
기준전압의 반이하로 떨어지게 되면 발생하게 됩니다.
1 2 3 4 5 6 7 8 | static void print_statistics(void) { while (voltage_falls_detected) { voltage_falls_detected--; printf("\n\r#%d fall detected", (int)voltage_falls_total); } } | cs |
만약 이벤트가 발생되면 카운트를 줄이고, UART로 뿌려줍니다.
Line 24~26 : 두번째 LED를 켜준후, PIN2의 출력을 차단한 후 100ms delay합니다.
Line 27 : Line 23과 같습니다.
Line 28~30 : 두번째 LED를 꺼준 후, PIN2의 출력을 발생시킨 후 400ms를 기다립니다.
그리고 while문이므로 Line 23으로 이동해 Voltage falling event를 체크합니다.
이벤트가 발생한것을 UART로 뿌린것입니다.
반응형
'Study > nRF51xxx(BLE)' 카테고리의 다른 글
BLE를 이용한 DFU (0) | 2015.03.18 |
---|---|
DFU (Device Firmware Update) (0) | 2015.03.18 |
nRF51 DK 예제 19 -UART(Loop back test) (0) | 2015.03.16 |
nRF51 DK 예제 18 -WDT(Watch Dog Timer) (0) | 2015.03.16 |
nRF51 DK 예제 17 -SIMPLE TIMER (0) | 2015.03.13 |