1、单限比较器和滞回比较器的区别
在单限比较器中,输入电压在阈值电压附近的任何微小变化,都会引起输出电压的跃变。不管这种微小变化是来源于输入电压还是来源于外部干扰。因此,虽然单限比较器很灵敏,但是抗干扰能力差。在单限比较器中加入正反馈,反相输入端接输入电压,可以做成滞回比较器。它具有惯性,看上去反应比较“慢”,对微小变化不敏感,有一定的抗干扰能力,因此称为滞回比较器。
单限比较器只有一个阈值,当输入信号超过这个阈值时,输出状态会改变。一旦输入信号回到阈值以下,输出状态会立即改变回来。如果在一些敏感的场合可能会造成信号不稳定。
滞回比较器具有内部的正反馈回路,这意味着输出状态取决于输入信号的历史状态。当输入信号超过设定阈值时,输出状态会改变,并且会保持在这个状态,直到输入信号降低到另一个设定的阈值才会再次改变。
滞回比较器可以减少由于输入信号的微小波动而引起的输出状态的不稳定性,因此常用于抗干扰性能要求较高的应用中,如传感器信号处理和开关控制等。
2、电池电压测量
(1)采用单限比较器方式实现
采样单限比较器方式实现如果电池电压处于临界值,或者大负载开关时,可能造成电池图标闪烁,一会显示两格,一会显示三格。
BBU_BAT_E FUNC_BBU_BatStatusGet(void)
{
float adc_data = 0;
VccVoltage = BSP_ADC_VccVoltage();
//The "4" in the formula is obtained from the hardware, and the partial voltage resistance is 3M and 1M
adc_data = (float)BSP_ADC_DataGet(BSP_ADC_BAT)*100*VccVoltage/4096*4.1f;
/*
0 ~~~~~~~~~2.52~~~~~ 3.1 ~~~~~ 3.4 ~~~~~~ 3.8~~~~~~~ 4.2
\ CLOSE \ NULL \ LOW \ MID \ HIGH \
*/
if(adc_data > 380)// >3.8
{
return BAT_HIGH;
}
else if(adc_data > 340)//3.4~3.8
{
return BAT_MID;
}
else if(adc_data > 310)//3.1~3.4
{
return BAT_LOW;
}
else if(adc_data > 252)//2.52~3.1
{
return BAT_NULL;
}
else
{
return BAT_CLOSE;
}
}
(2)采用滞回比较器实现
采用滞回比较器方式实现比较可靠,输出状态在电压发生变化后不会立即改变状态,而会在改变到一定阈值后才会发生改变,阈值取值合适,电池状态就不会在临界值发生跳变了。
#define CLOSE_VALUE 252
#define NULL_VALUE 252
#define LOW_VALUE 310
#define MID_VALUE 340
#define HIGH_VALUE 380
#define VOL_HYSTERESIS 10 /* hysteresis comparator*/
BBU_BAT_E FUNC_BBU_BatStatusGet(void)
{
float adc_data = 0;
VccVoltage = BSP_ADC_VccVoltage();
//The "4" in the formula is obtained from the hardware, and the partial voltage resistance is 3M and 1M
adc_data = (float)BSP_ADC_DataGet(BSP_ADC_BAT)*100*VccVoltage/4096*4.1f;
/*
0 ~~~~~~~~~2.52~~~~~ 3.1 ~~~~~ 3.4 ~~~~~~ 3.8~~~~~~~ 4.2
\ CLOSE \ NULL \ LOW \ MID \ HIGH \
*/
if(adc_data > (HIGH_VALUE+VOL_HYSTERESIS))// >3.8
{
BatStatus = BAT_HIGH;
}
else if((adc_data<HIGH_VALUE)&&(adc_data > (MID_VALUE+VOL_HYSTERESIS)))//3.4~3.8
{
BatStatus = BAT_MID;
}
else if((adc_data<MID_VALUE)&&(adc_data > (LOW_VALUE+VOL_HYSTERESIS)))//3.1~3.4
{
BatStatus = BAT_LOW;
}
else if((adc_data<LOW_VALUE)&&(adc_data > (NULL_VALUE+VOL_HYSTERESIS)))//2.52~3.1
{
BatStatus = BAT_NULL;
}
else if(adc_data < NULL_VALUE)
{
BatStatus = BAT_CLOSE;
}
return BatStatus;
}