leyendo la frecuencia de una onda sinusoidal

5

Estoy tratando de construir un velocímetro para mi auto, usando la salida del sensor de velocidad de los autos. El sensor de velocidad produce una onda sinusoidal. Aquí está en un osciloscopio:

comoloentiendo,paraqueelarduinoestécontento,estaseñaldebeestarentre0y5v.

Parecequeelpicoapicodeestaondaesdeaproximadamente8v-ish,loquesignificaquesidealgunamanera"corto" el voltaje negativo de esta señal, debería quedarme con algo como 0-4v, que es lo que necesito .

¿Cómo hago para leer esta señal del arduino? Me gustaría mantener el circuito simple debido al entorno severo (ish) en el que estará sentado.

He visto a algunas personas sugerir simplemente un diodo y una resistencia, y otras sugieren amplificadores operacionales, activadores Schmitt y otros conceptos en los que no estoy seguro.

Cualquier ayuda es muy bienvenida!

    
pregunta

5 respuestas

2

Hay varias maneras. Usando un amplificador operacional y algunos componentes discretos, puede obtener un detector de cruce por cero que proporciona un pulso de amplitud no mayor que el del riel de suministro positivo al amplificador operacional, que se puede detectar con una interrupción externa o cambio de pin. Interrumpir en el Arduino.

A continuación se muestra un ejemplo de un detector de cruce por cero.

simular este circuito : esquema creado usando CircuitLab

    
respondido por el J. Cotton
2

Por lo que veo en la imagen de su alcance, su señal abarca un rango desde aproximadamente −4 V a aproximadamente +2.5 V. El problema principal con esta señal no es su parte negativa, es el hecho de que la tensión positiva hace no ir lo suficientemente alto. La mayoría de los Arduinos funcionan con 5 V y tienen Schmitt dispara en sus entradas digitales. El umbral de tensión para el el cambio de pin a HIGH generalmente es de aproximadamente 2.6 V, pero esto es solo un valor típico . Lo único que garantiza la hoja de datos es que la pin leerá HIGH si su potencial es al menos 0,6 V CC , es decir, 3 V en un Arduino de 5 V.

Una opción sería usar un Arduino alimentado a 3.3 V, como el Versión 3.3 V del Pro Mini. Con esto, los pines digitales son garantizado para leer HIGH a 2 V. Esto es, sin embargo, el límite para tu señal Tu foto muestra que algunas de las oscilaciones apenas Alcanzar 2 V en su máximo. Así evitaría esta opción.

La otra opción es agregar un desplazamiento de CC a la señal para tenerla oscile alrededor de V CC / 2 = 2.5 V. De esta manera usted tiene una onda sinusoidal desplazada que va aproximadamente de −0.75 a +5.75 V. Entonces se le garantiza que alcanzará el umbral de lectura LOW , que no es inferior a 0,3 V CC = 1,5 V, y umbral para la lectura HIGH . Yo usaría un circuito como este:

simular este circuito : esquema creado usando CircuitLab

El divisor de voltaje crea un desplazamiento de CC de V CC / 2. los El condensador de la izquierda permite la entrada de la forma de onda de CA. Juntos, el condensador y el divisor de voltaje hace un filtro de paso alto con una frecuencia de corte de 1 / (πRC). Si eliges, digamos, R = 100 kΩ y C = 1 µF, entonces tiene un corte a 3.18 Hz. Tu La señal es de unos 300 Hz, por lo que debería ser capaz de medir una señal. hasta 100 veces más lento que el que se muestra en la foto.

En cuanto a la parte negativa de la señal, las entradas Arduino tienen Diodos de protección que la cuidan. Solo tienes que asegurarte de que el actual a través de esos diodos no excede de 1 mA. Esto es ¿Por qué el filtro anterior tiene una resistencia limitadora de corriente después del voltaje? divisor. Una resistencia de 10 kΩ le asegura que puede sobrepasar con seguridad el rango de voltaje de entrada normal hasta 10 V, es decir, usted está seguro mientras la onda sinusoidal desplazada se mantenga entre -10 V y +15 V.

Editar : como señala el comentario de Dmitry Grigoryev, cuando el auto la velocidad es cero este circuito dejará pasar el ruido. Teniendo un poco de ruido en una entrada digital a menudo no es un problema, ya que es cancelado por el La entrada Schmitt activa. Su amplitud de ruido, sin embargo, parece bastante grande, y es probablemente más grande que el ~ 0.5 V de histéresis que tienes En las entradas de Arduino. Entonces puedes detectar transiciones espurias que será visto como una velocidad finita.

Si esto sucede, una solución simple es cambiar el offset de CC para alejarlo de los umbrales de transición. Por ejemplo, un 47 kΩ. El menú desplegable combinado con un pull-up de 100 kΩ establecerá la polarización de CC en 1.6 V. Puede usar más resistencias asimétricas si necesita hacer El sesgo de DC sigue siendo menor. Tenga en cuenta que cambiar las resistencias también cambiar la frecuencia de corte. Las resistencias de 47 kΩ / 100 kΩ. combinado con un condensador de 1 µF tendrá un corte de aproximadamente 5 Hz.

    
respondido por el Edgar Bonet
1

Suponiendo que la velocidad es proporcional a la frecuencia y su plan es medirla contando los bordes, algo tan simple como un BJT de emisor común debería funcionar bien:

simular este circuito : esquema creado usando CircuitLab

La mayoría de los BJT pueden soportar algunos voltios de voltaje inverso sin problemas, y 2V de voltaje positivo son suficientes para conducirlos a la saturación. El hecho de que la señal se invierta y el ciclo de trabajo no sea del 50% no debería impedirle contar los bordes correctamente.

    
respondido por el Dmitry Grigoryev
0

Podría usar una resistencia, diodo y diodo Zener como el circuito que se muestra aquí:

Utilicévoltajede"red" con un transformador reductor para probar la salida del circuito que se ve así:

    
respondido por el VE7JRO
0

Una vez que haya resuelto el esquema de las excelentes respuestas hasta ahora, configure una interrupción de flanco ascendente: enlace

Esto le permitirá ejecutar un poco de código cada vez que la forma de onda pase de negativa a positiva. De hecho, escribí algo de código para hacer esto hace un tiempo para medir algunas cosas de PWM (entrada de 0 a 5v conveniente, ninguno de los problemas de filtrado con los que estás tratando). Elegí mantener una lista FIFO de deltas de tiempo de cruce, y luego, para obtener la frecuencia, las agregué y modifiqué un poco para dividirlas y obtener el promedio de esas muestras. El arduino no tiene división de hardware, por lo que dictó el número de muestras para poder hacer la división de desplazamiento de bits. Sin promediar, encontré la señal muy nerviosa.

    
respondido por el Jared Chmielecki

Lea otras preguntas en las etiquetas