Arduino ESP32:PWM驱动LED的ledcWrite功能

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino ESP32:PWM驱动LED的ledcWrite功能相关的知识,希望对你有一定的参考价值。

Arduino ESP32:PWM驱动LED的ledcWrite功能

运行RGB LED的完整255色谱(PWM驱动LED的ledcWrite功能)

实例代码

/*
  运行RGB LED的完整255色谱(PWM驱动LED的ledcWrite功能)
  接线说明: R-23,G-19,B-18
*/


// 设置 rgb LED 名称
uint8_t ledR = 23;
uint8_t ledG = 19;
uint8_t ledB = 18;

uint8_t ledArray[3] = {1, 2, 3}; // 三个 LED 通道

const boolean invert = false; // 如果共阳极设置为假,如果共阴极设置为真

uint8_t color = 0;          // 0 到 255 之间的值表示色调
uint32_t R, G, B;           // 红绿蓝颜色分量
uint8_t brightness = 255;  // 255 是最大亮度,但可以更改。 共阳极可能需要 256 才能完全关闭。

void setup() {
  Serial.begin(115200);
  delay(10);

  ledcAttachPin(ledR, 1); // 将 RGB LED 引脚分配给通道
  ledcAttachPin(ledG, 2);
  ledcAttachPin(ledB, 3);

  // 初始化通道
  // 通道 0-15,分辨率 1-16 位,频率限制取决于分辨率
  // ledcSetup (uint8_t channel, uint32_t freq, uint8_t resolution_bits);
  ledcSetup(1, 12000, 8); // 12 kHz PWM,8 位分辨率
  ledcSetup(2, 12000, 8);
  ledcSetup(3, 12000, 8);
}

void loop() {
  Serial.println("Send all LEDs a 255 and wait 2 seconds.");
  // 如果您的 RGB LED 在这里关闭而不是打开,您应该检查 LED 是共阳极还是共阴极。
  //如果它没有完全关闭并且是共阳极尝试使用256。
  ledcWrite(1, 255);
  ledcWrite(2, 255);
  ledcWrite(3, 255);
  delay(2000);
  Serial.println("Send all LEDs a 0 and wait 2 seconds.");
  ledcWrite(1, 0);
  ledcWrite(2, 0);
  ledcWrite(3, 0);
  delay(2000);

  Serial.println("Starting color fade loop.");

  for (color = 0; color < 255; color++) { // 在色谱中回转

    hueToRGB(color, brightness);  // 调用函数将色调转换为 RGB

    // 将 RGB 值写入引脚
    ledcWrite(1, R); // 将红色分量写入通道 1 等。
    ledcWrite(2, G);
    ledcWrite(3, B);

    delay(100); // RGB 超过 256 种颜色的完整循环需要 26 秒
  }
}

// 将颜色转换为其红色、绿色和蓝色分量的函数。
void hueToRGB(uint8_t hue, uint8_t brightness) {
  uint16_t scaledHue = (hue * 6);
  uint8_t segment = scaledHue / 256; // 第 0 至 5 段
  // color wheel
  uint16_t segmentOffset =
    scaledHue - (segment * 256); // 段内的位置

  uint8_t complement = 0;
  uint16_t prev = (brightness * ( 255 -  segmentOffset)) / 256;
  uint16_t next = (brightness *  segmentOffset) / 256;

  if (invert){
    brightness = 255 - brightness;
    complement = 255;
    prev = 255 - prev;
    next = 255 - next;
  }

  switch (segment ) {
    case 0:      // 红色的
      R = brightness;
      G = next;
      B = complement;
      break;
    case 1:     // 黄色的
      R = prev;
      G = brightness;
      B = complement;
      break;
    case 2:     // 绿色
      R = complement;
      G = brightness;
      B = next;
      break;
    case 3:    // 青色
      R = complement;
      G = prev;
      B = brightness;
      break;
    case 4:    // 蓝色的
      R = next;
      G = complement;
      B = brightness;
      break;
    case 5:      // 品红
    default:
      R = brightness;
      G = complement;
      B = prev;
      break;
  }
}

以上是关于Arduino ESP32:PWM驱动LED的ledcWrite功能的主要内容,如果未能解决你的问题,请参考以下文章

Arduino ESP32 PWM 通过示波器对实际产生的波形测量

Arduino ESP32利用PWM实现板载LED呼吸灯效果

使用Arduino点亮ESP-01S,ESP8266-01S上的板载LED

Arduino ESP8266 Web Service PWM控制led亮度

Arduino ESP32 Web Service PWM控制led亮度

Arduino ESP8266利用定时器中断控制LED闪烁示例程序二