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.