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