打印
[STC单片机]

STC15W4K利用BandGap电压精准测量外部输入电压

[复制链接]
6090|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
paul9ic|  楼主 | 2017-7-28 10:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、源码部分采用的是stc15.pdf文件中的"10.10 利用BandGap电压精准测量外部输入电压"小节里的源码;
2、电源采用的是5v的TTL电压(3.7v的锂电也测试了)
3、实验现象
     1)BandGap基准电压分别从Ram和Rom中读取,其值为1.243v;
     2)ADC转换结果分别测试了8位和10位两种,
        8位时BandGap的ADC测量值为90左右变化;
        10位时BandGap的ADC测量值为420左右变化;
     3)输入电压的ADC测量值,在8位和10位两种结果时分别为
       8位时为255;
       10位时为1023;
4、结论
   根据分式输入电压Vx=Vram * ADCx / ADCbg= 1.243 * 255/ 90 = 3.521v;
   而实际的供电电压为4.99v;
   ADC来测量计算出来的电压与实际电压相差4.99-3.521=1.468v
   差了1.5V!!!???
  

  

相关帖子

沙发
一周一天班| | 2017-7-28 13:16 | 只看该作者
ADC接10V,8位是一定是255,不信你试试。

使用特权

评论回复
板凳
paul9ic|  楼主 | 2017-7-28 13:38 | 只看该作者
  刚刚在ADC采样端口上加了一个电位器来模拟输入电压,发现这回ADC测量电压变化了,难道采样端接电源正极ADC测量到的电压只能是最大值1023或8位的255?
  实验的结果是这样的。如果stc是这样设计的,那BandGap根本无法精准测量外部供电电压,除非把ram或rom中的基准调整成反推出来的正确值,我这里推出的值为1.9左右,
  那么现在问题来了,如果换一个同款芯片呢?1.9会适用吗?

使用特权

评论回复
地板
hp34401a| | 2017-7-28 14:04 | 只看该作者
看官方例程吧

使用特权

评论回复
5
一周一天班| | 2017-7-28 17:54 | 只看该作者
你测试方法是错误的。ADC加个1V电压测试。

使用特权

评论回复
6
paul9ic|  楼主 | 2017-7-28 18:01 | 只看该作者
一周一天班 发表于 2017-7-28 17:54
你测试方法是错误的。ADC加个1V电压测试。

ADC加个1V电压测试,是什么意思?

使用特权

评论回复
7
一周一天班| | 2017-7-29 08:41 | 只看该作者
电位器调整,万用表测量到1v,这时你再用公式去计算准不准。你之前加的测试电压已经超出ADC范围。

使用特权

评论回复
8
paul9ic|  楼主 | 2017-7-29 10:02 | 只看该作者
本帖最后由 paul9ic 于 2017-7-29 10:03 编辑
一周一天班 发表于 2017-7-29 08:41
电位器调整,万用表测量到1v,这时你再用公式去计算准不准。你之前加的测试电压已经超出ADC范围。 ...

我在二楼的回复已经实验过了你说的这种方法。
我要说明的是,如果ADC的采样脚(如P1.1)接的是Vcc,那么基准电压再使用BandGap从Ram或Rom中读出来的1.243v是不能计算出实际的供电电压的,只有使用公式Vx=Vram * ADCx / ADCbg来反推出正确的Vram基准电压4.9v后才可以计算出真实的供电电压。

这也就是说ADC采样脚如果接的是供电电源正极,那么ADC测量的电压必定是最大值1023(10位结果;或255的8位结果),所以结论是采用BandGap的基准电压(Ram或Rom中存储的1.243v)是无法通过BandGap来获得准确的供电电压的。

使用特权

评论回复
9
paul9ic|  楼主 | 2017-7-29 10:10 | 只看该作者
一周一天班 发表于 2017-7-29 08:41
电位器调整,万用表测量到1v,这时你再用公式去计算准不准。你之前加的测试电压已经超出ADC范围。 ...

所谓的ADC范围,本质上就是基准电压大小。而基准电压是ADC采样脚接VCC时的电压。
举例来说,如果供电电压是5v,那么基准电压也是5v,ADC的范围也是5v。

使用特权

评论回复
10
paul9ic|  楼主 | 2017-7-29 10:18 | 只看该作者
paul9ic 发表于 2017-7-29 10:10
所谓的ADC范围,本质上就是基准电压大小。而基准电压是ADC采样脚接VCC时的电压。
举例来说,如果供电电压 ...

最终结论,stc15.pdf文件中10.10节给出的例子是用来测试外部输入电压的,不是用来测试自身供电电压的。ADC也不能用来测试芯片自身的供电电压。

使用特权

评论回复
11
一周一天班| | 2017-7-29 11:11 | 只看该作者
难道不不考虑运放,ADC模拟电路的失调范围吗,差点ADC给个0.1-0. 2V.

使用特权

评论回复
12
一周一天班| | 2017-7-29 11:12 | 只看该作者
怎么也不可能给VCC去测试。

使用特权

评论回复
13
一周一天班| | 2017-7-29 11:15 | 只看该作者
你把ADC当运放跟随器看待,运放输入VCC输出会如何

使用特权

评论回复
14
一周一天班| | 2017-7-29 11:17 | 只看该作者
本帖最后由 一周一天班 于 2017-7-29 11:20 编辑

正常的ADC基准都小于电源电压,如果基准等于电源电压(非标准)就必须考虑到这个失调有无影响。

使用特权

评论回复
15
hp34401a| | 2017-7-29 12:05 | 只看该作者
paul9ic 发表于 2017-7-29 10:18
最终结论,stc15.pdf文件中10.10节给出的例子是用来测试外部输入电压的,不是用来测试自身供电电压的。ADC ...

不要急着下结论,深入理解了再说。百度一下也行啊

使用特权

评论回复
16
coody| | 2017-7-31 18:07 | 只看该作者
说STC15W4K不能通过测试BandGap对应的ADC来计算VDD电压的朋友,是你没搞懂。

我的四轴遥控器,就是使用STC15W4K48S4,锂电池直接供电到VDD(3.5~4.2V之间),然后读BandGap对应的ADC值(STC称之为“第9通道”),比如读出值放变量ADC9,BandGap电压我是使用1.25V,则,VDD电压就是125*1023/ADC9,结果放大了100倍(避免浮点运算),然后将电池电压显示出来,并作为低压报警的判断依据,精度一般在0.03V之内。
比如,读数ADC9=327,则:
电池电压(就是MCU的VDD电压)=125*1023/327=391,表示电压是3.91V。

使用特权

评论回复
17
12864| | 2017-8-4 04:22 | 只看该作者
看了你的帖子,我也决定校正AD数值,结果对第9通道采集的数据始终是1023啊,模拟通道采集数据是对的,真的好奇怪,我的芯片是15W408AS


//返回指定模拟输入通道_ch的模拟电压值,单位mV
//调用之前,对应_ch通道的引脚要先设置为纯输入
unsigned int chip_AD(unsigned char _ch)
{
         unsigned int _data, adc_bg;

   _ch &= 0x07;  // _ch取值范围0-7,本芯片只有P1口的8个AD输入通道
       

         ADC_RES = 0;
   ADC_RESL = 0;
   P1ASF = 0x00;
   ADC_CONTR = 0xE8;
   _nop_();_nop_();_nop_();_nop_();_nop_();
         while((ADC_CONTR & 0x10) == 0);  // 等待AD结束,大约90个机器周期
         ADC_CONTR &= ~0x10;
   adc_bg = ADC_RES;
   adc_bg = adc_bg << 2;
   adc_bg += ADC_RESL & 0x03;
       
   ADC_RES = 0;
   ADC_RESL = 0;
   P1ASF = 1 << _ch;
         ADC_CONTR = 0xE8 | _ch;     // 启动AD,通道_ch, 如通道2就是0xEA
         _nop_();_nop_();_nop_();_nop_();_nop_();
         while((ADC_CONTR & 0x10) == 0);  // 等待AD结束标志,大约90个机器周期
         ADC_CONTR &= ~0x10;  // 清除AD结束标志
         _data = ADC_RES;
         _data = _data << 2;
         _data += ADC_RESL & 0x03;
                
         //return (unsigned long)Vbg_ROM * (unsigned long)_data / (unsigned long)adc_bg;
         return adc_bg;

}


问题在哪儿呢?

使用特权

评论回复
18
12864| | 2017-8-4 15:49 | 只看该作者
问题找到了,外晶体下,对第九通道基准的ADC读数都是1023,八竿子打不着的关系,偏偏就成立,奇葩啊。吐槽的人还不少呢。
http://bbs.mydigit.cn/read.php?tid=1635508&page=1

使用特权

评论回复
19
12864| | 2017-8-4 17:37 | 只看该作者
回到楼主的问题上来,楼主电源是4.99V,那么采集1.243V时:
8bit理想采样值应该是63,而楼主采到是90,大了42%;
10bit采样理想值应该是254,而楼主采到420,大了65%

这才是问题所在。

我在外晶体下,3.3V供电,1.24V计算理想采样值是384,分2种情况测量:
1、P1.0是准双向口,那么P1ASF=0之后,对0通道采样,这就是所谓的第九通道,每次采集的数据都是1023。
2、但如果把P1.0设置为纯输入,那么采集的数据就是330,不稳定,跳变较大。
仅对第九通道是如此,对正常模拟通道采集,数据和理论值相符。

问下楼主,你是内部RC还是外晶体?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

0

粉丝