CH573F ADC粗校准问题,校准原因、是否必须校准等

ADC使用之前官方例程中有对ADC做粗校准,这需要一个AIN输入脚悬空。论坛之前有过类似帖子:/bbs/thread-73064-1.html

结论是使用外部基准源自行校准,就不需要粗校准了。但自己的使用场景是没有基准源的,所以这里提出另外几个问题:


  1. ADC为何要校准,原因既根源是什么?

  2. ADC校准好处是什么?不校准情况下误差有多大?(自己应用场景对误差要求不高,测量温度误差1-3度左右都可以)

  3. ADC校准,是否必须有一个AIN引脚悬空(不能接仍任何外部器件,包括上、下拉电阻),且必须是PA5(例程中为该引脚)。

粗调实际上就是对GND校准,ADC对GND读个值,计算出固定的偏移, 然后手动去offset其他通道的值;

这个偏移通常在几个LSB到几十个LSB 之间,可能是偏大, 或者偏小,  把校准值带入实际的采样值,来修正这个固定偏差;

对于CH579,其借用PA5对应的ADC channel 1来做粗调通道,当使用粗调时,内部模拟开关会控制该channel的电平,如果该IO 正好被对应到了外部的IO上,要避免外部电路造成的影响,所以不建议使用PA5作为其他功能,否则建议其他方式实现粗调;

对于CH573 用于粗调的通道是可被修改的的, 例程中给的是channel 6 ,这是个内部通道;

下面代码来来源 CH573_EVT_1.6 的 CH57x_adc.c : 

signed short ADC_DataCalib_Rough( void )        // 采样数据粗调,获取偏差值
{
    UINT16  i;
    UINT32  sum=0;
    UINT8  ch=0;        // 备份通道
    UINT8   ctrl=0;     // 备份控制寄存器
    
    ch = R8_ADC_CHANNEL;
    ctrl = R8_ADC_CFG;

    R8_ADC_CFG = 0;
    ADC_ChannelCfg( 6 );		// 6/7/10/11 可选
    R8_ADC_CFG |= RB_ADC_OFS_TEST|RB_ADC_POWER_ON|(2<<4);      // 进入测试模式
    R8_ADC_CONVERT = RB_ADC_START;
    while( R8_ADC_CONVERT & RB_ADC_START );
    for(i=0; i<16; i++)
    {
        R8_ADC_CONVERT = RB_ADC_START;
        while( R8_ADC_CONVERT & RB_ADC_START );
        sum += (~R16_ADC_DATA)&RB_ADC_DATA;
    }    
    sum = (sum+8)>>4;
    R8_ADC_CFG &= ~RB_ADC_OFS_TEST;      // 关闭测试模式
    
    R8_ADC_CHANNEL = ch;
    R8_ADC_CFG = ctrl;
    return (2048 - sum); 
}



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