mangolu 发表于 2022-5-13 09:02:06

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;
                }

mangolu 发表于 2022-5-13 09:02:43

初始化代码和读ADC代码都是官方的

令狐冲 发表于 2022-5-13 09:21:14

误差有多少,内部基准本来就是有误差的。外面电源还好用万用表量下校正下,内部也没法直接量。

ecbm 发表于 2022-5-13 09:26:52

你看的你的公式,直接拿5.0也就是5V当做VCC了。但是实际USB电压也不是很准的5V,说白了假如是4.8V呢?然后你测通道0,AD值是1023,已经是满偏了,你把公式的5.0换成6.0,保准测出来的电压是5.999V呢.
说白了,你把一个不准的电压当做基准,得到的电压自然是不准的。解决方案,用万用表测量VCC,然后用实际值替换公式里的5.0。

mangolu 发表于 2022-5-13 09:35:12

令狐冲 发表于 2022-5-13 09:21
误差有多少,内部基准本来就是有误差的。外面电源还好用万用表量下校正下,内部也没法直接量。 ...
(引用自3楼)

这个是万用表测到VCC的值,手头只有这个万用表。估计VCC应该也不准,偏高了。



mangolu 发表于 2022-5-13 09:39:51

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作为计算的基准吗?

ecbm 发表于 2022-5-13 09:54:10

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

mangolu 发表于 2022-5-13 09:56:39

ecbm 发表于 2022-5-13 09:54
首先,这个基准电压的实际值在出厂的时候就存在内存里,可以先读出来。然后读15通道的AD值。AD值和实际值 ...
(引用自7楼)

谢谢!我看看

mangolu 发表于 2022-5-13 10:51:28

ecbm 发表于 2022-5-13 09:54
首先,这个基准电压的实际值在出厂的时候就存在内存里,可以先读出来。然后读15通道的AD值。AD值和实际值 ...
(引用自7楼)

请教一下:

adc_ch15=(float)(REG_BGV)/1000.0f;//将内部电压基准取出来,防止之后idata覆盖。

这个内部基准电压值这个文档里是什么地方有说明吗?

ecbm 发表于 2022-5-13 14:47:27

mangolu 发表于 2022-5-13 10:51
请教一下:

adc_ch15=(float)(REG_BGV)/1000.0f;//将内部电压基准取出来,防止之后idata覆盖。
(引用自9楼)

你直接在我发的工程里,找到那个地址就好了。STC8都通用,手册的话,我现在这电脑没有。

mangolu 发表于 2022-5-13 16:35:03

ecbm 发表于 2022-5-13 14:47
你直接在我发的工程里,找到那个地址就好了。STC8都通用,手册的话,我现在这电脑没有。 ...
(引用自10楼)

我这边找到了,谢谢 !

zhuyi25762 发表于 2022-5-13 17:48:27

本帖最后由 zhuyi25762 于 2022-5-13 18:09 编辑

这1.19 我都当标准来用,也还好

把楼上的工程传上来,感觉挺简单的STC,被你整成库,都整不会了,好复杂

王二小 发表于 2022-5-14 06:18:33

楼主那么快就忘记UID3072标定值了?

小李非刀 发表于 2022-5-17 10:51:29

先用精度比较好的万用表或电压表头测量VCC,并且VCC纹波越小越好,然后读出15通道ADC值,则VREF=VCC*ADC15/1024。

很多时候,手上的万用表都不会很准,我是自己做的电压表,+-17bit的读数,然后用一个高精度的基准源来校准,我用LM399,6.9V级别,每年用6位半表校准一下,年误差一般小于0.5mV。

爱晴海玩偶 发表于 2022-5-17 11:04:09

前段时间我弄这个的时候,没用库函数,是自己搞寄存器的。通道切换搞了好久,后来发现是初始化ADC的时候有个地方不能用|=。只能用=才搞定
页: [1]
查看完整版本: STC8G AD通道15读出的基准1.19V差别比较大是什么原因?