4、电源拓扑设计:系统供电架构
各位同学,咱们今天聊聊药盒的电源拓扑。说实话,这块内容我当年刚入行时也踩过不少坑。电源拓扑选得好不好,直接决定了你的药盒能撑多久——是三天一充还是三周一充,差别就在这儿。
4.1 单电池 vs 双电池架构
先说说最基础的选择:用一块电池还是两块?
单电池方案,说白了就是所有电路共用一颗电池。我早期做的一个便携式血氧仪就用的单电池,3.7V锂电池直接供电。优点是简单、成本低、体积小。但问题也很明显——电机一启动,屏幕就闪,MCU偶尔还会复位。为什么?因为电机启动瞬间电流能到500mA,电池电压会被拉低到3.0V以下,MCU直接掉电重启。
双电池方案呢,我建议这么分:一颗大容量电池(比如2000mAh)专门给电机、加热器这些大功率器件;另一颗小电池(比如300mAh)专供MCU、蓝牙、RTC这些核心逻辑。两路独立,互不干扰。
我个人习惯,如果药盒有电机或加热功能,优先考虑双电池。你想想看,用户半夜被闹钟叫醒吃药,结果电机一响MCU挂了,药没出来——这体验得多糟糕。
我的经验总结:
- 纯电子药盒(无电机、无加热):单电池足够
- 带电机分药、带加热功能:双电池更稳妥
- 成本敏感型产品:单电池+大电容缓冲
4.2 电源轨分配
确定了电池方案,接下来就是电源轨分配。嗯,这里要注意,不同模块对电压和纹波的要求完全不同。
我一般把电源轨分成三类:
| 电源轨 | 电压 | 供电对象 | 纹波要求 |
|---|---|---|---|
| 核心轨 | 3.3V / 1.8V | MCU、蓝牙、传感器 | <50mV |
| 驱动轨 | 5V / 6V | 步进电机、电磁阀 | <200mV |
| 模拟轨 | 3.3V(低噪声) | ADC、运放、触摸检测 | <10mV |
我在一个项目中遇到过这样的问题:触摸按键在电机工作时误触发。查了半天,发现是电机轨的噪声串到了模拟轨。后来加了独立的LDO给模拟部分供电,问题就解决了。说白了,电源轨之间要做好隔离,别让大功率器件的噪声污染了敏感电路。
小技巧:模拟轨和数字轨之间用磁珠+电容做π型滤波,效果比单纯用电容好得多。我习惯用600Ω@100MHz的磁珠,搭配10μF+0.1μF电容。
4.3 上电时序控制
上电时序这事儿,很多人觉得无所谓——不就是通电嘛,能有多大事?
我曾经吃过一次亏。一个药盒项目,MCU和蓝牙模块共用3.3V,但蓝牙模块的使能脚接在MCU的GPIO上。结果每次上电,蓝牙模块先于MCU初始化完成,而MCU的GPIO默认是高阻态,蓝牙模块的使能脚悬空,导致蓝牙随机进入错误模式。用户反映手机连不上药盒,查了三天才找到原因。
所以,上电时序的核心原则是:先给核心控制器供电,再给外围模块供电。
具体实现方式,我常用这几种:
- RC延时电路:简单便宜,但精度差。适合对时序要求不严的场景。
- 电源管理IC的使能引脚:用MCU的GPIO控制各路LDO/DCDC的EN脚,软件可控,灵活度高。
- 专用电源时序芯片:比如TPS22918这类负载开关,自带可调延时。我建议多路电源时用这个,省心。
// 上电时序控制示例(伪代码)
void power_on_sequence(void) {
// 第一步:开启核心3.3V
enable_core_3v3();
delay_ms(10); // 等待MCU启动
// 第二步:开启蓝牙1.8V
enable_ble_1v8();
delay_ms(5);
// 第三步:使能蓝牙模块
gpio_set_ble_enable(HIGH);
delay_ms(20); // 等待蓝牙初始化
// 第四步:开启电机驱动5V
enable_motor_5v();
// 第五步:开启模拟3.3V(最后上电,避免噪声)
enable_analog_3v3();
}
注意:上电时序的延时不要用纯软件循环delay,尤其是低功耗场景。我建议用硬件定时器或者RTC闹钟来触发,否则休眠唤醒时容易出问题。
4.4 低功耗休眠与唤醒电路
药盒大部分时间都在待机,所以休眠功耗是续航的关键。我见过一些产品,休眠电流做到10μA以下,电池能用半年。也见过一些产品,休眠电流50μA,一个月就没电了。
休眠电路设计要点:
- 切断不必要的外设电源:用MOS管或负载开关,在休眠时彻底断开电机、显示屏、蓝牙模块的供电。别只靠软件关断,漏电流会吃掉你的电池。
- 保留RTC和唤醒逻辑的供电:RTC需要一直跑,功耗通常在1μA左右。唤醒逻辑(比如按键检测、闹钟触发)也要保持供电。
- MCU进入深度睡眠:选择支持Standby或Shutdown模式的MCU,休眠电流可以做到1μA以下。我习惯用STM32L0系列,休眠功耗约0.5μA。
唤醒电路设计:
唤醒方式主要有三种:
- 按键唤醒:用外部中断引脚,按键按下时产生上升沿或下降沿。注意做去抖处理,否则一次按键可能触发多次唤醒。
- 定时唤醒:RTC闹钟输出一个脉冲,直接连到MCU的唤醒引脚。我建议闹钟提前10秒唤醒,给系统留足启动时间,别等到吃药时间到了才开机。
- 外部事件唤醒:比如药盒被打开、药仓被触碰。用霍尔传感器或电容触摸,输出信号触发中断。
// 休眠唤醒示例(基于STM32L0)
void enter_sleep_mode(void) {
// 关闭外设电源
HAL_GPIO_WritePin(MOTOR_EN_GPIO_Port, MOTOR_EN_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(DISPLAY_EN_GPIO_Port, DISPLAY_EN_Pin, GPIO_PIN_RESET);
// 配置唤醒源:RTC闹钟 + 按键
HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 10, RTC_WAKEUPCLOCK_CK_SPRE_16); // 10秒后唤醒
// 进入Stop模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
// 唤醒后恢复时钟
SystemClock_Config();
// 重新使能外设电源
HAL_GPIO_WritePin(MOTOR_EN_GPIO_Port, MOTOR_EN_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(DISPLAY_EN_GPIO_Port, DISPLAY_EN_Pin, GPIO_PIN_SET);
}
避坑指南:我曾经在休眠电路上犯过一个低级错误——唤醒引脚没有做上拉或下拉。结果MCU进入休眠后,引脚浮空,噪声信号不断触发唤醒,电池两天就耗光了。后来我在每个唤醒引脚上都加了10kΩ电阻,要么上拉到VDD,要么下拉到GND,问题才解决。
好了,关于电源拓扑设计,核心就是这四点:电池架构选型、电源轨分配、上电时序控制、休眠唤醒电路。你想想看,把这些都做好了,药盒的续航能力基本就稳了。下一节咱们聊聊电池充电管理,那又是另一个有意思的话题。