☰
24V供电掉电检测电路设计与软件保存策略实战
2026/10/28 9:17:58 网站建设 项目流程

1. 24V供电掉电检测到底在解决什么问题

1.1 从一次现场故障说起

前年冬天,一个做工业控制器的朋友半夜给我打电话,说他们一批发到现场的板子出了怪事:设备在正常运行时一切正常,但每次车间大功率设备启停、电网闪断一下,MCU就像失忆了一样,参数全部恢复出厂设置,有些板子甚至直接卡死。他一开始怀疑是程序跑飞,加了看门狗,没用;又怀疑是Flash被干扰,换了存储芯片,还是没用。最后把故障板拿回来,用示波器盯着24V电源轨和MCU的3.3V轨看,才发现问题所在——24V掉电的瞬间,MCU的3.3V不是立刻消失,而是跟着输入电源缓慢下滑,在1.8V到2.5V这个区间里,MCU还在“半死不活”地跑,执行了一些乱七八糟的指令,把参数区给擦了。

这个案例非常典型。24V供电掉电检测电路要解决的核心问题就是:当主电源(24V)开始跌落或者断电时,系统必须在MCU还能正常工作的极短时间内,检测到这个事件,然后抢在电源彻底崩溃之前,把关键数据保存到非易失存储器里,或者让MCU进入安全状态。这个“极短时间”通常只有几毫秒到几十毫秒,取决于电源的保持电容和负载电流。

很多人以为掉电检测就是接一个比较器,电压低于某个阈值就触发中断,听起来很简单。但实际做起来,坑非常多:阈值设多少?检测点放在24V侧还是3.3V侧?检测信号是给中断还是给ADC?掉电后MCU靠什么维持供电完成写入?这些问题如果没有想清楚,做出来的电路要么误触发,要么该触发的时候没反应。

1.2 这个电路适合谁看

这篇文章主要面向做工业控制、车载电子、电力仪表、安防设备这类24V供电系统的硬件工程师和嵌入式软件工程师。如果你正在用STM32、GD32、S32K这类MCU做产品,需要实现可靠的掉电保护功能,那这篇内容应该能帮你少走不少弯路。当然,如果你只是好奇24V系统里掉电检测是怎么一回事,也可以看看,我会尽量用大白话把原理讲清楚。

需要提前说明的是,掉电检测不是一个孤立的电路,它和你的电源设计、MCU的BOR(Brown-out Reset)配置、软件的中断处理逻辑是强耦合的。单独看一个比较器电路没有意义,必须放在整个系统的供电架构里来理解。

2. 掉电检测的三种主流方案与选型逻辑

2.1 方案一:电阻分压加比较器,最经典也最容易被做错

这是最常见的方案。用两个电阻把24V分压到一个比较器(比如LM358、LM393、TLV1701)的输入端,另一端接一个基准电压,当24V跌落到某个值时,比较器输出翻转,给MCU一个中断信号。

这个方案看起来简单,但实际设计时有几个关键点:

分压电阻的选择。假设你希望24V跌落到20V时触发检测,比较器基准是2.5V。那么分压比就是2.5/20=1/8。上电阻选100k,下电阻选14.3k(实际用14k或14.7k)。这里要注意,上电阻不能选太大,否则比较器输入偏置电流会在电阻上产生误差;也不能选太小,否则常态下白白消耗功率。100k到200k是比较合适的范围。

比较器基准的来源。可以用TL431产生2.5V基准,也可以用MCU的DAC输出,还可以用一颗低压差稳压器。TL431的精度和温漂都很好,成本也低,是首选。但要注意TL431需要至少1mA的阴极电流才能稳定工作,计算限流电阻时别忘了这一点。

比较器输出是否需要迟滞。24V电源上通常有纹波和噪声,如果比较器没有迟滞,在阈值附近会反复翻转,MCU会收到一串中断。加正反馈形成迟滞是必须的,迟滞窗口一般设100mV到200mV(折算到24V侧就是0.8V到1.6V)。具体计算方法是:在比较器输出和同相输入端之间接一个反馈电阻,根据你想要的迟滞宽度来选值。

输出上拉和电平匹配。LM393是开漏输出,需要上拉电阻。如果MCU是3.3V系统,上拉到3.3V即可。但要注意,如果比较器供电是5V,开漏输出上拉到3.3V是没问题的;如果是推挽输出,就必须做电平转换,否则5V会灌进MCU的IO口。

注意:很多人在调试时发现比较器输出一直在翻转,以为是电源噪声大,其实是迟滞没加或者加得太小。先用示波器看比较器输入端的实际波形,再决定迟滞窗口。

2.2 方案二:ADC采样24V分压,软件判断阈值

这个方案不用比较器,直接把24V分压后送到MCU的ADC引脚,软件定期采样,当采样值低于阈值时判定为掉电。热搜词里提到的“adc采样”“stm32 adc电压采样”“adc采样周期”都指向这个方向。

这个方案的好处是灵活:阈值可以通过软件修改,不需要动硬件;还可以同时监测电源的缓慢变化趋势,实现更复杂的电源管理策略。但缺点也很明显:ADC采样需要时间,软件判断需要时间,如果掉电速度很快,可能来不及反应。另外,ADC的参考电压如果也是从24V降压得来的,那24V掉电时参考电压也跟着掉,采样值就不准了。

所以用ADC方案时,ADC的参考电压必须来自一个独立的、能在掉电后维持一段时间的基准源,比如一颗3.0V的基准芯片,或者用MCU内部的VREF。STM32的内部VREF精度一般,但用于掉电检测足够了。

采样周期的设置也很关键。如果你用定时器触发ADC,采样周期设1ms,那最坏情况下要1ms后才能发现掉电。对于大多数24V系统,电源的保持时间在10ms以上,1ms的检测延迟是可以接受的。但如果你的负载很重,保持电容很小,可能只有2ms的保持时间,那就必须把采样周期缩短到200us以内。

2.3 方案三:专用电源监控芯片,省心但成本高

像MAX809、TPS3808、MCP131这类电源监控芯片,内部集成了基准、比较器和延时电路,输出直接给MCU的复位引脚或中断引脚。你只需要选一个阈值合适的型号,接上就行。

这个方案最省事,精度也最好,但成本比前两个方案高不少。而且阈值是固定的,不能软件调整。如果你的产品对成本敏感,或者需要灵活的阈值配置,这个方案就不太合适。

2.4 三种方案的对比与选择建议

对比项比较器方案ADC方案专用监控芯片
成本低最低高
精度中等取决于基准高
灵活性中等高低
响应速度快(us级)慢(ms级)快(us级)
占用MCU资源一个中断引脚ADC通道+定时器一个复位/中断引脚
适合场景大多数24V系统需要监测电源趋势高可靠性要求

我的建议是:如果你的系统对成本敏感,用比较器方案;如果需要监测电源的缓慢变化或者做电量计量,用ADC方案;如果是安全相关的应用,比如医疗设备或汽车电子,用专用监控芯片。

3. 核心电路细节与参数计算实操

3.1 分压网络的设计与计算

分压网络是掉电检测电路的第一环,它的精度直接影响检测阈值的准确性。假设我们要检测24V跌落到20V±0.5V,比较器基准为2.5V。

分压比计算:2.5V / 20V = 0.125,即1/8。

选择下电阻R2=15k,则上电阻R1 = 15k × (8-1) = 105k,取标准值100k或110k。如果用100k,实际分压比是15/(100+15)=0.1304,对应触发电压是2.5/0.1304=19.17V。如果用110k,分压比是15/125=0.12,触发电压是2.5/0.12=20.83V。可以看到,电阻值的选择会直接影响触发点,所以要用1%精度的电阻,并且计算清楚。

分压网络的功耗:24V / (100k+15k) = 0.209mA,功耗约5mW。这个功耗在24V系统里可以忽略不计。

分压点的滤波电容:在R2两端并联一个0.1uF的电容,可以滤掉高频噪声,防止比较器误触发。但电容不能太大,否则会延迟掉电检测的响应时间。0.1uF配合100k的电阻,时间常数是10ms,对于掉电检测来说太慢了。所以实际应该用1nF到10nF的电容,时间常数在0.1ms到1ms之间。

提示:分压电阻的温漂会影响检测阈值。如果产品工作在宽温环境(-40到85度),建议选用低温漂的电阻,或者用两颗电阻串联来分摊温漂。

3.2 比较器电路的设计要点

以LM358为例,它是双运放,可以当比较器用,但性能不如专用比较器LM393。LM358的响应时间在us级,对于掉电检测足够了。但LM358的输出是推挽的,不能直接线与,如果需要多个检测信号汇总,就要用LM393这样的开漏输出比较器。

比较器的同相输入端接分压网络,反相输入端接2.5V基准。当24V正常时,同相输入端电压高于2.5V,输出高电平;当24V跌落到20V以下时,同相输入端低于2.5V,输出翻转为低电平。MCU配置为下降沿触发中断。

迟滞电阻的计算:假设我们想要100mV的迟滞(折算到比较器输入端)。在输出和同相输入端之间接一个反馈电阻Rf。当输出为高时,Rf与R1并联,等效上电阻变小,分压比变大,触发点升高;当输出为低时,Rf与R2并联,等效下电阻变小,分压比变小,触发点降低。两个触发点之间的差值就是迟滞宽度。

具体计算比较复杂,我一般用仿真的方式来确定Rf的值。在LTspice里搭一个电路,扫描Rf从100k到10M,看迟滞宽度的变化。实测下来,Rf取1M左右,配合100k/15k的分压网络,迟滞宽度大约在150mV左右,比较合适。

3.3 掉电保持电容的计算

检测到掉电后,MCU需要时间来保存数据。这个时间包括:中断响应时间(几us)、中断服务程序执行时间(取决于你要保存多少数据,通常1ms到10ms)、EEPROM或Flash的写入时间(STM32的Flash写入一页大约1ms到2ms)。

假设总时间是5ms,MCU的工作电流是30mA,MCU的供电电压是3.3V,允许电压从3.3V跌落到2.7V(MCU的最低工作电压)。那么保持电容C = I × t / ΔV = 30mA × 5ms / 0.6V = 250uF。

这个电容要放在3.3V稳压器的输出端,而不是24V输入端。因为24V到3.3V之间通常有DC-DC或LDO,它们的输入掉电后,输出还能维持一段时间,但这个时间不好精确计算。直接在3.3V输出端加大电容,效果最直接。

但要注意,电容太大会导致上电时充电电流过大,可能触发电源的过流保护。可以在电容前面串一个小电阻(比如1欧姆),或者用软启动电路。

3.4 检测点位置的取舍:24V侧还是3.3V侧

这是一个经常被争论的问题。检测24V侧的好处是能最早发现掉电,因为24V是源头;坏处是24V侧通常有较大的滤波电容,电压下降比较慢,而且24V到3.3V之间还有稳压器,24V掉到20V时,3.3V可能还是稳的。

检测3.3V侧的好处是直接反映MCU的供电状态,触发时MCU肯定还能工作;坏处是3.3V掉电时,留给MCU的时间可能已经很短了。

我的做法是两个都检测:24V侧用比较器做快速检测,触发后立即进入中断,开始准备保存数据;3.3V侧用ADC监测,作为第二道防线,如果3.3V也跌落了,就立即执行紧急保存,不再等待。

4. 软件配合:中断处理与数据保存策略

4.1 中断服务程序的设计

掉电中断的优先级要设到最高,高于所有其他中断。在STM32里,可以把掉电检测引脚配置为EXTI中断,优先级设为0。

中断服务程序要做的事情:

  1. 立即关闭所有高功耗外设(LED、通信接口、电机驱动等),降低电流消耗。
  2. 设置一个标志位,通知主循环进入掉电处理流程。
  3. 如果数据量不大,直接在中断里完成保存;如果数据量大,在中断里启动DMA传输,把数据搬到备份寄存器或SRAM的保留区域。

这里有一个关键点:不要在中断里做耗时操作。Flash写入、EEPROM写入这些操作动辄几毫秒,放在中断里会阻塞其他中断。正确的做法是在中断里设置标志,在主循环里判断标志后执行保存。但主循环可能正在执行其他任务,响应不够快。折中方案是在中断里把数据拷贝到备份SRAM(STM32的备份SRAM在VDD掉电后由VBAT供电),然后等系统复位后,在启动代码里把备份SRAM的数据写入Flash。

4.2 数据保存的策略选择

保存什么数据?通常包括:运行参数、累计值、故障记录、系统状态。这些数据加起来可能几十到几百字节。

保存到哪里?STM32有几种选择:

  • 备份寄存器:容量很小,只有几十字节,但掉电后由VBAT维持,不需要写入操作,速度极快。
  • 备份SRAM:容量较大(通常4KB),掉电后由VBAT维持,写入速度是ns级。
  • 内部Flash:容量大,但写入速度慢(ms级),而且需要擦除整个扇区。
  • 外部EEPROM:写入速度中等(ms级),容量灵活。

我的推荐策略是:关键数据(比如系统状态字、故障码)放备份寄存器,大块数据放备份SRAM,系统复位后在启动阶段把备份SRAM的数据转存到Flash或EEPROM。这样掉电瞬间只需要把数据从主SRAM拷贝到备份SRAM,耗时在us级,对保持电容的要求大大降低。

4.3 ADC滤波与阈值判断

如果用ADC方案,采样值会有噪声,需要滤波。热搜词里的“c语言adc值滤波函数”就是干这个的。最简单的滤波是滑动平均,取最近8次或16次采样值的平均。但滑动平均会引入延迟,对于掉电检测来说,延迟越小越好。

我一般用中值滤波加滑动平均:先取最近5次采样值,去掉最大和最小,剩下3个取平均。这样既能滤掉脉冲噪声,又不会引入太大延迟。代码实现很简单,一个长度为5的数组,每次采样后排序,取中间3个求平均。

阈值判断不能只看单次采样值,要连续多次低于阈值才确认掉电。比如连续3次采样都低于阈值,才触发掉电处理。这样可以避免因为一次干扰导致的误触发。

5. 常见问题与排查技巧实录

5.1 比较器输出抖动,MCU频繁中断

这是最常见的问题。原因通常是迟滞不够或者电源噪声太大。排查步骤:

  1. 用示波器看比较器输入端的波形,确认噪声幅度。
  2. 如果噪声幅度超过迟滞窗口,加大迟滞电阻。
  3. 在分压点加RC滤波,截止频率设在1kHz左右。
  4. 检查比较器的供电是否干净,必要时加LC滤波。

5.2 掉电后数据丢失,保存不成功

可能的原因:

  • 保持电容太小,MCU在保存完成前就断电了。用示波器看3.3V轨的下降波形,测量从触发到2.7V的时间,和保存所需时间对比。
  • Flash写入被中断打断。在保存数据前关闭所有中断,保存完成后再开启。
  • 备份SRAM的VBAT供电没接或者电池没电。测量VBAT引脚的电压,确认在VDD掉电后仍然有电。

5.3 上电时误触发掉电中断

上电时,24V电源有一个上升过程,在达到稳定值之前,比较器可能输出低电平,MCU误以为掉电。解决方法:

  • 在软件里加一个上电延时,比如上电后500ms内不响应掉电中断。
  • 在硬件上加一个RC延时,让比较器的输出在上电后延迟一段时间才有效。
  • 用MCU的BOR功能,在电源稳定之前保持复位状态。

5.4 ADC采样值跳变,阈值判断不准

ADC采样值跳变的原因很多:参考电压不稳、模拟输入阻抗太大、采样时间不够、数字电路干扰。排查方法:

  1. 用万用表测量ADC输入引脚的电压,和采样值对比,确认是硬件问题还是软件问题。
  2. 检查ADC的参考电压是否稳定,必要时用外部基准。
  3. 增加采样时间,降低采样速率。
  4. 在ADC输入引脚加RC滤波,截止频率设在100Hz左右。

5.5 常见问题速查表

现象可能原因排查方法解决措施
比较器输出抖动迟滞不够、噪声大示波器看输入波形加大迟滞、加RC滤波
掉电后数据丢失保持电容小、保存慢测3.3V下降时间加大电容、优化保存流程
上电误触发电源上升慢看比较器输出时序加上电延时、用BOR
ADC值跳变基准不稳、干扰万用表对比外部基准、加滤波
中断不触发引脚配置错、优先级低查寄存器配置重新配置EXTI、提高优先级

6. 实测案例:一个24V工业控制器的掉电保护改造

6.1 改造前的系统状态

这个控制器用STM32F103,24V输入,经过LM2596降到5V,再经过AMS1117降到3.3V。原来的掉电保护只是简单地在3.3V轨上接了一个10uF的电容,软件里没有任何掉电处理逻辑。现场故障表现为:电网闪断后,设备重启,参数丢失。

6.2 改造方案

硬件改动:

  • 在24V输入端加分压网络(100k+15k),接LM393比较器,基准用TL431产生2.5V,迟滞电阻1M。
  • 比较器输出接STM32的PA0引脚,配置为下降沿触发中断。
  • 在3.3V轨上增加一个470uF的电解电容,并联一个0.1uF的陶瓷电容。
  • 在3.3V轨上接一个分压网络(10k+10k),送到STM32的ADC引脚,用于监测3.3V的缓慢下降。

软件改动:

  • PA0的EXTI中断优先级设为最高。
  • 中断服务程序:关闭LED和通信接口,把关键数据拷贝到备份SRAM,设置掉电标志。
  • 主循环:检测到掉电标志后,把备份SRAM的数据写入Flash。
  • 启动代码:检查备份SRAM的魔数,如果有效,把数据恢复到主SRAM。

6.3 实测结果

用可编程电源模拟24V掉电,下降时间设为10ms。示波器测量3.3V轨,从24V开始下降到3.3V跌到2.7V的时间是8ms。软件保存数据的时间是3ms。改造后,连续测试100次掉电,数据保存成功率100%。

6.4 踩过的坑

第一个坑:一开始把保持电容放在5V轨上,结果发现5V掉到4.5V时,3.3V稳压器还能维持一段时间,但5V到3.3V的压差不够,3.3V输出开始下降。后来把电容移到3.3V轨上,问题解决。

第二个坑:备份SRAM的VBAT引脚忘了接电池,掉电后数据全丢。后来接了一颗CR1220纽扣电池,问题解决。

第三个坑:中断服务程序里调用了printf,导致执行时间过长,数据没保存完就断电了。后来把printf全部去掉,只做数据拷贝。

7. 几个容易被忽略的细节

7.1 比较器输入共模范围

LM393的输入共模范围是0到VCC-1.5V。如果比较器供电是5V,那输入电压不能超过3.5V。我们的分压网络在24V时输出3V,在20V时输出2.5V,都在范围内。但如果你的分压比不同,输入电压可能超过3.5V,这时候就要换比较器或者调整分压比。

7.2 运放的压摆率和GBW

热搜词里提到的“运放gbw”“运放压摆率怎么选”,在掉电检测里其实要求不高。因为掉电检测的信号变化很慢(ms级),运放的带宽和压摆率都绰绰有余。但如果你用运放做有源滤波,就要注意GBW要足够高,否则滤波器的截止频率会偏离设计值。

7.3 施密特触发器输入

有些MCU的IO口内部有施密特触发器,输入信号在阈值附近时不会抖动。但施密特触发器的阈值是固定的,不能替代比较器的迟滞功能。如果你的掉电检测信号直接进MCU的IO口,可以利用施密特触发器来抑制抖动,但前提是信号幅度足够大。

7.4 多路电源的掉电检测

如果系统有多路电源(24V、12V、5V),掉电检测要检测哪一路?我的建议是检测最早掉电的那一路。通常24V是最早掉的,因为它是源头。但如果24V和12V是独立输入的,就要分别检测,用二极管汇合后给MCU一个中断信号。

8. 写在最后

掉电检测这个事,说大不大,说小不小。做得好,设备在恶劣电网环境下稳如泰山;做得不好,现场故障频发,售后跑断腿。我见过太多产品在这个环节上偷懒,最后付出惨痛代价。

如果你正在做24V供电的产品,我建议至少留出比较器的位置,哪怕先不焊,调试的时候焊上去试试。软件上也要留出掉电中断的处理框架,哪怕先不实现具体功能,至少把中断优先级和标志位机制搭好。这些东西后期补起来,比一开始就做要麻烦得多。

另外,保持电容的选型要注意温度特性。电解电容在低温下容量会大幅下降,如果你的产品要在零下20度工作,铝电解电容可能只剩一半容量。这时候要么加大容量,要么换钽电容或固态电容。钽电容的低温特性好,但要注意耐压和浪涌电流。固态电容的低温特性最好,但成本高。根据你的产品定位来选。

最后分享一个小技巧:在调试掉电检测时,可以用一个继电器串联一个电阻来模拟掉电,继电器的动作时间可以精确控制,比可编程电源更方便。继电器的常闭触点串在24V回路里,控制线圈通电后触点断开,24V通过一个电阻给电容放电,放电时间由电阻和电容决定。这样就能精确模拟不同速度的掉电,方便你测试软件的响应时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询