안녕하세요, '소프트웨어 공장'입니다. 이번 포스팅에서는 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);
}
}
}
코드 설명
- PWM 설정:
pwm_init()
함수에서 PWM을 초기화합니다.nrf_drv_pwm_config_t
구조체를 사용해 PWM의 출력 핀, 클럭, 모드 등을 설정합니다. - LED 밝기 조절:
main()
함수에서 LED 밝기를 점진적으로 증가시키고 다시 감소시키는 루프를 실행합니다.seq_values.channel_0
값을 변경하여 LED의 밝기를 조절합니다. - 딜레이:
nrf_delay_ms()
함수를 이용해 밝기가 천천히 변화하도록 조절합니다.
빌드 및 다운로드
- 프로젝트 빌드: SEGGER Embedded Studio에서 상단의
Build
버튼을 클릭해 프로젝트를 빌드합니다. 오류가 없으면 컴파일이 성공적으로 완료됩니다. - 펌웨어 다운로드: 보드를 USB 케이블로 PC에 연결한 후,
Target -> Download zephyr.elf
메뉴를 선택해 펌웨어를 보드에 다운로드합니다.
실행 결과
펌웨어가 정상적으로 다운로드되었다면, nRF52840 DK 보드의 LED가 천천히 밝아졌다가 어두워지는 것을 확인할 수 있습니다. 이 예제를 통해 PWM을 사용해 LED 밝기를 제어하는 방법을 익힐 수 있으며, 이를 바탕으로 모터 속도 제어나 기타 PWM을 활용한 제어 애플리케이션을 구현할 수 있습니다.
마무리
이번 포스팅에서는 nRF52840 DK 보드와 SDK를 사용하여 PWM을 활용한 LED 밝기 제어 예제를 다뤄봤습니다. PWM은 LED 밝기 제어뿐만 아니라 다양한 애플리케이션에 사용될 수 있는 중요한 기능입니다. 이 예제를 통해 PWM의 기본적인 동작 원리를 이해하고, nRF52840에서의 활용 방법을 익히셨기를 바랍니다.
'nRF52' 카테고리의 다른 글
nRF ESB(무선 통신 구현) (0) | 2024.09.20 |
---|---|
nRF52 RAM, Flash 크기 조정 (0) | 2024.09.19 |
nRF52 Watchdog Timer: 시스템 안정성을 보장하는 방법 (0) | 2024.09.18 |
nRF52 fstorage 사용 가이드 (0) | 2024.09.17 |
nRF52 RTC(Real-Time Clock)를 활용한 캘린더 구현 (0) | 2024.09.16 |