nRF52

nRF52840 PWM으로 LED 제어하기

임베디드 친구 2024. 11. 5. 21:02
반응형

안녕하세요, '소프트웨어 공장'입니다. 이번 포스팅에서는 nRF52840 DK 보드와 nRF52840 SDK를 활용하여 PWM(펄스 폭 변조)으로 LED의 밝기를 제어하는 방법을 소개하려고 합니다. 이 글에서는 PWM을 사용하여 LED 밝기를 점점 밝아지고 어두워지게 하는 예제를 구현해 볼 것입니다. 이를 통해 여러분은 nRF52840의 PWM 기능을 이해하고 실습해보는 기회를 가질 수 있습니다.

PWM(Pulse Width Modulation) 개요

PWM(Pulse Width Modulation)은 전자 기기에서 신호의 듀티 사이클을 조절하여 아날로그 출력을 에뮬레이션하는 방법입니다. 주로 모터의 속도 제어나 LED의 밝기 조절에 사용되며, 전력 소비를 효과적으로 관리할 수 있는 장점이 있습니다. nRF52840 보드는 PWM을 사용해 다양한 디바이스를 제어할 수 있습니다.

이 예제에서는 PWM을 사용해 LED의 밝기를 천천히 변화시켜 봄으로써 PWM의 동작을 이해하고 이를 어떻게 활용할 수 있는지 알아보겠습니다.

개발 환경 준비

1. 하드웨어

  • nRF52840 DK 보드
  • USB 케이블 (보드 연결용)

2. 소프트웨어

  • nRF5 SDK (버전 17.1.0을 추천)
  • SEGGER Embedded Studio (nRF52840 개발에 적합)
  • nRF Command Line Tools (펌웨어 다운로드 및 디버깅에 필요)

nRF5 SDK는 Nordic Semiconductor에서 제공하는 공식 개발 키트로, 다양한 예제 코드와 라이브러리를 포함하고 있어 개발자들이 손쉽게 임베디드 애플리케이션을 개발할 수 있도록 도와줍니다.

프로젝트 설정

먼저, PWM 예제를 만들기 위해 nRF5 SDK의 PWM 드라이버 예제를 활용해 보겠습니다. 예제를 통해 PWM 설정 및 사용법을 익히고, 이를 이용해 LED의 밝기를 조절할 수 있습니다.

1. 예제 코드 가져오기

nRF5 SDK에는 examples/peripheral/pwm_driver 폴더에 PWM 예제가 포함되어 있습니다. 이 예제를 기반으로 LED 밝기를 조절하는 코드를 작성해 보겠습니다.

2. 프로젝트 구성

  • SDK 폴더 구조에서 examples/peripheral/pwm_driver 경로로 이동하여 프로젝트 파일을 열어줍니다.
  • SEGGER Embedded Studio를 사용해 .emProject 파일을 엽니다.

코드 작성하기

아래는 LED 밝기를 PWM을 이용해 점점 밝아졌다가 어두워지게 하는 코드입니다. 이 코드는 nRF52840 DK 보드의 기본 LED 중 하나를 제어하도록 설계되었습니다.

#include "nrf_drv_pwm.h"
#include "app_util_platform.h"
#include "nrf_delay.h"

#define PWM_LED_PIN  NRF_GPIO_PIN_MAP(0,13)  // nRF52840 DK의 LED1 핀 번호

nrf_drv_pwm_t m_pwm0 = NRF_DRV_PWM_INSTANCE(0);

static nrf_pwm_values_individual_t seq_values;
static nrf_pwm_sequence_t const pwm_seq = {
    .values.p_individual = &seq_values,
    .length              = NRF_PWM_VALUES_LENGTH(seq_values),
    .repeats             = 0,
    .end_delay           = 0
};

void pwm_init(void) {
    nrf_drv_pwm_config_t const config0 = {
        .output_pins = {
            PWM_LED_PIN, // 채널 0에 연결된 핀
            NRF_DRV_PWM_PIN_NOT_USED,
            NRF_DRV_PWM_PIN_NOT_USED,
            NRF_DRV_PWM_PIN_NOT_USED
        },
        .irq_priority = APP_IRQ_PRIORITY_LOWEST,
        .base_clock   = NRF_PWM_CLK_1MHz,
        .count_mode   = NRF_PWM_MODE_UP,
        .top_value    = 1000,
        .load_mode    = NRF_PWM_LOAD_INDIVIDUAL,
        .step_mode    = NRF_PWM_STEP_AUTO
    };

    nrf_drv_pwm_init(&m_pwm0, &config0, NULL);
}

int main(void) {
    pwm_init();

    while (true) {
        // 밝기 증가
        for (uint16_t value = 0; value <= 1000; value += 10) {
            seq_values.channel_0 = value;
            nrf_drv_pwm_simple_playback(&m_pwm0, &pwm_seq, 1, NRF_DRV_PWM_FLAG_LOOP);
            nrf_delay_ms(10);
        }
        // 밝기 감소
        for (uint16_t value = 1000; value > 0; value -= 10) {
            seq_values.channel_0 = value;
            nrf_drv_pwm_simple_playback(&m_pwm0, &pwm_seq, 1, NRF_DRV_PWM_FLAG_LOOP);
            nrf_delay_ms(10);
        }
    }
}

코드 설명

  1. PWM 설정: pwm_init() 함수에서 PWM을 초기화합니다. nrf_drv_pwm_config_t 구조체를 사용해 PWM의 출력 핀, 클럭, 모드 등을 설정합니다.
  2. LED 밝기 조절: main() 함수에서 LED 밝기를 점진적으로 증가시키고 다시 감소시키는 루프를 실행합니다. seq_values.channel_0 값을 변경하여 LED의 밝기를 조절합니다.
  3. 딜레이: nrf_delay_ms() 함수를 이용해 밝기가 천천히 변화하도록 조절합니다.

빌드 및 다운로드

  1. 프로젝트 빌드: SEGGER Embedded Studio에서 상단의 Build 버튼을 클릭해 프로젝트를 빌드합니다. 오류가 없으면 컴파일이 성공적으로 완료됩니다.
  2. 펌웨어 다운로드: 보드를 USB 케이블로 PC에 연결한 후, Target -> Download zephyr.elf 메뉴를 선택해 펌웨어를 보드에 다운로드합니다.

실행 결과

펌웨어가 정상적으로 다운로드되었다면, nRF52840 DK 보드의 LED가 천천히 밝아졌다가 어두워지는 것을 확인할 수 있습니다. 이 예제를 통해 PWM을 사용해 LED 밝기를 제어하는 방법을 익힐 수 있으며, 이를 바탕으로 모터 속도 제어나 기타 PWM을 활용한 제어 애플리케이션을 구현할 수 있습니다.

마무리

이번 포스팅에서는 nRF52840 DK 보드와 SDK를 사용하여 PWM을 활용한 LED 밝기 제어 예제를 다뤄봤습니다. PWM은 LED 밝기 제어뿐만 아니라 다양한 애플리케이션에 사용될 수 있는 중요한 기능입니다. 이 예제를 통해 PWM의 기본적인 동작 원리를 이해하고, nRF52840에서의 활용 방법을 익히셨기를 바랍니다.

반응형