找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3329|回复: 14
打印 上一主题 下一主题
收起左侧

单片机芯片内部ADC计算值不正确,为什么?

[复制链接]
跳转到指定楼层
楼主
各位大佬,请教个问题,这边使用STC15W408as主控芯片,测量通道内部第9的内部基准源电压数值,为什么总是算不对呢?我放上源码,请大神帮忙看下。使用的是ssop20的芯片,我看也没有Vref这个管脚,默认不是电压供电多少,计算的值就是多少吗?为什么算出来的值怎么大

51hei图片_20210805230916.png (243.54 KB, 下载次数: 43)

ADC初始化

ADC初始化

51hei图片_202108052309161.png (158.84 KB, 下载次数: 59)

主函数调用

主函数调用

51hei图片_202108052309162.png (78.69 KB, 下载次数: 42)

显示结果

显示结果
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2021-8-6 01:30 | 只看该作者
程序中读出的是10位ADC转换值, 并没有算出来对应的电压值来

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:752974 发表于 2021-8-6 10:23 | 只看该作者
AD转换后的数据只是一个二进制数,定标后就是实际的物理量了。V=D*Vref/1024,D是AD后读取的数据。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:646328 发表于 2021-8-6 10:58 | 只看该作者
csmyldl 发表于 2021-8-6 01:30
程序中读出的是10位ADC转换值, 并没有算出来对应的电压值来

adc_value_Vcc=(unsigned long)(5000*(unsigned long)adc_value)/1024;
这句话不就是算电压值的吗?
回复

使用道具 举报

5#
ID:646328 发表于 2021-8-6 10:58 | 只看该作者
munuc_w 发表于 2021-8-6 10:23
AD转换后的数据只是一个二进制数,定标后就是实际的物理量了。V=D*Vref/1024,D是AD后读取的数据。

adc_value_Vcc=(unsigned long)(5000*(unsigned long)adc_value)/1024;
我就是用这句话来根据这个公式算的
回复

使用道具 举报

6#
ID:609524 发表于 2021-8-6 11:03 | 只看该作者
baocong2019 发表于 2021-8-6 10:58
adc_value_Vcc=(unsigned long)(5000*(unsigned long)adc_value)/1024;
我就是用这句话来根据这个公式算 ...

你是用内部vcc做参考电压的吗
回复

使用道具 举报

7#
ID:646328 发表于 2021-8-6 11:05 | 只看该作者
杨天想 发表于 2021-8-6 11:03
你是用内部vcc做参考电压的吗

标定的供电电压是5v  = 5000
然后来测外部通道
回复

使用道具 举报

8#
ID:401564 发表于 2021-8-6 13:31 | 只看该作者
PCON2默认是0x00
你在ADC初始化那加一条
PCON2=0x20;
试一下

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:928549 发表于 2021-8-6 15:27 | 只看该作者
假设有一个参考电压,其中一个通道测量该参考电压,那么就可以逆推出当前的电源电压(电源电压不一定有多么稳定,因此一般需要一个稳定的参考电压),然后用逆推出的电源电压去计算所要测量的电压,你这个5000乘的有点梦幻了吧,这个5000直接用逆推出的电源电压就可以了吧,,,如果对精度要求不高(直接乘5v就可以了),还有,我感觉程序有点问题 (ADC_RES<<8)|(ADC_RESL&3),这里有问题吧,把数增大了吧

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

10#
ID:646328 发表于 2021-8-6 17:09 | 只看该作者
1093562897 发表于 2021-8-6 15:27
假设有一个参考电压,其中一个通道测量该参考电压,那么就可以逆推出当前的电源电压(电源电压不一定有多么 ...

                adc_value_temp = (ADC_RES<<2)|(ADC_RESL&3);
最终问题解决了,是偏移位数的问题,高8位在RES寄存器,低2位在bit1-bit0,所以应该是左移2位,而不是左移8位。
回复

使用道具 举报

11#
ID:401564 发表于 2021-8-6 18:08 | 只看该作者
ADC_RESL&3
你看一下数据手册,你这个公式对吗?
所以我叫你PCON2改一下试一下
回复

使用道具 举报

12#
ID:584195 发表于 2021-8-6 18:18 | 只看该作者
学习了,虽然我不用STC单片机!
回复

使用道具 举报

13#
ID:646328 发表于 2021-8-6 20:25 | 只看该作者
Y_G_G 发表于 2021-8-6 18:08
ADC_RESL&3
你看一下数据手册,你这个公式对吗?
所以我叫你PCON2改一下试一下

不是PCON2寄存器的问题,是移位出现了问题
回复

使用道具 举报

14#
ID:401564 发表于 2021-8-6 21:08 | 只看该作者
baocong2019 发表于 2021-8-6 20:25
不是PCON2寄存器的问题,是移位出现了问题

哦哦,汇编用习惯了,就觉得高位会变成低位了...
你这样也是对的
但,如果你有看过PCON2的说明,你就会知道,你最初的公式是PCON2的ADRJ位为1时的公式,网上大多是用这个公式的,但ADRJ默认是0的,别人的程序是要设定PCON2的
这就是我提醒你修改PCON2试一下原因
回复

使用道具 举报

15#
ID:569384 发表于 2021-8-10 11:48 | 只看该作者
ad值需要用公式换算会电压值,而且检测的电压值要做降压处理,不能超过参考电压,再根据降压比推算会原来的电压值。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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