Capacimetro con Arduino

Si quieres mejorar la precision, lo que se puede hacer es medir varios ciclos de carga y descarga. Es decir, mides el tiempo que tarda en cargar, inviertes y mides el tiempo que tarda en descargar y lo repites varias iteraciones.

El error se da por que se trata el tiempo de carga de un condensador, como si fuese algo lineal y no lo es. La carga de un condensador se corresponde a una curva poco pronunciada, pero aunque no sea pronunciada, sigue siendo una curva y por eso da errores de lectura. En mi programa la lectura se repite continuamente y los valores son siempre similares. El error no es tanto por una cuestión de tomar barias muestras, si no por una cuestión matemática.

La descarga no es peligrosa, pero como tu adviertes si pruebas un condensador que tenga una carga superior a 5V y empieza la descarga por un pin de arduino no creo que sobreviva el micro.

Yo simplemente hacia un critica constructiva :slight_smile:

Sí, en el supuesto de que el condensador esté cargado a más de 5v podría ser peligroso para el arduino, por eso recomiendo poner entre masa y el pin 0 analógico un diodo zener de algo menos de 5v, para que en caso sobre tensión se cortocircuite por el zener. Pero de todos modos, la mayoría de capacímetros tiene ese problema, que si se miden cargados corren peligro de romperse, aunque se ponga un zener, sobre todo si hablamos de condensadores cargados a cientos de voltios, el Zener no va a aguantar un chispazo como dios manda.

Y por supuesto se que tú comentario es constructivo, no me lo he tomado de otra manera. XD

A ver, a ver si me aclaro. ¿Como es posible tener una tensión mayor en el condensador si la carga se hace con un pin del AVR y el circuito RC no es un charge pump?

@fm si el condensador por cualquier cosa esta cargado antes de probarlo por ejemplo a 12V no podría quemar el micro al hacer la descarga internamente por un pin.

Si podría pero es muy improbable que se ponga uno a desenchufar condensadores cargados y conectarlos para medirlos.

¿Que sucederia si pusiesemos un condensador sin polaridad cargado? Pues si lo conectas al revés, saldrian chispas hacia la masa del controlador.

lm386:
El error se da por que se trata el tiempo de carga de un condensador, como si fuese algo lineal y no lo es. La carga de un condensador se corresponde a una curva poco pronunciada, pero aunque no sea pronunciada, sigue siendo una curva y por eso da errores de lectura.

No entiendo esto muy bien. La ecuación matemática sale totalmente lineal. Has elegido un 63,2% de la tensión final de modo que operando sobre la ecuación de carga el ln es 1 y por tanto queda que C = t / R. Es totalmente lineal aunque la carga del condensador no lo sea. Si existe un error del 5% tiene que ser debido a otros factores.

Bueno pues nada, se me a ocurrido probar una serie de condensadores electrolíticos del mismo fabricante y estos son los resultados que he conseguido con el programa que hice, que es el que está al principio del hilo.

Valor Medido %Error

0.1uF .................= 0.1uF................. 0%
1uF ...................= 1,02uF................ 2%
4,7uF .................= 4,83uF............... 3%
10uF ..................= 10,56uF.............. 5,6%
22uF ..................= 21,5uF...............-2,3%
47uF ..................= 48,7uF............... 3,6%
100uF .................= 113,4uF............. 13,4% <<<< Una burrada <<<
220uF .................= 223,2uF............. 1,5%
470uF .................= 500uF................ 6,4%
1000uF ...............= 1009uF............... 0.9%

Valor = Es el valor marcado en el condensador.
Medido = Es el valor medido por el programa del arduino.
%Error = Es el porcentaje de error, entre la capacidad medida y la que figura escrita en el condensador.

Con estos resultados no se que pensar. Los condensadores son nuevos, son del mismo fabricante (uno chino) y probando condensadores de misma capacidad me dan los mismos resultados, así que no es que unos tengan algo más o menos de capacidad. El error debe de estar en el programa, pero en los condensadores de 100uF me da un error del 13%, que es una salvajada, sin embargo, el resto de mediciones más o menos tiene errores relativamente tolerables.

No veo una linealidad en los errores, así que esto debe de ser algo más complejo de lo que parece.

Lo que estas viendo es la tolerancia que tienen los condensadores, algunos son hasta del 20%!

fm:
Lo que estas viendo es la tolerancia que tienen los condensadores, algunos son hasta del 20%!

Pues tienes razón, he mirado por Internet y sí, las tolerancias típicas suelen llegar al 20%.

Muchas gracias por la info, pensaba que las tolerancias de los condensadores serían de menos del 5%, pero no, es mucho más.

Un saludo.

Un par de cosas. La ecuación para calcular la capacidad del condensador pones

(tiempofincarga/3350)-0.04

pero matemáticamente debería ser el tiempo de carga dividido por la resistencia. ¿Por qué has puesto esa otra? ¿Cómo has llegado a esa ecuación? ¿Es algo que has hecho de forma empírica?

Y una última cosa. El programa es sencillo pero a la vez lo veo muy práctico. Tanto es así que podías ampliarlo para calcular valores de condensadores más pequeños. En el programa que puedas seleccionar entre la resistencia de 3K u otra de por ejemplo 100K (no sé si la impedancia de las entradas de Arduino permitiría valores más altos para la resistencia).

Cheyenne:
Un par de cosas. La ecuación para calcular la capacidad del condensador pones

(tiempofincarga/3350)-0.04

pero matemáticamente debería ser el tiempo de carga dividido por la resistencia. ¿Por qué has puesto esa otra? ¿Cómo has llegado a esa ecuación? ¿Es algo que has hecho de forma empírica?

Y una última cosa. El programa es sencillo pero a la vez lo veo muy práctico. Tanto es así que podías ampliarlo para calcular valores de condensadores más pequeños. En el programa que puedas seleccionar entre la resistencia de 3K u otra de por ejemplo 100K (no sé si la impedancia de las entradas de Arduino permitiría valores más altos para la resistencia).

3350 fue a base de probar. En realidad tendría que ser 3000, que es la resistencia de carga del condensador, pero como los resultados que me daba no coincidían por el tema de las tolerancias tan altas de los condensadores, lo ajusté hasta que cuadrasen las medidas leídas. -0.04 es una lectura que me daba el programa en vacío, es decir, sin conectar ningún condensador, así que se me ocurrió rectar ese valor de 0,04uF. No se si será que los 40 nanofaradios es por algún error en el programa, es por que las pistas de la protoboard hacen de condensador o es por algún tema interno del arduino.

Con respecto a poner resistencias mucho más altas no hay problema teóricamente, pero lo tengo que probar. El programa en principio lo hice únicamente con fines educativos.

La verdad que con el arduino se puede hacer un polímetro bastante práctico y barato. Por supuesto con limitaciones.

Ni que decir tiene que se admiten mejoras al programa que hice. Si alguien ve como mejorarlo, aumentando el rango de lecturas o implementándole otras funciones, pues por supuesto bien venido sea. Eso sí, ruego que se prueba antes de colgar el código aquí y que se comente de la forma más exhaustiva posible, el código incluido o modificado.

Es diferencia entre el valor teórico y el valor que has medido viene determinado por:

  • el tiempo que tarda el AVR en invocar a la rutina para leer el tiempo.
  • el tiempo que tarda el código digitalWrite hasta que realmente se pone el pin a 1 o a 0.
  • error de cuantización del contador de micros. Es decir, tu mejor resolución es 1 micro segundo.
    Por otro lado, las rutinas digitalWrite y microseconds son deterministas, e.d. constantes. Por eso puedes añadir ese offset, que realmente debería ser un offset en vez de una constante por la que multiplicas.

Resumiendo:

  1. cuando la constante RC sea inferior a 1us o de unos poco microsegundos, el error será mayúsculo.
  2. tendrías que calibrar cuanto tiempo se tarda, desde que invocas a microseconds y se pone el pin a 1 y restar este valor al tiempo que estás midiendo a modo de offset.

@lm386, ese sistema de ajuste de valores es muy bueno para ti pero puede ser muy malo para cualquier otro que vaya a utilizar el código ya que has fijado unos ajustes para tu resistencia y tu Arduino. Lo importante es conseguir precisión independientemente del usuario y los elementos que utilice, bien porque se consigue con el código reducir los errores o bien porque se establece una subrrutina de calibración que cada usuario puede hacer. No lo he pensado mucho así que no sé si para este caso hay alguna forma.

Cheyenne:
@lm386, ese sistema de ajuste de valores es muy bueno para ti pero puede ser muy malo para cualquier otro que vaya a utilizar el código ya que has fijado unos ajustes para tu resistencia y tu Arduino. Lo importante es conseguir precisión independientemente del usuario y los elementos que utilice, bien porque se consigue con el código reducir los errores o bien porque se establece una subrrutina de calibración que cada usuario puede hacer. No lo he pensado mucho así que no sé si para este caso hay alguna forma.

La única forma que se me ocurre, es modificar el programa para que pueda auto calibrarse usando la capacidad de un condensador conocido, pero eso supone hacer más complejo el código y más difícil de entender para el que quiera entender como funciona el programa. Aunque es una idea totalmente razonable la que propones, creo que con que cada uno modifique la cifra hasta conseguir una lectura correcta, de un condensador de capacidad conocida, es suficiente por el momento.

Este programa posiblemente lo termine ampliando y mejorando, pero como lo hago como simple hobbye, no se para cuando estará. Hice pruebas con condensadores de mucha menos capacidad y en condensadores de cientos de pico faradios las lecturas son correctas. Pero bajando de los 100 picofaradios se producen errores monumentales, posiblemente por que las entradas del arduino tengan algún tipo de condensador entre sus patillas o a nivel interno dentro del propio chip o yo que se, lo mismo las pitas también hacen de condensador.

De todas formas si los condensadores los fa rican con un 20% de precisión de su capacidad y teniendo en cuenta que en la gran mayoría de sus usos no se necesitan valores más exactos creo que tu programa cumple muy bien su finalidad.

perdón que responda a este hilo que tiene ya más de un año pero como se refiere a un desarrollo específico me parece que lo mejor es continuarlo y no abrir otro para hacer referencia a este mismo.

Justamente ayer observaba en una casa de electrónica un medidor de componentes y recuerdo perfectamente que medimos un capacitor electrolítico de 470uf y marcaba un margen de error exactamente igual al tuyo.

La consulta que quería hacer es la siguiente ¿el riesgo del voltaje es solo si se llegara a medir un capacitor cargado? ¿si me aseguro de descargarlo puedo medir capacitores de cualquier voltaje?

muchas gracias

La verdad que es un circuito peligroso, tarde o temprano pincharas un condensador con 12v y adios, ademas q tarde 10 seg en medir uno de 1000uF me parece muy poco practico...

Los capacimetros profesionales montan el condensador en un circuito LC y miden la frecuencia de resonancia, como sabemos la frecuencia y el valor de L es un valor fijo conocido aplicamos la formula y ya, es super rapido (nada de 10s, en menos de medio segundo medimos cualquier valor) y ademas es mas preciso...

Lo unico es que no podemos hacer pistas largas o poner cables en el circuito LC pues afectaria creando un cierto valor L residual, pero haciendolo bien no hay problema.

Lo otro seria poner dos L de valores distintos controladas con un rele para tener 2 escalas de medida y poder tener un gran rango de valores a medir.

Por ultimo mostrar los valores en un LCD y hacerlo autonomo (tipo polimetro) sin necesidad de ordenador

Y ya para los mas avezados poner varios reles para conectar y desconertar L o C segun queramos y asi poder medir bobinas y condensadores, puesto que usamos un circuito LC asi que segun sustituyamos uno u otro componente podemos medir las dos cosas.

Lo montamos todo en un tupperwear de tamaño adecuado con una pila de 9v y tenemos un medidor LC autonomo, quedaria algo asi:



En esta pagina montan uno tipo RC con un 555

Aqui para medir inductanciascircuito LC con un 339

otro

Muchísimas gracias!!!

es un gran aporte!