출처: https://randomnerdtutorials.com/esp32-pwm-arduino-ide/
#define LEDC_CHANNEL_0 0
#define LEDC_TIMER_13_BIT 13
#define LEDC_BASE_FREQ 5000
#define LED_PIN 2
int brightness = 0;
int fadeAmount = 5;
void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255){
uint32_t duty = (8191 / valueMax) * min(value,valueMax);
ledcWrite(channel, duty);
}
void setup(){
ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
ledcAttachPin(LED_PIN, LEDC_CHANNEL_0);
}
void loop(){
ledcAnalogWrite(LEDC_CHANNEL_0, brightness);
brightness = brightness + fadeAmount;
if(brightness <= 0 || brightness >= 255){
fadeAmount = -fadeAmount;
}
delay(30);
}
("확! 다른 아두이노 사이다 교과서" 사용)
이 코드는 PWM를 이용하여 내장 LED를 조절한다.
(PWM은 모터제어나 LED의 조명제어등에 사용된다.)
#define LEDC_CHANNEL_0 0
#define LEDC_TIMER_13_BIT 13
#define LEDC_BASE_FREQ 5000
#define LED_PIN 2
int brightness = 0;
int fadeAmount = 5;
ESP32에는 3개의 하드웨어 타이머가 있다. 그 중에서 13번을 사용한고 설정한 것이 LEDC_TIMER_13_BIT이다.
LEDC_BASE_FREQ는 LED제어 하는 주파수 값이다. (보통 LED는 5000HZ이다.)
LED_PIN은 ESP32에 내장되어있는 LED번호를 사용하였다.
void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255){
uint32_t duty = (8191 / valueMax) * min(value,valueMax);
ledcWrite(channel, duty);
}
8비트 분해능을 사용하므로 duty는 0 ~ 255 사이 값을 사용하여 제어된다.
ledcWrite기능에서는 GPIO가 아닌 신호를 생성하는 채널이다.
->여기서 LED의 밝기를 설정한다.
void setup(){
ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
ledcAttachPin(LED_PIN, LEDC_CHANNEL_0);
}
ledcSetup()은 ledChannel, 주파수, 해상도를 인수로 받는 함수이다.
ledcAttachPin()은 두 개의 인자를 갖는다.
첫 번째 인자는 신호를 출력할 GPIO지정, 두 번째 인자는 신호를 생성할 채널이다.
void loop(){
ledcAnalogWrite(LEDC_CHANNEL_0, brightness);
brightness = brightness + fadeAmount;
if(brightness <= 0 || brightness >= 255){
fadeAmount = -fadeAmount;
}
delay(30);
}
위에 ledAnalogWrite함수를 사용하여 LED를 제어한다.
만약 brightness가 0보다 작거나 255보다 클 때 fadeAmount값을 -로 바꿔준다.
이렇게 하게 되면 불이 점점 밝아졌다가 다시 어두워졌다를 반복하게 된다.