반응형

ESP32 보드에서는 아두이노의 analogWrite() 함수를 사용하지 못하고 대체 함수인 ledcWrite() 함수를 사용해야 한다. 

 

ESP32에는 3개의 하드웨어 타이머가 있고 3개의 타이머를 사용하여 16개의 아날로그 출력을 할 수 있으며 그 출력은 채널 번호(0 ~ 15)를 할당하여 사용한다. 

 

 

아두이노와 비교하면서 살펴보자. 

 

setup() 함수 설정

아두이노 : pinMode(pwm_ledPin, OUTPUT);          // 디지털과 아날로그 핀의 입력/출력을 설정한다.

ESP32 : ledcAttachPin(pwm_ledPin, pwm_channel)  // 아날로그 핀과 사용할 아날로그 채널(0~15 채널) 연결(0~15 채널)

                ledcSetup(pwm_channel, freq, resolution)   // 아날로그 채널에 대한 설정(freq: 보통 5000, resolution : 보통 8)

loop() 함수에서의 사용

아두이노 : analogWrite(pwm_ledPin, h_pwm);   // 설정된 아날로그 핀에 값 대입

ESP32  : ledcWrite(pwm_channel, h_pwm);       // 설정된 아날로그 채널에 값 대입

 

아두이노는 아날로그 핀을 기준으로 아날로그 출력이 이루어지고 ESP32는 아날로그 채널을 기준으로 아날로그 출력이 됨을 알 수 있다.

 

ESP32 라이브러리의 esp32-hal-ledc.c 에서 아날로그 채널마다 할당된 타이머를 확인할 수 있다.  

 * LEDC Chan to Group/Channel/Timer Mapping

** ledc: 0  => Group: 0, Channel: 0, Timer: 0

** ledc: 1  => Group: 0, Channel: 1, Timer: 0

** ledc: 2  => Group: 0, Channel: 2, Timer: 1

** ledc: 3  => Group: 0, Channel: 3, Timer: 1

** ledc: 4  => Group: 0, Channel: 4, Timer: 2

** ledc: 5  => Group: 0, Channel: 5, Timer: 2

** ledc: 6  => Group: 0, Channel: 6, Timer: 3

** ledc: 7  => Group: 0, Channel: 7, Timer: 3

** ledc: 8  => Group: 1, Channel: 0, Timer: 0

** ledc: 9  => Group: 1, Channel: 1, Timer: 0

** ledc: 10 => Group: 1, Channel: 2, Timer: 1

** ledc: 11 => Group: 1, Channel: 3, Timer: 1

** ledc: 12 => Group: 1, Channel: 4, Timer: 2

** ledc: 13 => Group: 1, Channel: 5, Timer: 2

** ledc: 14 => Group: 1, Channel: 6, Timer: 3

** ledc: 15 => Group: 1, Channel: 7, Timer: 3

 

// PWM, setup() 함수 설정 코드

ledcAttachPin(pwm_ledPin, pwm_channel);     // Esp32 analogWrite 

ledcSetup(pwm_channel, 5000, 8);                // Esp32 analogWrite

 

// PWM, loop() 함수 설정 코드

ledcWrite(pwm_channel, h_pwm);                 // analogWrite() 대체 함수 - 가변저항 LED 제어

esp32_pwm.ino
0.00MB

int ledPin = 15; 
int val = 0; // analog값 0 ~ 255 저장, 초기값 설정 및 변경값 저장 변수 지정

void setup() {
  // pinMode(ledPin, OUTPUT) 역할
  ledcAttachPin(ledPin, 0); // ledcAttachPin(ledPin, ledChannel) led 채널과 세팅값 연결
  ledcSetup(0, 5000, 8);  // ledcSetup(ledChannel, freq, resolution) -> led 채널별(0~15채널) 세팅값
}

void loop() {
  ledcWrite(0, val);  // analogWrite(Pin, value) -> ledcWrite(ledChannel, value)
  delay(10);

  val += 1;
  if(val >=256)
    val = 0;
}

주의할 점은 GPIO 34, 35, 36, 37, 38, 39번 핀은 PWM을 출력하지 못한다. 

상기 핀은 아날로그 입력 또는 디지털 입력/출력에만 사용할 수 있다. 

PWM GPIO: 2, 4, 12 ~ 19, 21, 22, 23, 25, 26, 27, 32, 33 중 16개(16 채널) 사용하여 제어 가능

아래 코드는 RGB LED를 제어하는 스케치이다.

esp32_pwm_rgbled.ino
0.00MB

#define redPin 17
#define greenPin 16
#define bluePin 4

void setup() {  // pinMode(redPin, OUTPUT); -> ledcAttachPin(redPin, ledChannel) + ledcSetup(ledChannel, freq, resolution)
  ledcAttachPin(redPin, 0); // ledcAttachPin(redPin, ledChannel) led 채널과 세팅값 연결
  ledcAttachPin(greenPin, 1); 
  ledcAttachPin(bluePin, 2); 
  ledcSetup(0, 5000, 8);  // R 채널  channel: 0, 5000Hz, 8bits = 256(0 ~ 255)
  ledcSetup(1, 5000, 8);  // G 채널 
  ledcSetup(2, 5000, 8);  // B 채널
}

void loop() {
  setColor(255, 0, 0); // red
  delay(1000);
  setColor(0, 255, 0); // green
  delay(1000);
  setColor(0, 0, 255); // blue
  delay(1000);
  setColor(255, 255, 0); // yellow
  delay(1000); 
  setColor(80, 0, 80); // purple
  delay(1000);
  setColor(0, 255, 255); // aqua
  delay(1000);
}

void setColor(int red, int green, int blue) {
  ledcWrite(0, red);  // analogWrite(Pin, value) -> ledcWrite(ledChannel, value)
  ledcWrite(1, green);
  ledcWrite(2, blue);
}

 

 

 

+ Recent posts