八.STM32F030C8T6 MCU开发之电源掉电检测案例
0.总体功能概述
使用STD库–en.stm32f0_stdperiph_lib_v1.6.0。
单片机在正常工作时,因某种原因造成突然掉电,将会丢失数据存储器(RAM)里的数据。在某些应用场合如测量、控制等领域,单片机正常工作中采集和运算出一些重要数据,待下次上电后需要恢复这些重要数据。
因此,在一些没有后备供电系统的单片机应用系统中,有必要在系统完全断电之前,把这些采集到的或计算出的重要数据存在在FLASH中。
为此,通常做法是在这些系统中加入单片机电源掉电检测电路与单片机掉电数据保存机制。用储能电容可在掉电后延长电源的稳定时间,从而从容实现 在单片机掉电检测后完成数据掉电保存。
1.ST MCU 电源相关机制介绍
了解电源之前,先来简单了解一下各种电源端口的命名
VCC:C=circuit 表示电路的意思, 即接入电路的电压。
VDD:D=device 表示器件的意思, 即器件内部的工作电压。
VSS:S=series 表示公共连接的意思,通常指电路公共接地端电压。
GND:在电路里常被定为电压参考基点。
VEE:负电压供电;场效应管的源极(S)
VPP:编程/擦除电压。
V与VA的区别是:数字与模拟的区别
数字电路供电VCC
模拟电路供电VCCA
1.1 ST MCU 电源供应介绍
STM32F030C8T6的可工作电源电压范围是2.4-3.6V
1.2 ST MCU POR/PDR
1.3 PVD模块
STM32F030系列没有PVD
1.3.1 ADC检测电源来判断是否掉电
没有PVD的话,可以用ADC检测电源来判断是否掉电。
2.硬件设计
2.1掉电时间
掉电保存的前提是断电后电源电压是缓慢下降的,这样才有足够的时间去检测掉电并保存数据。因此,电源上必须有个大电容,保证电源断开后能继续给单片机供电。
具体需要维持多长时间,要看存储器的擦写周期。以STM32F030C8T6的内部存储器为例,擦除一页需要30ms,写入一个16位数据需要53.5us。根据实际需要擦除和写入的数据多少来计算至少需要多少时间。
还需要关注一个参数,编程电压。在用示波器测量掉电时的波形时,测量出从断电瞬间到电压降低到2.4V时的时间,该时间大于总的数据擦写的时间即可。当然要留有一定裕量。如果时间不够,就要加大电容了。
2.2ADC检测
ADC检测掉电的方式有两种,一种是通过某个通道直接采集电源电压(或者分压后采集),另一种是采集内部参考电压Vrefint来判断电源电压。
第一种方式很好理解,采样值就代表电源电压,可以直接去触发ADC的看门狗中断。
第二种方式由于内部参考电压是不变的,STM32F030是1.23V,有一定误差。当电源电压变化时,ADC采集的参考电压会发生变化。这里有个前提,即单片机的VREF引脚或AVDD引脚就是要检测的电源电压。
2.2.1 vref与VDDA电源关系
vref = adc_value x VDDA/0xffff
当VDDA不同,VREF 是确定数值,adc_value不同。
正常时ADC采样值=1.234096/3.3,大约是1526左右,由于Vrefint和电源电压都有误差,所以只是个大概。
如果我们将掉电电压检测值设为3.1V,那对应的ADC看门狗的高门限值应为1.234096/3.1,约1625左右。
STM32F030C8T6 VDDA=3V的时候采集内部vrefint的ADC数值adc_value =1672
[2022-11-07 12:44:47] index=4 RegularConvData_Tab= 1672, ADC1ConvertedVoltage 1224 mV
这里有两点需要注意:
一是在中断中先关闭功耗较大的外设,比如液晶背光、数码管等。使断电时电源电压下降不至于太快。
二是在保存数据后关闭ADC中断,或者直接死循环(因为已经断电,也不需要执行其它程序了)。这样做主要是为了防止电压下降的太慢,多次触发看门狗中断,导致最后一次写入错误。
3.总结
关于电源检测,STM32MCU的可编程电压监测(PVD),模拟电压监测(AVD)和电池电压监测等功能可以用来检测VDD,VDDA和电池电压是否在正常的电压范围内。
4.参考
https://mp.weixin.qq.com/s/QlmvLQBaD_v-wgkuK3yD3w
能可以用来检测VDD,VDDA和电池电压是否在正常的电压范围内。