Arduino ESP32:PWM驱动LED的ledcWrite功能

Arduino ESP32:PWM驱动LED的ledcWrite功能


  • 📌Arduino esp32有关LEDC功能介绍原文档:https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/api/ledc.html
  • 🔖功能说明:运行RGB LED的完整255色谱(PWM驱动LED的ledcWrite功能)
  • 📑ESP32 LED控制(LEDC)

LED控制(LEDC)外围设备主要设计用于控制LED的强度,尽管它也可以用于生成用于其他目的的PWM信号。

  • 🌿ESP32 SoC有6到16个通道(SOC的变化,见下表),可以生成独立的波形,例如可用于驱动RGB LED器件。
    在这里插入图片描述

Arduino esp32 LED控制(LEDC)API相关功能函数

  • 🌿bool ledcAttach(uint8_t pin, uint32_t freq, uint8_t resolution);
  • pin选择LEDC引脚。
  • freq选择pwm的频率。
  • resolution选择LEDC通道的分辨率。范围为1-14位(ESP32为1-20位)。
  • 🌿bool ledcAttachChannel(uint8_t pin, uint32_t freq, uint8_t resolution, uint8_t channel);
  • pin选择LEDC引脚。
  • freq选择pwm的频率。
  • resolution选择LEDC通道的分辨率。channel选择LEDC通道。范围为1-14位(ESP32为1-20位)。
    如果配置成功,此函数将返回true。 如果返回false,则发生错误并且未配置LEDC通道。
  • 🌿void ledcWrite(uint8_t pin, uint32_t duty);:设置LEDC引脚的占空比.
  • pin选择LEDC引脚。
  • duty选择要为选定的LEDC引脚设置的占空比。
    如果设置任务成功,此函数将返回true。 如果返回false,则发生错误并且未设置.
  • 🌿uint32_t ledcRead(uint8_t pin);:用于获取LEDC引脚的配置占空比.
  • pin选择LEDC引脚以读取配置的LEDC占空比。
  • 🌿uint32_t ledcReadFreq(uint8_t pin);:获取LEDC通道的配置频率。
  • pin选择LEDC引脚以读取配置的频率。
    此功能将返回为选定LEDC引脚配置的frequency.
  • 🌿uint32_t ledcWriteTone(uint8_t pin, uint32_t freq);:用于将LEDC引脚设置为所选频率上的50%PWM音调。
  • pin选择LEDC引脚。
  • freq选择pwm信号的频率。如果频率为0,占空比将设置为0。
    此功能将返回LEDC引脚的frequency设置。 如果返回0,则发生错误并且未配置LEDC引脚。
  • 🌿uint32_t ledcWriteNote(uint8_t pin, note_t note, uint8_t octave);:用于将LEDC引脚设置为特定音符。
  • pin选择LEDC引脚。
  • note选择要设置的音符。
    在这里插入图片描述
  • octave选择八度音符。
    此功能将根据音符和倍频程输入返回为LEDC引脚配置的frequency。 如果返回0,则发生错误并且未配置LEDC通道。
  • 🌿bool ledcDetach(uint8_t pin);:取消ledc功能关闭。
  • pin选择LEDC引脚。
    如果关闭成功,此函数返回true。 如果返回false。
  • 🌿uint32_t ledcChangeFrequency(uint8_t pin, uint32_t freq, uint8_t resolution);
  • pin选择LEDC引脚。
  • freq选择pwm的频率。
  • resolution选择LEDC通道的分辨率。范围为1-14位(ESP32为1-20位)。
    返回为LEDC通道配置的frequency。 如果返回0,则发生错误并且未设置LEDC通道频率。
  • 🌿bool ledcFade(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms);:用于设置和开始LEDC引脚的淡入淡出。
  • pin选择LEDC引脚。
  • start_duty选择淡入淡出的起始占空比。
  • target_duty选择淡入淡出目标。
  • max_fade_time_ms选择淡入淡出的最长时间。
    如果配置成功,此函数将返回true。 如果返回false,则发生错误并且LEDC淡入淡出未配置/启动。
  • 🌿bool ledcFadeWithInterrupt(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void));:用于设置和启动具有中断的LEDC引脚的淡入淡出。
  • pin选择LEDC引脚。
  • start_duty选择淡入淡出的起始占空比。
  • target_duty选择淡入淡出目标。
  • max_fade_time_ms选择淡入淡出的最长时间。
  • userFunc在触发中断时被调用。
    如果配置成功并淡入淡出启动,此函数将返回true。 如果返回false,则发生错误并且LEDC淡入淡出未配置/启动。
  • 🌿bool ledcFadeWithInterruptArg(uint8_t pin, uint32_t start_duty, uint32_t target_duty, int max_fade_time_ms, void (*userFunc)(void*), void * arg);:用于使用参数设置和启动具有中断的LEDC引脚的淡入淡出。
  • pin选择LEDC引脚。
  • start_duty选择淡入淡出的起始占空比。
  • target_duty选择淡入淡出目标。
  • max_fade_time_ms选择淡入淡出的最长时间。
  • userFunc在触发中断时被调用。
  • arg指向中断参数的指针。
    如果配置成功并淡入淡出启动,此函数将返回true。 如果返回false,则发生错误并且LEDC淡入淡出未配置/启动。
  • 🌿void analogWrite(uint8_t pin, int value);:在引脚上写入模拟值(PWM波)
  • pin选择GPIO引脚。
  • value选择pwm的占空比。 *范围从0(始终关闭)到255(始终打开)。
  • 🌿void analogWriteResolution(uint8_t pin, uint8_t resolution);:设置模拟写入引脚的分辨率。
  • pin选择GPIO引脚。
  • resolution选择模拟通道的分辨率。
  • 🌿void analogWriteFrequency(uint8_t pin, uint32_t freq);:设置所选模拟写入引脚的频率。
  • pin选择GPIO引脚。
  • freq选择pwm的频率。

📝实例代码

/*
  运行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;
  }
}
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值