news 2026/10/28 1:02:05

24V掉电检测电路设计:从分压运放到ADC采样与掉电保存

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
24V掉电检测电路设计:从分压运放到ADC采样与掉电保存

1. 从一次半夜设备重启说起:24V掉电检测到底在防什么

做工业控制和嵌入式硬件的朋友,大概都遇到过这种场景:现场一台24V供电的设备,白天跑得好好的,到了晚上电网波动或者前级开关电源切换的瞬间,设备莫名其妙重启了,或者MCU里的参数丢了、Flash写坏了。你去查日志,什么都查不到,因为掉电那一瞬间MCU已经没电了,根本没机会记录。这种问题排查起来极其痛苦,因为它是偶发的、瞬态的,示波器不盯着看根本抓不到。

24V供电掉电检测电路要解决的就是这个问题。它的核心任务是在24V母线电压开始下降、但还没有低到MCU无法工作的那个时间窗口里,尽早给MCU一个"要断电了"的信号,让MCU有时间把关键数据写进EEPROM或Flash、安全关闭输出、保存运行状态。这个时间窗口可能只有几毫秒到几十毫秒,取决于你电源的保持电容和负载电流。

为什么是24V?因为24V是工业现场最通用的直流母线电压之一,PLC、传感器、电磁阀、伺服驱动器大量使用24V供电。而24V系统的一个特点是:它通常由开关电源(SMPS)产生,开关电源在输入断电后,输出电容还能维持一段时间,但这段"余电时间"是不确定的,跟负载大小、电容容量、电源拓扑都有关系。所以不能靠"等电源自己掉"来触发保护,必须主动检测、提前预警。

这篇文章适合谁看?如果你正在做STM32、GD32、S32K这类MCU的工业控制板,需要设计掉电保护功能,那这篇内容可以直接抄作业。如果你只是想了解ADC采样、运放电路、比较器这些基础模块怎么组合成一个实用功能,也能从中拿到不少细节。我会从分压网络、运放调理、ADC采样、阈值判断、软件滤波到实际调试踩坑,完整走一遍。

2. 为什么不能直接用电阻分压进ADC:24V到3.3V之间的信号调理逻辑

很多人第一反应是:24V掉电检测嘛,两个电阻分压,把24V降到3.3V以内,直接接MCU的ADC引脚不就行了?理论上没错,但实际工程里这样做会踩一堆坑。这一章我们把"为什么需要运放"这件事讲透。

2.1 纯电阻分压的三个致命问题

先算一下分压比。假设MCU的ADC参考电压是3.3V,24V满量程要降到3.0V左右留点余量,分压比大概是3.0/24 = 1/8。选R1=7K,R2=1K,分压后24V对应3.0V。看起来很简单,但问题在于:

第一,输出阻抗太高。7K和1K并联后的等效输出阻抗约为875Ω。STM32的ADC采样保持电容大概是几pF级别,采样开关导通电阻加上外部源阻抗,会形成一个RC充电时间常数。如果源阻抗太大,采样电容在采样窗口内充不满,ADC读数就会偏低且不稳定。STM32的ADC手册一般建议源阻抗不超过几十kΩ,但那是针对慢速采样的,如果你要快速连续采样做掉电判断,875Ω其实勉强能用,但余量不大。

第二,没有缓冲,负载会拉低电压。如果分压点还接到别的地方,比如比较器输入或者另一个ADC通道,负载效应会改变分压比。而且24V母线本身可能有纹波和噪声,直接分压会把所有噪声都带进ADC。

第三,共模和地弹问题。工业现场的地不是理想地,24V的地和MCU的地之间可能有压差。如果分压电阻直接跨接在24V和MCU地之间,这个地压差会直接叠加到ADC输入上,导致读数漂移。

2.2 运放做缓冲和缩放:LM358够不够用

关键词里出现了LM358和NE5532,这两个都是经典运放。LM358是双运放,单电源供电,价格便宜,工业上大量使用。NE5532是低噪声双运放,但它是为音频设计的,单电源低压场景下不如LM358方便。对于24V掉电检测这种应用,LM358基本够用,但要注意几个参数。

增益带宽积(GBW):LM358的GBW约1MHz。如果你只是做直流或低频缓冲,1MHz绰绰有余。但如果你要在运放后面做低通滤波,截止频率设到1kHz,那GBW=1MHz意味着在1kHz处开环增益还有1000倍,闭环增益1倍时相位裕度足够,不会振荡。

压摆率(Slew Rate):LM358的压摆率约0.3V/μs。掉电检测的信号变化其实很慢,24V掉到0V可能需要几十毫秒,折算下来电压变化率远小于0.3V/μs,所以压摆率不是瓶颈。

输入共模范围:LM358的输入共模范围是Vcc-1.5V到Vcc+1.5V(单电源时),也就是说如果运放供电是5V,输入共模范围大概是0V到3.5V。如果你把24V分压到3V以内再进运放,这个范围是满足的。但要注意,LM358不是轨到轨输入,输入接近0V时可能有问题,所以分压后的信号最好保持在0.5V以上。

输出摆幅:LM358的输出也不能轨到轨,输出高电平大概能到Vcc-1.5V。如果运放供电5V,输出最高约3.5V,接3.3V的ADC没问题,但如果你要输出接近5V的信号就不行。

2.3 单极信号差分输入:把地弹和共模噪声干掉

关键词里有个"单极信号差分输入到运放",这个思路很实用。工业现场的地噪声很大,如果只用单端输入,24V的地和MCU的地之间的压差会直接变成测量误差。差分输入可以把这个共模电压抑制掉。

具体做法是:用两个电阻分压,一个从24V分到运放同相输入端,一个从24V地分到运放反相输入端,运放做差分放大。这样24V地相对于MCU地的波动就变成了共模信号,被运放的共模抑制比(CMRR)压下去。LM358的CMRR大概70dB到80dB,对于几十毫伏的地弹来说,抑制后只剩几十微伏,完全可以接受。

不过差分输入有个代价:需要匹配电阻。四个电阻的比值必须精确匹配,否则CMRR会急剧下降。比如用1%精度的电阻,CMRR可能只有40dB左右。如果要高CMRR,得用0.1%的匹配电阻或者集成差分放大器。对于掉电检测这种应用,40dB其实也够用了,因为地弹本身不大。

2.4 实际电路参数计算:从24V到3.0V的完整链路

假设我们采用"分压+运放缓冲"的方案,目标是把0到24V映射到0到3.0V,给3.3V参考的ADC。分压比1/8,运放做电压跟随器(增益1倍)。

分压电阻选R1=30kΩ,R2=4.3kΩ,分压比4.3/(30+4.3)=0.1253,24V对应3.007V,接近3.0V。为什么选30k和4.3k而不是7k和1k?因为阻值大一点,从24V母线抽取的电流小。24V/34.3kΩ≈0.7mA,对24V母线几乎没影响。如果选7k和1k,电流是3mA,虽然也不大,但多个检测点累积起来就不可忽略了。

分压点的等效输出阻抗是30k并联4.3k,约3.76kΩ。这个阻抗直接进ADC太高了,所以加一级运放跟随器。运放输入阻抗极高(LM358约10MΩ以上),对分压点几乎不加载。运放输出阻抗极低(闭环时几十毫欧),可以直接驱动ADC采样电容。

运放供电用5V单电源,输出3.0V在LM358的输出范围内(5V-1.5V=3.5V,3.0V小于3.5V,没问题)。但要注意,如果24V掉到0V,分压点也是0V,运放输入0V,LM358在单电源下输入0V时输出可能不准确,会有一个几十毫伏的失调。对于掉电检测来说,我们关心的是电压从24V下降的过程,0V附近不关心,所以这个失调可以忽略。

3. ADC采样与阈值判断:怎么在正确的时间点说"要断电了"

信号调理好了,接下来是MCU怎么读、怎么判断。这部分看起来简单,但实际做起来有很多细节决定成败。

3.1 ADC采样周期与触发方式的选择

STM32的ADC采样时间是可以配置的,从1.5个ADC时钟周期到239.5个周期不等。采样时间越长,采样电容充电越充分,读数越准,但转换速度越慢。对于掉电检测,我们不需要高速采样,但需要稳定可靠的读数。

假设ADC时钟是12MHz,采样时间设为71.5个周期,转换时间12.5个周期,总转换时间84个周期,约7μs。这个速度足够快,因为掉电过程是毫秒级的。如果你用定时器触发ADC,比如1ms触发一次,那CPU负担极小。

关键词里有"tim触发adc"和"stm32 adc中断",这两个可以结合使用。用TIM定时触发ADC转换,转换完成后产生中断,在中断里读取ADC值并做判断。这样采样周期精确,不受主循环任务影响。

但要注意:如果主循环里有其他高优先级中断,ADC中断可能被延迟,导致采样点抖动。对于掉电检测,抖动几微秒无所谓,因为电压变化很慢。但如果你的系统对时间要求极严,可以考虑用DMA搬运ADC数据,减少中断开销。

3.2 阈值设定:不是拍脑袋定一个数

掉电检测的阈值设定是个关键。设太高,正常电压波动就误触发;设太低,等电压掉到阈值时MCU已经快没电了,来不及保存数据。

假设24V正常范围是24V±10%,即21.6V到26.4V。那么阈值应该设在21.6V以下,比如20V。20V对应分压后电压是20/8=2.5V,ADC读数(12位,3.3V参考)是2.5/3.3*4095≈3102。所以阈值可以设为3100左右。

但实际电网波动可能更大,有些工业现场24V可能掉到18V甚至更低。所以阈值要留足余量。我一般建议阈值设在正常工作电压下限的85%到90%。如果24V系统最低工作电压是21.6V,那阈值设在18V到19V比较安全。

还有一个关键参数:MCU的工作电压范围。STM32F103的工作电压是2.0V到3.6V,但Flash写入需要至少2.7V(不同型号不一样)。所以从24V掉到MCU无法写Flash的那个点,时间窗口是有限的。你需要计算:24V母线电容C,负载电流I,从24V掉到18V的时间t = C*(24-18)/I。假设C=1000μF,I=100mA,t=1000μF*6V/100mA=60ms。这60ms就是你的黄金时间。

3.3 软件滤波:C语言ADC值滤波函数的实际写法

关键词里有"c语言adc值滤波函数",这个很实用。ADC读数一定有噪声,直接拿单次采样做判断会误触发。常用的滤波方法有:

算术平均滤波:连续采N次,取平均。N一般取8到16。优点是简单,缺点是响应慢。对于掉电检测,响应慢是致命的,因为掉电过程只有几十毫秒,你采16次可能就花掉几毫秒。

中值滤波:连续采N次,排序后取中间值。对脉冲噪声抑制好,但计算量大,且同样有延迟。

滑动平均滤波:维护一个环形缓冲区,每次新采样替换最旧的值,然后求平均。这样既有滤波效果,又不会引入额外延迟(每个采样周期输出一个滤波后的值)。

一阶低通滤波:y = α*x + (1-α)*y_prev,α是滤波系数。α越小,滤波越强,但响应越慢。对于掉电检测,α可以取0.3到0.5,兼顾滤波和响应。

我实际用下来,滑动平均加阈值判断最稳。具体做法:维护一个长度为8的环形缓冲区,每次ADC中断把新值放进去,然后计算平均值。如果平均值连续3次低于阈值,才认为真的掉电了。这样既能滤掉噪声,又能防止单次误判。

#define FILTER_LEN 8 #define THRESHOLD 3100 #define CONFIRM_CNT 3 static uint16_t adc_buf[FILTER_LEN]; static uint8_t adc_idx = 0; static uint8_t low_cnt = 0; uint8_t check_power_fail(uint16_t new_adc) { uint32_t sum = 0; uint16_t avg; adc_buf[adc_idx] = new_adc; adc_idx = (adc_idx + 1) % FILTER_LEN; for (int i = 0; i < FILTER_LEN; i++) { sum += adc_buf[i]; } avg = sum / FILTER_LEN; if (avg < THRESHOLD) { low_cnt++; if (low_cnt >= CONFIRM_CNT) { return 1; // 确认掉电 } } else { low_cnt = 0; } return 0; }

这段代码里,FILTER_LEN=8,CONFIRM_CNT=3,意味着需要连续3次滤波后的平均值低于阈值才触发。假设1ms采样一次,那就是3ms确认时间。对于60ms的窗口来说,3ms完全可以接受。

3.4 中断优先级与掉电保存的时序配合

一旦确认掉电,MCU要立刻做几件事:关闭输出、保存数据、进入安全状态。这些操作必须在电源彻底掉下去之前完成。所以掉电检测中断的优先级要设得足够高,但不能高到影响ADC采样本身。

我的做法是:ADC中断优先级设为中等,掉电判断放在主循环或者一个低优先级任务里。一旦确认掉电,立刻置一个标志位,然后在一个高优先级中断或者直接在主循环里执行保存操作。保存操作要尽量快,只写最关键的数据,不要写一大堆。

如果数据量大,可以考虑用DMA把数据搬到备份寄存器(STM32的BKP寄存器),或者用FRAM这种快速非易失存储器。EEPROM写入通常需要几毫秒,Flash写入更慢,所以要提前规划好写什么、写多少。

4. 实测中的坑:从误触发到不触发,我踩过的那些雷

这一章讲实际调试中遇到的问题。很多问题在理论设计时想不到,只有上电测试才会暴露。

4.1 上电瞬间的误触发:电容充电导致的假掉电

第一次测试就遇到了:设备上电时,MCU还没启动,24V母线电容在充电,电压从0慢慢升到24V。如果MCU启动快,在电压还没升到阈值以上时就开始采样,就会误判为掉电。

解决方法有两个:一是加一个上电延时,MCU启动后先等100ms再开始掉电检测;二是用滞回比较,阈值设两个,上升沿阈值和下降沿阈值不同。比如上升沿阈值设20V,下降沿阈值设18V。这样上电时电压必须超过20V才认为正常,正常后掉到18V以下才认为掉电。

滞回比较在软件里实现很简单:维护一个状态变量,正常状态下用低阈值判断,掉电状态下用高阈值判断。

#define THRESHOLD_HIGH 3300 // 对应20V #define THRESHOLD_LOW 2900 // 对应18V static uint8_t power_state = 0; // 0=掉电, 1=正常 void update_power_state(uint16_t adc_avg) { if (power_state == 1) { if (adc_avg < THRESHOLD_LOW) { power_state = 0; // 触发掉电保存 } } else { if (adc_avg > THRESHOLD_HIGH) { power_state = 1; } } }

4.2 运放振荡:容性负载惹的祸

LM358输出直接接ADC引脚,ADC引脚有采样电容,相当于一个容性负载。有些运放驱动容性负载会振荡,输出波形上出现高频毛刺。我遇到过LM358输出接长线到ADC时,线上出现几十MHz的振荡,导致ADC读数乱跳。

解决方法是在运放输出和ADC之间串一个小电阻,比如100Ω,然后再并一个100pF到地。这个电阻隔离了容性负载,电容滤掉了高频噪声。但要注意,电阻不能太大,否则ADC采样电容充电时间变长,影响精度。100Ω加上ADC内部采样开关电阻(通常几kΩ),总源阻抗还是可以接受的。

4.3 地线处理:单点接地不是万能的

工业现场的地很脏,24V地、MCU地、模拟地、数字地,如果处理不好,ADC读数会漂。我一开始把所有地都连在一起,结果ADC读数随负载变化漂了几十LSB。

后来改成单点接地:模拟部分(分压电阻、运放)的地单独走,最后在ADC芯片下方单点连接到数字地。24V地通过一个0Ω电阻或者磁珠连接到MCU地,把高频噪声挡一挡。这样改完后,ADC读数稳定多了。

但单点接地也有代价:如果地平面分割不好,回流路径变长,可能引入新的噪声。所以PCB布局时要小心,模拟地和数字地不要交叉,回流路径要短。

4.4 阈值附近的抖动:滞回不够大

即使加了滞回,如果滞回窗口太小,电压在阈值附近波动时还是会反复触发。比如阈值18V,滞回1V,那17.5V到18.5V之间会抖动。如果24V母线本身纹波就有1V,那就会频繁误触发。

解决方法是加大滞回窗口,或者加更长的确认时间。我一般把滞回窗口设在2V到3V,确认时间设在5ms到10ms。这样即使有纹波,也不会误触发。

但滞回窗口太大也有问题:如果电压真的掉电,从24V掉到18V以下,需要掉到滞回下限才触发,可能浪费了几毫秒的宝贵时间。所以要在误触发和响应速度之间权衡。我的经验是:如果24V纹波小于500mV,滞回窗口1V就够了;如果纹波大,先解决纹波问题,而不是一味加大滞回。

5. 从比较器到MCU内部比较器:另一种更快的掉电检测思路

用ADC做掉电检测的好处是灵活,阈值可以软件调整,还能顺便监测电压值。但ADC采样和软件判断需要时间,最快也要几十微秒。如果对响应速度要求极高,可以考虑用硬件比较器。

5.1 独立比较器方案:LM393的用法

LM393是双比较器,开漏输出,可以直接接MCU的外部中断引脚。把分压后的24V信号接到比较器同相输入端,反相输入端接一个基准电压(比如用TL431产生2.5V基准)。当24V分压后低于2.5V时,比较器输出翻转,触发MCU中断。

这个方案的响应速度是纳秒级的,比ADC快几个数量级。而且不占用MCU的ADC资源。缺点是阈值由硬件电阻决定,调整不方便。可以用数字电位器或者DAC来产生基准电压,实现软件可调阈值。

关键词里有"mcu control dc-dc output voltage using feedback pin dac pwm i2c digital potentiometer",这个思路也可以用在掉电检测上:用MCU的DAC或者PWM加滤波产生基准电压,接到比较器反相输入端,这样阈值就可以软件调整了。

5.2 STM32内部比较器:省掉外部器件

有些STM32型号内部集成了比较器,比如STM32G4、STM32L4系列。内部比较器的输入可以选外部引脚,也可以选内部基准。用内部比较器做掉电检测,可以省掉外部LM393和基准源,降低成本。

但内部比较器的精度和速度通常不如外部专用比较器。STM32G4的内部比较器传播延迟大概几十纳秒,精度受内部基准影响。对于掉电检测这种应用,其实够用了。

用内部比较器时,可以把比较器输出连接到定时器的刹车输入或者外部中断,实现快速响应。同时还可以用ADC监测电压值,两者结合:比较器负责快速触发,ADC负责精确测量。

5.3 两种方案的对比与选型建议

对比项ADC方案比较器方案
响应速度几十微秒到几毫秒纳秒级
阈值灵活性软件可调,非常灵活硬件决定,调整麻烦
成本占用ADC资源,无额外器件需要比较器和基准源
精度12位ADC,精度高比较器精度一般
复杂度软件滤波,中等复杂度硬件设计,简单直接
适用场景需要监测电压值、阈值需调整只需快速触发、阈值固定

我的建议是:如果MCU有富余的ADC通道,优先用ADC方案,因为灵活。如果对响应速度要求极高,或者ADC资源紧张,用比较器方案。两者也可以结合:比较器做快速触发,ADC做电压监测和阈值确认。

6. 关键器件选型与参数计算:电阻、电容、运放怎么选

这一章把选型相关的细节集中讲一下。很多新手在设计电路时,不知道电阻选多大、电容选什么材质、运放选什么型号,这里给出具体的计算方法和推荐值。

6.1 分压电阻的计算与精度选择

分压电阻的阻值计算前面已经讲了,这里补充精度选择。分压比误差直接影响ADC读数误差。如果用1%精度的电阻,分压比误差最大2%(两个电阻误差叠加)。对于12位ADC,1LSB对应3.3V/4095≈0.8mV,2%误差对应60mV,约75LSB。这个误差对于掉电检测来说可以接受,因为阈值判断有滞回窗口。

但如果要精确测量24V电压值,就需要更高精度的电阻,比如0.1%。或者用软件校准:在已知电压下测一次ADC读数,算出校准系数,后续测量都用这个系数修正。

电阻的温度系数也要考虑。普通厚膜电阻的温度系数是100ppm/°C到200ppm/°C,温度变化50°C时阻值变化0.5%到1%。对于工业环境,温度变化可能很大,所以最好选低温漂电阻,比如25ppm/°C的薄膜电阻。

6.2 滤波电容的材质与容值

运放输出到ADC之间的滤波电容,一般选100pF到1nF。材质选C0G或NP0,这种电容温度稳定性好,容值不随电压和温度变化。不要用X7R或Y5V,它们的容值随电压变化很大,会导致滤波效果不一致。

分压点也可以加一个电容到地,和分压电阻形成低通滤波。截止频率f=1/(2πRC),R是分压点等效输出阻抗,C是电容值。比如R=3.76kΩ,C=100nF,f=1/(2π3760100e-9)≈423Hz。这个截止频率可以滤掉高频噪声,但对掉电检测的响应速度影响不大,因为掉电信号是直流或低频。

但要注意:如果电容太大,掉电时电容上的电荷会延缓电压下降,导致检测延迟。所以电容不能太大,100nF到1μF比较合适。

6.3 运放选型:LM358、NE5532还是其他

LM358是最经济的选择,单电源供电,输入共模范围包含地,输出摆幅够用。缺点是失调电压较大(最大7mV),温漂也大。但对于掉电检测,这些都不重要。

NE5532是低噪声运放,但它是双电源设计的,单电源低压下性能下降。而且NE5532的输入共模范围不包含负电源轨,单电源使用时输入接近0V会有问题。所以不建议用NE5532做掉电检测。

如果要求高精度,可以用OPA333、MCP6001这类零漂移运放,失调电压只有几微伏。但价格贵不少,对于掉电检测有点浪费。

如果运放供电是3.3V而不是5V,要选轨到轨输入输出的运放,比如MCP6001、TLV9001。LM358在3.3V供电时输出摆幅不够,可能无法输出3.0V。

6.4 基准电压源的选择

如果用比较器方案,需要基准电压源。TL431是最常用的可调基准,精度0.5%到2%,温度系数50ppm/°C。价格便宜,但需要至少1mA的阴极电流才能正常工作。

如果要求更高精度,可以用REF3025、LM4040这类专用基准芯片,精度0.1%,温度系数更低。但价格贵一些。

也可以用MCU的DAC输出作为基准,但DAC的精度和稳定性不如专用基准。如果MCU供电本身在波动,DAC输出也会波动,导致阈值漂移。所以DAC做基准只适合对精度要求不高的场景。

7. 软件层面的掉电保存策略:写什么、写多快、怎么写

掉电检测只是第一步,检测到掉电后怎么保存数据才是最终目的。这一章讲软件层面的策略。

7.1 保存哪些数据:优先级排序

掉电时时间宝贵,不可能保存所有数据。必须提前规划好哪些数据最关键。一般分三个优先级:

最高优先级:设备运行状态、关键参数、故障标志。这些数据丢失会导致设备行为异常,必须保存。

中等优先级:累计运行时间、产量计数、校准系数。这些数据丢失影响不大,但最好保存。

低优先级:日志、历史曲线、调试信息。这些数据可以丢弃,或者只保存最近几条。

我的做法是:在RAM里维护一个结构体,把所有需要保存的数据放在一起。掉电时一次性写入EEPROM或Flash。结构体大小控制在256字节以内,这样写入时间可以控制在几毫秒。

7.2 EEPROM与Flash的写入速度对比

EEPROM写入速度通常比Flash快。以AT24C02为例,页写入模式可以一次写8字节,写入周期5ms。如果写256字节,需要32页,总共160ms,太慢了。所以要用页写入加轮询的方式,或者用FRAM。

FRAM(铁电存储器)写入速度极快,没有写入延迟,可以像RAM一样直接写。但价格贵,容量小。如果数据量不大(几KB以内),FRAM是最佳选择。

Flash写入需要先擦除再写入,擦除时间长(几十毫秒),所以不能掉电时擦除。必须提前擦好一个区域,掉电时直接写。STM32的Flash可以按半字或字写入,写入时间几十微秒。但Flash写入需要电压稳定,如果电压已经掉到2.7V以下,写入可能失败。

所以我的建议是:如果数据量小,用FRAM;如果数据量大,用EEPROM加页写入;如果用Flash,必须提前擦除,并且确保掉电时电压还在安全范围内。

7.3 写入过程中的二次掉电保护

最怕的情况是:掉电时正在写EEPROM,写到一半电彻底没了,导致数据写坏。下次上电读出来是乱码。

解决方法是用双备份加校验。把数据存两份,每份带CRC校验。写入时先写第一份,校验通过后再写第二份。读取时如果第一份校验失败,读第二份。如果两份都失败,用默认值。

还有一种方法是日志式写入:每次写入都追加到新的位置,不覆盖旧数据。读取时找最新的有效记录。这样即使写入过程中掉电,旧数据还在。但这种方法需要更大的存储空间,且需要垃圾回收机制。

对于掉电检测这种场景,双备份加CRC就够用了。实现简单,可靠性高。

7.4 上电后的数据恢复与校验

上电后,MCU要先读取保存的数据,校验CRC。如果校验通过,恢复运行状态;如果失败,用默认值并记录一个故障标志。

这里有个细节:上电时电压可能还没稳定,读取EEPROM可能出错。所以上电后要等电压稳定再读,或者读多次取多数结果。我一般上电后延时100ms再读EEPROM,并且读三次,如果三次结果一致才采用。

8. 调试与验证:怎么确认掉电检测真的可靠

设计完了,怎么验证?不能只靠理论计算,必须实际测试。

8.1 用可调电源模拟掉电

最直接的测试方法:用可调直流电源给24V母线供电,然后突然关掉电源,用示波器同时抓24V母线电压和MCU的掉电保存信号。看从电压开始下降到保存完成,时间够不够。

但可调电源的关断特性可能和实际开关电源不同。实际开关电源断电后,输出电容放电曲线是指数下降的,而可调电源关断可能更快或更慢。所以最好用实际的24V开关电源测试,拔掉交流输入,观察掉电过程。

8.2 用示波器抓时序:关键波形分析

示波器要抓几个信号:24V母线电压、运放输出电压、ADC中断信号、掉电保存信号。触发方式设为24V下降沿触发,单次触发。

从波形上可以看到:24V开始下降,经过分压和运放,ADC读数下降,软件判断,触发保存。整个链路的时间延迟一目了然。如果保存完成时24V还在MCU工作电压以上,说明设计合格。

我实测下来,从24V开始下降到触发保存,延迟大概2ms到5ms(取决于滤波参数)。保存256字节到EEPROM需要10ms到20ms。总共15ms到25ms。如果24V母线电容是1000μF,负载100mA,从24V掉到18V有60ms,那时间绰绰有余。

8.3 反复上电断电测试:验证可靠性

单次测试通过不代表可靠。要做反复上电断电测试,比如连续断电100次,看是否每次都能正确保存。我一般做500次以上,确保没有偶发失败。

测试时要注意:每次断电后要等电容完全放完电再上电,否则可能测不到真正的掉电过程。可以在24V母线上并一个放电电阻,加快放电。

如果发现偶发失败,要查原因:是ADC读数抖动导致误判?是EEPROM写入失败?还是电源掉得太快?用示波器抓失败那次的波形,对比成功和失败的差异。

8.4 温度与电压边界的测试

工业设备要在宽温度范围内工作,所以要在高低温下测试掉电检测。低温下电容容值变化、电阻阻值变化、运放失调变化,都可能影响检测阈值。高温下EEPROM写入速度可能变慢。

我一般做-40°C、25°C、85°C三个温度点的测试。如果条件有限,至少做0°C和50°C。测试方法和常温一样,看是否每次都能正确保存。

电压边界测试:把24V调到最低工作电压(比如21.6V),然后掉电,看是否能检测到。再把24V调到最高工作电压(26.4V),掉电,看是否误触发。确保在整个工作电压范围内都可靠。

9. 一些容易被忽略的细节和我的个人经验

最后分享几个细节,都是实际项目中踩过坑才总结出来的。

第一,ADC参考电压的稳定性。如果MCU的ADC用VDDA做参考,而VDDA又来自一个不稳定的LDO,那ADC读数会随VDDA波动。掉电时VDDA可能先掉,导致ADC读数偏低,误判为掉电。所以最好用外部基准芯片,或者确保VDDA在掉电时能维持到最后。

第二,运放供电的顺序。如果运放供电和MCU供电是分开的,要注意上电顺序。如果运放先上电,输出可能有一个高电平脉冲,被MCU的ADC引脚看到,可能误触发。可以在运放输出加一个钳位二极管,防止电压超过VDDA+0.3V。

第三,PCB布局。分压电阻和运放要靠近MCU的ADC引脚,走线尽量短。分压点不要走长线,否则容易引入噪声。模拟地和数字地要分开,最后单点连接。

第四,软件看门狗。掉电保存过程中如果看门狗复位,保存可能失败。所以在保存前要先喂狗,或者暂时关闭看门狗。保存完成后再开启。

第五,多次掉电的累积效应。如果设备频繁掉电,EEPROM会频繁写入,寿命可能不够。EEPROM的写入寿命通常是100万次,如果每天掉电100次,能用27年。但如果每天掉电1000次,只能用2.7年。所以如果掉电频繁,要考虑用FRAM或者减少写入次数。

第六,掉电检测的阈值要留足余量。我一般把阈值设在正常工作电压下限的80%左右。比如24V系统最低工作电压21.6V,阈值设在17V到18V。这样即使电网波动大,也不会误触发。但也不能太低,否则等电压掉到阈值时,MCU已经快没电了。

第七,测试时要模拟真实负载。有些设备在轻载和重载下的掉电曲线完全不同。轻载时电容放电慢,重载时放电快。所以要在最重负载下测试,确保时间窗口够用。

第八,考虑电源反接和浪涌。工业现场可能有反接和浪涌,分压电阻和运放输入要加保护。比如在分压点加一个TVS管,钳位电压在ADC输入范围内。运放输入串一个电阻限流。

这些细节看起来琐碎,但每一个都可能决定掉电检测的成败。我在实际项目中,因为忽略了运放供电顺序,导致上电时误触发,查了两天才找到原因。也因为EEPROM写入寿命问题,把方案从EEPROM改成了FRAM。所以做硬件设计,细节决定成败。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/28 1:02:03

基于CH32V307的RISC-V开发板:ESP8266联网OLED时钟制作教程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/28 1:02:03

工控人必知:字节与16进制实战解析,从报文到浮点数

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/28 0:56:40

Chatbot联网搜索技术演进:从RAG检索到Agent工具调用

1. 从搜索框到 Agent&#xff1a;Chatbot 联网搜索的技术演进拆解1.1 一个搜索框背后的三个时代Chatbot 的联网搜索&#xff0c;这几年走的路径其实非常清晰&#xff1a;从“搜索框里的关键词”&#xff0c;到“能理解你说了什么的AI”&#xff0c;再到“能替你跑完整条路径的 …

作者头像 李华
网站建设 2026/10/28 0:52:27

大模型考试通关指南:零基础考生的考点精讲与应试策略

1. 这不是“AI速成班”&#xff0c;而是一份给考试人的大模型通关地图“大模型技术与应用&#xff1a;零基础考点精讲”——看到这个标题&#xff0c;我第一反应不是点开视频&#xff0c;而是翻出去年三套真题卷子&#xff0c;在草稿纸上画了个三层结构图&#xff1a;最底下是“…

作者头像 李华
网站建设 2026/10/28 0:52:10

语义分割技术演进:从FCN到Transformer的十年突破

1. 语义分割技术十年演进全景图&#xff08;2015-2025&#xff09;2014年全卷积网络&#xff08;FCN&#xff09;的诞生&#xff0c;彻底改变了计算机视觉领域对图像理解的范式。作为像素级分类任务的代表&#xff0c;语义分割在过去十年经历了从传统方法到深度学习&#xff0c…

作者头像 李华
网站建设 2026/10/28 0:34:25

类脑计算、量子纠错与端到端大模型:算力架构变革的技术日报解读

最近几个月的固定习惯&#xff0c;是每天早上花二十分钟&#xff0c;把前一天的全球科技新闻按主题捋一遍。这个动作看起来简单&#xff0c;但坚持下来之后&#xff0c;我对行业热点的判断速度快了很多。9月28日的这一波新闻里&#xff0c;AI硬件、量子计算、自动驾驶、开源生态…

作者头像 李华