Obtenga un valor de CC preciso en una señal de CA + CC

3

Fondo: Mi objetivo es usar un Arduino con dos sensores de sonda de proximidad para lograr algo de salida.

Vale la pena mencionar que la salida de la sonda de proximidad tiene dos componentes:

  1. Salida de CC que determina la posición o el GAP
  2. Componente de CA en la parte superior de ese voltaje de CC para determinar la vibración

Quiero centrarme en la parte DC .

El sensor de la sonda de proximidad tiene una salida de voltaje negativo de 0 a -20 voltios DC , ya que el Arduino acepta voltaje solo en el rango de 0 a 5 voltios, así que decidí usar un filtro de paso bajo para eliminar el componente de CA y obtener solo el componente de CC, ya que este componente de CC está en el rango de 0 a -20 voltios. Utilicé un amplificador operacional para invertir y reducir el voltaje, por lo que en lugar de estar en el rango de 0 a -20 V, será de 0 a 5 V.

En esta pregunta específica, mi objetivo es obtener el componente DC muy preciso . El circuito que implementé es muy simple. Básicamente, es un filtro de paso bajo con una frecuencia de corte de 1 Hz (asumiendo que mi señal no tendrá un componente de frecuencia en el rango de 0.00001 - 1 Hz) y luego un amplificador inversor con una ganancia de 1/4 para invertir y para reducir la tensión de CC.

Aquí está el circuito:

Lasalidaeslógica.UtilicéunafuentedevoltajeconCAyuncomponentedeCCde-10VCCcompensadoparasimularlaseñaldelasondadeproximidad,yaquíestálasalida:

La línea verde es el componente de CC que es casi -10 voltios, y la línea azul es la salida invertida y reducida. Que es casi 2.5.

El problema está en la salida. Es casi 2.5 V, y está oscilando y cambiando. Mi aplicación necesita una precisión de milivoltios, por lo que no será aceptable. ¿Cómo obtengo una salida más estable y precisa?

Aquí está la imagen de una salida ampliada:

    
pregunta Sabir Moglad

2 respuestas

4

Tu salida se ve bien para mí.
Siempre hay un período en el inicio de un filtro donde su salida está desactivada, y converge a la salida correcta en un período de tiempo relacionado con la frecuencia de corte - un corte más bajo para un filtro de paso bajo significa que tomará más tiempo converger a El verdadero valor. Esto explica la salida "cambiante" de su filtro.

A continuación, está la oscilación. Eso, también, parece correcto. Un filtro no elimina todo lo que está fuera de su banda de paso, simplemente lo reduce. Como está utilizando un filtro simple, la reducción no es muy fuerte. Su salida tiene una onda muy reducida de 50Hz en el DC, que es aproximadamente lo que podría esperar de la configuración dada del simulador y el circuito (el generador de señal dice -10V DC, 1 Volt AC a 50Hz).

Necesitará un filtro mejor para reducir la CA. Algunas otras personas aquí son más capaces de darte consejos sobre eso.

Es probable que tenga que vivir con el período al principio donde el filtro está convergiendo al nivel de DC adecuado.

Me perdí el bit sobre la "precisión de milivoltios". Dado que Arduino tiene un ADC de 10 bits, solo obtendrá 1024 pasos para voltajes entre 0 y 5 voltios. Eso es un poco menos de 5 milivoltios de resolución (4.88mVolt.) Por lo tanto, no está gong para obtener milivoltios de precisión simplemente usando el ADC.

Lo que puede hacer es usar una variante del filtro de promedio móvil sugerido para mejorar la precisión al costo de la resolución de tiempo. Lo que haría es usar un filtro de paso bajo para eliminar (reducir, realmente) los componentes superiores a 1Hz, luego promediar todos los valores de ADC durante un segundo. Obtendría un valor con más bits de precisión, pero solo una vez por segundo. La relación entre el período de tiempo para el promedio y la tasa de muestreo real le indica cuántos bits (teóricos) de precisión puede obtener. Si está muestreando a 8000Hz y promedia cada dos muestras, puede obtener un bit de precisión pero solo tiene 4000 muestras por segundo en lugar de 8000.

Eso ayudará con el DC, pero no con el AC. No sé qué puede hacer allí o si también necesita una precisión de milivoltios también.

En respuesta a los comentarios: Veo que puedes hacer postprocesamiento en Matlab. Esto hace una gran diferencia. Utilice un filtro anti-aliasing apropiado para su frecuencia de muestreo y la señal esperada. Almacene los datos muestreados en SD, luego procese en Matlab.

En Matlab, puede implementar el remuestreo para mejorar la precisión de los bits como se mencionó anteriormente, así como utilizar mejores filtros para eliminar la CA. Ya que está trabajando sin conexión, puede usar un filtro no causal para eliminar la CA, esto solucionará el problema de convergencia mencionado anteriormente.

Filtrar el DC para que pueda procesar solo el AC también será más sencillo, los filtros no causales también ayudarán aquí.

    
respondido por el JRE
3

Si entiendo el problema tienes que hacerlo

  1. invertir la señal
  2. Escala la señal
  3. Eliminar el componente de CA

Como mínimo, se requiere un OPAMP para rellenar los números 1 y 2, por lo que este componente activo también podría usarse para eliminar "algunos" del componente de CA.

Para eliminar el componente de CA, sin embargo, no solo atenúelo. Puedo sugerir un filtro de cancelación en el dominio digital. Esto utiliza un filtro de bloqueo de CC para aislar la ondulación que luego se eliminó

\ $ W = W_ {ripple} - [W_ {ripple} - \ frac {1} {N} \ sum_ {n = 0} ^ {\ infty} W_ {ripple}] \ $

La clave aquí es eliminar, no atenuar.

Como una ecuación en diferencias:

y[0] = x[0] - 0.999*(( x[0]-x[1])+y[1])

Esto requiere 2 registros de almacenamiento (y anterior, x anterior). El factor 0.999 gobierna esencialmente qué tan bien este "filtro" rechaza AC. cuanto más importantes sean las cifras, más cerca estará la salida de DC PERO tardará más en establecerse.

Ejemplo de una señal de CA (retroalimentación de velocidad de 6000rpm con ondulación de 1000rpm - forzada)

con 0.999

Con0.9999

Recuerde que se está cambiando el tiempo de liquidación por el estado libre de rizado. Si el dominio analógico puede atenuar el componente de CA lo suficiente, entonces es posible que pueda vivir con 0.999 coef

Esto no debería causar una gran sobrecarga en el Arduino al tiempo que proporciona una salida de CC muy agradable para el resto de su software

    
respondido por el JonRB

Lea otras preguntas en las etiquetas