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;
}
}