Compensación constante no deseada en la lectura de ADC

1

Estoy usando un AD7323 12bit + sign 4-channel ADC an on a Escudo Arduino personalizado. Lo conduzco con 12V desde una fuente de alimentación y -12V creado usando un ICL7662 IC. VCC es 5V del Arduino. El ADC se usa para medir señales de CC con una tasa de muestreo baja (muestrear una vez por segundo aproximadamente).

El diseño del tablero se ve así

yelpinoutAD7323es

Estoy usando capacitores de cerámica smd y diodos BAT43. Usando el registro de control, configuro el Modo de energía en Normal (0,0), Modo de convertidor de terminación única (0,0), Codificación 1 (binario directo), referencia interna 1 y modo de secuenciador desactivado (0,0).

SPI está configurado a 256000 de velocidad y MODE2. Primero escribo una dirección en el registro de control, y luego escribo 0 a través de SPI para recibir el siguiente valor de conversión, que me da -FSR / 2 + 1LSB = 0 y FSR / 2-1LSB = 8191 como un valor.

El código C ++ relevante es

void AD7323::SetSamplingChannel(uint16_t channel) {
    uint16_t data = GetControlValue(true);
    data &= ~(3 << 10); //Clear channel bytes
    data |= channel << 10; // Push channel address
    uint16_t answer = WriteSPI(data);
}

uint16_t AD7323::ReadADC(uint16_t channel)
{
    SetSamplingChannel(channel);
    uint16_t answer = WriteSPI(0) & ~(57344); //Remove top 3 bits
    return answer; 
}
// Get the current value of for the control register
uint16_t AD7323::GetControlValue(bool Write) {

    uint16_t data = Write ? 32800 : 32; //Sets write bit and Coding
    data &= ~(3 << 8); //Mode 0,0
    data |= Mode << 8; //Set new mode
    data &= ~(1 << 4); //Ref 0
    data |= (RefEnabled ? 1 : 0) << 4; //Set ref
    data &= ~(3 << 6); //Power mode 0,0
    data |= PowerMode << 6; //Set power mode
    return data;
}   
uint16_t AD7323::WriteSPI(uint16_t DIN)
{
  SPI.beginTransaction(settings); //settings = SPISettings(256000, MSBFIRST, SPI_MODE2);
  digitalWrite(CSPin,LOW);
  uint16_t val = SPI.transfer16(DIN);
  digitalWrite(CSPin,HIGH);
  SPI.endTransaction();
  delay(1); //Just for testing purposes
  return val;
}

Esto básicamente funciona, sin embargo, cuando simplemente aplico un voltaje dado y leo el valor de ADC, tengo un desplazamiento constante de 11-13 LSB (LSB = 2.441 mV a un rango de -10- > 10V).

Me pregunto si he hecho algo mal en el diseño del lado del código de las cosas. Estaba un poco en el lado bajo en cuanto a las tapas de desacoplamiento para el chip, pero no entiendo cómo las tapas de desacoplamiento faltantes podrían causar un desplazamiento constante en el valor leído. Además, ¿esto debería ser cuidado por la referencia interna de 2.5V en el ADC?

¿O es solo una cosa que existe, de modo que tengo que agregar una función de calibración en el código?

Ya que me he quedado sin ideas, me gustaría recibir cualquier comentario. Déjame saber si necesitas más información.

    
pregunta Jens

1 respuesta

2

AD7323 (de la hoja de datos): -

  • El error de compensación podría ser de hasta +9 LSB de terminación única o +10 diferencial LSB.
  • El error de ganancia podría ser +/- 8 LSB de terminación única y +/- 14 LSB diferencial
  • Las no linealidades integrales y diferenciales podrían agregar otros 2 LSB
  • La precisión de referencia interna es de +/- 5 mV en 2.5 voltios
respondido por el Andy aka

Lea otras preguntas en las etiquetas