比如用电池供电的产品,需要实时检测电压以判断电池的电量情况,并及时提醒用户对电池充电或者更换电池。
再比如通过检验测试电池电压判断断电,及时在断电之后采用电容上储存的电荷供电,维持记录工作,在此期间将RAM中的数据写入flash,eeprom等非易失存储器,重新上电之后再读出恢复,以此来实现断电记忆功能。
为了保证该功能的可靠性,产品需要满足电源瞬断试验要求。比如对电源50ms瞬断,在断电之后,并联在供电电源两端的电解电容能够继续放电,维持负载正常工作。
50ms瞬断要求电容在向负载放电50ms之后,其两端的电压仍能满足设备正常工作要求。
以下面的电路为例,12V供电电源经过LDO稳压,得到+3.3V向负载供电,
对于线性稳压器,其输入电流等于输出的负载电流加上线性稳压器的工作电流(也即静态电流);
在上图中,Iin=Iload+IQ,从规格书上可知,其静态电流约为6mA,这样+12V外部电源的负载电流为50mA+6mA=56mA。
要注意的是,对DC-DC电源,其输入电流和输出电流需要从功率的角度通过效率来换算;
从规格书上还不难得知,LDO的最小压差的最大值为1.10V,即输入电压要达到3.3V+1.1V=4.4V以下,LDO才能稳定输出+3.3V的电压。
根据这些参数, +12V输入电源两端的电解电容C1需要取多大的容值才可能正真的保证在断电50ms之内,+3.3V的电源电压稳定,从而负载正常工作。
通过仿真软件,用示波器测量断电之后LDO输入电压的波形,可知当电容以恒定的56mA的电流放电,放电到LDO稳定输出+3.3V的电压4.4V所对应的时间为49.9mS,与理论分析一致。
铝电解电容器的电气性能参数受温度影响:随着温度的降低,电解液的粘度增加,从而使其导电性能降低,因此,温度降低时电容量会减小,温度上升时电容量增加,且此现状比别的类型的电解电容器更加明显;
理论计算得到368uF的实际容量需求,应该选用368F/70%=525uF的电容,可选择680uF的电容;
在第一部分中,根据测算得到的负载电流,设备正常工作的最低电压,瞬断时间要求,通过电容的电流电压关系推算出电容的容值;并通过电源瞬断试验进行验证。
处理器的中断资源有限,正常的情况中中断处理函数仅用于实时性要求非常高的业务;
所以断电检测以及将RAM数据写入EEPROM或者FLASH一般都在主程序中完成;
代码中不能有while等死等待,比如软件延时,死等ADC完成等硬件标志。
在发生断电时,有可能需要耗费这些时间以后才执行输入电压检测以及保存数据的程序;
写1个word数据的时间最长时间为70us,保存50个word的数据的最长时间为3.5ms;
如果还需要同时备份一组数据的线个word数据断电记忆的总时间高达87ms;
显然50ms的维持时间不满足采用STM32F103处理器的内部FLASH的断电记忆的要求。
即使不额外备份一组数据,要求考虑了总的中断时间以后,主程序在在3ms之内轮询一次,也是难以做到的。
如果采用外置的SPI FLASH,比如MX25L系列,其只支持以sector(4KB)为单位的擦除操作,所要消耗的时间最短为40ms, 最长为200ms,显然无法在50ms的时间内完成断电记忆;
如果采用EEPROM,比如AT24C系列,可以按页写入,即通过IIC通信发送一页数据之后,再启动写入操作,这样写入的时间能达到5ms左右;
容量为8KB的AT24C64一页的大小为32Byte,即写入32个Byte,考虑400kbps波特率的通信时间,总耗费约6ms,写入100个字节的数据,大概耗时约18ms,即使再备份一组数据,也能在36ms内完成,从而轮询一次主程序的最大时间为14ms,这是努力一把可以做得到的;
如果不计成本,用铁电存储器当作非易失存储器,那就可以不受限制随时写入了;
一些外部输入的高速计数,比如生产线上的生产计件,假设一秒内有1次计数,如果数据变化就写入非易失存储器,则1秒内大概会擦写1次;大概2天擦写次数就会达到16万次。
采用STM32F103处理器的内部FLASH,通过检验测试电源电压进行断电记忆需要满足至少100ms左右的瞬间要求;
采用大容量的EEPROM,满足50ms的电源瞬断要求,可能能做到断电记忆。
如果成本没有压力,能够使用铁电存储器做断电记快功能,铁电存储器没有写入次数的限制,不需要检测断电,可以存储写入,而且写入的速度很快,不需要仔细考虑写入时间;
上图是一个简单的电源电压检测电路,将电源电压通过电阻分压之后接到MCU的ADC口。
二极管D1除了电源防反接保护之后,还能够尽可能的防止电容C1上的电压反灌到输入电源检测电路,使得断电之后,能马上被检测到;
1)检测电路的工作电流,以智能灌溉的阀门控制器为例,该设备由9V碱性电池供电,实测大概为400mAh的容量;
根据设定的定时浇灌逻辑,利用RTC的Alarm功能每天定时唤醒,驱动阀门打开浇水,
驱动电流大概为500mA,驱动时间大概为1s,执行一次消耗电量为0.14mAh,一天执行三次总耗电为0.42mAh;
而该电源电压检测电路的平均工作电流约为64uA,一天消耗的电量为1.54mAh,远大于单片机睡眠功耗,加上该电流,电池仅可使用180天左右;
虽然增加R2的阻值能够大大减少检测电路的电流,然而,阻值大的电阻精度差,而且PCB板的表面绝缘电阻也会对测量精度造成影响。
2)MCU的端口保护,在这一电路中,MCU的端口通过分压电阻R2到了外部;
当有静电放电、电磁干扰、闪电、接地不良、感性负载切换等情况出现时,可能有浪涌电压或者浪涌电流从外部串入MCU;
正电压可以在D1导通之后由C1、C2吸收,但是由于D1导通需要响应时间以及走线的寄生电感的影响,不可避免会有高压脉冲串入IO口;
电源的电压越高,R3两端的分压值也越大,当该分压值超过MCU的工作电压与MCU端口的上拉保护二极管的正向导通电压之和,
假设电源电压为Vin,MCU的工作电压为V+3.3V,MCU内部上,下拉保护二极管的导通电压为Vf,流过MCU内部二极管为Iin,则满足下面关系式:
针对这一些状况,靠近MCU IO口放置的小电容能够更好的起到至关重要的保护作用;
电容两端的电压不能突变,输入电压通过R2,R3向电容充电,时间常数τ为,
应该保证在高压脉冲维持的时间内,电容两端的电压不能被充至让MCU的内部保护二极管导通;
1)如果防护电压高达几千V,维持的时间达几十us以上的浪涌电压,避免其对MCU造成损失破坏,所需的电容容值比较大;
2)出于保护目的,选择了大电容,同时会导致电容放电时间慢,导致MCU无法及时检测到断电,为实现断电记忆,有更长的瞬断时间要求 ;
MCU的IO口输出高、低电平通过Q1以及Q2控制电源电压检测电路的通路;
只有在需要检测时,才输出高电平,使能Q1、Q2导通,电源电压经过R2,R6分压之后送入ADC口进行仔细的检测,如果由电池供电,这时才会消耗电池电量。
与上一个电路相比,少了一个PNP三极管以及两个电路,能节约大几毛钱,蚂蚁脚也是肉,摘下口罩之后,大形势不明朗,能省一点是一点。
该电路设计要点在于选择正真适合的基极、集电结、发射结的电阻,使得三极管Q1处于饱和导通状态;
取电流放大倍数β的最小值为50,Vin的最大值为20V,则右式的最小值为219kΩ;