Autor Tema: Medidor avanzado LCR ( se puede hacer??)  (Leído 13645 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Medidor avanzado LCR ( se puede hacer??)
« en: 11 de Junio de 2012, 05:24:04 »
Buenas a todos.

Estoy dandole vueltas a un proyecto nuevo relacionado con medidas de impedancias. La idea surgió después de leer un antiguo proyecto de Elektor del año 1997 "Advanced LCR meter".

Elektor pdf

El objeto es diseñar un instrumento avanzado de medidas de L, C y R asi como otros parametros relacionados con estos componentes como el factor Q.
 
En lugar de usar el clásico metodo de contar la frecuencia de oscilación generada por un circuito donde se incluye el elemento a medir, este instrumento
estaría basado en la medida de impedancias en un puente compuesto por un impedancia de referecia y el elemento a medir, para obtener esta magnitud
el puente se excita con una onda sinusoidal de frecuencia conocida y se mide los valores de tensión y desplazamiento de fase en el puente.

Para hacer esto el proyecto de Elektor usaba un CI que generaba la onda con un DAC interno y luego obtenia el valor medido en el puente con un ADC incluido en el mismo CI.
No he conseguido suficientes detalles ( para migrarlo a un PIC18, dspPIC o PIC32) del proceso matemático posterior que permite obtener la medidas de L,C y R y factor Q y otros.

He encontrado otros proyecto similares que usan el mismo principio pero con poco detalle del algoritmo que usan ( http://www.pro-radio.ru/measure/4319/ en ruso... :?).

Tengo varias dudas iniciales:

   - Generación de la onda senosoidal : los ejemplo que he visto usan DAC de 14-16 bits, si uso un PIC necesito un DAC externo ( no quiero meterme en lios de DDS) ,
    no se si podré obtener una onda de 1Khz, 10 Khz o hasta 100 Khz con un PIC rápido y un DAC mediante SPI o I2C.
   - Que precision necesito en la amplitud de la ona generada y en su frecuencia para obtener medidas fiables ( digamos 1% de error ) ¿?
   - Relacionado con lo anterior, ¿ como de bueno tiene que ser el ADC para obtener esa  precisión ? puedo usar el ADC interno de un PIC (ya los hay 12 bits)

Bueno, no pongo más dudas porque me desanimo a mi mismo y lo doy por "imposible"   :(, con vuestra ayuda seguro que no será así. :)

Gracias a todos...

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #1 en: 11 de Junio de 2012, 11:37:03 »
Es un proyecto interesante. Me apunto al hilo.

Saludos.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #2 en: 11 de Junio de 2012, 12:16:09 »
Respecto al error de la amplitud y frecuencia, seguramente para calcular las impedancias estos valores se ingresan en una formula. Ahí se puede aplicar propagación de errores, de esa manera teniendo por ejemplo la amplitud con x%, la frecuencia con y% podes determinar con que % de error obtienes la medida. Luego a ese error pueden agregarse otros, que dependen de cada caso.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #3 en: 11 de Junio de 2012, 18:11:54 »
Creo que se puede intentar. Me conformo con mucho menos de lo que promete el artículo.

Rango de medidas:
R = 0.1 mOhm  ...  100 Mohm
L = 100 nH  ...   10 kH
C = 0.5 pF ...  10 mF
Q factor = 1 ... 1000

Exactitud 0.25% en gran parte del rango.

Tensión de test: 0.1 ... 1 voltio
Frecuencia de test: 1000 Hz
Tiempo de medida: 1.5 segundos


Yo puedo ayudar en la programación de las rutinas matemáticas.

Saludos.

Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #4 en: 11 de Junio de 2012, 19:24:56 »
Buenas noticias  :mrgreen: :mrgreen:

Del foro ruso he sacado un esquema :

http://cqham.ru/image4/RLC_usb_big.png


y código que corre en un micro 8051F410, el calculo que hace se basa en la siguiente formula:



        Re_U + j*Im_U     Re_U*Re_I + Im_U*Im_I        ReI*Im_U - Re_U*Im_I
 Z =   --------------      = ----------------------------    + j -----------------------
         Re_I + j*Im_I     Re_I*Re_I + Im_I*Im_I          Re_I*Re_I + Im_I*Im_I




La parte Real e Imaginaria de U e I se calcula con un MAC de 48 bits, que se hace sobre una serie de muestras obtenidas en el ADC periodicamente.

Despues a partir de Z se obtiene los valores de R , C o L , lo malo es que parte del programa está en ensamblador, copio parte del codigo C extraido :

Código: [Seleccionar]
     

        tfloat=Re_I*Re_I+Im_I*Im_I;

      Real.F=R_Et*(Re_U*Re_I+Im_U*Im_I)/tfloat; // Calculate real part complex resistance
      Imag.F=R_Et*(Im_U*Re_I-Re_U*Im_I)/tfloat; // Calculate imaginery part complex resistance

      if (Real.F==0) Real.F=1.0E-38 ;

      Phase = atan(Imag.F/Real.F);
      if ((Real.F<0) && (Imag.F<0)) Phase-=Pi;
      if ((Real.F<0) && (Imag.F>=0)) Phase+=Pi;

      if (abs(Phase)<0.1){
        strcpy(LCD_Line,"R= ");
      } else {
        if (Phase > 0) {
          Real.F=1/(2*Pi*Frequency*Imag.F);      
          strcpy(LCD_Line,"C= ");
        } else {
          Real.F=Imag.F/(2*Pi*Frequency);
          strcpy(LCD_Line,"L= ");
        }
      }


Seguire investigando, si alguien se anima con el foro ruso...  :lol:  por el momento ya he hecho un pedido de samples de un PIC con ADC de 12 bits y un DAC (MPC4822) a nuestro amigo Microchip.



Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #5 en: 12 de Junio de 2012, 03:05:29 »
He estado estudiando el esquema y creo que la base del sistema se basa en un lock-in amplifier.

Este amplificador lo que hace es multiplicar la señal de referencia (tensión senoidal) por la señal de corriente (otra onda senoidal desfasada).
El amplificador sólo amplifica la señal que tenga exactamente la misma frecuencia y fase. El resto de señales se elimina. Elimina el ruido de manera muy eficaz.
Para detectar el desfase multiplica la señal de entrada desfasada 90º (señal coseno) por la señal de corriente.

El amplificador lock-in está implementado dentro del microcontrolador y por eso tiene que ser tan rápido.

Dejo otro enlace de un miliohmetro que utiliza un sistema semejante, pero no detecta desfases y el amplificador está fuera del micro. Lo mejor de este artículo es que explica con detalle el funcionamiento:
http://cappels.org/dproj/dlmom/dlmom.html

Un amplificador Lock-in para el laboratorio:
http://orchard.uwaterloo.ca/Courses/Chem724/SimpleLockInAmplifier.pdf

Saludos.
« Última modificación: 12 de Junio de 2012, 10:13:00 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #6 en: 12 de Junio de 2012, 10:22:25 »
Creo que si se puede hacer y es muy semejante a un proyecto que quería copiar de un medidor de miliohmios, pero más avanzado.

Esta nota de aplicación de Microchip explica como hacer un lock-in amplifier digital:
   Implementing Digital Lock-In Amplifiers Using the dsPIC DSC


Un Lock-in amplifier analógico casero, con ejemplos de aplicación y muchos enlaces:
Homebrew Lock-In Amplifier

Presentación que explica el principio de los lock-in amplifiers:
Lock-in amplifiers


Creo que sí se puede hacer el medidor LRC.


Saludos.

Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #7 en: 12 de Junio de 2012, 14:07:06 »
Gracias Picuino por tu análisis y busqueda de información.

Seguire mirando el código C que consegui en el foro ruso   :mrgreen: porque creo que el esquema que adjunte no corresponde con ese software, encontre otro en ensamblador pero no me entero de "na" por que los comentarios están en ese bonito lenguaje desconocido que hablan nuestro amigos... :lol:.

Aparte de que el esamblador es de un PIC y el "C" de un 8051... otra diferencia que si he conseguido identificar es que el sofware C usa un DAC para generar la onda senoidal, pero en el código ensamblador parece que se usa una onda cuadrada generada mediante el CCP del PIC, por eso creo que se usa un filtro de segundo orden en el esquema, para sacar de ahi la senoidal.



Sin embargo el codigo de  la nota de microchip que pasate si parece similar al "software C".. supongo que la algoritmia que sigue un filtro lock-in y el procesamiento que se usa para calcular los valores LCR es similar... no sé... el principal problema que veo es el proceso de multiplicación y suma que hay que hacer con las muestras del ADC y la tabla seno y coseno... esto tiene que ser rápidito...

Por cierto, todo este software se puede sacar del foro ruso, hay que buscar, no tengo los links directos a mano.


Saludos.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #8 en: 12 de Junio de 2012, 14:56:02 »
El funcionamiento es el siguiente:

Primero se genera una señal de tensión senoidal (se podría dedicar un pequeño pic a ello sin problema o un GAL)

Después se aplica la tensión a una impedancia desconocida y se mide la corriente.

Se convierte la corriente a señal digital con un DAC.

Se multiplica la señal de corriente por la señal seno y se van sumando los resultados.
Se multiplica la señal de corriente por la señal coseno (la misma señal seno pero desfasada 90º) y se van sumando los resultados.

Los dos valores anteriores son la parte real e imaginaria de la corriente  I = X + Y j

Ahora se puede calcular la impedancia como Z = V/I


En realidad los cálculos se complican un poco porque el puente de medida es un poco más complejo, pero la base del asunto es la que te he contado. Creo que se puede hacer hasta con un PIC16F. Depende de la precisión que quieras tener.

Saludos.


Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #9 en: 12 de Junio de 2012, 16:12:54 »
Asi es, ese es el algoritmo que implementa el codigo C que tengo:

Código: [Seleccionar]
   Saved_ADC0=ADC1BUF0;
   Saved_Sin=Last_Sin;
   Saved_Cos=Last_Cos;

   // MAC48 !!!! En ensamblador
   //Real+=(Saved_ADC0*Saved_Sin); // Multiplay and acumulate Real Part
   //Imag+=(Saved_ADC0*Saved_Cos); // Multiplay and acumulate Im. Part

Esta parte está incluida en la rutina de interrupción del ADC, como ves aqui es donde se multiplica el valor leido del ADC por el seno y el coseno, pero hay una diferencia con lo que dices, primero se hace con V durante 0.5 segundos y después con I el mismo tiempo, es decir obtengo 2 numeros complejos V e I a partir de varias muestras, luego se divide por el numero de muestras y así se obtiene el primer valor de la formula que ya puse:


        Re_U + j*Im_U     Re_U*Re_I + Im_U*Im_I        ReI*Im_U - Re_U*Im_I
 Z =   --------------      = ----------------------------    + j -----------------------
         Re_I + j*Im_I     Re_I*Re_I + Im_I*Im_I          Re_I*Re_I + Im_I*Im_I



También veras que he marcado MAC48 ( Multiply -Accumulate ), aqui realmente se usa una rutina en ensamblador que maneja magnitudes de 48 bits.
Mi idea es migralo a ensamblador del PIC18F y ver que pasa....

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #10 en: 12 de Junio de 2012, 17:14:09 »
Hay muchas formas de hacerlo dependiendo del puente que utilices. Todas son equivalentes.

Al final necesitas saber 2 números complejos V e I.
En mi explicación supongo V conocida y por eso no la mido.

También hay otros métodos que suponen V conocida con dos valores y miden dos valores de I para poder eliminar el error de offset, etc.

En el proyecto que presentaste al comienzo parece que se conoce V_total y se mide la tensión que sale de un divisor de tensión en el que una impedancia es conocida y la otra no.

Saludos.

Desconectado nZeta

  • PIC16
  • ***
  • Mensajes: 130
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #11 en: 14 de Junio de 2012, 01:05:57 »
Talvez te interece ver los videos de PSOC Today Episodios  2 a 5 que tratan de Synchronous Detection, en el ep 5 muestran que como se puede usar para crear un RLC.
http://www.cypress.com/?rID=60521

Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #12 en: 14 de Junio de 2012, 09:21:36 »



Gracias por la info, nZeta, les echare un vistazo...

Sigo avanzando con esto, conseguí un codigo en ensamblador que hace un MAC de 48 bits rapidito, lo que necesitaba para poder ponerlo en la rutina de interrupción.

Lo he estado probando ( desde C llama a la rutina en ensamblador) y parece que va bien, la prueba consiste en ir pasandole al MAC datos sacados de dos arrays de 96 valores
que forman una onda seno y coseno completa.

Hay un detalle que me llama la atención: si en el MAC introduzo un seno y un coseno es decir ejecuto el siguiente proceso : mac = mac + ( sin(x) * cos(x) )
el resultado despues de un numero entero de ciclos simpre en 0, es aritmetica con signo , lo cual parece correcto.

Sin embargo si en el MAC introduzco 2 senos , es decir :  mac = mac + ( sin(x) * sin(x) ) el resultado, como parece obvio va creciendo con el numero de ciclos .

Esta prueba corresponderia con el siguiente escenario real:

una impedancia Z que sería una R pura, es decir sin componentes L y C excitado por una funcion seno.

con el algoritmo que indicó Picuino :


Se multiplica la señal de corriente por la señal seno y se van sumando los resultados.
Se multiplica la señal de corriente por la señal coseno (la misma señal seno pero desfasada 90º) y se van sumando los resultados.

Los dos valores anteriores son la parte real e imaginaria de la corriente  I = X + Y j

Ahora se puede calcular la impedancia como Z = V/I



una de las componentes , la imainaria sería 0, correcto,  pero  la parte real  al estar las 2 señales en fase, iria creciendo indefinidamente, ¿ es esto correcto ?

supongo que si, ya que al final el valor que se obtiene después de N ciclos se divide por N, pero me llama la atención...

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5883
    • Picuino
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #13 en: 14 de Junio de 2012, 10:47:27 »
Se supone que la operación mac la realizas sobre un número finito de samples (por ejemplo 16000)

Si quieres sacar una señal continua, como hace un lock-in amplifier, tienes que aplicar un filtro paso bajos.

Hay muchas maneras de implementarlo. Una de ellas sería un filtro exponencial de orden uno:

   mac = (255 * mac  +  1* (sen[t] * i[t])) / 256


Los números multiplicadores tienen que sumar 256 para que funcione. Cuanto mayor sea el primer multiplicador, mas despacio responde el filtro. Los números están escogidos para que sea muy rápido realizar la multiplicación y la división (con un desplazamiento de 8 bit y una resta se multiplica por 255 y con un desplazamiento de 8 bit se divide por 256, todo muy rápido con el barrel shifter)

A propósito, creo que no necesitas tanta precisión. Con 16 bit para empezar creo que es suficiente.

Saludos.

Desconectado splasma2

  • PIC16
  • ***
  • Mensajes: 131
Re: Medidor avanzado LCR ( se puede hacer??)
« Respuesta #14 en: 14 de Junio de 2012, 11:21:56 »
Gracias Picuino,

Probare a incluir el filtro que me indicas en la rutina en ensamblador    :?  que calcula el MAc de 48 bits... a ver como se comporta

La prueba la hice con 500x96 muestras y cada muestra es de 12 bits ( es decir el n. de bits del ADC del PIC que quiero usar) la anchura en bits del resultado de MAC tiene que ser grande , por eso  48 bits, realmente el codigo que estoy usando  esta pensado para un MAC de 16x16, pero... mejor que sobre... :mrgreen: