nRF52

nRF52840 SAADC, ADC 활용

임베디드 친구 2024. 9. 5. 17:29
반응형

ADC는 아날로그 신호를 샘플링하여 이를 디지털 값으로 변환하는 역할을 수행합니다. 이 기능은 센서 데이터나 외부 아날로그 신호를 디지털 시스템에서 처리할 때 필수적입니다. SAADC(Single-Ended Analog-to-Digital Converter)는 단일 종단 아날로그-디지털 변환기로, 하나의 아날로그 입력 채널에 대해 동작하며 이를 디지털 값으로 변환합니다. nRF52840와 같은 마이크로컨트롤러에서 주로 온도 센서나 조도 센서와 같은 아날로그 센서의 신호를 디지털 값으로 변환하여 처리할 때 사용됩니다.

1. SAADC 주요 특징

  1. 단일 종단 변환: nRF SAADC는 하나의 아날로그 입력 채널에 대해 동작합니다. 차동 입력(differential input)이 아닌 단일 종단(single-ended) 아날로그 신호를 디지털 데이터로 변환할 수 있습니다.
  2. 높은 변환 해상도: nRF SAADC는 12비트의 해상도를 제공하여, 정밀한 센서 데이터 측정이 가능합니다.
  3. 유연한 설정 가능: 샘플링 속도, 입력 범위, 오버샘플링 등의 다양한 설정이 가능하여 다양한 응용 환경에 맞게 적용할 수 있습니다.
  4. 저전력 동작: nRF SAADC는 낮은 전력으로 동작하며, 배터리 수명을 향상시켜 휴대용 장치에 적합합니다.

2. SAADC 모듈 설정

먼저, SAADC 모듈을 사용하기 위해서는 sdk_config.h 파일에서 SAADC 모듈을 활성화해야 합니다.

#define NRFX_SAADC_ENABLED 1
#define SAADC_ENABLED 1

SAADC 드라이버 파일은 다음 위치에 있습니다.

./modules/nrfx/drivers/src/nrfx_saadc.c

3. SAADC 초기화

nRF52840 MCU에서 아날로그 입력으로 사용할 수 있는 핀은 총 8개입니다: AIN0(GPIO0_2), AIN1(GPIO0_3), AIN2(GPIO0_4), AIN3(GPIO0_5), AIN4(GPIO0_28), AIN5(GPIO0_29), AIN6(GPIO0_30), AIN7(GPIO0_31). 이 예제에서는 AIN0(GPIO0_2)를 입력으로 사용할 것입니다.

3.1 SAADC 초기화 코드

다음은 SAADC를 초기화하는 코드 예제입니다.

void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
    if (p_event->type != NRF_DRV_SAADC_EVT_DONE)
        return;

    ret_code_t err_code;
    err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
    APP_ERROR_CHECK(err_code);

    int32_t adc_value = p_event->data.done.p_buffer[0];
    // ADC 값을 처리하는 로직 추가 가능
}

void saadc_init(void)
{
    ret_code_t err_code;
    nrf_drv_saadc_config_t saadc_config = NRF_DRV_SAADC_DEFAULT_CONFIG;
    saadc_config.low_power_mode = true;
    saadc_config.resolution = NRF_SAADC_RESOLUTION_12BIT;

    nrf_saadc_channel_config_t channel_config = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0);
    channel_config.resistor_p = NRF_SAADC_RESISTOR_PULLUP;  // Pull-up resistor 설정
    channel_config.pin_n = NRF_SAADC_INPUT_DISABLED;        // 단일 종단 모드에서 필요 없음
    channel_config.reference = NRF_SAADC_REFERENCE_INTERNAL;

    err_code = nrf_drv_saadc_init(&saadc_config, saadc_callback);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_saadc_channel_init(0, &channel_config);
    APP_ERROR_CHECK(err_code);

    static nrf_saadc_value_t buffer[SAMPLES_IN_BUFFER];
    err_code = nrf_drv_saadc_buffer_convert(buffer, SAMPLES_IN_BUFFER);
    APP_ERROR_CHECK(err_code);

    nrf_saadc_enable();
}

위 코드에서는 AIN0를 입력으로 사용하여 SAADC를 초기화하고, 콜백 함수를 통해 샘플링된 ADC 값을 처리합니다.

4. SAADC 측정

채널과 입력 핀을 설정한 후, nrf_drv_saadc_sample() 함수를 호출하면 이전에 등록한 ADC 콜백 함수에서 측정된 아날로그 값을 디지털 데이터로 읽어올 수 있습니다.

4.1 샘플링 코드

void do_saadc_sampling(void)
{
    ret_code_t err_code;

    err_code = nrf_drv_saadc_sample();
    APP_ERROR_CHECK(err_code);
}

이 함수는 SAADC 샘플링을 시작합니다. 부팅 직후 ADC 값이 측정될 때까지 1초 간격으로 샘플링하고, 첫 샘플링 이후에는 10분 간격으로 샘플링하도록 설정할 수 있습니다.

5. 결론

SAADC(Single-Ended Analog-to-Digital Converter)는 nRF52840와 같은 저전력 마이크로컨트롤러에서 아날로그 센서 데이터를 처리할 때 매우 유용한 도구입니다. 이 가이드를 통해 SAADC의 주요 기능과 설정 방법을 익히고, 샘플링 및 초기화를 통해 아날로그 신호를 디지털로 변환하는 과정을 이해할 수 있습니다. 정확한 해상도와 저전력 동작을 통해, SAADC는 다양한 애플리케이션에서 효율적인 센서 데이터 처리가 가능하도록 도와줍니다. 특히, 배터리 수명이 중요한 휴대용 장치에서 적절한 샘플링 간격을 설정함으로써 전력 소모를 최적화할 수 있습니다.
이 가이드를 바탕으로 SAADC를 활용하여 더욱 효율적이고 정밀한 센서 데이터 처리를 구현해 보시기 바랍니다.

반응형