求助CH573F的ADC配置为-6db时误差较大的问题

根据数据手册中的说明:

image.png


使用CH573F的ADC去采样管脚的电压:


当万用表实际检测出的电压为1588mv时:

PGA增益选择为0db, 转换出来的测量结果电压值为1601mv.

PGA增益选择为-6db, 转换出来的测量结果电压值为1490mv.


当万用表实际检测出的电压为1946mv时:

PGA增益选择为0db, 转换出来的测量结果电压值为1965mv.

PGA增益选择为-6db, 转换出来的测量结果电压值为1853mv.


当万用表实际检测出的电压为2586mv时:

PGA增益选择为0db, 转换出来的测量结果电压值为1986mv.

PGA增益选择为-6db, 转换出来的测量结果电压值为2488mv.


当万用表实际检测出的电压为2794mv时:

PGA增益选择为0db, 转换出来的测量结果电压值为1986mv.

PGA增益选择为-6db, 转换出来的测量结果电压值为2693mv.


可以发现当被测电压在0db区间时, 使用0db增益去测量, 结果值误差不算太大.

但PGA增益配置为-6db时, 基本有一个100mv的误差存在, 而且是很稳定的要比实际电压值小100mv左右.


请问是否数据手册中的公式存在问题?

首先,在配置增益的时候需要根据测量电压的范围选择不同的增益。比如1588mv时推荐使用0dB增益去测量;2794mv时推荐使用-6dB增益去测量。其次,我们这里刚刚验证了一下,在相对应的范围内使用对应的增益是没有问题的。你刚刚说的-6dB时存在100mv的误差,刚刚经检验,并不存在这个问题,可能是你使用的计算公式出现问题,建议你将实际测量值也贴出来,我们确认一下。


你好!

我这边把ADC_ExcutSingleConver获取的值+RoughCalib_Value也打印出来了, 重新测试了一遍, 结果如下:


当万用表实际检测出的电压为1555mv时:

PGA增益选择为0db, ADC采样校准后的值3063, 转换出来的测量结果电压值为1570mv.

PGA增益选择为-6db, ADC采样校准后的值2446, 转换出来的测量结果电压值为1458mv.


当万用表实际检测出的电压为1883mv时:

PGA增益选择为0db, ADC采样校准后的值3707, 转换出来的测量结果电压值为1990mv.

PGA增益选择为-6db, ADC采样校准后的值2772, 转换出来的测量结果电压值为1792mv.


当万用表实际检测出的电压为1965mv时:

PGA增益选择为0db, ADC采样校准后的值3870, 转换出来的测量结果电压值为1984mv.

PGA增益选择为-6db, ADC采样校准后的值2853, 转换出来的测量结果电压值为1875mv.


当万用表实际检测出的电压为2371mv时:

PGA增益选择为0db, ADC采样校准后的值3875, 转换出来的测量结果电压值为1986mv.

PGA增益选择为-6db, ADC采样校准后的值3244, 转换出来的测量结果电压值为2276mv.


当万用表实际检测出的电压为2613mv时:

PGA增益选择为0db, ADC采样校准后的值3875, 转换出来的测量结果电压值为1986mv.

PGA增益选择为-6db, ADC采样校准后的值3477, 转换出来的测量结果电压值为2515mv.



我这边根据ADC采样校准后的值计算出vin的方法如下:

int ADC_CalcSampVoltage(UINT16 val, ADC_SignalPGATypeDef ga)
{
#if 1
    int u32 = val;

    switch (ga)
    {
    case ADC_PGA_1_4:
        return ((((u32 * 1050) - 1536 ) >> 9 ) - (1050 * 3 - 3));
    case ADC_PGA_1_2:
        return ((((u32 * 1050) - 1024 ) >> 10 ) - (1050 - 1));
    case ADC_PGA_0:
        return ((u32 * 1050) >> 11 );
    case ADC_PGA_2:
        return ((((u32 * 1050) + 2048 ) >> 12 ) + ( 1050 >> 1 ));
    default:
        return 0;
    }
#else
    float fval = val;

    switch (ga)
    {
    case ADC_PGA_1_4:
        return (int)((fval / 512.0 - 3.0) * 1050.0);
    case ADC_PGA_1_2:
        return (int)((fval / 1024.0 - 1.0) * 1050.0);
    case ADC_PGA_0:
        return (int)((fval / 2048.0) * 1050.0);
    case ADC_PGA_2:
        return (int)((fval / 4096.0 + 0.5) * 1050.0);
    default:
        return 0;
    }
#endif
}


请问是我这个算法有问题吗


关于这点:

首先,在配置增益的时候需要根据测量电压的范围选择不同的增益。比如1588mv时推荐使用0dB增益去测量;2794mv时推荐使用-6dB增益去测量。

因为我这边要测量的电压范围很宽, 从0V ~ 3.3V都可能出现, 所以我这边需要做的是先粗测量, 判断电压在哪个区间内, 然后才能再去选择PGA增益进行精确的测量.


另外还发现一个问题, CH573F的第20号引脚VINTA, 如果悬空不贴电容的话. 即便在0db的测量范围内, 也有200mv的误差.

贴上100nF的电容后, 0db范围内ok了, 但-6db还是有100mv的误差.

请问下ADC采样还会受到哪些因素的影响呢?


1、你的测量范围是0-3.3V,根据手册来看,我的建议是选择-12dB增益,范围更大;如果你是为了精准验证某一个电压值,那么请根据实际的测量电压范围去选择增益,即从最后一列去选择。1.png


2、VINTA引脚是务必接电容的,这一点在手册是有明确说明的,你可以多试几个电容,如0.1uF,1uF,2.2uF等,这个会影响到误差,因为需要根据情况来判断,所以无法给出精确的电容值,建议你去尝试。2.png


3、ADC测量的误差影响。根据你上图贴的内容来看:

①测量一下Vref即VINTA的实际电压,可能你是用的1.05V直接进行测量,但实际也许会有偏差,见图。

3.png 

②测量一下你的供电电压,是否为3.3V。一般来说通过USB供电即可,但是如果为了精确测量,那么建议使用稳压源供电,同时万用表校验。

③我这边使用的是官方例程ADC下面的单通道采样方式,注意需要修改增益,见下图。4.png


好的谢谢, 电容部分我这边有空再替换测试看看.

VINTA的电压我这边刚测量是1057mv, 3.3V供电是3305mv. 都在正常范围内.


只有登录才能回复,可以选择微信账号登录