본문 바로가기

ESP32

ESP-IDF: ESP32 GPIO PWM LED 밝기 조절 5

반응형

 

ESP-IDF: LEDC(LED 밝기 제어)가 포함된 ESP32 GPIO PWM

 

이 가이드에서는 ESP-IDF(Espressif IoT 개발 프레임워크)와 PWM(펄스 폭 변조)을 사용하여 ESP32 보드의 GPIO를 제어하는 ​​방법을 알아봅니다.

 

ESP32는 여러 개의 범용 입출력(GPIO) 핀을 제공하는 마이크로컨트롤러입니다. 대부분의 ESP32 GPIO는 LEDC(LED 제어) 주변 장치와 함께 구성될 수 있으며, 이를 통해 PWM 신호를 생성하여 LED 밝기를 제어하거나 듀티 사이클 및 주파수 제어 신호가 필요한 기타 출력 장치를 제어할 수 있습니다.

 

 

ESP-IDF개발 포스팅 관련 문서는 아래와 같습니다.

 

ESP-IDF: ESP32 프로그래밍 시작 가이드 1 

ESP-IDF: ESP32 LED 깜박임 예제 VS 코드 2 

ESP-IDF: ESP32 GPIO 디지털 출력 제어 3 

ESP-IDF: ESP32 GPIO 디지털 입력 읽기 4 

ESP-IDF: ESP32 GPIO PWM LED 밝기 조절 5 

 

 

 

ESP-IDF: LEDC 제어 기능이 있는 ESP32 GPIO PWM LED 밝기 조절

 

사전 필수 조건

 

이 가이드를 따르기 전에 VS Code IDE(Microsoft Visual Studio Code)에 ESP-IDF 확장 프로그램을 설치해야 합니다. 아직 설치하지 않았다면 다음 가이드를 따라 설치하세요.

 

시작 가이드: VS Code를 사용하여 ESP-IDF로 ESP32 프로그래밍

 

또한 원하는 ESP32 개발 보드 모델이 필요합니다 .

 

ESP32 LEDC(LED 제어)

 

ESP-IDF에서 ESP32 GPIO를 사용하여 PWM 신호를 생성하려면 LEDC(LED 제어) 주변 장치를 사용해야 합니다. ESP32는 최대 8개의 채널을 제공하며, 각 채널은 다양한 듀티 사이클, 주파수 및 해상도로 구성될 수 있습니다.

 

LEDC를 사용하기 위해서는 먼저 ledc_timer_config()를 사용하여 타이머를 구성한 후, ledc_channel_config()로 채널을 구성해야 합니다. 이 절차는 PWM 주파수가 원하는 값이 되도록 보장합니다. 이 과정은 예제에서 더 자세히 설명될 예정이며(공식 문서에서도 더 자세히 확인할 수 있습니다).

 

ESP32에는 6개에서 16개의 독립 채널(ESP32 모델에 따라 다름)을 갖춘 LED PWM 컨트롤러가 있으며, 이를 통해 다양한 속성의 PWM 신호를 생성하도록 설정할 수 있습니다. 출력으로 사용할 수 있는 모든 핀은 PWM 핀으로 사용할 수 있습니다(GPIO 34~39는 PWM을 생성할 수 없습니다).

 

ESP32 GPIO에 대해 자세히 알아보세요: ESP32 GPIO 참조 가이드

 

ESP32용 ESP-IDF 템플릿 앱 프로젝트 만들기

 

ESP-IDF 확장 기능은 필요한 모든 파일과 구성을 자동으로 생성하여 처음부터 프로젝트를 쉽게 만들 수 있는 방법을 제공합니다.

 

VS Code에서 새로운 ESP-IDF 프로젝트를 만들려면 다음 단계를 따르세요.

 

  1. ESP-IDF Espressif 확장 프로그램을 엽니다.
  2. " 고급 " 메뉴를 확장합니다.
  3. " 새 프로젝트 마법사 " 옵션을 클릭하세요.
  4. 프레임워크 버전을 선택하려면 " ESP-IDF v5.4.1 사용 "을 선택하세요.

 

ESP-IDF ESP32 새 프로젝트 만들기 마법사 메뉴

 

새 창이 열리면 다음 필드를 입력해야 합니다.

 

  • 프로젝트 이름: 원하는 프로젝트 이름을 입력하세요.
  • 프로젝트 디렉터리 입력: 폴더 아이콘을 클릭하고 모든 프로젝트 파일을 저장할 대상 폴더를 선택하세요. 어떤 디렉터리든 사용할 수 있습니다. 참고: Google Drive/One Drive/Dropbox 폴더는 사용하지 마세요 . 빌드 과정에서 많은 파일이 생성/쓰기되므로 클라우드 폴더에 있는 경우 프로세스가 매우 느릴 수 있습니다.
  • ESP-IDF 대상: 대상 장치 칩을 선택합니다. 저는 esp32s3 칩이 장착된 ESP32를 사용하고 있습니다.
  • ESP-IDF 보드: esp32s3 칩의 경우, 구성도 선택해야 합니다: ESP32-S 칩(내장 USB-JTAG를 통해);
  • 직렬 포트: ESP32 보드를 컴퓨터에 연결한 상태에서 ESP32를 나타내는 올바른 COM 포트 번호를 선택하세요.
  • 템플릿 선택: 파란색 버튼을 클릭하면 템플릿을 사용하여 새 프로젝트를 만들 수 있습니다.

 

 

ESP-IDF ESP32 새 프로젝트 만들기 마법사 메뉴 디렉토리 보드 템플릿 선택

 

메뉴에서 " template-app " 샘플 프로젝트를 선택하고 " template-app을 사용하여 프로젝트 만들기 " 버튼을 누릅니다.

 

 

ESP-IDF ESP32 새 프로젝트 만들기 템플릿 앱 옵션 선택

 

VS Code에서 ESP-IDF 프로젝트 열기

 

몇 초 후 VS Code 오른쪽 하단에 작은 알림이 나타납니다. " 예 "를 클릭하면 새로 생성된 ESP-IDF 프로젝트 템플릿이 열립니다.

 

 

ESP-IDF ESP32 새 창에서 프로젝트 열기 VS Code

 

중요: VS Code에서 ESP-IDF 프로젝트를 자동으로 열 수 있는 알림이 보이지 않으면 다음 지침에 따라 쉽게 열 수 있습니다.

 

파일 > 폴더 열기… 로 이동합니다 .

 

 

ESP-IDF ESP32 프로젝트 폴더 열기 VS 코드 파일 메뉴

 

컴퓨터에서 esp-idf-project 폴더 (이전에 정의한 프로젝트 폴더 이름)와 " 폴더 선택 "을 찾습니다.

 

 

ESP-IDF ESP32 프로젝트 열기 VS 코드 폴더 선택

 

이제 새 ESP-IDF 프로젝트 템플릿이 성공적으로 생성되어 열렸습니다.

 

ESP-IDF는 프로젝트에 필요한 여러 파일, 폴더 및 하위 폴더를 생성합니다. 이 가이드에서는 모든 기본 파일을 변경하지 않고 main.c 파일만 수정하는 것을 권장합니다.

 

예제 코드는 main.c 파일에 작성됩니다. 파일을 열려면 다음 지침을 따르세요.

 

  1. 왼쪽 사이드바의 첫 번째 아이콘을 클릭하여 프로젝트 탐색기를 엽니다.
  2. 프로젝트 폴더 이름을 선택하세요. 제 경우에는 " ESP-IDF-PROJECT " 입니다 .
  3. " main " 폴더를 확장합니다.
  4. “ main.c ” 파일을 클릭합니다.
  5. 기본 main.c 템플릿 파일이 코드 창에 로드됩니다.

 

 

VS Code에서 ESP-IDF ESP32 프로젝트 열기 메인 C 파일 찾아보기

 

예제 #1: ESP-IDF LEDC(LED 제어)를 사용하여 ESP32 LED의 밝기 제어

 

LEDC 주변 장치를 사용하여 LED 밝기를 제어하는 main.c 코드 전체는 다음과 같습니다:

 

/*  
  Rui Santos & Sara Santos - Random Nerd Tutorials
  https://RandomNerdTutorials.com/esp-idf-esp32-gpio-pwm-ledc/
*/
#include <stdio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <driver/ledc.h>
#include "sdkconfig.h"

#define LED_PIN 5           // LED connected to GPIO 5
#define LEDC_CHANNEL LEDC_CHANNEL_0
#define LEDC_TIMER LEDC_TIMER_0
#define LEDC_MODE LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES LEDC_TIMER_10_BIT // 10-bit resolution (0-1023)
#define LEDC_FREQUENCY 1000             // 1 kHz PWM frequency

void app_main(void)
{
    // Configure LEDC timer
    ledc_timer_config_t ledc_timer = {
        .speed_mode = LEDC_MODE,
        .duty_resolution = LEDC_DUTY_RES,
        .timer_num = LEDC_TIMER,
        .freq_hz = LEDC_FREQUENCY
    };
    ledc_timer_config(&ledc_timer);

    // Configure LEDC channel
    ledc_channel_config_t ledc_channel = {
        .gpio_num = LED_PIN,
        .speed_mode = LEDC_MODE,
        .channel = LEDC_CHANNEL,
        .timer_sel = LEDC_TIMER,
        .duty = 0
    };
    ledc_channel_config(&ledc_channel);

    // Fading loop
    while (1) {
        // Fade in
        for (int duty = 0; duty <= 1023; duty += 10) {
            ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);
            ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);
            vTaskDelay(20 / portTICK_PERIOD_MS);
            printf("LED duty cycle: %d\n", duty);
        }
        // Fade out
        for (int duty = 1023; duty >= 0; duty -= 10) {
            ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);
            ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);
            vTaskDelay(20 / portTICK_PERIOD_MS);
            printf("LED duty cycle: %d\n", duty);
        }
    }
}

 

코드 작동 방식

 

이 섹션에서는 코드가 어떻게 작동하는지 살펴보겠습니다.

 

라이브러리

 

먼저 필요한 라이브러리를 포함합니다.

 

  • stdio.h– 표준 C 라이브러리가 사용됩니다.프린트프직렬 모니터에 디버깅 정보를 출력하는 기능
  • FreeRTOS.h– 핵심 FreeRTOS 유형과 기능을 제공합니다.
  • task.h– 비차단 지연 기능 사용을 허용합니다.vTaskDelay;
  • driver/ledc.h– PWM 신호를 생성하기 위해 타이머와 채널을 구성하는 데 필요한 기능이 포함되어 있습니다.
  • sdkconfig.h– 프로젝트의 구성 파일을 포함합니다.

 

#include <stdio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <driver/ledc.h>
#include "sdkconfig.h"

 

핀 할당

 

이 라인은 LED를 다음에 할당합니다.GPIO 5보드 핀아웃과 일치하도록 다른 숫자로 변경하거나 다른 GPIO를 제어할 수 있습니다.

 

#define LED_PIN 5

 

LEDC 구성

 

LEDC 채널, LEDC 타이머, 모드, 듀티 사이클 분해능 및 주파수에 대한 구성을 정의합니다.

 

#define LEDC_CHANNEL LEDC_CHANNEL_0
#define LEDC_TIMER LEDC_TIMER_0
#define LEDC_MODE LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES LEDC_TIMER_10_BIT  // 10-bit resolution (0-1023)
#define LEDC_FREQUENCY 1000              // 1 kHz PWM frequency

 

app_main(void)

 

ESP-IDF 프로젝트를 생성할 때 이 함수는 항상 호출되어 실행됩니다. 이 함수는 모든 ESP-IDF 애플리케이션용 코드를 작성해야 하는 곳으로, 아두이노 프로그래밍의 setup() 함수와 동일합니다. ESP32가 부팅되면 ESP-IDF 프레임워크가 app_main을 호출합니다.

 

void app_main(void)
{
    // your code goes here
}

 

app_main(void) 함수에서 모드, 분해능, 타이머 및 주파수를 사용하여 ledc_timer를 생성하는 것으로 시작합니다:

 

  • speed_mode: LEDC_LOW_SPEED_MODE를 사용하십시오 (일부 ESP32는 LEDC_HIGH_SPEED_MODE도 지원합니다)
  • duty_resolution: PWM 해상도를 설정합니다(예: 10비트는 0~1023 범위를 제공함)
  • timer_num: 사용 가능한 타이머 중 하나를 선택하세요
  • freq_hz: PWM 주파수를 설정합니다(LED에는 1kHz 사용 가능)

 

// Configure LEDC timer
ledc_timer_config_t ledc_timer = {
    .speed_mode = LEDC_MODE,
    .duty_resolution = LEDC_DUTY_RES,
    .timer_num = LEDC_TIMER,
    .freq_hz = LEDC_FREQUENCY
};
ledc_timer_config(&ledc_timer);

 

 

그런 다음 ledc_channel_config(&ledc_channel) 함수를 호출하여 GPIO 번호, 모드, 채널, 타이머 및 듀티 사이클로 LEDC 채널을 구성합니다.

 

 

  • gpio_num: LED에 연결된 GPIO 핀을 할당합니다.
  • speeed_mode: LEDC_LOW_SPEED_MODE를 사용하십시오 (일부 ESP32는 LEDC_HIGH_SPEED_MODE도 지원합니다)
  • channel: 사용 가능한 채널을 할당합니다(예:LEDC_채널_0)
  • timer_sel: 구성된 타이머에 채널을 할당합니다.
  • duty: 초기 듀티 사이클을 설정합니다(예: 0 = 꺼짐, 1023 = 10비트 범위에 대한 최대 밝기)

 

// Configure LEDC channel
ledc_channel_config_t ledc_channel = {
    .gpio_num = LED_PIN,
    .speed_mode = LEDC_MODE,
    .channel = LEDC_CHANNEL,
    .timer_sel = LEDC_TIMER,
    .duty = 0
};
ledc_channel_config(&ledc_channel);

 

 

while(1)은 LED가 점점 밝아졌다가 점점 어두워지는 효과를 만들어내는 무한 루프를 실행합니다.

 

while (1) {
    // Fade in
    for (int duty = 0; duty <= 1023; duty += 10) {
        ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);
        ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);
        vTaskDelay(20 / portTICK_PERIOD_MS);
        printf("LED duty cycle: %d\n", duty);
    }
    // Fade out
    for (int duty = 1023; duty >= 0; duty -= 10) {
        ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);
        ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);
        vTaskDelay(20 / portTICK_PERIOD_MS);
        printf("LED duty cycle: %d\n", duty);
    }
}

 

 

LEDC_CHANNEL 듀티 사이클을 duty에 저장된 값으로 설정하고 LED에 적용하십시오(예: 0 = 꺼짐, 1023 = 10비트 범위에서 최대 밝기).

 

 

 

ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);

ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);

 

그런 다음 20밀리초의 지연 시간을 추가하여 LED의 밝기가 증가하여 페이드인 효과를 만듭니다.

 

vTaskDelay(20 / portTICK_PERIOD_MS);

 

무한 루프 내부에서 "LED 듀티 사이클:"이라는 메시지를 직렬 모니터/터미널 탭에서 인쇄하면 현재 적용된 듀티 사이클을 확인할 수 있습니다.

 

printf("LED duty cycle: %d\n", duty);

 

비슷한 과정을 반복하여 LED를 희미하게 만듭니다.

 

ESP32 보드에 코드 빌드 및 플래시

 

ESP-IDF 코드를 ESP32에 빌드하고 플래싱하려면 항상 다음 절차를 따라야 합니다. 플래싱 방식(UART), COM 포트 번호, 대상 장치(ESP32)를 선택하고, 코드를 빌드한 후, 마지막으로 보드에 플래싱하면 됩니다. 이 모든 명령은 VS Code 하단 메뉴 막대에서 사용할 수 있습니다.

 

모든 옵션이 올바른지 확인하세요(프로젝트 마법사를 사용한 경우 이미 올바르게 구성되어 있을 수 있음).

 

VS Code ESP-IDF 모든 구성된 설정 UART COM 포트 대상 보드 확인

 

하지만 설정이 올바르지 않은 경우, 다음 지침에 따라 모든 것이 올바르게 설정되었는지 확인하세요. 먼저 " 별 " 아이콘을 클릭하고 플래시 방식을 UART 로 선택하세요 .

 

 

VS Code ESP-IDF 플래시 UART 옵션을 선택하여 플래시 ESP32를 프로그래밍하세요

 

ESP32 보드가 컴퓨터에 연결된 상태에서 COM 포트(플러그 아이콘)를 클릭하고 ESP32를 나타내는 올바른 포트 번호를 선택합니다.

 

 

VS Code ESP-IDF 프로그래밍 ESP32 보드 올바른 COM 포트 번호 선택

 

대상 장치도 선택해야 합니다. 하단 표시줄의 칩 아이콘을 클릭하세요. 제 경우에는 esp32s3 칩이 장착된 ESP32를 사용하고 있습니다.

 

 

VS 코드 ESP32 S3 또는 올바른 대상 장치 ESP-IDF를 선택하세요

 

이 보드의 경우 ESP32-S 칩(내장 USB-JTAG를 통해) 구성도 선택해야 합니다 .

 

 

VS Code ESP-IDF 내장 USB JTAG 대상 장치를 통해 ESP32 S3 칩을 선택합니다.

 

마지막으로, VS Code 하단의 명령 모음에도 비슷한 옵션이 선택되어 있어야 합니다.

 

 

VS Code ESP-IDF 모든 구성된 설정 UART COM 포트 대상 보드 확인

 

이제 아래 이미지에 표시된 것처럼 렌치 아이콘( 프로젝트 빌드 )을 클릭하여 프로젝트를 빌드할 수 있습니다.

 

 

VS 코드 빌드 프로젝트 예제 코드 ESP32 ESP-IDF

 

프로젝트를 처음 빌드할 때는 보통 시간이 조금 더 걸립니다. 완료되면 터미널 메뉴에 비슷한 메시지가 출력되고 " 빌드 성공 "이라는 메시지가 표시됩니다.

 

 

VS 코드 빌드 예제 프로젝트 ESP32 ESP-IDF 성공 메시지

 

이제 마지막 단계입니다. " 장치 플래시 " 버튼(천둥 모양 아이콘)을 클릭하여 ESP-IDF 프로젝트를 ESP32에 플래시할 수 있습니다 .

VS Code Flash Hello World 코드 프로젝트를 ESP32 ESP-IDF로 변환

 

보드에 따라 ESP32의 온보드 BOOT 버튼을 길게 눌러 플래싱 모드로 전환해야 할 수도 있습니다. 프로세스가 완료되면 " 플래시 완료 "라는 정보 메시지가 나타납니다.

 

VS Code Flash Hello World 프로젝트를 ESP32 ESP-IDF로 완료 성공 메시지

 

데모

 

모든 단계를 따라왔다면 코드 예제가 보드에서 성공적으로 실행될 것입니다. 터미널 창을 열고 화면 아이콘으로 표시된 " 장치 모니터링 " 도구를 클릭하세요.

 

 

VS 코드 터미널 창 모니터 장치 ESP32 ESP-IDF 열기

 

터미널은 " LED 듀티 사이클: 1023 " 이라는 메시지를 인쇄해야 하며 0에서 1023까지 증가/감소합니다. 이 프로세스는 무기한 반복됩니다.

 

 

ESP-IDF ESP32 제어 LED 밝기 LEDC 듀티 사이클 데모

 

밝기를 늘리거나 줄일 수 있는 LED가 있어야 합니다.

 

 

ESP-IDF ESP32 PWM LED 밝기

 

예제 #2: ESP-IDF LEDC를 사용하여 여러 LED의 밝기 제어

 

다음은 서로 다른 속도로 2개의 LED 밝기를 제어하는 ​​전체 main.c 코드입니다.

 

/*  
  Rui Santos & Sara Santos - Random Nerd Tutorials
  https://RandomNerdTutorials.com/esp-idf-esp32-gpio-pwm-ledc/
*/
#include <stdio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <driver/ledc.h>
#include "sdkconfig.h"

#define LED_PIN_1 4
#define LED_PIN_2 5
#define LEDC_CHANNEL_0 LEDC_CHANNEL_0
#define LEDC_CHANNEL_1 LEDC_CHANNEL_1
#define LEDC_TIMER_0 LEDC_TIMER_0
#define LEDC_MODE LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES LEDC_TIMER_10_BIT  // 10-bit resolution (0-1023)
#define LEDC_FREQUENCY 1000              // 1 kHz for smooth fading

void app_main(void)
{
    // Configure LEDC timer (one timer for all channels)
    ledc_timer_config_t ledc_timer = {
        .speed_mode = LEDC_MODE,
        .duty_resolution = LEDC_DUTY_RES,
        .timer_num = LEDC_TIMER_0,
        .freq_hz = LEDC_FREQUENCY,
    };
    ledc_timer_config(&ledc_timer);

    // Configure LEDC channels
    ledc_channel_config_t ledc_channel_0 = {
        .gpio_num = LED_PIN_1,
        .speed_mode = LEDC_MODE,
        .channel = LEDC_CHANNEL_0,
        .timer_sel = LEDC_TIMER_0,
        .duty = 0
    };
    ledc_channel_config(&ledc_channel_0);

    ledc_channel_config_t ledc_channel_1 = {
        .gpio_num = LED_PIN_2,
        .speed_mode = LEDC_MODE,
        .channel = LEDC_CHANNEL_1,
        .timer_sel = LEDC_TIMER_0,
        .duty = 0
    };
    ledc_channel_config(&ledc_channel_1);

    // Fading loop
    int duty1 = 0, duty2 = 0;
    int step1 = 10, step2 = 20;
    while (1) {
        // LED 1: slow fade
        duty1 += step1;
        if (duty1 > 1023) {
            duty1 = 1023;
            step1 = -step1;
        } else if (duty1 < 0) {
            duty1 = 0;
            step1 = -step1;
        }
        ledc_set_duty(LEDC_MODE, LEDC_CHANNEL_0, duty1);
        ledc_update_duty(LEDC_MODE, LEDC_CHANNEL_0);

        // LED 2: fast fade
        duty2 += step2;
        if (duty2 > 1023) {
            duty2 = 1023;
            step2 = -step2;
        } else if (duty2 < 0) {
            duty2 = 0;
            step2 = -step2;
        }
        ledc_set_duty(LEDC_MODE, LEDC_CHANNEL_1, duty2);
        ledc_update_duty(LEDC_MODE, LEDC_CHANNEL_1);

        printf("LED #1 duty cycle: %d, LED #2 duty cycle: %d\n", duty1, duty2);
        vTaskDelay(20 / portTICK_PERIOD_MS);
    }
}

 

코드 작동 방식

 

라이브러리

 

이전 예제에서 보여준 것처럼 필요한 라이브러리를 포함시키는 것으로 시작합니다.

 

#include <stdio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <driver/ledc.h>
#include "sdkconfig.h"

 

핀 할당

 

이 라인은 2개의 LED 핀을 GPIO 4와 GPIO 5에 할당합니다.

 

#define LED_PIN_14

#define LED_PIN_25

 

LEDC 구성

 

그런 다음 LEDC 채널, LEDC 타이머, 모드, 듀티 사이클 분해능 및 주파수에 대한 구성을 정의합니다.

 

#define LEDC_CHANNEL_0 LEDC_CHANNEL_0
#define LEDC_CHANNEL_1 LEDC_CHANNEL_1
#define LEDC_TIMER_0 LEDC_TIMER_0
#define LEDC_MODE LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES LEDC_TIMER_10_BIT  // 10-bit resolution (0-1023)
#define LEDC_FREQUENCY 1000              // 1 kHz for smooth fading

 

app_main(void)

 

app_main(void) 함수 내에서 두 채널이 모드, 분해능, 타이머 및 주파수를 설정하는 데 사용할 단일 ledc_timer 객체만 생성해야 합니다:

 

  • speed_mode: LEDC_LOW_SPEED_MODE를 사용하십시오 (일부 ESP32는 LEDC_HIGH_SPEED_MODE도 지원합니다)
  • duty_resolution의무_결의: PWM 해상도를 설정합니다(예: 10비트는 0~1023 범위를 제공함)
  • timer_num: 사용 가능한 타이머 중 하나를 선택하세요
  • freq_hz: PWM 주파수를 설정합니다(LED에는 1kHz 사용 가능)

 

// Configure LEDC timer
ledc_timer_config_t ledc_timer = {
    .speed_mode = LEDC_MODE,
    .duty_resolution = LEDC_DUTY_RES,
    .timer_num = LEDC_TIMER,
    .freq_hz = LEDC_FREQUENCY
};
ledc_timer_config(&ledc_timer);

 

 

그런 다음, ledc_channel_config(&ledc_channel_0) 및 ledc_channel_config(&ledc_channel_1) 함수를 호출하여 GPIO 번호, 모드, 채널, 타이머 및 듀티 사이클로 LEDC 채널을 구성합니다.

 

 

 

  • gpio_num: LED에 연결된 GPIO 핀을 할당합니다.
  • speed_mode: 사용LEDC_저속_모드(일부 ESP32도 지원LEDC_고속_모드)
  • channel: 사용 가능한 채널을 할당합니다(예:LEDC_채널_0)
  • timer_sel: 구성된 타이머에 채널을 할당합니다.
  • duty: 초기 듀티 사이클을 설정합니다(예: 0 = 꺼짐, 1023 = 10비트 범위에 대한 최대 밝기)

 

ledc_channel_config_t ledc_channel_0 = {
    .gpio_num = LED_PIN_1,
    .speed_mode = LEDC_MODE,
    .channel = LEDC_CHANNEL_0,
    .timer_sel = LEDC_TIMER_0,
    .duty = 0
};
ledc_channel_config(&ledc_channel_0);

ledc_channel_config_t ledc_channel_1 = {
    .gpio_num = LED_PIN_2,
    .speed_mode = LEDC_MODE,
    .channel = LEDC_CHANNEL_1,
    .timer_sel = LEDC_TIMER_0,
    .duty = 0
};
ledc_channel_config(&ledc_channel_1);

 

 

while(1)은 무한 루프를 실행하여 두 개의 LED가 번갈아 가며 점등과 소등 상태를 반복하게 하여 서로 다른 속도로 LED 밝기 조절 효과를 생성합니다.

 

// Fading loop
int duty1 = 0, duty2 = 0;
int step1 = 10, step2 = 20;
while (1) {
    // LED 1: slow fade
    duty1 += step1;
    if (duty1 > 1023) {
        duty1 = 1023;
        step1 = -step1;
    } else if (duty1 < 0) {
        duty1 = 0;
        step1 = -step1;
    }
    ledc_set_duty(LEDC_MODE, LEDC_CHANNEL_0, duty1);
    ledc_update_duty(LEDC_MODE, LEDC_CHANNEL_0);

    // LED 2: fast fade
    duty2 += step2;
    if (duty2 > 1023) {
        duty2 = 1023;
        step2 = -step2;
    } else if (duty2 < 0) {
        duty2 = 0;
        step2 = -step2;
    }
    ledc_set_duty(LEDC_MODE, LEDC_CHANNEL_1, duty2);
    ledc_update_duty(LEDC_MODE, LEDC_CHANNEL_1);

    printf("LED #1 duty cycle: %d, LED #2 duty cycle: %d\n", duty1, duty2);
    vTaskDelay(20 / portTICK_PERIOD_MS);
}

 

 

회로 연결도

 

회로를 만드는 데 필요한 부품 목록은 다음과 같습니다.

 

  • ESP32 ( 최고의 ESP32 개발 보드 읽기 )
  • 2x 5mm LED
  • 2x 220옴 저항기
  • 브레드보드
  • 점퍼 와이어

 

아래 회로도에 표시된 대로 2개의 LED를 GPIO 4와 GPIO 5에 연결하십시오.

 

 

ESP32-S3 2개 LED PWM 회로도 ESP-IDF

 

터미널은 " LED #1 듀티 사이클: 1023, LED #2 듀티 사이클: 700 " 이라는 메시지를 인쇄해야 하며 0에서 1023까지 증가/감소합니다. 이 프로세스는 무기한 반복됩니다.

 

 

ESP-IDF ESP32 제어 다중 LED 밝기 LEDC 듀티 사이클 데모

 

ESP32에 코드를 빌드하고 플래시할 수 있습니다. 이 코드는 연결된 두 개의 LED를 서로 다른 속도로 계속해서 페이드 인/아웃합니다.

 

 

ESP-IDF ESP32 PWM 다중 LED 밝기 제어

 

마무리하기

 

이 튜토리얼에서는 VS Code를 사용하여 ESP-IDF 프레임워크로 ESP32를 프로그래밍하고, ESP32 GPIO를 제어하는 ​​PWM 신호를 생성하는 방법을 배웠습니다. 다음 가이드에서는 ESP-IDF GPIO 입력에 대해 다루겠습니다.

 

기타 ESP-IDF 가이드:

 

 

한편, ESP32 보드에 대해 자세히 알아보려면 ESP32 리소스(Arduino IDE 포함)를 확인하세요.

 

Arduino IDE로 ESP32 배우기(eBook)

더 많은 ESP32 프로젝트와 튜토리얼…

 

읽어주셔서 감사합니다.

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

귀사가 성공하기까지의 긴 고난의 시간을 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩