980578873 发表于 2023-4-20 10:19:58

adc读数不正确

各位大佬,程序架构如下,现在遇到的问题是单片机复位进入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)
{}
}


980578873 发表于 2023-4-20 11:06:24

刚测试发现在while函数大循环里面要2秒钟后读数才正确。

980578873 发表于 2023-4-20 11:19:58

980578873 发表于 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)
{}
}

乘风飞扬 发表于 2023-4-20 15:42:37

初始化时打开ADC电源,等待1ms后就可以进行采集了



980578873 发表于 2023-4-20 16:00:43

乘风飞扬 发表于 2023-4-20 15:42
初始化时打开ADC电源,等待1ms后就可以进行采集了

我要等2S读数才准确,这是什么问题

乘风飞扬 发表于 2023-4-20 18:00:40

adc_init();初始化函数里面是否已经打开了ADC电源?
另外有没有测过在首次读取ADC时,采样脚的电压是否稳定?

神农鼎 发表于 2023-4-21 08:28:08

原理图的PDF, 源程序 都贴上来,广大爱好者帮你查错
如下示意图,ADC输入端接个 0.01uF的小电容


980578873 发表于 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转换速度(系统时钟),右对齐数据格式
}

980578873 发表于 2023-4-21 10:58:56

神农鼎 发表于 2023-4-21 08:28
原理图的PDF, 源程序 都贴上来,广大爱好者帮你查错
如下示意图,ADC输入端接个 0.01uF的小电容



你这个原理图adc输入端接入0.1uF的电容啊,我也是接0.1uF

神农鼎 发表于 2023-4-21 17:21:00

大家帮看下楼主的图





页: [1] 2
查看完整版本: adc读数不正确