STC8G AD通道15读出的基准1.19V差别比较大是什么原因?
单片机是STC8G1K08,下面是内部通道15读出的值,通道0是连接到VCC,VCC是电脑USB 5V供电的:看起来VCC读出的电压是正常的,但是为什么内部1.19V基准读出的值差别比较大?
下面是计算代码:
switch (u8Data) {
case 01:
u16ADC = Get_ADC_Result(ADC_CH_15);
fVoltage = 5.0 * u16ADC / 1024;
printf("ADC Ref Value : %d", u16ADC);
printf("Voltage : %f\r\n", fVoltage);
break;
case 02:
u16ADC = Get_ADC_Result(ADC_CH_0);
fVoltage = 5.0 * u16ADC / 1024;
printf("ADC0 Value : %d", u16ADC);
printf(" Voltage : %f\r\n", fVoltage);
break;
case 03:
break;
default:
break;
} 初始化代码和读ADC代码都是官方的 误差有多少,内部基准本来就是有误差的。外面电源还好用万用表量下校正下,内部也没法直接量。 你看的你的公式,直接拿5.0也就是5V当做VCC了。但是实际USB电压也不是很准的5V,说白了假如是4.8V呢?然后你测通道0,AD值是1023,已经是满偏了,你把公式的5.0换成6.0,保准测出来的电压是5.999V呢.
说白了,你把一个不准的电压当做基准,得到的电压自然是不准的。解决方案,用万用表测量VCC,然后用实际值替换公式里的5.0。 令狐冲 发表于 2022-5-13 09:21
误差有多少,内部基准本来就是有误差的。外面电源还好用万用表量下校正下,内部也没法直接量。 ...
(引用自3楼)
这个是万用表测到VCC的值,手头只有这个万用表。估计VCC应该也不准,偏高了。
ecbm 发表于 2022-5-13 09:26
你看的你的公式,直接拿5.0也就是5V当做VCC了。但是实际USB电压也不是很准的5V,说白了假如是4.8V呢?然后 ...
(引用自4楼)
确实如此!
u16ADC = Get_ADC_Result(ADC_CH_15);
fVoltage = 5.26 * u16ADC / 1024;
printf("ADC Ref Value : %d", u16ADC);
printf("Voltage : %f\r\n", fVoltage);
break;
那有什么方法,把内部1.19作为计算的基准吗? mangolu 发表于 2022-5-13 09:39
确实如此!
(引用自6楼)
首先,这个基准电压的实际值在出厂的时候就存在内存里,可以先读出来。然后读15通道的AD值。AD值和实际值都有了,就可以计算出Vref。其他通道的实际值就用这个Vref来计算。可以参考这个adc.c里面的实现代码https://gitee.com/jackchio/ecbm_library/blob/master/ECBM_LIB/adc.c ecbm 发表于 2022-5-13 09:54
首先,这个基准电压的实际值在出厂的时候就存在内存里,可以先读出来。然后读15通道的AD值。AD值和实际值 ...
(引用自7楼)
谢谢!我看看 ecbm 发表于 2022-5-13 09:54
首先,这个基准电压的实际值在出厂的时候就存在内存里,可以先读出来。然后读15通道的AD值。AD值和实际值 ...
(引用自7楼)
请教一下:
adc_ch15=(float)(REG_BGV)/1000.0f;//将内部电压基准取出来,防止之后idata覆盖。
这个内部基准电压值这个文档里是什么地方有说明吗? mangolu 发表于 2022-5-13 10:51
请教一下:
adc_ch15=(float)(REG_BGV)/1000.0f;//将内部电压基准取出来,防止之后idata覆盖。
(引用自9楼)
你直接在我发的工程里,找到那个地址就好了。STC8都通用,手册的话,我现在这电脑没有。 ecbm 发表于 2022-5-13 14:47
你直接在我发的工程里,找到那个地址就好了。STC8都通用,手册的话,我现在这电脑没有。 ...
(引用自10楼)
我这边找到了,谢谢 !
本帖最后由 zhuyi25762 于 2022-5-13 18:09 编辑
这1.19 我都当标准来用,也还好
把楼上的工程传上来,感觉挺简单的STC,被你整成库,都整不会了,好复杂
楼主那么快就忘记UID3072标定值了? 先用精度比较好的万用表或电压表头测量VCC,并且VCC纹波越小越好,然后读出15通道ADC值,则VREF=VCC*ADC15/1024。
很多时候,手上的万用表都不会很准,我是自己做的电压表,+-17bit的读数,然后用一个高精度的基准源来校准,我用LM399,6.9V级别,每年用6位半表校准一下,年误差一般小于0.5mV。 前段时间我弄这个的时候,没用库函数,是自己搞寄存器的。通道切换搞了好久,后来发现是初始化ADC的时候有个地方不能用|=。只能用=才搞定
页:
[1]