Como sugirieron los otros chicos, agregar un amplificador operacional como seguidor es una buena idea, pero puedes hacerlo también agregando un capacitor pequeño, aproximadamente 0.1uF.
El ADC tiene un pequeño condensador de muestra interno que se carga hasta el voltaje de entrada durante el período de muestra.
Sitieneunosciloscopiode2canales,valelapenarealizarelsiguienteexperimento.ColoqueuncanalenlaentradaanalógicadelADC(acoplamientodeCA,gananciarazonablementealta)yelotrocanalenlaentradaCLKalADC(acoplamientodeCC,2v/div).
Loquepuedeveresqueenelperíododelamuestra,laentradadelADCcaeligeramentemientrassecargaelcondensadorinterno.Silaseñalnoharegresadoasunivelnormalalfinaldelperíododemuestra,entoncesnoobtendráunalecturaprecisayprobablementetambiénobtendráunalecturamásruidosa.
Larazónporlaquesecaeesquenotienessuficientecorrientedeesosresistoresdealtovalorparacargarelcondensadorinternoduranteelcortoperíododemuestreo.
TambiénpuedeverunproblemasiestáutilizandounamplificadorconaltagananciacomoentradaADC(porejemplo,enaplicacionesdemedicióndetensión).LaapariciónrepentinadelatapapuedecausarunainestabilidadenelOpAmp,queaparecerácomounapequeñaseñal:
Tienes dos opciones, en primer lugar puedes alargar el período de muestra, como lo he hecho en la imagen de arriba. Esto es realmente muy fácil de hacer, ya que el período de muestra se puede colocar entre dos bytes SPI consecutivos, por lo que la pausa es natural.
#define SPI_XCEIVE(out, in) {SSPBUF = out; while(!(SSPSTAT&0x01)); in = SSPBUF;}
typedef union
{
int16u word;
int8u byte[2];
}union16;
union16 mcp_result_union = {0};
void mcp320x_read(int8u chan) __wparam
{
overlay int8u control_byte_0;
control_byte_0 = B8(00011000) | chan; // Set up control byte:
// b4 = start bit
// b3 = single ended
// b2:0 = channel number
SPI_ChipSelect(MCP320x_CS_PORT); // BEGIN
SPI_XCEIVE(control_byte_0, control_byte_0); // Send control byte. Ignore the return value.
SPI_XCEIVE(0, mcp_result_union.byte[1]); // Get the sample back. Put it straight into its destination.
SPI_XCEIVE(0, mcp_result_union.byte[0]); // Get the sample back. Put it straight into its destination.
mcp_result_union.word >>= 1; // Shift the sample into the correct position
mcp_result_union.word >>= 1; // (doing it in two stages is actually faster)
mcp_result_union.byte[1] &= 0x0F; // and mask off the unused bits.
SPI_ChipDeselect(MCP320x_CS_PORT); // END
}
Alternativamente, puede simplemente agregar un pequeño condensador entre el pin de entrada del ADC y tierra. Esto actuará como un suministro de carga local que evitará cualquier caída de señal notable durante la muestra. De esta manera, deberías poder tener resistencias de valor bastante alto.
Si desea ahorrar aún más energía, piense en la frecuencia de muestreo de ADC. Si es muy lento (digamos una vez por segundo), entonces podría considerar apagar todo el ADC durante este período. Asegúrese de revisar la hoja de datos para ver el tiempo de encendido requerido.