# 软开关机电路设计方案(长按 2 秒开机 + 自动关机) > 适用于 MotherCup 整机:电池供电,按键软开关,防误触开机,无操作自动断电。 --- ## 1. 需求 | 项 | 要求 | |---|---| | 开机 | **长按按键 2 秒**才开机(防误触,短按不开机) | | 关机 | **自动关机**:无操作超时后自动断电(固件定时,超时值可配) | | 掉电后 | 整机彻底断电(VSYS=0),待机电流仅 P-MOS 漏电流(<1µA 级) | --- ## 2. 电路设计 ``` VBAT(电池 3.0~4.2V) │ │ S Q1 ─────┤ P-MOS (AO3401) │ D ├─────────────────────── VSYS(整机电源,去 LDO/升压/制冷片) │ G(栅极节点 G) │ R2 100K ─────────┼────┬──────────────────┬─────────────────────┐ (接 VBAT) │ │ │ │ │ │D │D │ │ Q2(N-MOS 2N7002) Q3(N-MOS 2N7002) │ │ │G │G │ │ │ │ │ │ ├─ R3 10K ─┐ ├── C1 3.3µF ── GND │ │ │ │ │ │ │ ├─ R5 100K ┴ GND ├── R4 10M ── GND │ │ │ (PWR_HOLD 下拉,MCU 掉电时确保 Q2 关) │ │ │ │ │ │ └──── PWR_HOLD (MCU 输出) │ │ R1 1M │ │ │ │ │ SW1 ──── VBAT │ │ │ │ │ (可选) KEY_DET (MCU 输入) │ │ Q2/Q3 源极 ── GND Q2/Q3 源极 ── GND ``` > 说明:Q2 的漏极与 Q3 的漏极都并到栅极节点 G,任一路导通都能把 Q1 栅极拉低。 --- ## 3. 工作原理 ### 3.1 开机(长按 2 秒) 1. 初始:`PWR_HOLD` 悬空(MCU 未上电),R5 把 Q2 栅极拉低 → Q2 关断; R2 把 Q1 栅极拉高到 VBAT → Q1 关断 → VSYS=0,整机断电。 2. 按住 SW1:VBAT 经 SW1 → R1 给 C1 充电(τ = R1×C1 ≈ 3.3s)。 3. 约 **2.1 秒**后 C1 电压达到 Q3(2N7002) 阈值(~2V) → Q3 导通 → 拉低 Q1 栅极 → Q1 导通 → VSYS 得电。 4. MCU 上电启动,**第一时间置 `PWR_HOLD=高`** → Q2 导通 → 持续拉低 Q1 栅极(锁存开机)。 5. 松开 SW1:C1 经 R4 缓慢泄放,Q3 逐渐关断,但 Q2 已锁存,不影响供电。 6. 若按的时间不足 2 秒就松手:C1 没充到阈值,Q3 不导通,Q1 不开机(防误触)。 ### 3.2 自动关机 1. MCU 运行中检测「无操作」超时(BLE 无指令 / 按键无动作,超时值可配,见 §6)。 2. 超时到 → 置 `PWR_HOLD=低` → Q2 关断 → R2 把 Q1 栅极拉高 → Q1 关断 → VSYS=0 → 整机断电。 --- ## 4. 器件清单(BOM) | 位号 | 器件 | 参数/型号 | 封装 | 数量 | 说明 | |---|---|---|---|---|---| | Q1 | P-MOSFET | AO3401(-30V/-4A,低压开启) | SOT23 | 1 | 高边主开关 | | Q2 | N-MOSFET | 2N7002(Vth≈2V) | SOT23 | 1 | PWR_HOLD 锁存 | | Q3 | N-MOSFET | 2N7002(Vth≈2V) | SOT23 | 1 | 长按开机触发 | | R1 | 电阻 | 1MΩ ±5% | 0402 | 1 | C1 充电电阻(定 2s 延时) | | R2 | 电阻 | 100KΩ | 0402 | 1 | Q1 栅极上拉(默认关机) | | R3 | 电阻 | 10KΩ | 0402 | 1 | PWR_HOLD → Q2 栅极 | | R4 | 电阻 | 10MΩ | 0402 | 1 | C1 泄放 | | R5 | 电阻 | 100KΩ | 0402 | 1 | Q2 栅极下拉(MCU 掉电时确保 Q2 关) | | C1 | 电容 | 3.3µF / 10V X7R | 0603 | 1 | 延时电容 | | SW1 | 轻触按键 | 6×6 侧按/顶按 | — | 1 | 电源键 | | (可选) D1 | 二极管 | BAT54 | SOT23 | 1 | 如 KEY_DET 需隔离时用 | --- ## 5. RC 延时计算 - 充电:`Vc(t) = VBAT × (1 − e^(−t/RC))`,RC = R1×C1 = 1M×3.3µF = 3.3s。 - 2N7002 阈值约 2V,取 VBAT=4.2V:到达 2V 的时间 `t = −RC·ln(1 − 2/4.2) = −3.3·ln(0.524) ≈ 2.13s` ✓(约 2 秒)。 - 若需更精确 2.0s,可调 R1=910K 或 C1=3.0µF;**最终以实测为准微调 R1/C1**。 --- ## 6. 固件配合 ### 6.1 GPIO | 引脚 | 方向 | 说明 | |---|---|---| | `PWR_HOLD` | 输出 | **`main()` 最开头就置高**(先于 banner/初始化),锁存开机;自动关机时置低 | | `KEY_DET`(可选) | 输入 | 接 C1 节点/按键节点,运行中检测按键,用于复位自动关机定时器 | > 注意:`PWR_HOLD` 必须在 MCU 复位后**立即**拉高,否则用户一松键就掉电。 ### 6.2 自动关机定时(伪代码) ```c // 空闲超时值(可做成 APP_DATA 参数,appset 配置) #define AUTO_OFF_TIMEOUT_MS 120000 /* 默认 2 分钟,可配 */ void activity_heartbeat(void) { // 任何活动(BLE 指令/按键)都调 s_last_activity = xTaskGetTickCount(); } // 在某个常驻任务里(如 BLE 调度任务)周期性检查: if ((xTaskGetTickCount() - s_last_activity) >= pdMS_TO_TICKS(AUTO_OFF_TIMEOUT_MS)) { display_set(0, DISP_TYPE_CELSIUS, DISP_BASE_DECIMAL); // 可先清屏/提示 vTaskDelay(pdMS_TO_TICKS(500)); PWR_HOLD_LOW(); // 断电 for(;;) {} // 等电源跌落 } ``` --- ## 7. 注意事项 1. **开机时序**:`PWR_HOLD` 必须在 MCU 启动后立即置高,且 R5 保证 MCU 掉电时 Q2 可靠关断。 2. **C1 泄放**:R4 取 10M 时泄放 τ≈33s;若担心「短按后快速再长按」会把上次残余电荷算进去,可把 R4 调小(如 4.7M)或加受控泄放。 3. **待机功耗**:关机时只有 R2(100K→VBAT) 与 P-MOS 漏电流,约 0.04µA + 漏电流,可满足低待机要求。 4. **VBAT 下限**:Q3(2N7002) 阈值 2V,电池低到 ~2.5V 时 C1 充不到阈值会导致开不了机;若需支持更低电压,换低压开启的 N-MOS(如 SI2302,Vth<1V)并重算 RC。 5. **栅极保护**:Q1 栅极如需加 TVS/钳位(防静电/浪涌),可在 G 节点对 VBAT 加 4.7~6.8V 稳压管(可选)。 --- ## 8. 待确认 1. **自动关机超时值**:本文默认 2 分钟(`AUTO_OFF_TIMEOUT_MS`),你之前写的是「2 秒」——请确认用多少。 2. 是否需要 **KEY_DET**(按键复位自动关机定时 / 手动关机)。 3. 电池最低电压(决定 Q3 选型与 RC 是否需重算)。