找回密码
 立即注册
查看: 2029|回复: 16

adc读数不正确

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-4-20 10:19:58 | 显示全部楼层 |阅读模式
各位大佬,程序架构如下,现在遇到的问题是单片机复位进入main函数后到while(1)大循环之前,首次读取单节锂电池电压不准确,打印信息如下,但是在while(1)大循环里面adc读数正确没有问题。
void main()
{
adc_init();
vbat=get_vbat_value(12);
  TI=1;
printf("vbat is %f\n",vbat);
while(TI==0);
printf("hvbat_flag is 0x%bx\n",hvbat_flag);
while(TI==0);
printf("lvbat_flag is 0x%bx\n",lvbat_flag);
while(TI==0);
TI=0;
while(1)
{}
}
adc读数不正确-1.png

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-4-20 11:06:24 | 显示全部楼层
刚测试发现在while函数大循环里面要2秒钟后读数才正确。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-4-20 11:19:58 | 显示全部楼层
98057*** 发表于 2023-4-20 11:06
刚测试发现在while函数大循环里面要2秒钟后读数才正确。

系统从断电到上电才有这个问题,需要等2秒ADC读数才正确,STC帮忙看下这个问题能不能解决,延时10mS是否可以解决此问题,谢谢。
void main()
{
adc_init();
delayms2000();//延时2秒
vbat=get_vbat_value(12);
   TI=1;
printf("vbat is %f\n",vbat);
while(TI==0);
printf("hvbat_flag is 0x%bx\n",hvbat_flag);
while(TI==0);
printf("lvbat_flag is 0x%bx\n",lvbat_flag);
while(TI==0);
TI=0;
while(1)
{}
}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2023-4-20 15:42:37 | 显示全部楼层
初始化时打开ADC电源,等待1ms后就可以进行采集了

1.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-4-20 16:00:43 | 显示全部楼层
乘风*** 发表于 2023-4-20 15:42
初始化时打开ADC电源,等待1ms后就可以进行采集了

我要等2S读数才准确,这是什么问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2023-4-20 18:00:40 | 显示全部楼层
adc_init();初始化函数里面是否已经打开了ADC电源?
另外有没有测过在首次读取ADC时,采样脚的电压是否稳定?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2023-4-21 08:28:08 | 显示全部楼层
原理图的PDF, 源程序 都贴上来,广大爱好者帮你查错
如下示意图,ADC输入端接个 0.01uF的小电容
1.png

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-4-21 10:57:25 | 显示全部楼层
乘风*** 发表于 2023-4-20 18:00
adc_init();初始化函数里面是否已经打开了ADC电源?
另外有没有测过在首次读取ADC时,采样脚的电压是否稳定 ...

这是adc初始化的程序,你帮忙看看有没有问题。附件是原理图,帮忙看看ADC检测线路是否问题,谢谢。
void adc_init()
{
P_SW2=P_SW2|0x80;//访问片内扩展特殊寄存器时需要将P_SW2的BIT7设置为1
ADCTIM=0X3f;//设置ADC内部时序,ADCTIM为片内扩展特殊寄存器
P_SW2=P_SW2&0x7f;//访问结束后需要将P_SW2的BIT7设置为0,切换为访问片内基本RAM区
ADC_CONTR=0x80;//打开ADC模块电源,选择ADC0通道:P10引脚
//ADC_RES=;//ADC转换结果高位寄存器
//ADC_RESL=;//ADC转换结果低位寄存器
ADCCFG=0x2f;//设置ADC转换速度(系统时钟),右对齐数据格式
}

NC200Pro-D Charger Box MB V2.0.pdf

131.98 KB, 下载次数: 123

原理图

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-25 15:38:27

39

主题

204

回帖

651

积分

高级会员

积分
651
发表于 2023-4-21 10:58:56 | 显示全部楼层
神*** 发表于 2023-4-21 08:28
原理图的PDF, 源程序 都贴上来,广大爱好者帮你查错
如下示意图,ADC输入端接个 0.01uF的小电容

你这个原理图adc输入端接入0.1uF的电容啊,我也是接0.1uF
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2023-4-21 17:21:00 | 显示全部楼层
大家帮看下楼主的图
1.png

2.png


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 12:40 , Processed in 0.120747 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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