Puede obtener una medida aproximada de la capacitancia con solo 2 pines del microcontrolador, 1 resistencia y 1 capacitor conocido. El circuito se ve algo como esto:
C2eslacapacitanciadesconocidaqueestástratandodemedir.C1esuncondensadordereferenciadevalorconocido,yaproximadamente50-1000veceselvalordeC2.R1noesdemasiadocrítico,1kOhmomenos.
LaideaescargarC2conunvoltajeconocido(5o3.3V,cualquieraqueseaV+),yluegotransferirsucarga(q=C*V)aC1.CadavezquetransferimoslacargadeC2aC1,elvoltajedeC1aumentaenunapequeñacantidadproporcionalaC2.ElnúmerodevecesquetenemosquetransferirlacargaparahacerqueelvoltajedeC1excedaalgúnumbral(paranosotros,elumbral"1" lógico del pin A) es inversamente proporcional al valor de C2.
El truco es aprovechar el estado de alta impedancia de los pines del microcontrolador. Si mantuviéramos a tierra el lado inferior de C1 mientras cargábamos C2, también terminaríamos cargando completamente C1. En cambio, dejamos que el lado inferior de C1 flote configurando el pin B como de alta impedancia. Ahora, independientemente de lo que haga la parte superior de C1, la parte inferior también lo hace, manteniendo siempre el mismo voltaje en C1.
El algoritmo de medición es el siguiente (en pseudo-C):
// Step 0: discharge C1 to prepare for a new measurement
PIN_A = 0;
PIN_B = 0;
delay(some_time); // long enough to discharge C1
bool under_threshold = true; // has the voltage across C1 exceeded the threshold?
int count = 0;
while (under_threshold)
{
// Step 1: Charge C2
PIN_B = Z; // Z means high-impedance
PIN_A = 1;
delay(some_time); // long enough to charge C2
// Step 2: Transfer charge from C2 to C1
PIN_A = Z;
PIN_B = 0;
delay(some_time); // long enough for C2 to discharge into C1
// Step 3: Check if the threshold is exceeded
if (PIN_A || (count > COUNT_MAX))
{
under_threshold = false;
}
}
return count;
Puede ver una demostración del circuito en enlace