ADC/DAC精度校准

ADC(模数转换器)和DAC(数模转换器)的精度校准是确保信号转换准确性的关键步骤

1. 误差来源分析

(1) ADC主要误差类型

  • 偏移误差(Offset Error):实际转换曲线与理想曲线的垂直偏移(零点偏差)。
  • 增益误差(Gain Error):实际转换曲线斜率与理想值的偏差(满量程偏差)。
  • 积分非线性(INL):实际转换点与理想直线的最大偏差(非线性误差)。
  • 微分非线性(DNL):相邻码值之间的实际步长与理想步长的偏差。
  • 噪声与温漂:热噪声、电源波动、温度变化引起的误差。

(2) DAC主要误差类型

  • 类似ADC,包括偏移、增益、非线性误差,但方向相反(数字到模拟)。

2. ADC校准方法

(1) 硬件校准(适用于12位/16位)

  • 偏移校准

    • 步骤:

      1. 输入已知的零电平(如短接AIN到GND)。
      2. 读取ADC输出码值(应为0,实际可能为N_offset)。
      3. 软件补偿:后续采样值减去N_offset。
    • 实现:

      1
      2
      int16_t raw_value = ADC_Read();
      int16_t calibrated_value = raw_value - offset;
  • 增益校准

    • 步骤:

      1. 输入满量程参考电压(如VREF)。
      2. 读取ADC输出码值(理想为最大值,如4095对应12位)。
      3. 计算增益误差系数:
        gain = (理论最大值) / (实际测量值)
      4. 软件补偿:采样值乘以增益系数。
    • 实现:

      1
      2
      float gain = 4095.0 / measured_max_value;
      int16_t calibrated_value = raw_value * gain;
  • 多点校准(提升INL精度)

    • 步骤:
      1. 使用精密电压源输入多个已知电压点(如10%VREF, 50%VREF, 90%VREF)。
      2. 记录实际ADC码值与理论值的偏差。
      3. 构建查找表(LUT)或拟合多项式曲线,实时补偿非线性误差。
    • 适用场景:16位高精度系统,需补偿非线性误差。

(2) 自动校准(芯片内置功能)

  • 示例

    :STM32的ADC自校准模式

    • 触发内部校准流程,自动计算偏移校正值并存入寄存器。

    • 代码示例:

      1
      HAL_ADCEx_Calibration_Start(&hadc); // 启动自校准

(3) 外部参考源校准

  • 使用高精度外部电压基准(如ADR4550)替代内部VREF,减少基准源误差。

3. DAC校准方法

(1) 偏移校准

  • 步骤:
    1. 设置DAC输出数字码为0,测量实际输出电压V_off。
    2. 软件补偿:输出码值动态调整为DAC_code = target_code + (V_off / LSB)

(2) 增益校准

  • 步骤:
    1. 设置DAC输出最大码值(如65535对应16位),测量实际电压V_full。
    2. 计算增益误差系数:
      gain = V_full / (理论满量程电压)
    3. 软件补偿:输出码值乘以增益系数。

(3) 分段线性校准

  • 对DAC输出范围分段,每段单独校准偏移和增益,适用于高分辨率(16位)系统。

4. 校准实现注意事项

(1) 12位 vs. 16位系统差异

参数 12位 ADC/DAC 16位 ADC/DAC
LSB精度 1 LSB = VREF/4096 1 LSB = VREF/65536
校准精度要求 ±2 LSB以内 ±1 LSB以内
校准点数量 2点(偏移+增益)通常足够 需多点校准(如5-10点)
噪声影响 较小(LSB较大) 显著(需低噪声PCB布局和滤波)

(2) 校准设备要求

  • 电压源:精度至少比目标系统高4倍(如校准16位需20位精度的源表)。
  • 测量仪器:使用高精度万用表(如6½位)或校准ADC。

(3) 温度补偿

  • 在宽温范围内工作的系统需存储不同温度下的校准系数(EEPROM存储)。

  • 公式示例:

    1
    calibrated_value = raw_value * gain_table[temp] + offset_table[temp];

5. 校准流程示例(以16位ADC为例)

  1. 预热系统:上电稳定30分钟,减少温漂影响。
  2. 偏移校准:
    • 输入0V,读取100次取平均,得到N_offset。
  3. 增益校准:
    • 输入VREF-1LSB(避免饱和),读取N_full,计算增益系数。
  4. 多点INL校准:
    • 输入10个均匀分布的电压点,构建LUT或二次多项式拟合。
  5. 存储系数:将offset、gain和LUT存入非易失存储器。

6. 代码实现片段(STM32 HAL库示例)

1
2
3
4
5
6
7
8
9
10
11
12
// ADC偏移校准
void ADC_Calibrate() {
HAL_ADCEx_Calibration_Start(&hadc1); // 内置校准
uint32_t offset = hadc1.Instance->CALFACT; // 获取校准因子
}

// DAC增益补偿
void DAC_SetVoltage(float voltage) {
float lsb = VREF / 65536.0;
uint16_t code = (voltage / lsb) * gain_factor + offset;
HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, code);
}

7. 高精度设计技巧

  • PCB布局:
    • 分离模拟/数字地,使用星型接地。
    • 缩短模拟信号走线,避免平行数字信号线。
  • 参考源选择:
    • 使用低温漂参考电压(如MAX6126,温漂3ppm/℃)。
  • 软件滤波:
    • 多次采样取平均(16位系统建议64次以上)。
    • 中值滤波消除脉冲噪声。

通过系统级校准(硬件+软件)和严格的环境控制,12位系统可达到±1 LSB精度,16位系统可控制在±2 LSB以内。