低功耗的重要性
对于电池供电的IoT设备,功耗决定产品命运:
- 续航长 = 用户体验好
- 续航长 = 维护成本低
功耗构成
`
总功耗 = 静态功耗 + 动态功耗
静态功耗:
- 深度睡眠电流
- 漏电流
- 待机功耗
动态功耗:
- 发射功耗 (峰值)
- 接收功耗
- 数据处理功耗
`
功耗模式
1. 活跃模式(Active)
`c
// 全速运行,处理数据
// 功耗: mA级
void active_mode() {
// 收发数据
// 处理业务
}
`
2. 低功耗模式(Sleep)
`c
// 部分外设休眠
// 功耗: μA级
void sleep_mode() {
// 关闭不必要外设
// 保留中断唤醒
}
`
3. 深度睡眠(Deep Sleep)
`c
// 仅RTC运行
// 功耗: nA~μA级
void deep_sleep() {
// 关闭所有外设
// 仅RTC/按键唤醒
}
`
4. 关机(Shutdown)
`c
// 最低功耗
// 功耗: nA级
void shutdown() {
// 彻底关闭
// 只能通过硬件复位唤醒
}
`
各芯片功耗对比
| 芯片 | 活跃 | 睡眠 | 深度睡眠 |
|---|---|---|---|
| ------ | ------ | ------ | ---------- |
| nRF52832 | 6mA | 2μA | 0.6μA |
| nRF52840 | 7mA | 2μA | 1μA |
| CC2640 | 6mA | 1.5μA | 1μA |
| DA14580 | 4mA | 1μA | 0.5μA |
| ESP32 | 80mA | 0.8mA | 10μA |
低功耗设计策略
1. 合理选择休眠模式
`c
// 传感器上报场景
void loop() {
// 唤醒
wake_up();
// 采集数据
sensor_read();
// 发送数据
ble_send();
// 立即休眠
enter_deep_sleep();
}
`
2. 优化广播策略
广播功耗公式:
`
平均功耗 = 峰值电流 × 广播占比
广播占比 = 广播时长 / 广播间隔
`
优化方法:
`c
// 延长广播间隔
// 1000ms → 5000ms
adv_params.adv_interval = 5000;
// 降低发射功率
// 0dBm → -20dBm
adv_params.tx_power = -20;
// 非必要不广播
// 改为按需广播
if (need_to_connect) {
start_advertising();
}
`
3. 缩短连接时间
`c
// 快速连接参数
conn_params.min_conn_interval = 20; // 20ms
conn_params.max_conn_interval = 40; // 40ms
conn_params.slave_latency = 99; // 跳过99个间隔
conn_params.supervision_timeout = 500; // 500ms超时
`
4. 优化数据交互
批量发送:
`c
// 不要频繁发送
// 错误: 每秒发送一次
// 正确: 收集10秒后一次发送
`
数据压缩:
`c
// 减少传输数据量
// 压缩后再发送
compress_data(sensor_data);
`
5. 关闭不必要外设
`c
// 进入深度睡眠前关闭所有外设
void prepare_sleep() {
// 关闭ADC
ADC_Disable();
// 关闭定时器
TIM_Cmd(TIM2, DISABLE);
// 关闭I2C
I2C_Cmd(I2C1, DISABLE);
// 关闭SPI
SPI_Cmd(SPI1, DISABLE);
}
`
硬件低功耗设计
1. 电源设计
`
电池 ──┬──► LDO ──► 模块
│
└──► 分压电路 ──► ADC(检测电池电量)
`
建议:
- 使用低静态电流LDO
- 添加电源开关
- 合理滤波
2. 晶振选择
| 晶振 | 功耗 | 精度 |
|---|---|---|
| 32KHz RTC | nA级 | 一般 |
| 16MHz 主晶振 | μA级 | 高 |
建议:使用32K晶振作为休眠时钟
3. GPIO处理
`c
// 所有未使用GPIO配置为低功耗模式
void config_unused_gpio() {
// 设置为输入+下拉
for (int i = 0; i < 16; i++) {
if (!used_gpio[i]) {
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin = (1 << i);
GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
GPIO_InitStructure.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
}
}
}
`
功耗计算示例
场景:智能门锁
配置:
- 每天唤醒10次
- 每次工作2秒
- 电池2000mAh
计算:
`
工作电流: 10mA
工作时间: 10 × 2s = 20s/天
睡眠电流: 5μA
睡眠时间: 86400 - 20 = 86380s
日均功耗:
= (10mA × 20) + (5μA × 86380)
= 200mAs + 431.9mAs
= 631.9mAs
= 0.175mAh
续航时间:
= 2000mAh / 0.175mAh
= 11428天 ≈ 31年
`
实测技巧
1. 电流监测
`c
// 使用精密电流表
// 串联在电源线中
// 示波器观察电流波形
`
2. 功耗分析
`c
// 开启功耗统计
power_profile_enable();
// 打印功耗报告
print_power_stats();
`
3. 休眠测试
`c
// 测试各模式电流
void test_sleep_modes() {
// 测试深度睡眠
enter_deep_sleep();
assert(current < 10uA);
// 测试浅睡眠
enter_sleep();
assert(current < 100uA);
}
`
总结
蓝牙低功耗设计要点:
1. 选对芯片:nRF52832/DA14580超低功耗
2. 合理休眠:深度睡眠+快速唤醒
3. 优化广播:延长间隔+降低功率
4. 关闭外设:不用的都关掉
5. 硬件配合:低功耗元件
*低功耗设计问题?评论区聊!*