找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9759|回复: 22
收起左侧

关于STC单片机的ADC问题请教

  [复制链接]
ID:612392 发表于 2020-9-13 21:16 | 显示全部楼层 |阅读模式
20黑币
各路大神,关于STC的51单片机的ADC有个问题一直不解。
以STC15W408AS-5V单片机为例,本身自带10位ADC。
当单片机的供电是5V的情况下,ADC采回数值为0xFF的时候,基本代表被采集电压是5V。
但是当单片机的供电电压不足5V,例如低到手册上的下限3.6V时,此时如果ADC采集数值是0xFF,那么这时候代表的电压是5V还是3.6V?我的理解应该是3.6V。
3.3V的单片机是同理吗?
我的场景是用电池直接供电,供电范围是2.5V-3.5V。如果随着电压的变化,ADC满量程代表的电压值是一直在变化的,怎么确定基准电压呢?用所谓的bandgap值可靠吗?不想再增加 TL431之类的基准源。
对于各位的回复,感激不尽。

最佳答案

查看完整内容

stc官方的数据手册说是1.27V左右,连它自己都是用"左右"这个词语,可想而知它是有一定误差的 不管你用多少电压供电,10位ADC都是1024个数字量,就是0-1023 你想利用内部参考电压来测量VCC,这个是可以的,但是,由于制造参数的误差,最终的结果会有正负0.15V左右的误差,这个是我实际使用测试得来的结果,一共测试了5PCS,没有一个是完全在1.27V的 如果你要完全达到10位ADC的精度,那就得按照STC官方的方法:先测试内部电压的ADC值,然后再以 ...
回复

使用道具 举报

ID:151846 发表于 2024-2-3 08:26 | 显示全部楼层
Y_G_G 发表于 2020-9-14 11:28
这0.15V的误差是制造误差,并不是精度误差,要区分
单片机本身的ADC精度依然是保持着10ADC的精度,但BandGa ...

烧录stc15w单片机时不是有基准电压显示吗?
回复

使用道具 举报

ID:624769 发表于 2021-9-13 15:20 | 显示全部楼层
Y_G_G 发表于 2021-8-6 12:34
STC的单片机并不是都像你说的那样的
至少STC15W408AS不是,在数据手册中并没有读取EEPROM内部参考电压的 ...

看你们挖坟挖的不亦乐乎,我也来两铲子,

STC15系列,已经有读取内部参考电压了,和8系列一样,可以从RAM读,也可以从CODE 读,只不过,本来是记录在ISP里面的,下载时够选 末尾添加重要参数,才会写入Code区,当然,不管是否写入,单片机开机后,都能第一时间从RAM中读出来,因为是两个字节终究是需要读出来再加工的,所以,我一般懒得再去CODE绕了,开机先用指针把基准电压处理一下换个地方存好备用就是了。
关于准不准的问题,STC15系列,STC8系列都是 出厂时校准过的,我手里8PCS 15W408AS, 和30PCS 15W204S 其他一两片的型号就不举例了,分别读取它们的出厂基准电压,发现并不是完全相同的,说明确实是实际测量后写入的,而不是随便给个参考值。
而强调“精准电源”是基于你不用内部基准电压校准的前提下。要是按你所说的逻辑去分析的话,STC8A 系列,STC8H系列,为什么还要外部基准电压输入引脚?是因为,STC8系列做到这些这些型号了,内部参考电压反而不如8F系列 8G系列精准了?
回复

使用道具 举报

ID:839875 发表于 2021-9-13 12:14 | 显示全部楼层
adc的基准电压就是您单片机的供电电压,所以供电电压必须稳定
回复

使用道具 举报

ID:401564 发表于 2021-8-6 12:34 | 显示全部楼层
ploestar 发表于 2021-8-5 23:13
挖个坟,这个值出厂已经校准过,并且写到了eeprom里面了,内存里也有,你只要读取就好了,根本没看过手册 ...

STC的单片机并不是都像你说的那样的
至少STC15W408AS不是,在数据手册中并没有读取EEPROM内部参考电压的例程
而且,下载那是你选择之后会把参考电压值写入RAM,但并没有说明那是精确的内部参考电压
还有,如果是已经有了,那么,数据手册中强调的一定要很精准的电源来干嘛?不是多此一举吗?
我读取过程序存储器最后的内部电压,用来作为低电压检测功能,并不准确
所以,我现在用来DIY的单片机选择了STC8G系列,这个系列的内部参考电压是相对准确的
回复

使用道具 举报

ID:346329 发表于 2021-8-5 23:13 来自手机 | 显示全部楼层
cjjdemon 发表于 2020-9-14 20:11
谢谢,那如果这个产品量产,出货前还需要对BandGap再进行1次校准,把准确值写到EEPROM里,每次ADC采样都 ...

挖个坟,这个值出厂已经校准过,并且写到了eeprom里面了,内存里也有,你只要读取就好了,根本没看过手册吧,烧录的时候,日志里面也有显示,厂家说的1.27左右,这个左右指的是对于芯片与芯片之间不固定,就是2颗芯片可能不同,单个芯片,这个值永远是固定的
回复

使用道具 举报

ID:612392 发表于 2020-9-15 19:08 | 显示全部楼层
Y_G_G 发表于 2020-9-15 16:30
是这么搞的了
如果是要防止误触发,还会把一个已经校准过的标志位写入EEPROM,说明已经校准过了,下次再按 ...

都是有实战经验的大佬!!感谢,大概明白怎么处理了。谢谢
回复

使用道具 举报

ID:147710 发表于 2020-9-15 18:53 | 显示全部楼层
Y_G_G 发表于 2020-9-15 16:30
是这么搞的了
如果是要防止误触发,还会把一个已经校准过的标志位写入EEPROM,说明已经校准过了,下次再按 ...

这个主意好!
回复

使用道具 举报

ID:401564 发表于 2020-9-15 16:30 | 显示全部楼层
XTXB 发表于 2020-9-15 16:05
多谢指点!是STC8G,平时用的精度要求没那么高,所以没怎么留意,原以为芯片出厂时保存的那个BGVx每个值 ...

是这么搞的了
如果是要防止误触发,还会把一个已经校准过的标志位写入EEPROM,说明已经校准过了,下次再按这个按键也不会触发校准程序了
回复

使用道具 举报

ID:147710 发表于 2020-9-15 16:05 | 显示全部楼层
Y_G_G 发表于 2020-9-15 12:00
哥们,你说的这个应该是STC8G系列的吧,楼主用的是STC15W系列的,并不一样的,而且,STC15W系列的官方手册也是 ...

多谢指点!是STC8G,平时用的精度要求没那么高,所以没怎么留意,原以为芯片出厂时保存的那个BGVx每个值都不一样,应该是出厂时校准过的,想不到误差竟然有这么大!之前一直还纳闷,既然你已校准,干嘛还要我们再测量标定呢?
看了你的说明,看是不是这样的操作思路:接个按键,在程序中加一段代码,接上精准电源,按下按键,得到标定的BandGap值,自动存入eeprom,以后就利用这个标定值计算,而不用出厂BGVx值。
回复

使用道具 举报

ID:401564 发表于 2020-9-15 12:00 | 显示全部楼层
XTXB 发表于 2020-9-15 10:36
实际生产中,每片都要校准,感觉操作起来比较困难,实际上STC出厂时1.19V基准已校准,1%精度就是10mv左右, ...

哥们,你说的这个应该是STC8G系列的吧,楼主用的是STC15W系列的,并不一样的,而且,STC15W系列的官方手册也是已经说明了利用内部参考电压测量VCC的方法
而且,我在实际使用中也是测量到这个误差的,但这是制造误差而已,精度是有的,这个1.27V的参考电压,有个别的是1.21V左右,误差是0.05V左右,如果是3.6V的电压,换算出来的VCC就会有0.15V左右
每次校准其实也没有那么麻烦的,烧录电压准确就可以一次搞定的
51hei截图20200915115010.jpg

回复

使用道具 举报

ID:147710 发表于 2020-9-15 10:36 | 显示全部楼层
实际生产中,每片都要校准,感觉操作起来比较困难,实际上STC出厂时1.19V基准已校准,1%精度就是10mv左右,这个精度不知道能不能满足你的需求,如果不能,外界基准源会更省事一些。
adc.jpg

这个是我用内部BandGap做的电压表:
51hei图片_20200915101345.jpg

回复

使用道具 举报

ID:401564 发表于 2020-9-14 23:23 | 显示全部楼层
cjjdemon 发表于 2020-9-14 20:11
谢谢,那如果这个产品量产,出货前还需要对BandGap再进行1次校准,把准确值写到EEPROM里,每次ADC采样都 ...

可以在程序里写入的,第一次运行,或者是按下某个按键就进行校准,然后就把这个值写入EEPROM,以后都是按照这个值来作为参考就可以了
回复

使用道具 举报

ID:612392 发表于 2020-9-14 20:11 | 显示全部楼层
Y_G_G 发表于 2020-9-14 11:28
这0.15V的误差是制造误差,并不是精度误差,要区分
单片机本身的ADC精度依然是保持着10ADC的精度,但BandGa ...

谢谢,那如果这个产品量产,出货前还需要对BandGap再进行1次校准,把准确值写到EEPROM里,每次ADC采样都进行一次修正。
回复

使用道具 举报

ID:401564 发表于 2020-9-14 11:28 | 显示全部楼层
cjjdemon 发表于 2020-9-14 09:26
感谢回复,所以说,利用TL431做一个基准电压,对于电池供电的ADC是很有必要的了。

这0.15V的误差是制造误差,并不是精度误差,要区分
单片机本身的ADC精度依然是保持着10ADC的精度,但BandGap的电压并不是绝对的数据手册上说的1.27V,它可能是1.17到1.37V之间,这个值在某个单片机中是固定的,最终的结果就会有0.15V左右的误差
所以,如果你要使用内部的参考电压测量的时候,要要按照官方的数据手册上的方法去使用
先是在VCC为5.00V的高精度电源下测量到BandGap的AD值,就可以知道这个BandGap的电压是多少了,以后计算就以这个计算得来的电压做参考电压
并不需要TL431的,也不用多次测量的,只要一个程序就可以了呀
回复

使用道具 举报

ID:612392 发表于 2020-9-14 10:43 | 显示全部楼层
hsl32 发表于 2020-9-14 10:07
有内部BandGap,就不TL431了,AD基准用VCC,用一路AD测内部BandGap,然后换算出当前的VCC。电池供电我不 ...

是的,我也是基于功耗的考虑,不希望增加此类硬件。但用内部BandGap,楼上有人说有+/-0.15V的精度问题,你在实际使用BandGap作为参考,实际计算ADC采样后的偏差会有多大呢?
回复

使用道具 举报

ID:767423 发表于 2020-9-14 10:07 | 显示全部楼层
cjjdemon 发表于 2020-9-14 09:26
感谢回复,所以说,利用TL431做一个基准电压,对于电池供电的ADC是很有必要的了。

有内部BandGap,就不TL431了,AD基准用VCC,用一路AD测内部BandGap,然后换算出当前的VCC。电池供电我不喜欢外接基准,增加功耗。
回复

使用道具 举报

ID:310961 发表于 2020-9-14 09:29 | 显示全部楼层
stc官方的数据手册说是1.27V左右,连它自己都是用"左右"这个词语,可想而知它是有一定误差的
不管你用多少电压供电,10位ADC都是1024个数字量,就是0-1023
你想利用内部参考电压来测量VCC,这个是可以的,但是,由于制造参数的误差,最终的结果会有正负0.15V左右的误差,这个是我实际使用测试得来的结果,一共测试了5PCS,没有一个是完全在1.27V的
如果你要完全达到10位ADC的精度,那就得按照STC官方的方法:先测试内部电压的ADC值,然后再以这个值来计算,每个单片机都要测试
回复

使用道具 举报

ID:612392 发表于 2020-9-14 09:26 | 显示全部楼层
Y_G_G 发表于 2020-9-14 08:22
stc官方的数据手册说是1.27V左右,连它自己都是用"左右"这个词语,可想而知它是有一定误差的
不管你用多少电 ...

感谢回复,所以说,利用TL431做一个基准电压,对于电池供电的ADC是很有必要的了。
回复

使用道具 举报

ID:612392 发表于 2020-9-14 09:25 | 显示全部楼层
wulin 发表于 2020-9-14 06:38
10位ADC在供电是5V的情况下,ADC采回数值为0x03FF时基本代表被采集电压是5V。当用电池供电时ADC满量程的电 ...

感谢回复,10位是0x03FF,0xFF是只取8位。
回复

使用道具 举报

ID:147710 发表于 2020-9-14 08:46 | 显示全部楼层
本帖最后由 XTXB 于 2020-9-14 10:16 编辑

用内部BandGap测电压,0.01V精度没压力,具体操作可以看这个贴子:http://www.51hei.com/bbs/dpj-192371-1.html
回复

使用道具 举报

ID:213173 发表于 2020-9-14 06:38 | 显示全部楼层
10位ADC在供电是5V的情况下,ADC采回数值为0x03FF时基本代表被采集电压是5V。当用电池供电时ADC满量程的电压值可能是变化的,每次采样前必须利用基准电压推算出现时VCC电压值。否则难以获取准确的AD值。基准电压源既可以由外部提供也可以利用内部BandGap电压来计算工作电压VCC。
回复

使用道具 举报

ID:401564 发表于 2020-9-13 21:16 | 显示全部楼层
stc官方的数据手册说是1.27V左右,连它自己都是用"左右"这个词语,可想而知它是有一定误差的
不管你用多少电压供电,10位ADC都是1024个数字量,就是0-1023
你想利用内部参考电压来测量VCC,这个是可以的,但是,由于制造参数的误差,最终的结果会有正负0.15V左右的误差,这个是我实际使用测试得来的结果,一共测试了5PCS,没有一个是完全在1.27V的
如果你要完全达到10位ADC的精度,那就得按照STC官方的方法:先测试内部电压的ADC值,然后再以这个值来计算,每个单片机都要测试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表