在 Phase 3 的基础上增加 低功耗优化 功能,实现动态电源管理。
enum power_state {
POWER_STATE_ACTIVE, /* 全速运行,所有外设开启 */
POWER_STATE_IDLE, /* CPU 空闲,外设开启 */
POWER_STATE_SLEEP, /* CPU 睡眠,部分外设关闭 */
POWER_STATE_LOW_POWER, /* 最小外设,低速时钟 */
};
┌─────────────────────────────────────────────────────────┐
│ ACTIVE (活动) │
│ ↓ 5秒无活动 │
│ IDLE (空闲) │
│ ↓ 10秒无活动 │
│ LOW_POWER (低功耗) │
│ ↑ 有活动 │
│ ACTIVE │
└─────────────────────────────────────────────────────────┘
| 状态 | 电流消耗 | 说明 |
|---|---|---|
| ACTIVE | ~10mA | 128MHz 全速运行 |
| IDLE | ~5mA | CPU 空闲 |
| SLEEP | ~2mA | CPU 睡眠 |
| LOW_POWER | ~0.5mA | 最小功耗模式 |
float power_manager_get_average_current(void)
{
float active_ratio = (float)(total_time - low_power_time) / total_time;
float low_power_ratio = (float)low_power_time / total_time;
return (active_ratio * 10.0f) + (low_power_ratio * 0.5f);
}
/* 低功耗模式下降低 CPU 频率 */
config.low_clock_freq_hz = 16000000; /* 16 MHz */
/* BLE 连接时不进入低功耗模式 */
if (ble_service_is_connected()) {
power_manager_report_activity(); /* 保持活动状态 */
}
/* 采样完成后报告活动 */
power_manager_report_activity();
/* 采样间隙进入低功耗 */
k_sleep(K_MSEC(MAIN_LOOP_INTERVAL_MS));
[INF] Power Stats: Total=30s, LowPower=20s (66.7%), Avg=3.83mA
平均电流 = (活动时间 × 活动电流 + 低功耗时间 × 低功耗电流) / 总时间
= (10s × 10mA + 20s × 0.5mA) / 30s
= 3.67mA
# 电源管理
CONFIG_PM=y
CONFIG_PM_DEVICE=y
struct power_config cfg = {
.active_timeout_ms = 5000, /* 5秒后进入空闲 */
.idle_timeout_ms = 10000, /* 10秒后进入低功耗 */
.enable_dynamic_clock = true, /* 启用动态调频 */
};
power_manager_configure(&cfg);
multi_sensor_project/
├── CMakeLists.txt
├── prj.conf
├── README.md
├── boards/
│ └── nrf54l15dk_nrf54l15_cpuapp.overlay
└── src/
├── main.c
├── sensor/
│ ├── adc_sensor.c/h
│ └── i2c_sensor.c/h
├── control/
│ └── pwm_fan.c/h
├── communication/
│ ├── uart_log.c/h
│ └── ble_service.c/h
└── utils/
└── power_manager.c/h
| Phase | 功能 | 外设数 | 复杂度 |
|---|---|---|---|
| Phase 1 | ADC + I2C + UART | 3 | 低 |
| Phase 2 | PWM 风扇控制 | 4 | 中 |
| Phase 3 | BLE NUS 集成 | 5 | 高 |
| Phase 4 | 低功耗优化 | 5+PM | 最高 |
小白 🤖 2026-03-14