ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ESP32-P4 备用电池(VBAT)供电方案深度解析:主电源掉电保持计时与低功耗设计实战

ESP32-P4 备用电池(VBAT)供电方案深度解析:主电源掉电保持计时与低功耗设计实战 ESP32-P4 备用电池VBAT供电方案深度解析主电源掉电保持计时与低功耗设计实战【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution本文以 esp-iot-solution 仓库中的 ESP32-P4 备用电池供电方案文档 为核心系统讲解 ESP32-P4 集成 RTC 的 VBAT 备用电源输入原理、电池连接与电路保护、PMU 电源切换寄存器配置、欠压检测BOD与电池充电电路的阈值设置以及 VBAT 供电场景下的外设支持验证方法。读完本文你将能够在 ESP32-P4 上实现主电源断开后依靠纽扣电池持续计时、恢复供电后时间仍然准确的低功耗应用并掌握从电路设计到寄存器级驱动的完整测试流程。ESP32-P4 在片内集成了 RTCReal-Time Clock实时时钟功能包含备用电源输入端VBAT、32.768KHz 外部晶振输入以及电源切换控制可在主电源断开后保持计时准确。其备用电池方案支持以下特性主电源掉电后由备用电池VBAT供电保持计时功能不中断睡眠/唤醒时由 PMUPower Management Unit电源管理单元自动切换电源支持备用电池电压检测与阈值报警支持备用电池充电当 VDDA 存在时可通过内部电阻为 VBAT 上的备用电池充电。⚠️ 注意ESP-IDF 尚未完全支持 VBAT 方案当前方案仅供测试。需要按照下文测试过程在 ESP-IDF master 分支上修改驱动代码。当前仓库只提供方案说明与测试参考不包含可直接运行的完整示例工程。上图展示了 ESP32-P4 的备用电池连接框架外部 32K 晶振XTAL32K_P / XTAL32K_N为 RTC 提供时基VBAT 引脚接入备用电池Always on PD始终上电电源域中包含 PMU、LP memory、xtal32k/rc32k 振荡器、超级看门狗、LP GPIO 与 LP 定时器等关键低功耗模块保证了在深度睡眠下核心计时电路依然有电可用。电池连接与电路保护ESP32-P4 备用电池的连接非常简单VBAT 引脚内置充电保护电路因此无需外部电阻与二极管有效降低了在备用电池通路上增加元件带来的有害风险如漏电、压降和引入噪声。从电池切换控制框图可以看出整个备用电池通路的核心构件包括充电保护电阻 Rx限流、ESD 保护器件 D1 与 R1、电源开关 S1、由 PMU 控制的 Power switch control 模块以及分别针对 VBAT、VDDA 与电池充电检测的三路 BODBrown-Out Detector欠压检测器比较器与滤波电路。LDO 负责将 VBAT 或 VDDA 电压调节后稳定输出至 Always on PD 域。备用电池的选择为满足长时间、低功耗的备用计时需求备用电池的选择应关注以下四点低自放电率电池应具有出色的抗漏电性这是决定待机年限的首要因素充放电性能较高充放电次数的电池可以提升产品使用寿命仅对可充电电池有意义放电电流VBAT 供电功耗较低仅几微安因此大部分电池的放电能力均可满足充电电流支持 VDDA 给 VBAT 上备用电池充电软件可配置充电限流电阻范围为1KΩ ~ 9KΩ。⚠️ 警告严禁接入 3.6V 的可充电电池3.6V 可充电电池在满电情况下的电压可达 4V 左右而 VBAT 引脚的输入电压范围仅为2.3V ~ 3.6V超出上限会导致 VBAT 引脚损坏。电池上的去耦电容电路设计中工程师通常习惯为每个供电引脚添加去耦电容但在 VBAT 用作备用电源输入时必须避免这一做法电容的漏电流会显著缩短电池寿命电池本身具有良好的电容特性无需外部去耦电容即可满足供电稳定性。另外框图中的 D1 与 R1 为 ESD 保护器件Rx 为充电保护电阻其作用是将充电电流限制在1 mA 以下使保护电路满足 UL 认证测试要求。电源切换PMU 寄存器配置与两种实现方式VBAT 与 VDDA 的电源选择由 PMU 在睡眠与唤醒时自动控制也可以手动选择。用户需要提前配置寄存器当芯片处于 sleep 状态时可配置 VDDA 或 VBAT 作为电源输入。核心寄存器语义如下寄存器/字段作用PMU_HP_SLEEP_VDDBAT_MODE选择 HP_SLEEP 状态时的供电电源。0VDDA 供电1VBAT 供电2自动选择PMU_VDDBAT_SW_UPDATE置 1 使PMU_VDDBAT_CFG_REG寄存器配置生效PMU_LP_ANA_WAIT_TARGET设置唤醒过程中的 delay 时间时间长度应大于 VDDA 外部电源的上电稳定时间说明当前 ESP-IDF 尚未完整支持 PMU 驱动。若需测试 VBAT 功能请按下述测试过程在 ESP-IDF 中添加必要的代码。测试准备在 ESP-IDF 中添加头文件第一步在 ESP-IDF 的components/esp_hw_support/port/esp32p4/pmu_sleep.c中添加必要的头文件#include soc/pmu_reg.h #include soc/lp_analog_peri_reg.h #include soc/lp_gpio_struct.h #include esp_private/regi2c_ctrl.h #include soc/lp_analog_peri_reg.h #include soc/lp_analog_peri_struct.h #include esp_private/regi2c_ctrl.h #include soc/regi2c_bias.h方式一VDDA 与 VBAT 自动切换在components/esp_hw_support/port/esp32p4/pmu_sleep.c的pmu_sleep_start函数中pmu_ll_hp_set_sleep_enable(PMU_instance()-hal-dev);上方添加如下代码让 PMU 在睡眠时自动选择供电电源#define VBAT_MODE_VDDA 0 #define VBAT_MODE_VBAT 1 #define VBAT_MODE_AUTO 2 REG_SET_FIELD(PMU_HP_SLEEP_LP_DIG_POWER_REG, PMU_HP_SLEEP_VDDBAT_MODE, VBAT_MODE_AUTO); REG_SET_BIT(PMU_VDDBAT_CFG_REG, PMU_VDDBAT_SW_UPDATE); while(VBAT_MODE_AUTO ! REG_GET_FIELD(PMU_VDDBAT_CFG_REG, PMU_ANA_VDDBAT_MODE));关键点在于先写入电源模式字段再置位PMU_VDDBAT_SW_UPDATE使配置生效最后通过轮询PMU_ANA_VDDBAT_MODE确认切换完成——这是典型的写-使能-确认寄存器操作序列。方式二VDDA 与 VBAT 手动设置如果需要精确控制睡眠各阶段的供电来源可以分别配置 HP_SLEEP 与 LP_SLEEP 状态的电源并同时设置唤醒延迟#define VBAT_MODE_VDDA 0 #define VBAT_MODE_VBAT 1 #define VBAT_MODE_AUTO 2 REG_SET_FIELD(PMU_HP_SLEEP_LP_DIG_POWER_REG, PMU_HP_SLEEP_VDDBAT_MODE, VBAT_MODE_VDDA); REG_SET_BIT(PMU_VDDBAT_CFG_REG, PMU_VDDBAT_SW_UPDATE); while(VBAT_MODE_VDDA ! REG_GET_FIELD(PMU_VDDBAT_CFG_REG, PMU_ANA_VDDBAT_MODE)); REG_SET_FIELD(PMU_LP_SLEEP_LP_DIG_POWER_REG, PMU_LP_SLEEP_VDDBAT_MODE, VBAT_MODE_VBAT); REG_SET_FIELD(PMU_SLP_WAKEUP_CNTL5_REG, PMU_LP_ANA_WAIT_TARGET, 0xFF);该方式下HP 域睡眠仍由 VDDA 供电便于保留更多功能而 LP 域切换至 VBATPMU_LP_ANA_WAIT_TARGET被设为0xFF为唤醒时的 VDDA 上电预留稳定时间。实测数据经过测试deep sleep 下的 VBAT 平均电流为7 µAlight sleep 下的 VBAT 平均电流为21 µA。备用电池运行时间以最常见的 CR2032 纽扣电池225 mAh为例按 deep sleep 下 7 µA 平均电流估算225 mAh ÷ 7 µA ≈ 32143 h ≈ 3.669 年。这意味着仅靠一颗纽扣电池设备就可以在断电状态下维持近 4 年的 RTC 计时这也是该方案在智能电表、温控器、安防报警器等场景中的核心价值。欠压检测器与 BOD FilterESP32-P4 的欠压检测器支持检测 VDDA 与 VBAT 的电压在电压快速下落至预设阈值以下时触发信号并进行相应的处理。BOD filter欠压滤波电路用于滤除短暂电压毛刺避免误触发。阈值配置与电压关系阈值配置值与对应比较电压如下表所示VDDA、VBAT 检测共用该映射阈值配置电压02.52V12.57V22.63V32.68V42.74V52.78V62.83V72.89V欠压标志位检测测试代码新建测试工程添加如下代码检测欠压标志位。其中I2C_BIAS_OR_DREFL_*与I2C_BIAS_OR_DREFH_*分别设置比较器窗口的下限与上限本例为 2.83V ~ 2.89VBOD filter 的时间阈值以 20MHz cycle 为单位REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_DREFL_VDDA, 6); // Vdda 比较器电压阈值设置 2.83 REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_DREFH_VDDA, 7); // Vdda 比较器电压阈值设置 2.89 REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_DREFL_VBAT, 6); // Vbat 比较器电压阈值设置 2.83 REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_DREFH_VBAT, 7); // Vbat 比较器电压阈值设置 2.89 REG_SET_FIELD(LP_ANALOG_PERI_VDDBAT_CHARGE_CNTL_REG, LP_ANALOG_PERI_VDDBAT_CHARGE_UNDERVOLTAGE_TARGET, 20); // 设置bod filter的时间阈值单位20MHz cycle REG_SET_FIELD(LP_ANALOG_PERI_VDDBAT_CHARGE_CNTL_REG, LP_ANALOG_PERI_VDDBAT_CHARGE_UPVOLTAGE_TARGET, 10); // 设置bod filter的时间阈值单位20MHz cycle REG_SET_BIT(LP_ANALOG_PERI_VDDBAT_CHARGE_CNTL_REG, LP_ANALOG_PERI_VDDBAT_CHARGE_CNT_CLR); esp_rom_delay_us(30); REG_CLR_BIT(LP_ANALOG_PERI_VDDBAT_CHARGE_CNTL_REG, LP_ANALOG_PERI_VDDBAT_CHARGE_CNT_CLR); while (1) { printf(value:%lx\n, REG_READ(LP_ANALOG_PERI_VDD_SOURCE_CNTL_REG)); REG_WRITE(LP_ANALOG_PERI_VDD_SOURCE_CNTL_REG, 0X30020000); // 清空VBAT欠压标志位 REG_WRITE(LP_ANALOG_PERI_VDD_SOURCE_CNTL_REG, 0X30040000); // 清空VDDA欠压标志位 vTaskDelay(500 / portTICK_PERIOD_MS); }测试流程的要点通过I2C_BIASregi2c 总线上的偏置模拟寄存器配置 VDDA/VBAT 比较器阈值用LP_ANALOG_PERI_VDDBAT_CHARGE_CNTL_REG配置滤波时间并先置位再清除计数清除位以复位滤波器随后在循环中读取LP_ANALOG_PERI_VDD_SOURCE_CNTL_REG观察欠压标志并以固定写值清除标志位实现周期性监控。电池充电电路当选择可充电电池作为 VBAT 电源输入时芯片支持检测电池电压并在电压低于设定阈值时通过 VDDA 反向给 VBAT 端电池充电。充电检测阈值与电压关系充电检测比较器的阈值映射与欠压检测一致阈值配置电压02.52V12.57V22.63V32.68V42.74V52.78V62.83V72.89V充电标志检测测试代码新建测试工程添加如下代码检测欠压标志位。与纯检测模式相比这里额外配置了I2C_BIAS_OR_DREFL_VBAT_CHARGER/I2C_BIAS_OR_DREFH_VBAT_CHARGER充电检测比较器并通过I2C_BIAS_OR_FORCE_PU_VBAT_CHARGER强制其上电REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_DREFL_VDDA, 6); // Vdda 比较器电压阈值设置 2.83 REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_DREFH_VDDA, 7); // Vdda 比较器电压阈值设置 2.89 REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_DREFL_VBAT, 6); // Vbat 比较器电压阈值设置 2.83 REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_DREFH_VBAT, 7); // Vbat 比较器电压阈值设置 2.89 REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_DREFL_VBAT_CHARGER, 6); // 充电检测比较器的阈值设置应高于 brownout 报警电压 2.83 REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_DREFH_VBAT_CHARGER, 7); // 充电检测比较器的阈值设置应高于 brownout 报警电压 REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_FORCE_PU_VBAT_CHARGER, 1);// vbat_charger 比较器强制上电 REG_SET_FIELD(LP_ANALOG_PERI_VDDBAT_CHARGE_CNTL_REG, LP_ANALOG_PERI_VDDBAT_CHARGE_UNDERVOLTAGE_TARGET, 20); // 设置bod filter的时间阈值单位20MHz cycle REG_SET_FIELD(LP_ANALOG_PERI_VDDBAT_CHARGE_CNTL_REG, LP_ANALOG_PERI_VDDBAT_CHARGE_UPVOLTAGE_TARGET, 10); // 设置bod filter的时间阈值单位20MHz cycle REG_SET_BIT(LP_ANALOG_PERI_VDDBAT_CHARGE_CNTL_REG, LP_ANALOG_PERI_VDDBAT_CHARGE_CNT_CLR); esp_rom_delay_us(30); REG_CLR_BIT(LP_ANALOG_PERI_VDDBAT_CHARGE_CNTL_REG, LP_ANALOG_PERI_VDDBAT_CHARGE_CNT_CLR); while(1) { printf(value:%lx\n, REG_GET_BIT(LP_ANALOG_PERI_VDDBAT_CHARGE_CNTL_REG, LP_ANALOG_PERI_VDDBAT_CHARGE_UNDERVOLTAGE_FLAG)); // 获取 VBAT 管脚充电标志信号 vTaskDelay(500 / portTICK_PERIOD_MS); }使用要点充电检测比较器的阈值应高于 brownout 报警电压避免充电控制与欠压复位逻辑互相干扰BOD filter 的UNDERVOLTAGE_TARGET与UPVOLTAGE_TARGET20MHz cycle 计数的窗口时间决定了电压跌落到什么持续时间算欠压、恢复到什么持续时间算恢复是抑制电池供电抖动误触发充电的关键参数循环中通过LP_ANALOG_PERI_VDDBAT_CHARGE_UNDERVOLTAGE_FLAG读取 VBAT 管脚充电标志即可确认芯片是否判定电池处于欠压状态并触发充电。VBAT 供电场景下的外设支持RTC TIMER 保持计时验证在进入休眠状态切换 VBAT 供电后VDDA 下电后 RTC TIMER 正常计数再次重启后时间显示正常。测试代码如下需配合上文电源切换章节在 ESP-IDF 中添加电源切换代码time_t now; char strftime_buf[64]; struct tm timeinfo; time(now); localtime_r(now, timeinfo); strftime(strftime_buf, sizeof(strftime_buf), %c, timeinfo); printf( The current date/time is: %s\n, strftime_buf); const gpio_config_t config { .pin_bit_mask BIT(GPIO_NUM_0), .mode GPIO_MODE_INPUT, }; ESP_ERROR_CHECK(gpio_config(config)); esp_deep_sleep_enable_gpio_wakeup(BIT(GPIO_NUM_0), 0); esp_deep_sleep_start();验证方法说明测试过程在 VDDA 下电后等待了一段时间再重新上电并使用 GPIO0 唤醒 ESP32-P4对比休眠前后的时间变化。若 RTC TIMER 在 VBAT 供电下持续计数唤醒后打印的strftime_buf应与休眠前的时间连续衔接从而证明掉电计时功能正常。这也是该方案最直观、最重要的验收标准。LP GPIO / ADC / UART 外设在 VBAT 供电的低功耗场景下LP低功耗外设的可用性是方案完整性的重要一环。当前 GPIO/ADC/UART 的测试已支持 ESP32-P4可参考 ESP-IDF 中examples/system/ulp/lp_core的测试驱动进行测试。作为参考本仓库同样提供了 LP 核心应用的示例位于 examples/ulp/lp_cpu/lp_environment_sensor其中main/lp_core/main.c为 LP 核上运行的传感器采集程序main/lp_environment_sensor.c为 HP 核侧的主控逻辑展示了 HP 核与 LP 核协作完成低功耗数据采集的完整代码组织方式可结合 VBAT 方案设计断电后由电池供电的定时采集计时应用。总结与设计建议综合本文内容在 esp-iot-solution 与 ESP32-P4 上落地备用电池方案时可遵循以下要点电路层面VBAT 直连电池即可无需外部电阻/二极管/去耦电容严禁使用 3.6V 可充电电池充电电流由内部 Rx 限制在 1 mA 以下驱动层面当前需在 ESP-IDF master 分支手动修改pmu_sleep.c添加电源切换代码推荐优先使用自动切换方式并注意PMU_LP_ANA_WAIT_TARGET要大于 VDDA 上电稳定时间阈值层面欠压检测与充电检测的阈值均在 2.52V ~ 2.89V 之间按 8 级配置充电比较器阈值应高于 brownout 报警电压BOD filter 时间参数决定抗抖能力验收层面以 deep sleep 7 µA / light sleep 21 µA 的 VBAT 电流为基准做功耗核算用 RTC TIMER 跨掉电计时实验与 LP 外设测试作为功能验收标准。关于更广泛的 ESP32 低功耗背景Deep-sleep 唤醒源、ULP 协处理器、Touchpad 唤醒等可参阅本仓库 低功耗方案总览文档本方案的英文版原文见 ESP32-P4 Battery Backup Solution。【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表