LED灯发光与驱动原理

LED(Light Emitting Diode,发光二极管)是一种半导体器件,其发光基于电致发光效应。当电流通过PN结时,电子与空穴复合释放能量,以光子形式发射。

LED通常有两种接法,分别为灌电流接法和拉电流接法

灌电流(Sink Current):MCU的GPIO引脚作为电流的接收端(接地路径),LED的正极接电源。

拉电流(Source Current):MCU的GPIO引脚作为电流的提供端(电源路径),LED的负极接地。

本人使用立创·ESP32S3R8N8开发板,其中LED灯通过灌电流法接入GPIO48,所以我们只要使GPIO48输出低电平即可点亮LED,输出高电平则LED熄灭。

创建新项目

在新建工程页,配置工程名、工程路径、ESP32芯片、连接端口(后继可改)等,点击【Choose Template】进行模板创建。

在弹出的界面中,有两个选项可以选择,是使用扩展例程(ExtenSion)还是使用官方IDF的例程(ESP-IDF),这里我们选择选择 【ExtenSion】下的 【template-app】进行工程创建,有许多其他例程小伙伴们可以自行尝试,点击【Create project using template hellp_world】创建项目。

创建完成之后,右下角会提示【工程已经创建完毕,是否用新窗口打开工程?】点击Yes,出现打开一个VSCode窗口。

代码实现

方法一

通过设置一个结构体gpio_config_t直接配置IO口。

打开main.c,输入代码:

#include <stdio.h>
#include "driver/gpio.h"

#define     LED_PIN     48
gpio_config_t led_config = {
    .pin_bit_mask = (1ULL<<LED_PIN),          //配置引脚
    .mode =GPIO_MODE_OUTPUT,                  //输出模式
    .pull_up_en = GPIO_PULLUP_DISABLE,        //不使能上拉
    .pull_down_en = GPIO_PULLDOWN_DISABLE,    //不使能下拉
    .intr_type = GPIO_INTR_DISABLE            //不使能引脚中断
};


void app_main(void)
{
    gpio_config(&led_config);
}
1. pin_bit_mask = (1ULL<<LED_PIN)
  • 作用:指定要配置的GPIO引脚

  • 格式:64位位掩码,每位对应一个GPIO引脚

  • 示例

    • (1ULL<<2) - 配置GPIO2

    • (1ULL<<2) | (1ULL<<4) - 同时配置GPIO2和GPIO4

  • ULL后缀:确保64位无符号长整型,避免移位溢出

2. mode = GPIO_MODE_OUTPUT
  • 作用:设置GPIO工作模式

  • 可选值

    • GPIO_MODE_INPUT - 输入模式

    • GPIO_MODE_OUTPUT - 输出模式

    • GPIO_MODE_OUTPUT_OD - 开漏输出模式

    • GPIO_MODE_INPUT_OUTPUT_OD - 输入+开漏输出

    • GPIO_MODE_INPUT_OUTPUT - 输入+输出

3. pull_up_en = GPIO_PULLUP_DISABLE
  • 作用:是否启用内部上拉电阻

  • 可选值

    • GPIO_PULLUP_ENABLE - 启用上拉(约45kΩ)

    • GPIO_PULLUP_DISABLE - 禁用上拉(默认)

  • 应用场景

    • 输入模式时,防止引脚悬空

    • 按钮检测时提供默认高电平

4. pull_down_en = GPIO_PULLDOWN_DISABLE
  • 作用:是否启用内部下拉电阻

  • 可选值

    • GPIO_PULLDOWN_ENABLE - 启用下拉(约45kΩ)

    • GPIO_PULLDOWN_DISABLE - 禁用下拉(默认)

  • 应用场景

    • 输入模式时,防止引脚悬空

    • 提供默认低电平

5. intr_type = GPIO_INTR_DISABLE
  • 作用:设置中断触发类型

  • 可选值

    • GPIO_INTR_DISABLE - 禁用中断

    • GPIO_INTR_POSEDGE - 上升沿触发

    • GPIO_INTR_NEGEDGE - 下降沿触发

    • GPIO_INTR_ANYEDGE - 任意边沿触发

    • GPIO_INTR_LOW_LEVEL - 低电平触发

    • GPIO_INTR_HIGH_LEVEL - 高电平触发

注:当调用 gpio_config(&led_config) 时:

  1. 清除原有配置:指定的GPIO引脚(在 pin_bit_mask 中)的所有现有设置被完全清除

  2. 应用新配置:按照结构体中的参数重新配置该引脚

  3. 影响所有方面:包括模式、上下拉、中断设置等所有GPIO属性

即使你只关心某个参数(如模式),也必须设置所有参数:

// 错误:只设置模式,其他用默认值(但默认值可能不是期望的)
gpio_config_t bad_config = {
    .pin_bit_mask = (1ULL<<2),
    .mode = GPIO_MODE_OUTPUT
    // 其他字段未初始化,值不确定!
};

// 正确:明确设置所有参数
gpio_config_t good_config = {
    .pin_bit_mask = (1ULL<<2),
    .mode = GPIO_MODE_OUTPUT,
    .pull_up_en = GPIO_PULLUP_DISABLE,
    .pull_down_en = GPIO_PULLDOWN_DISABLE,
    .intr_type = GPIO_INTR_DISABLE
};

方法二

先通过gpio_reset_pin函数初始化一个IO口,然后再使用gpio_set_direction函数配置这个引脚的输入输出模式。

#include <stdio.h>
#include "driver/gpio.h"

#define     LED_PIN     48


void app_main(void)
{
    gpio_reset_pin(LED_PIN);
    gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
}
gpio_reset_pin() 是ESP-IDF中一个非常重要的GPIO管理函数。
函数原型:
esp_err_t gpio_reset_pin(gpio_num_t gpio_num);
参数说明:

gpio_num_t gpio_num:

  • 类型:枚举类型,指定要复位的GPIO引脚编号

  • 取值范围GPIO_NUM_0 到 GPIO_NUM_48(取决于ESP32型号)

  • 示例

    • GPIO_NUM_2 - GPIO2引脚

  • 等效于手动配置:

gpio_config_t reset_config = {
    .pin_bit_mask = (1ULL << gpio_num),
    .mode = GPIO_MODE_DISABLE,         // 禁用模式(高阻态)
    .pull_up_en = GPIO_PULLUP_DISABLE, // 禁用上拉
    .pull_down_en = GPIO_PULLDOWN_DISABLE, // 禁用下拉
    .intr_type = GPIO_INTR_DISABLE     // 禁用中断
};
gpio_config(&reset_config);
gpio_set_direction() 是ESP-IDF中用于设置GPIO引脚方向的函数。
函数原型:
esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode);
参数说明

1. gpio_num_t gpio_num

  • 作用:指定要设置的GPIO引脚编号

  • 类型:枚举类型

  • 取值范围GPIO_NUM_0 到 GPIO_NUM_48(取决于ESP32型号)

  • 示例

    • GPIO_NUM_2 - GPIO2引脚

    • GPIO_NUM_4 - GPIO4引脚

    • GPIO_NUM_18 - GPIO18引脚

2. gpio_mode_t mode

  • 作用:设置GPIO的工作模式

  • 类型:枚举类型

  • 常用值

    • GPIO_MODE_INPUT - 输入模式

    • GPIO_MODE_OUTPUT - 输出模式

    • GPIO_MODE_OUTPUT_OD - 开漏输出模式

    • GPIO_MODE_INPUT_OUTPUT_OD - 输入+开漏输出模式

    • GPIO_MODE_INPUT_OUTPUT - 输入+输出模式

    • GPIO_MODE_DISABLE - 禁用模式(高阻态)

构建与烧录

构建项目:

用USB数据线将开发板连接到电脑,选择相应端口,烧录到开发板:

可以看到开发板LED灯成功点亮:

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐