ESP32低功耗实战:利用RTC IO_MUX和GPIO保持功能实现超长待机

esp32——硬件学习(1)<芯片> 基于小智学长桌面屏幕esp32项目的硬件学习 阅读详情

ESP32低功耗实战:利用RTC IO_MUX和GPIO保持功能实现超长待机

在物联网设备开发中,功耗优化往往是决定产品成败的关键因素。ESP32作为一款广泛应用于IoT领域的芯片,其低功耗特性尤为突出,特别是在深度睡眠模式下的功耗控制。今天我们将深入探讨如何利用ESP32的RTC IO_MUX和GPIO保持功能,实现设备在超低功耗状态下的智能唤醒和状态保持,为电池供电设备提供完整的解决方案。

1. ESP32低功耗架构解析

ESP32的低功耗能力建立在其独特的双核架构和电源管理子系统之上。芯片支持多种功耗模式:主动模式、调制解调器睡眠、轻度睡眠和深度睡眠。其中深度睡眠模式功耗最低,可达10μA左右,但在此模式下大部分系统功能被关闭,只有RTC(实时时钟)子系统保持运行。

RTC子系统由RTC控制器、RTC存储器和RTC外设组成。RTC IO_MUX是连接RTC子系统与外部GPIO的关键桥梁,它允许18个特定的GPIO引脚(0、2、4、12-15、25-27、32-39)在深度睡眠期间保持功能。这些引脚不仅能够维持电平状态,还能作为唤醒源触发系统恢复。

与普通IO_MUX相比,RTC IO_MUX具有以下独特优势:

  • 独立供电:由RTC电源域供电,主系统断电时仍可工作
  • 状态保持:支持在深度睡眠期间保持引脚配置和电平状态
  • 唤醒能力:支持多种唤醒触发方式,包括外部信号和触摸传感器
  • 模拟功能:部分引脚支持ADC、DAC和触摸传感器功能

2. RTC GPIO配置与深度睡眠控制

要充分利用ESP32的低功耗特性,首先需要正确配置RTC GPIO。以下是一个完整的深度睡眠配置示例:

#include "driver/rtc_io.h"
#include "esp_sleep.h"

void configure_rtc_gpio(void)
{
    // 配置GPIO12为RTC输出引脚,并设置高电平
    rtc_gpio_init(GPIO_NUM_12);
    rtc_gpio_set_direction(GPIO_NUM_12, RTC_GPIO_MODE_OUTPUT_ONLY);
    rtc_gpio_set_level(GPIO_NUM_12, 1);
    
    // 启用GPIO保持功能
    rtc_gpio_hold_en(GPIO_NUM_12);
    
    // 配置GPIO13为唤醒源,上升沿触发
    esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 1);
    
    // 启用深度睡眠期间GPIO状态保持
    gpio_deep_sleep_hold_en();
}

在这个配置中,我们使用了两个关键的API函数:

  • rtc_gpio_hold_en():启用单个GPIO的保持功能
  • gpio_deep_sleep_hold_en():启用所有数字GPIO在深度睡眠期间的保持功能

重要提示:GPIO保持功能仅对支持输出的GPIO有效,输入专用引脚(GPIO34-39)无法使用此功能。此外,启用保持功能后,在深度睡眠期间引脚状态将被锁定,无法更改。

3. 唤醒机制与中断处理

ESP32提供了多种唤醒方式,每种方式都有其适用场景和功耗特性:

3.1 外部中断唤醒

外部中断唤醒是最常用的唤醒方式之一,支持边沿触发和电平触发:

// 配置EXT0唤醒(单个引脚)
esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 1);  // 上升沿触发

// 配置EXT1唤醒(多个引脚组合)
#define BUTTON_PIN_BITMASK ((1ULL << GPIO_NUM_13) | (1ULL << GPIO_NUM_14))
esp_sleep_enable_ext1_wakeup(BUTTON_PIN_BITMASK, ESP_EXT1_WAKEUP_ANY_HIGH);

EXT0和EXT1唤醒的主要区别如下:

特性EXT0唤醒EXT1唤醒
引脚数量单个引脚最多多个引脚
触发方式边沿触发电平触发
功耗较低稍高
灵活性较低较高

3.2 触摸传感器唤醒

对于需要用户交互的设备,触摸传感器唤醒提供了优雅的解决方案:

#include "driver/touch_sensor.h"

void configure_touch_wakeup(void)
{
    // 初始化触摸传感器
    touch_pad_init();
    
    // 配置触摸通道
    touch_pad_config(TOUCH_PAD_NUM9, 0);
    
    // 设置唤醒阈值
    touch_pad_set_thresh(TOUCH_PAD_NUM9, 100);
    
    // 启用触摸唤醒
    esp_sleep_enable_touchpad_wakeup();
}

触摸唤醒的灵敏度需要通过实验调整,阈值设置过低可能导致误触发,过高则可能无法正常唤醒。

4. 功耗优化实战技巧

在实际项目中,要实现极致的功耗优化,需要综合考虑硬件设计和软件配置:

4.1 电源管理最佳实践

  • 禁用未使用的外设:在进入深度睡眠前,明确关闭所有不需要的外设
// 禁用Wi-Fi和蓝牙
esp_wifi_stop();
esp_bt_controller_disable();

// 关闭ADC和DAC
adc_power_release();
dac_output_disable(DAC_CHANNEL_1);
  • 优化GPIO状态:将所有未使用的GPIO设置为输入模式并禁用上拉/下拉,避免漏电流

  • 控制外部器件电源:使用MOS管或负载开关控制外部传感器的电源,在睡眠期间完全断电

4.2 内存数据保持策略

深度睡眠期间,RTC内存是唯一保持数据的存储区域,合理使用可以避免每次唤醒后重新初始化:

// 定义RTC内存数据结构
RTC_DATA_ATTR static struct {
    uint32_t boot_count;
    uint8_t device_state;
    float sensor_calibration;
} rtc_data;

void initialize_rtc_data(void)
{
    if (rtc_data.boot_count == 0) {
        // 首次启动初始化
        rtc_data.boot_count = 1;
        rtc_data.device_state = 0;
        rtc_data.sensor_calibration = 1.0f;
    } else {
        rtc_data.boot_count++;
    }
}

4.3 实时时钟校准

对于需要定时唤醒的应用,RTC时钟的准确性至关重要:

#include "esp_clk.h"

void calibrate_rtc_timer(void)
{
    // 获取主频频率
    uint32_t cpu_freq = esp_clk_cpu_freq();
    
    // 根据主频调整RTC计时器参数
    // 具体校准算法需要根据实际硬件特性调整
    
    // 设置唤醒时间(单位:微秒)
    esp_sleep_enable_timer_wakeup(10 * 1000000);  // 10秒后唤醒
}

5. 实战案例:智能环境传感器

让我们通过一个完整的智能环境传感器案例,展示如何将上述技术整合到实际产品中:

5.1 系统架构设计

该传感器每10分钟采集一次温湿度数据,通过BLE传输,其余时间处于深度睡眠状态。硬件连接如下:

  • SHT30温湿度传感器:I2C接口,GPIO21(SDA)、GPIO22(SCL)
  • LED状态指示:GPIO2 -唤醒按钮:GPIO13(下降沿触发)

5.2 低功耗软件实现

RTC_DATA_ATTR static int boot_count = 0;
RTC_DATA_ATTR static float temperature_history[12];
RTC_DATA_ATTR static float humidity_history[12];

void app_main(void)
{
    // 初始化RTC数据
    if (boot_count == 0) {
        memset(temperature_history, 0, sizeof(temperature_history));
        memset(humidity_history, 0, sizeof(humidity_history));
    }
    boot_count++;

    // 配置GPIO和唤醒源
    configure_low_power_gpio();
    esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 0);  // 下降沿触发
    esp_sleep_enable_timer_wakeup(10 * 60 * 1000000);  // 10分钟定时

    // 读取传感器数据
    if (read_sensor_data()) {
        // 通过BLE传输数据
        transmit_data_via_ble();
    }

    // 进入深度睡眠
    prepare_for_deep_sleep();
    esp_deep_sleep_start();
}

void configure_low_power_gpio(void)
{
    // 配置传感器电源控制引脚
    gpio_reset_pin(GPIO_NUM_15);
    gpio_set_direction(GPIO_NUM_15, GPIO_MODE_OUTPUT);
    
    // 启用GPIO保持功能
    gpio_hold_en(GPIO_NUM_15);
    gpio_deep_sleep_hold_en();
}

void prepare_for_deep_sleep(void)
{
    // 关闭传感器电源
    gpio_set_level(GPIO_NUM_15, 0);
    
    // 断开所有外设
    i2c_driver_delete(I2C_NUM_0);
    
    // 禁用Wi-Fi和蓝牙
    esp_bluedroid_disable();
    esp_bt_controller_disable();
    esp_wifi_stop();
}

5.3 功耗测试结果

通过优化实现,我们获得了以下功耗数据:

工作模式平均电流持续时间能耗占比
主动测量85mA2秒4.7%
BLE传输45mA1秒1.3%
深度睡眠12μA597秒94.0%

整体平均电流约为18μA,使用1000mAh电池可支持超过5年的工作时间。

6. 常见问题与调试技巧

在实际开发中,可能会遇到各种低功耗相关的问题:

6.1 唤醒失败排查

  • 检查唤醒引脚配置:确认引脚支持RTC功能且配置正确
  • 验证唤醒电平:使用逻辑分析仪检查实际唤醒信号
  • 检查电源稳定性:电压跌落可能导致唤醒失败

6.2 电流异常排查

当发现睡眠电流异常偏高时,可以按以下步骤排查:

  1. 检查GPIO状态:所有未使用引脚应配置为输入模式,禁用上下拉
  2. 验证外设断电:使用万用表测量各外设电源引脚电压
  3. 检查内部外设:确保ADC、DAC、Wi-Fi、蓝牙等已正确关闭

6.3 使用ESP32功耗分析工具

乐鑫提供了专门的功耗分析工具帮助优化:

# 使用ESP-PROG和EnergyTrace功能
idf.py -p PORT power_trace

这个工具可以详细显示各时间段的电流消耗,帮助识别功耗异常点。

在实际项目中,我发现最影响深度睡眠功耗的往往是那些不起眼的细节:一个未正确配置的GPIO、一个忘记关闭的外设时钟、或者一个漏电流较大的外部元件。每次调试功耗时,都需要耐心地逐个排查,使用电流表实时监测变化,才能找到那些"偷电"的元凶。

经过多个项目的实践,我总结出一个有效的调试流程:首先确保所有基础配置正确,然后逐个模块测试功耗影响,最后进行长时间稳定性测试。这种方法虽然耗时,但能够确保产品的功耗表现达到最优。

避坑指南:ESP32 Deep Sleep下GPIO状态保持,为什么你的RTC GPIO没锁住? 本文深入解析ESP32在Deep Sleep模式下GPIO状态保持的常见问题与解决方案,特别关注RTC GPIO的正确使用。通过硬件原理分析、API调用顺序优化及电源管理配置,帮助开发者避免GPIO状态丢失的陷阱,实现稳定的低功耗物联网设备设计。 阅读详情

相关推荐

避坑指南:ESP32休眠唤醒后GPIO状态跑飞?可能是你没用好gpio_hold和gpio_deep_sleep_hold

本文深入解析ESP32在低功耗模式下GPIO状态保持的常见问题,特别是gpio_hold和gpio_deep_sleep_hold的使用误区。通过详细的原理解析和实战解决方案,帮助开发者避免GPIO状态跑飞问题,提升低功耗应用的可靠性。

weixin_30266885的博客 472

二、ESP-IDF库函数之RTC GPIO

RTC GPIO1. 函数rtc_gpio_is_valid_gpio2. 函数rtc_gpio_init3. 函数rtc_gpio_deinit4. 函数rtc_gpio_get_level5. 函数rtc_gpio_set_level6. 函数rtc_gpio_set_direction7. 函数rtc_gpio_pullup_en8. 函数rtc_gpio_pulldown_en9. 函数rtc_gpio_pullup_dis10. 函数rtc_gpio_pulldown_dis 1. 函数rtc_g

hzy的博客 1475

ESP32 IO MUX与GPIO交换矩阵原理与工程实践

在嵌入式系统中,IO多路复用(IO MUX)和GPIO交换矩阵是实现外设信号灵活路由的核心机制。其本质是通过硬件可编程开关,在有限物理引脚上动态映射高速外设(如UART、SPI)、通用GPIO及低功耗RTC功能。原理上,IO MUX提供低延迟直连路径,而GPIO交换矩阵以162×34输入/176×28输出规模实现全连接路由,支持信号广播、恒定电平注入与多源复用。技术价值在于兼顾性能确定性与配置灵活性,支撑复杂外设共存、功耗分级控制(Deep-sleep/Light-sleep)及安全关键场景的确定性响应。典

weixin_29317963的博客 98

ESP32进入深度睡眠后,io口不可控,都是默认低电平的,有办法设置一个状态吗

esp32可以使用 RTC GPIO 来保持某些IO口的状态(高电平或低电平)。RTC GPIO 是独立于CPU运行的低功耗GPIO,适用于深度睡眠期间。使用 rtc_gpio_set_level() 设置高或低电平。使用 rtc_gpio_init() 初始化RTC GPIO。这样可以确保在深度睡眠时某些引脚保持设定的状态。配置该IO为输入或输出模式。

四博智联的技术博客 1033

ESP32引脚图基础讲解:GPIO分配全面剖析

深入剖析ESP32引脚图的布局与功能,重点讲解各GPIO的复用特性与使用限制,帮助开发者合理规划外设连接。结合esp32引脚图与实际应用场景,提升开发效率与稳定性。

weixin_36304957的博客 1048

ESP32-S3 GPIO交换矩阵与IO MUX深度解析

GPIO交换矩阵和IO MUX是现代MCU实现外设信号灵活路由与高性能直连的核心硬件机制。其原理基于可编程信号交叉开关与多路复用选择器,通过寄存器配置实现物理管脚与逻辑功能的动态解耦,显著提升I/O资源利用率与系统集成度。该架构在嵌入式开发中支撑低功耗设计、多外设复用、高精度模拟采集及抗干扰通信等关键技术价值,广泛应用于物联网传感器节点、电池供电设备及工业控制终端。本文聚焦ESP32-S3平台,深入剖析GPIO交换矩阵、IO MUX与RTC IO MUX三层协同机制及其工程落地细节。

weixin_36474001的博客 104

ESP32连接DS3231实时时钟(RTC)的方法

在本篇文章中,我们将学习如何将RTC实时时钟模块DS3231连接到ESP32开发板和0.96英寸I2C OLED显示屏。我们将使用DS3231实时时钟模块跟踪正确的时间和日期,在OLED显示屏上进行显示,并使用ESP32作为微控制器。 也可以使用DS1307代替DS3231。 DS3231 RTC具有内置的闹钟功能以及温度传感器,其分辨率为0.25,精度为±3°C,这使该项目更加容易实现。 所需的组件 以下是制作此项目所需的组件: ● ESP32开发板 ● DS3231 RTC模块 ● 0

佐佐沐 7931

ESP32 GPIO底层架构:IO MUX与交换矩阵深度解析

GPIO是嵌入式系统中连接软件与硬件的关键接口,其本质是一套受控的信号路由机制。在ESP32中,该机制由IO MUX(物理引脚级多路复用)和GPIO交换矩阵(外设信号级动态绑定)双层架构实现,支持功能复用、低功耗状态保持与跨域信号调度。这种设计突破了传统‘引脚-功能’静态映射的限制,使单个GPIO可灵活承载UART、SPI、I2S等多种外设信号,并在Deep-sleep等场景下通过Hold机制锁存电平。理解其寄存器级控制逻辑(如FUNCx_SEL、IN_SEL_CFG、OEN_SEL)对规避功能冲突、降低功

weixin_29317963的博客 61

ESP32外设入门GPIO

前言 最近开发用到了ESP32,乐鑫已经对接口进行比较深度的封装,但是还是看了下外设的参考手册,摘取了一部分结合自己的理解给记录下来。 如有异议,欢迎指正 概述 ESP32芯片具有34个物理GPIO。每个pad都可用作一个通用IO,或连接内部的外设信号。IO_MUX、RTC_IO_MUX和GPIO交换矩阵用于将信号从外设传输至GPIO pad,这些模块共同组成了芯片的IO控制。 备注:这34个物理GPIO pad的序列号为:0-19, 21-23, 25-27, 32-39。其中GPIO34-39仅作为输入

9685

ESP32-S2 IO MUX与GPIO交换矩阵寄存器级解析

GPIO交换矩阵和IO MUX是嵌入式系统中实现外设信号灵活路由的核心硬件机制,其本质是通过寄存器配置建立物理引脚与内部功能模块间的可编程连接路径。原理上,IO MUX负责高速外设直连与模拟前端控制,而GPIO交换矩阵提供全交叉输入/输出映射能力,二者协同构成分层信号路由架构。该设计显著提升硬件复用率与系统集成度,支撑RMT、I2S、Sigma Delta等复杂外设的精准绑定。典型应用场景包括红外信号极性翻转、低功耗唤醒源配置、专用GPIO实时控制及抗干扰滤波调度。本文基于ESP32-S2硬件实证,深入寄存

weixin_42524864的博客 54

【雕爷学编程】MicroPython手册之 ESP32 实时时钟(RTC)

然后,我们使用rtc.alarm()设置RTC定时唤醒的时间,以毫秒为单位(此处设置为5000毫秒,即5秒后唤醒)。4、外设:12 位 SAR ADC 最多支持 18 个通道,2 个 8 位 DAC,10 个触摸传感器,4 个 SPI,2 个 I2S,2 个 I2C,3 个 UART,SD/SDIO/MMC 主机控制器,SDIO/SPI 从设备控制器,以太网 MAC 接口,CAN 总线 2.0,红外远程控制器,电机 PWM,LED PWM 最多支持 16 通道。RTC是一个独立的时钟,用于跟踪日期和时间。

雕爷学编程 2234

【ESP32-IDF】基础外设开发1:IO_MUX和GPIO交换矩阵

ESP32 GPIO开发指南:IO_MUX与交换矩阵详解 本文介绍了ESP32开发中两个核心概念:IO_MUX和GPIO交换矩阵。IO_MUX作为功能选择器,负责将不同外设功能映射到GPIO引脚,支持RTC模式实现低功耗场景应用。GPIO交换矩阵则作为信号路由器,管理外设与引脚间的信号传输,支持动态功能切换。文章还详细解析了ESP32的GPIO类型定义和错误码系统,包括34个可配置GPIO引脚及其特殊功能限制。通过ESP32-IDF框架提供的API,开发者可以灵活配置引脚功能,满足物联网设备开发需求。

谢谢你的关注 2164

5G物理层基础知识

1、关于RB和RE (1) RB(Resource Block,资源块)频率上连续12个子载波,时域上一个slot(时隙,14个ofdm符号) (2) RE(Resource Element,资源单元)频率上一个子载波,及时域上一个ofdm符号 注意:协议规定,5G每个时隙(非扩展CP)的符号数为14个(扩展CP情况下每个时隙有12个符号),而LTE(非扩展CP)每个时隙的符号数为7个。 简单说:一个12X14的方格,大的整个叫一个RB,每一个小块叫一个RE。另外,一个RE可存放一个调制符号(mo.

qq_39074243的博客 2万+

从交通枢纽到智能管家:深入解析ESP32的IO_MUX与GPIO交换矩阵设计哲学

本文深入解析ESP32的IO_MUX与GPIO交换矩阵设计哲学,阐述其如何通过双层级路由架构高效管理有限物理引脚与丰富外设功能。IO_MUX负责基础功能选择与高速信号直连,GPIO交换矩阵实现动态路由与智能调度,为物联网设备提供灵活的资源分配和低功耗优化方案。

efc1234567的博客 1012

(2024,DDPM,DDIM,流匹配,SDE,ODE)扩散:基础教程

本文的目标是尽可能简单地教授扩散。第一节介绍扩散的基本原理。第二节和第三节展示如何构建随机和确定性扩散采样器。第四部分介绍了密切相关的流匹配,可看作是扩散的推广。​第五节,强调实践中最重要的一些设计选择,包括采样器、噪声时间表和参数化方法。

qq_44681809的博客 1万+

从波形到代码:手把手调试GaN图腾柱PFC的过零点切换与软启动策略

本文详细解析了GaN图腾柱无桥Boost PFC电路在过零点切换与软启动策略中的调试方法。通过波形分析、代码实现和寄存器配置,提供了解决误开通、震荡波形等问题的实用方案,帮助工程师优化电源设计效率与可靠性。

weixin_30831529的博客 425

从硬件架构师视角:解密ESP32的IO_MUX与GPIO交换矩阵设计哲学

本文从硬件架构师视角深入解析ESP32的IO_MUX与GPIO交换矩阵设计哲学。IO_MUX作为引脚功能选择中枢,优化信号完整性与功耗管理;GPIO交换矩阵则提供灵活的信号路由能力,实现外设与引脚的动态映射。这种协同架构解决了有限物理引脚与丰富外设功能的矛盾,为物联网硬件设计提供了极高的灵活性和系统优化空间。

food6的博客 638

AIoT 在线工程实训平台案例——智能家居

AIoT 在线工程实训平台案例——智能家居的操作步骤

m0_53608652的博客 1432

从硬件架构师视角:深入解析ESP32的IO_MUX与GPIO交换矩阵设计哲学

本文从硬件架构师视角深入解析ESP32的IO_MUX与GPIO交换矩阵设计哲学。IO_MUX作为功能选择器负责引脚功能映射,而GPIO交换矩阵则实现信号灵活路由,为外设开发提供极高的引脚配置自由度,突破了传统MCU的固定功能限制,极大提升了物联网设备的设计灵活性。

s4t5u6v7的博客 547

深入理解 Terraform 中的资源更新与管理

摘要:本文探讨Terraform处理AWS安全组名称变更时的行为。当修改不可变属性(如安全组名称)时,Terraform会创建新资源并删除旧资源。通过状态文件比对所需状态与实际状态,Terraform对不可变属性采用"先创建后删除"策略,对可变属性则直接更新。实例演示了修改安全组名称和关联EC2实例时的处理过程,强调理解资源属性可变性对基础设施管理的重要性。(149字)

2501_90323865的博客 473

3D打印机控制系统设计:基于MATLAB的3D打印机运动学建模、轨迹规划和控制

控制实现:在控制实现中,需要将轨迹规划的结果转化为实际的控制指令,控制3D打印机按照规划的轨迹进行运动。3D打印机的运动学建模:3D打印机的运动学建模是指将3D打印机的机械结构、传动系统和运动控制部件等抽象成数学模型,以便于进行控制系统的设计和分析。轨迹规划:轨迹规划是指根据3D模型的几何形状和打印机的运动学模型,计算出打印机需要执行的运动轨迹,以便于实现所需的打印效果。控制实现:控制实现是指将轨迹规划的结果转化为控制指令,控制3D打印机按照规划的轨迹进行运动。

走向CTO的路上... 2474

【ESP32-IDF】深度探索GPIO配置:从IO_MUX到交换矩阵的实战解析

本文深入解析ESP32-IDF的GPIO架构,重点介绍IO_MUX功能选择器和GPIO交换矩阵的工作原理及配置方法。通过UART、SPI等外设映射实战案例,提供完整的配置流程、功耗优化技巧和常见问题排查指南,帮助开发者充分利用ESP32灵活的引脚功能,提升外设开发效率。

defi6farmer的博客 202

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ESP32-ULP协处理器低功耗模式RTC GPIO中断唤醒

​ 该示例展示了当 ULP 通过WAKE指令向 RTC 控制器发送中断信号时,主程序该如何配置中断处理函数以响应该中断信号。

晨之清风 2265

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

超越闪烁LED:ESP32 GPIO高级应用与低功耗深度睡眠实战指南

本文深入解析ESP32的GPIO高级应用与低功耗深度睡眠技术,重点介绍IO_MUX、GPIO交换矩阵和RTC IO_MUX架构,实战演示如何配置深度睡眠下的GPIO保持功能及多种唤醒机制,帮助开发者在电池供电的物联网设备中实现极致功耗优化。

grafana8visual的博客 195
上一篇: 从零到一:OAK相机标定背后的数学原理与视觉几何解密
下一篇: USB设备断连与识别故障:从硬件到驱动的全链路排查指南
devops8pract
博客等级 码龄4年 533粉丝 849原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值