电量检测思想之软件施密特触发器

      问题来源?

      很多搞电子的朋友在做项目的时候基本上都会遇到用MCU的ADC采集电压来监视电量使用情况。作为一种粗略的电量检测方法在很多电子设备上用得很广泛,尤其是需要显示类似电池图标的方法来显示电量。我们都知道通过检测电压的方法来监视电量只能大概知道使用的一个范围,而且电压一般随时会有小幅波动。这里举个例子,假设我们要显示四格电池的图标。电压区间范围设置为小于A设备关机,A-B电池显示空,B-C电池显示一格,C-D电池显示两格,D-E电池显示三格,大于E电池显示4格(即满格)。现在会遇到这种麻烦,假设某一时刻采集到的电压刚好使图标显示三格(即电压值为D),我们知道电压随时是有小幅波动的,在这种情况下电压值可能会在D的附近来回跳动,导致的结果是电池图标一会儿显示两格,一会儿显示三格。那么如何解决这个问题呢?这时候就要用到施密特触发器的思想I

什么叫施密特触发器?

门电路有一个阈值电压,当输入电压从低电平上升到阈值电压或从高电平下降到阈值电压时电路的状态将发生变化。施密特触发器是一种特殊的门电路,
与普通的门电路不同,施密特触发器有两个阈值电压,分别称为正向阈值电压和负向阈值电压。在输入信号从低电平上升到高电平的过程中使电路状态发
生变化的输入电压称为正向阈值电压,在输入信号从高电平下降到低电平的过程中使电路状态发生变化的输入电压称为负向阈值电压。正向阈值电压与负向阈值电压之差称为回差电压。
它是一种阈值开关电路,具有突变输入——输出特性的门电路。这种电路被设计成阻止输入电压出现微小变化(低于某一阈值)而引起的输出电压的改变
何谓软件施密特触发器?
软件施密特触发器就是利用上面所说的施密特触发器原理。这里我直接写一段代码来说明问题。
unsigned char level = 0; //表示电压档位
unsigned int Read_adc = 0;
Read_adc = Function_get_adc(); //经过多次采样去最大最小取平均值
if(level == 0){
if(Read_adc >= B + 2) { //这里的2是随便设定的,可以根据实际情况更改
level = 1}}
if(level == 1){
if(Read_adc >= C + 2){
level = 2;}else if(Read_adc < B - 2){
level = 0;}}
if(level == 2){
if(Read_adc >= D + 2){
level = 3;}else if(Read_adc < C - 2){
level = 1;}}
if(level == 3){
if(Read_adc >= E + 2){
level = 4;}else if(Read_adc < D - 2){
level = 2;}}
if(level == 4){
if(Read_adc < E - 2){
level = 3;}}
这里的“B+2”和“B-2”(以B为例)就是上面所说的回差。
希望对用到这方面内容的朋友有所帮助,如有不对之处烦请指正,谢谢大家!





你可能感兴趣的:(嵌入式开发)