ADC는 아날로그 신호를 샘플링하여 이를 디지털 값으로 변환하는 역할을 수행합니다. 이 기능은 센서 데이터나 외부 아날로그 신호를 디지털 시스템에서 처리할 때 필수적입니다. SAADC(Single-Ended Analog-to-Digital Converter)는 단일 종단 아날로그-디지털 변환기로, 하나의 아날로그 입력 채널에 대해 동작하며 이를 디지털 값으로 변환합니다. nRF52840와 같은 마이크로컨트롤러에서 주로 온도 센서나 조도 센서와 같은 아날로그 센서의 신호를 디지털 값으로 변환하여 처리할 때 사용됩니다.
1. SAADC 주요 특징
- 단일 종단 변환: nRF SAADC는 하나의 아날로그 입력 채널에 대해 동작합니다. 차동 입력(differential input)이 아닌 단일 종단(single-ended) 아날로그 신호를 디지털 데이터로 변환할 수 있습니다.
- 높은 변환 해상도: nRF SAADC는 12비트의 해상도를 제공하여, 정밀한 센서 데이터 측정이 가능합니다.
- 유연한 설정 가능: 샘플링 속도, 입력 범위, 오버샘플링 등의 다양한 설정이 가능하여 다양한 응용 환경에 맞게 적용할 수 있습니다.
- 저전력 동작: 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를 활용하여 더욱 효율적이고 정밀한 센서 데이터 처리를 구현해 보시기 바랍니다.
'nRF52' 카테고리의 다른 글
nRF52840 USB CDC ACM 이용 (0) | 2024.09.07 |
---|---|
nRF52840에서 FatFs 사용 - 파일 시스템 (0) | 2024.09.06 |
nRF52840 QSPI 드라이버 활용 (0) | 2024.09.04 |
nRF52840 SPI 드라이버 활용하기 (0) | 2024.09.03 |
nRF52840 TWI(I2C) Slave 드라이버 활용하기 (0) | 2024.09.02 |