본문 바로가기
Study/nRF51xxx(BLE)

nRF51 DK 예제 20 -LPCOMP(Low Power Comparator)

by Answer Choi 2015. 3. 17.
반응형


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

인기글