请问PFS122B是如何利用内部参考电压反推VDD的?

在一些电池产品设计中,往往需要单片机去检测电池电压的使用情况。在以往的设计中,多少设计者会利用一路ad输入口来对电池分压,然后检测分压点的电压来计算vdd的值是多少。如图所示:
采用这种方法计算vdd的优点是精度相对较高,缺点是会消耗静态电流和占用一个ad口。所以在后来的设计中,设计者往往直接把电池的电压接在mcu的vdd上,然后通过内部提供的一路或者多路参考电压来计算vdd。以利用内部1.2v作为一路ad输入为例,当设置vdd为ad转换参考的参考电压,那么在不同的vdd时,对1.2v参考电压转换的结果不一样。
如果ad为12位数字精度,那么vdd对应的值为 vdd= 1200*4095/ad转换值。其他的参考电压1.6v,2.0v,2.4v计算方式类似。一般普通的锂电池电压,在使用过程中的电压值会是3.0v~4.25v之间,低于3.0v会被做低压保护处理,不让用户继续使用该产品,以起到保护电池的作用。
因为pfs122b,内部具有多路的参考电压,1.2v,1.6v,2.0v,2.4v,3.0v,4.0v等。考虑到电池放电的低压情况,一般参考电压用到2.4v以下就可以了。因为当vdd都没有参考电压高时,参考电压的实际值肯定也不准了,这时已经失去了参考的意义。
为了比较一下看看pfs122b,采用哪种参考电压反推vdd的效果会更好,我做了一个实验。实验利用pfs122b一个io口输出显示数据,其他只接vdd和gnd,利用内部的参考电压来计算测试的vdd值。实验的adc采样只是简单地做了16次短时间内求平均的方法。单次采集的数据并没有取中间值:
voidget_16_ad (void)
{
word ad_temp;
word ad16;
byte cnt;
ad_start=1;//skip first adc, can delete by your select
while(!ad_done)
{
nop;
}//
   ad16=0;
cnt=16;
do
{
  ad_start=1;//skip first adc, can delete by your select
  while(!ad_done)
  {
  nop;
   }// 
// 
ad_temp = adcrh 4;      
//    get_middle_adc_from_3();
//ad16    += adcr;8bit
.wdreset; 
} while (--cnt);
adc_result=ad16 >> 4;// >> 4;
}
adc初始化做了很多种设置:
void    ad_init(void)
{
/*
       $ adcm /2, 12bit;
       $ adcc enable, adc;//pb7 通道
       $ adcrgc vdd; // */
       $ adcm 12bit,/8;
       $ adcc enable, adc; 
       switch(sys_mode)
       {
        case 0:
        {
        $ adcrgc vdd,adc_bg,bg_1v2; //  
        break;
        }
        case 1:
        {
        $ adcrgc vdd,adc_bg,bg_1v6; //  
        break;
        }       
        case 2:
        {
        $ adcrgc vdd,adc_bg,bg_2v; //  
        break;
        }       
        case 3:
        {
        $ adcrgc vdd,adc_bg,bg_2v4; //  
        break;
        }       
        case 4:
        {
        $ adcrgc 2v,adc_vdd/4; //  目前看起来是这种设置,利用内部2v参考电压,转化1/4vdd效果更为理想。
        break;
        }       
        default:
        {
        $ adcrgc vdd,adc_bg,bg_1v2; //  
        break;
        }       
        }
       .delay 1600;//延时400us      
}
实验照片结果比较,当ad转换的高电压为vdd时,直接采用内部1.2v作为一路输入的误差最大,2.4v作为一路输入的误差最小。但是这种效果,还是没有采用内部2v作为ad转换的参考高电压,利用1/4vdd作为输入读取的结果值更为接近实际值。
利用vdd做ad转换高电压,内部1.2v作为一路输入的误差约60mv。
利用vdd做ad转换高电压,内部1.6v作为一路输入的误差约50mv。
利用vdd做ad转换高电压,内部2.0v作为一路输入的误差约40mv。
利用vdd做ad转换高电压,内部1.2v作为一路输入的误差约30mv。
利用内部2v做ad转换高电压,1/4vdd作为一路输入的误差约15mv。
这可是相当的准确了,检测误差有时在10mv以内。


175°C室温下的高温数据采集参考设计
超声波封尾机是什么,它的应用特点都有哪些
Acrel-2000E配电室综合监控系统设计方案
老牌家电巨头发起设立20亿半导体产业股权投资基金
什么是5G技术?这篇文章讲得很详细
请问PFS122B是如何利用内部参考电压反推VDD的?
ZiKKO(即刻)AK2800移动电池携带方便仅售450元
什么是超级电容器?超级电容有什么特殊的性能?
诺基亚6真机上手评测:低配高价,你怎么看?
苹果ios 16将新增交互方式,不支持3GB运行内存以下的机型
IBM :量子计算有望在 2023 年进入市场
引领考试数字化,拓维信息旗下海云天科技精彩亮相第81届中国教育装备展
NVIDIA的RTX2060显卡获得了2019我最喜欢称号
一加官方放出的图像信息制作的一加7Pro的高清渲染图
车载双通道远端天线LDO/开关的外部元件选择
为什么做百度爱采购 让效果说话
康美特科创板IPO获受理!募资3.7亿加码半导体封装材料
“暂停NOIP”将引起哪些影响?
苹果针对无法升级iOS 13的设备推送iOS 12.4.2更新
自行车码表如何进行密封性测试