在低功耗应用(如电池供电、无线传感等)中,灵动MCU(例如 MM32L系列)可通过“定时器唤醒 + 快速ADC采样 + 自动回休眠”的策略,实现高效、节能的电压周期性监测。这是一种常见的“唤醒–测量–休眠”闭环设计,非常适合电池电压监测、环境监测等间歇性任务。
实现目标
MCU处于Sleep/Stop模式时定时被唤醒,进行一次快速电压采样(通过ADC),判断是否低电压或异常,然后立即回到低功耗状态。
一、核心思路流程
diff
复制
编辑
+------------------------+
| MCU处于Sleep/Stop模式 |
+------------------------+
↑
| (RTC / TIM 唤醒)
+------------------------+
| 唤醒 -> 启动ADC采样 |
| -> 电压判断/控制输出 |
| -> 无异常 → 回休眠 |
+------------------------+
二、关键模块配置
1. 低功耗定时器唤醒
可选唤醒源:
RTC定时器(推荐)适用于秒级~分钟级周期唤醒,耗电极低;
低功耗定时器 LPTIM / TIMx,精度高,适合ms级周期;
外部中断唤醒(如IO事件)也可结合使用。
配置示例(RTC周期唤醒):
c
复制
编辑
// 配置RTC为每60秒唤醒一次
RTC_SetWakeup(60);
EnableWakeupInterrupt();
2. ADC快速采样配置
建议:
设置ADC为单次模式(Single Conversion)
采样时间设为较短(但满足输入阻抗要求)
可结合DMA自动采样并立即处理
c
复制
编辑
ADC_InitStructure.Mode = ADC_Mode_Single;
ADC_InitStructure.SamplingTime = ADC_SampleTime_7_5Cycles;
ADC_Init(&ADC_InitStructure);
ADC_StartConversion();
while (!ADC_ConversionComplete()); // 等待完成
uint16_t result = ADC_GetResult();
3. 电压判断 + 控制逻辑
根据阈值判断电压是否低于警戒值;
触发动作(如拉低GPIO关负载、上报状态等);
c
复制
编辑
if (voltage < LOW_VOLTAGE_THRESHOLD) {
GPIO_ResetBits(GPIOx, LOAD_EN);
flag_low_power = true;
}
4. 进入低功耗模式
在完成采样和判断后,调用休眠函数返回低功耗模式。
c
复制
编辑
if (!flag_low_power) {
// 进入低功耗休眠
PWR_EnterStopMode();
}
三、功耗优化技巧
项目 优化建议
ADC工作时间 使用最快采样时间(7.5~15 cycles),采样后立即关闭
唤醒方式 RTC最低功耗,LPTIM也可选
IO配置 所有不使用的IO配置为模拟/下拉
内部参考 若使用VREFINT,应提前启用并延迟采样,避免前期不稳定
Flash wait state 降频/降压运行以降低工作功耗
示例:周期唤醒采样逻辑伪代码
c
复制
编辑
void RTC_Wakeup_Handler(void) {
SystemInit(); // 恢复时钟
ADC_Enable();
float v_bat = read_battery_voltage();
if (v_bat < 3.5) {
GPIO_ResetBits(GPIOx, LOAD_EN); // 欠压关闭负载
}
ADC_Disable();
PWR_EnterStopMode(); // 回低功耗
}
四、闭环电压监测系统设计概览
模块 实现方式
唤醒控制 RTC/LPTIM定时触发
电压测量 快速ADC采样,单次模式
电压判断 阈值+迟滞+滤波(可选)
控制输出 GPIO 控MOS/继电器/上报
低功耗管理 快速入睡,关闭不必要模块
总结
特性 说明
节能高效 唤醒时间短、采样快、功耗低
精度可靠 可结合内部参考(VREFINT)和校准提高准确度
灵活扩展 可并行监测多个通道电压
场景适用 电池电量管理、无线传感节点、电源健康监控等
|