基础入门:RGB LED 硬件原理与树莓派 Pico PWM 控制实战

1. RGB LED 的基础知识

RGB LED(Red, Green, Blue 发光二极管)是一种通过红、绿、蓝三种不同颜色的 LED 组合而成的发光器件,通过调节这三种颜色的亮度,可以生成各种颜色的光;RGB LED 广泛应用于显示屏、装饰照明和指示灯等场合。

RGB LED 通常集成了三个独立的 LED 芯片,每个芯片负责发出红、绿、蓝三种颜色的光。这些芯片可以独立控制,因此可以通过组合不同的亮度来混合出多种颜色:

1280X1280.PNG

  • 红色(R)​:发射红色光,通常工作电压较低
  • 绿色(G)​:发射绿色光,工作电压中等
  • 蓝色(B)​:发射蓝色光,通常工作电压较高

RGB LED 可以通过混合红、绿、蓝三种光,来生成不同的颜色,我们可以利用脉宽调制(PWM)精确控制每个 LED 的亮度,每种颜色的亮度可以通过改变电压的占空比(0~100%)来调节,从而实现丰富的颜色变化。

RGB LED 根据其结构可以分为以下两种:

1280X1280 (1).PNG

  • 共阴极​:所有的 LED 的阴极连接在一起,阳极分别连接到电路的不同控制端
  • 共阳极​:所有的 LED 的阳极连接在一起,阴极分别连接到电路的不同控制端

RGB LED 的参数反映了它的电气和光学性能,这些参数不仅决定了 LED 的发光效率、颜色、亮度,还影响了它在电路中的使用:

  • 正向电压(Forward Voltage,VF​​​:正向电压是指当 LED 正向导通时,两个电极之间的电压差;不同颜色的 LED 由于材料不同,其工作电压范围有所不同
  • 最大正向电流(Maximum Forward Current,IF)​:最大正向电流是指 LED 在正常工作时允许通过的最大电流,常见值为 20mA;高于这个电流可能会损坏 LED,导致过热或降低 LED 的寿命
  • ​发光强度​(​​Luminous Intensity,Iv)​:发光强度通常用毫坎德拉(mcd)表示,描述的是 LED 发出的光的亮度,发光强度取决于电流的大小,电流越大,LED 发光强度越高
  • ​波长​(​​Wavelength)​:LED 的波长决定了它发出的光的颜色,RGB LED 的波长范围代表了它的颜色;波长的不同是由于 LED 的材料决定的,不同波长的光子能量不同,因此不同颜色的 LED 需要不同的电压来工作
  • 反向电流(Reverse Current,IR​​​:反向电流是指当 LED 反向偏置时,流过 LED 的电流。通常,LED 的反向电流非常小,典型值为微安级(例如 10μA);如果反向电流过大,可能会导致 LED 损坏

以 R6GHBHW-A01 型 RGB LED 的电气参数为例,如下图所示:
1280X1280 (2).PNG

这里,我们需要给 RGB LED 二极管加限流电阻以确保 LED 不会因为电流过大而损坏,限流电阻的计算公式为:

$$
R = \frac{V_{in} - V_F}{I_F}
$$

其中,各个参数含义如下:

  • Vin​:电源电压,通常是 LED 电路的电源电压
  • VF​:LED 的正向电压(Forward Voltage),对于不同颜色的 LED,它的 VF 值不一样
  • IF​:LED 的工作电流,通常是 20mA(即 0.02A)

2.PWM 信号控制 RGB LED

这里,我们需要将风雅一号板-环境与存储采集板插入到风雅一号板-通用兼容扩展板上,同时打开风雅一号板-环境与存储采集板SWITCH2 拨码开关的 PWM_BPWM_GPWM_R 选项,实物连接图如下所示:

68d4722d-1729-40b8-8c27-ed94ff01d420.png

49bc9057-d410-481c-94e4-d7bc6669f7f5.jfif

引脚连接情况如下表所示:

ScreenShot_2026-06-08_111833_307.png

以下实验中所有代码开源在我们提供的资料包中 elegance-devkit v1\Demo\27 PWM_RGBLED 文件夹找到。

在以下代码中,我们通过 PWM 模块控制树莓派 Pico 的 GPIO 引脚输出 PWM 信号,从而驱动 RGB LED,示例代码如下:

# Python env   : MicroPython v1.23.0
# -*- coding: utf-8 -*-        
# @Time    : 2024/9/20 下午3:18   
# @Author  : 李清水            
# @File    : main.py       
# @Description : PWM类使用,驱动RGB LED产生不同颜色的光

# ======================================== 导入相关模块 =========================================

# 导入硬件相关的模块
from machine import Pin, PWM
# 导入时间相关模块
import time

# ======================================== 全局变量 ============================================

# 定义颜色RGB值到PWM占空比的映射表(常见颜色)
COLOR_PWM_VALUES = {
    'red': (255, 0, 0),         # 红色
    'green': (0, 255, 0),       # 绿色
    'blue': (0, 0, 255),        # 蓝色
    'yellow': (255, 255, 0),    # 黄色
    'cyan': (0, 255, 255),      # 青色
    'magenta': (255, 0, 255),   # 品红
    'white': (255, 255, 255),   # 白色
    'black': (0, 0, 0),         # 关闭LED
}

# ======================================== 功能函数 ============================================

# 将8位值(0-255)转换为16位PWM值(0-65535)
def map_to_pwm(value: int) -> int:
    """
​    将8位颜色值(0-255)映射到16位PWM占空比(0-65535)。

​    Args:
​        value (int): 0-255之间的颜色值。

​    Returns:
​        int: 映射到0-65535范围内的PWM占空比。
​    """
​    ​return int(value * 65535 / 255)

# ======================================== 自定义类 ============================================

# RGB LED控制类
class RGBLed:
    """
​    RGB LED控制类,用于通过PWM驱动RGB LED产生不同颜色的光。

​    该类封装了对RGB LED的控制逻辑,支持通过PWM调节红、绿、蓝三个通道的亮度,
​    从而实现多种颜色的显示。此外,支持通过颜色名直接设置LED的颜色。

​    Attributes:
​        red_pwm (PWM): 红色LED的PWM实例。
​        green_pwm (PWM): 绿色LED的PWM实例。
​        blue_pwm (PWM): 蓝色LED的PWM实例。

​    Methods:
​        __init__(self, red_pin: int, green_pin: int, blue_pin: int):
​            初始化RGB LED类实例。

​        set_color(self, red_val: int, green_val: int, blue_val: int) -> None:
​            设置RGB LED的颜色。

​        set_color_by_name(self, color_name: str) -> None:
​            通过颜色名设置RGB LED的颜色。
​    """

​    ​def __init__(self, red_pin: int, green_pin: int, blue_pin: int):
        """
​        初始化RGB LED。

​        Args:
​            red_pin (int): 红色LED连接的引脚编号。
​            green_pin (int): 绿色LED连接的引脚编号。
​            blue_pin (int): 蓝色LED连接的引脚编号。
​        """
​        ​# 初始化红、绿、蓝三个PWM通道
        self.red_pwm = PWM(Pin(red_pin))
        self.green_pwm = PWM(Pin(green_pin))
        self.blue_pwm = PWM(Pin(blue_pin))

        # 设置PWM频率(典型值为1000Hz)
        self.red_pwm.freq(1000)
        self.green_pwm.freq(1000)
        self.blue_pwm.freq(1000)

    def set_color(self, red_val: int, green_val: int, blue_val: int) -> None:
        """
​        设置RGB LED的颜色。

​        Args:
​            red_val (int): 红色RGB值,取值范围为0-255。
​            green_val (int): 绿色RGB值,取值范围为0-255。
​            blue_val (int): 蓝色RGB值,取值范围为0-255。

​        Returns:
​            None
​        """
​        ​# 将8位颜色值映射到16位PWM值,并设置占空比
        self.red_pwm.duty_u16(map_to_pwm(red_val))
        self.green_pwm.duty_u16(map_to_pwm(green_val))
        self.blue_pwm.duty_u16(map_to_pwm(blue_val))

    def set_color_by_name(self, color_name: str) -> None:
        """
​        通过颜色名设置RGB LED的颜色。

​        Args:
​            color_name (str): 颜色名,比如'red', 'green', 'blue'等。

​        Returns:
​            None
​        """
​        ​# 获取颜色对应的RGB值
        # 从字典中获取指定键对应的值,如果找不到指定的键,则返回默认值 (0, 0, 0)
        color_values = COLOR_PWM_VALUES.get(color_name.lower(), (0, 0, 0))
        # 设置RGB LED的颜色
        # 使用了 Python 中的解包操作符,将元组中的三个值分别传递给
        # set_color() 方法的三个参数 red_val、green_val 和 blue_val
        self.set_color(*color_values)

# ======================================== 初始化配置 ==========================================

# 上电延时3s
time.sleep(3)
# 打印调试信息
print("FreakStudio : Use PWM to drive a RGB LED")
# 初始化RGB LED类:使用红色引脚为2,绿色引脚为3,蓝色引脚为4
rgb_led = RGBLed(red_pin=2, green_pin=3, blue_pin=4)

# ========================================  主程序  ===========================================

# 设置为一个中等红、绿色最亮、蓝色较暗的颜色
rgb_led.set_color(128, 255, 64)
# 延时3s
time.sleep(3)

# 循环控制RGB LED变换颜色
while True:
    # 设置为红色,并延时1s
    rgb_led.set_color_by_name('red')
    time.sleep(1)
    # 设置为绿色,并延时1s
    rgb_led.set_color_by_name('green')
    time.sleep(1)
    # 设置为蓝色,并延时1s
    rgb_led.set_color_by_name('blue')
    time.sleep(1)
    # 设置为黄色,并延时1s
    rgb_led.set_color_by_name('yellow')
    time.sleep(1)
    # 设置为青色,并延时1s
    rgb_led.set_color_by_name('cyan')
    time.sleep(1)
    # 设置为品红,并延时1s
    rgb_led.set_color_by_name('magenta')
    time.sleep(1)
    # 设置为白色,并延时1s
    rgb_led.set_color_by_name('white')
    time.sleep(1)
    # 设置为黑色,并延时1s
    rgb_led.set_color_by_name('black')
    time.sleep(1)

这里,我们首先定义了一个全局字典,保存了常见颜色的 RGB 值,每个颜色对应一个 RGB 元组,例如红色为 (255, 0, 0),然后定义了一个 map_to_pwm 函数,将 RGB 值(范围 0-255)映射为 PWM 值(范围 0-65535)。

接着,我们定义了一个 RGB LED 控制类用于封装 RGB LED 的控制逻辑,在初始化方法中传入 RGB LED 连接到的红、绿、蓝三个引脚编号,分别初始化这些引脚为 PWM 输出模式并设置其 PWM 的频率为 1000Hz,定义了两个方法:

  • set_color_by_name()​ 方法​:通过颜色名称来设置 RGB LED 的颜色,它从全局字典 COLOR_PWM_VALUES 中查找颜色名称对应的 RGB 值,如果没有找到则默认返回 (0, 0, 0),即关闭 LED
  • set_color()​ 方法​:用于设置 RGB LED 的颜色,接收三个参数(红、绿、蓝的占空比,范围为 0-255),使用 map_to_pwm() 将 RGB 值映射到 16 位 PWM 占空比,并通过 duty_u16() 方法设置各个颜色通道的 PWM 值

烧录代码,可以看到板载的 RGB LED 循环发出不同颜色的光。

ac7f0aa2-ebaf-456e-bb96-1c1efda0e5a7.png

mmexport1780889051434.gif

posted @ 2026-08-31 19:19  FreakStudio  阅读(9)  评论(0)    收藏  举报