¿Es posible el ajuste de curvas a una función sinusoidal con microcontrolador?

Tengo 2 ondas sinusoidales con una frecuencia de 2 kHz rectificadas y muestreadas a 50 kHz por dos canales ADC (10 bits) de un PIC18F26K22.

Quiero encontrar la medida de la amplitud de cada seno y la diferencia de fase entre sí. Podría usar ZCD para detectar la diferencia de fase y usar el adc solo para muestrear la amplitud, pero estaba buscando un enfoque más inteligente y amplio todo en uno.

Mi pregunta es si el uController tiene el poder computacional y si es posible hacer un ajuste de curva con un uController en otro para extraer esos 2 parámetros. Obtener un ADC con mayor frecuencia de muestreo y resolución es una posibilidad abierta, por supuesto.

Editar: para dar a mi pregunta un contexto/marco, lo que estoy buscando es medir una impedancia, tengo la señal correspondiente a la caída de voltaje en la impedancia y tengo otra señal correspondiente al circuito de detección de corriente. Entonces necesito muestrear ambos para medir la amplitud y la diferencia de fase de cada uno.

Con 16 MIPS, flash de 64 kB, ram de 3,896 kB y un multiplicador de hardware, esto está dentro del ámbito de la viabilidad. Si reduce su frecuencia de muestreo a 10 kHz por canal, puede dedicar 400 instrucciones para procesar cada muestra. Olvídese de las matemáticas de punto flotante, pero puede usar tablas de búsqueda para determinar rápidamente, por ejemplo, el seno, el seno inverso o la función exponencial de un valor. Descartaría los dos bits menos significativos de cada muestra para que cada muestra quepa en un solo byte, lo que permitiría tablas de búsqueda más pequeñas y un procesamiento más rápido.
La diferencia de amplitud y fase sugiere que desea detectar un cambio de impedancia reactiva o un acondicionador de señal LVDT diseñado para un determinado nivel de clase. Indique el propósito y/o el requerido; 1) resolución 2) precisión y 3) SNR o espectros de posible ruido y rango dinámico de la señal?
la razón por la que pregunto es que es trivial crear una onda pseudosinusoidal precisa con una escalera ponderada R desde un contador o un registro de desplazamiento largo. Y luego es posible usar un A log DAC para generar una onda sinusoidal con >70 dB SNR o incluso es posible usar cualquier PC con Audacity para generar una onda sinusoidal pura a un nivel fijo. Todo depende de lo que usted necesita para detectar?
Podrías construir un PLL digital. Esto producirá una estimación de fase continua de ambas señales. Simplemente reste las dos fases para estimar la diferencia de fase.
@TonyStewart, sí, quiero medir una impedancia. A saber, la conductividad eléctrica del agua de mar, que se mide midiendo la impedancia del fluido entre dos sondas. Pero quiero muestrear (medir) una onda sinusoidal y no generarla. Mi acondicionamiento de señal es una detección de corriente y una medición de voltios, ambas emiten dos ondas sinusoidales con la misma frecuencia pero con una fase diferente. La resolución de impedancia que busco es: 0,1 ohmios y puede tener una precisión de +/- 5%. Esto se traduce en voltaje como una precisión de 1mV y +/-5%. ¿Ayuda mi información?
@mkeith, gracias, nunca antes había oído hablar de PLL, déjame leer sobre él y ver si se adapta a mis necesidades.
Parece que no tienes restricción de tiempo, así que es más una cuestión de memoria. Estoy seguro de que puede ajustar los datos, pero para un ajuste rápido y preciso, debe establecer los parámetros de inicio, que obtiene al encontrar la amplitud y la fase máximas por otros métodos. Por lo tanto, no se vuelve más simple y de ninguna manera más rápido.

Respuestas (5)

No tengo ni idea de por qué quieres estas cosas. Y Tony pregunta y tú no respondes. Así que voy a tomarte literalmente y responder eso.

Un método general para encontrar la diferencia de fase entre dos señales idénticas es usar un correlador. Esto funciona incluso para el habla y la música. En el dominio digital, simplemente correlacionelos. El máximo local en la función de correlación estará en el tiempo de retardo d . Si tiene una señal de referencia, también puede correlacionarla con esa. La correlación también es muy fácil. Puede encontrar una rutina muy simple para ello en cualquier lugar donde mire. Solo unas pocas líneas de código, de verdad.

Hay un artículo antiguo de 1963 llamado "Análisis de quefrecuencia de series temporales para ecos: Cepstrum, Pseudo-autovariance, Cross-Cepstrum y Saphe Cracking" de Bogert et al. También puede encontrar que vale la pena leerlo.

Yo también soy aficionado a los métodos de "levantamiento rahmónico" utilizados en ese artículo.
@jonk me gusta tu idea, pero ¿puedo hacer esto si pruebo las dos ondas diferentes en momentos diferentes?
Eso debería darle una pequeña compensación de fase fija que puede restar.
La correlación es esencialmente una convolución. Requiere un número de acumulaciones múltiples en cada muestra . Puede ser matemáticamente simple y simple de describir, pero tomará muchos ciclos, especialmente para un PIC 18 que no tiene hardware de acumulación múltiple.
@jonk, ¿sabe dónde puedo descargar ese artículo sobre el análisis de quefrecuencia de Bogert? Gracias
@NicholasTJ Si no tuviera una copia, probablemente iría a la biblioteca. La cita completa es Bruce P Bogert, Michael JR Healy y John W Tukey. The Quefrency Analysis of Time Series for Echoes: Cepstrum, Pseudo-Autocovariance, Cross-Cepstrum and Saphe Cracking , Proceedings of the Symposium on Time Series Analysis, volumen 15, páginas 209–243, 1963. No sé si un DOI fue asignado. Pero las actas son un trabajo publicado, por lo que debería estar disponible en forma impresa, en alguna parte.

Puede hacer esto con el PIC, pero sería de gran ayuda comenzar con el hardware correcto frente al A/D. Rectificar las señales es una mala idea. Eso hace que sea más difícil encontrar tanto la amplitud como la fase. La CA acopla las señales y agrega una polarización de CC de la mitad del rango A/D. Escálelo para que la amplitud máxima no alcance los límites mínimo y máximo del rango A/D.

Puede utilizar los dos flujos de muestra de 50 kHz para encontrar tanto las amplitudes como la fase entre las señales.

Si sabe que ambas señales son realmente senos, entonces la amplitud se puede derivar de la diferencia promedio del promedio a largo plazo. Filtro de paso muy bajo cada señal para obtener el componente de CC. Reste cada lectura de este componente de CC, luego tome el valor absoluto y promedie eso. El resultado será proporcional a la amplitud. Nuevamente, esto solo funciona si sabe que las señales son sinusoidales (contenido armónico bajo).

Para encontrar el cambio de fase, detecte los cruces por cero. Busque la primera lectura positiva después de haber visto un número mínimo de lecturas negativas seguidas, por ejemplo. Cada ciclo de una de las señales, calcula cuántos ciclos atrás la última vez que la otra tuvo un cruce por cero. Probablemente habrá algo de ruido en esta señal, entre los cuales se encuentra el ruido de cuantificación. A una frecuencia de muestreo de 50 kHz, solo tiene 25 muestras por ciclo. Filtro de paso bajo este número 0-24 con algunos bits adicionales debajo del punto binario. Ayudará si la frecuencia de muestreo no es un múltiplo exacto de la frecuencia de interés.

Si lo anterior todavía genera demasiado ruido de cuantificación, entonces interpole entre las dos muestras donde ocurrió el cruce por cero para determinarlo con mayor precisión. Esto llevará más ciclos de computación.

Considerándolo todo, haría esto con uno de los PIC de 16 bits o dsPIC con un A/D de 12 bits. El 18F26K22 parece una elección extraña para esto. Una parte de 16 bits permitiría el filtrado de paso bajo de los flujos entrantes antes de hacer cualquier otra cosa con ellos, y el A/D de 12 bits le brinda una mejor resolución de muestreo para comenzar. Eso debería permitir una verdadera medición RMS (aunque puede que no sea necesaria) y permitir que más ciclos hagan un mejor trabajo para encontrar los cruces por cero, lo que permite mejores mediciones de fase.

Plan de diseño: (medir la impedancia del agua de mar)

  • frecuencia de 2kHz
  • La resolución de impedancia: 0,1 ohmios
  • precisión de +/- 5%.
  • Esto se traduce en voltaje como una precisión de 1mV y +/-5%.

Agua:

  • constante dieléctrica de 80 +/-10%
  • conductividad: Sus unidades son siemens por metro [S/m] en SI y milimhos por centímetro [mmho/cm] en US (no recomendado)

Lea más: http://www.lenntech.com/applications/ultrapure/conductivity/water-conductivity.htm#ixzz4KzOtwJlE

  • (Curiosidad: el agua ultra pura no es un líquido saludable para beber debido a la ausencia de minerales saludables disueltos).

  • Los sólidos disueltos totales (TDS) y la conductividad eléctrica (EC) son casi equivalentes, ya que la cantidad de iones disueltos es lo que hace que el agua sea conductora.

  • Agua ultrapura 5,5 · 10-6 S/m

  • Agua potable 0,005 – 0,05 S/m
  • Agua de mar 5 S/m

Lea más: http://www.lenntech.com/applications/ultrapure/conductivity/water-conductivity.htm#ixzz4KzOEKC3V

  • experiencia de fondo

Por lo general, los medidores LCR de precisión miden la impedancia utilizando una fuente de frecuencia de corriente constante de rango automático a una frecuencia fija como 120 Hz, 1 kHz, 100 kHz, 1 MHz y luego miden directamente el voltaje para obtener la resistencia y los componentes reactivos y otros parámetros.

Los diseños de instrumentos de alta sensibilidad de precisión utilizarán un PLL doble para mejorar la relación señal/ruido (SNR) y, por lo tanto, es posible una resolución de 10 ppm {que he logrado en diseños de corrientes de Foucault para detectar fallas metalúrgicas} en relación con valores normalizados (cero automático )

Esto no es una solución, ni un comentario, sino información de referencia para elegir un mejor plan de diseño de instrumentos o una mejor pregunta. El tamaño y los materiales de los electrodos también son un aspecto importante de este diseño, ya que la corrosión puede influir en la repetibilidad de la prueba de muestreo.

Te dejaré decidir si esto es útil.

Hola Tony, ya sabía esto y no veo cómo ayuda cómo hacer un ajuste de curva de dos señales en un microcontrolador. Gracias por ayudar.
El ajuste de curvas no es cómo mediría la impedancia reactiva. Hay mejores métodos para los detectores de fase y amplitud.
Ok, ¿puedes darme una pista de cuál sería tu enfoque?

Solución propuesta Intervalo de tiempo del oscilador de relajación > 2 KHz

Dado que la conductividad del agua depende de la temperatura del agua, esto se puede medir con el sensor de temperatura IC para la corrección de la tabla de búsqueda wrt 20'C.

La constante dieléctrica del agua es 80+/-5 y la capacitancia de los electrodos dependerá del área de la superficie y el espacio entre los electrodos. Para que esto funcione de manera efectiva, queremos hacer que C del agua sea mucho menor que un valor C de precisión en el circuito, para ignorar efectivamente Cwater y solo medir la conductividad en Siemens/metro. Por lo tanto, se requieren electrodos cortos con un espacio preciso.

Algunos investigadores también saben (cita requerida) que el agua contaminada puede comenzar la ionización y recubrir la superficie del electrodo con CC en 1 ms, si es mayor a 1,5 V, por lo que se desea una frecuencia >> 1 KHz.

El método propuesto aquí utiliza la resistencia del agua para cargar un condensador de baja fuga de precisión para un oscilador de relajación. El principio de todos los diseños de Schmitt Trigger es ignorar las entradas de ruido, pero en este caso es generar un reloj con retroalimentación negativa y el umbral incorporado de 1/3 a 2/3 tiene una amplia tolerancia, por lo que un comparador de precisión con R Se prefiere la retroalimentación de relación 3:1 con una precisión que depende de la tolerancia y los valores de la relación de resistencia.

Detalles de diseño

  • C >>100x C de electrodos.
  • C se divide por la mitad en Vcc y Vdd para que el arranque del oscilador sea instantáneo con V/2 en la entrada. (opcional)
  • El valor C se elige con la forma y el espacio del electrodo para producir f>2kHz
  • T=RC normalmente se realiza a ~60% de una onda triangular de medio ciclo de 5V.

    • Esto es solo 1/3 de oscilación en la entrada del inversor Schmitt, pero se puede hacer (amplificador operacional discreto de oscilación completa) para que sea exactamente 30% de histéresis, si RC = T = 1/f fuera deseable por alguna razón.
  • La salida de 50 ohmios es la impedancia interna de las puertas HCxx @ 5V aprox. se muestra para mayor claridad.

    • Los comparadores con colector abierto requieren un pull-up R. que afecta los umbrales. Se desea riel a riel para un regulador estable o al menos calibrado de 5.00V

Simulación Java Falstad

captura de pantalla a continuacióningrese la descripción de la imagen aquí

También puede aplicar la FFT a ambas señales y extraer la amplitud y la fase utilizando el componente con mayor amplitud.

Para la fase, también podría hacer la detección de cruce por cero y no ajustar la curva a toda la señal, sino solo cerca del cero, donde es casi lineal (sin (theta) es aproximadamente theta para theta pequeño)