¿Cómo mostrar señales de alta frecuencia en una pantalla pequeña?

Estoy trabajando en un proyecto para construir un osciloscopio usando el Arduino Mega2560. Construí el sistema usando una pantalla de 128x160 y tengo dificultades para mostrar un rango de frecuencias en la pantalla.

El sistema que he desarrollado mide la señal de entrada con un retraso de 1 ms entre cada medición, haciendo esto 120 veces colocando cada lectura en una matriz. Descubrí que tengo que usar un retraso de 1 ms; de lo contrario, captura las frecuencias bajas demasiado rápido y solo mostrará partes de la forma de onda. Con este sistema, el osciloscopio solo mide hasta unos 400 Hz antes de que se active Nyquist y la forma de onda se distorsione.

Mido la frecuencia (arriba a la izquierda) comprobando la matriz y encontrando cuántas veces la señal cruzó el 0. Para evitar que la señal vuele por la pantalla, encuentro el primer valor cuando cruzó el 0 y extraigo la señal desde allí. Solo se muestran 74 valores de la matriz 120.

¿Existe una forma matemática a partir de la información proporcionada de tal manera que si la frecuencia está por encima del retraso de cambio de 'x', de modo que el sistema pueda medir y medir automáticamente hasta 100 kHz y mostrar la señal en la pantalla, es esto posible?

ingrese la descripción de la imagen aquí

Los osciloscopios suelen tener bases de tiempo intercambiables: el usuario determina cuánto tiempo representa la pantalla. No podrá obtener un muestreo rápido con su método actual. Puede llegar a quizás 10000 muestras por segundo usando las bibliotecas de Arduino. Ciertamente no llegará a las 200000 muestras por segundo necesarias para capturar una señal de 100kHz.
Si entiendo. Me pregunto si esto se puede hacer automáticamente con la configuración dada, como la función de rango automático de ossiloscopios, editado cuestionado para incluir el término 'autorango'.
¿Cómo lo harás automáticamente? Si muestrea demasiado lentamente, no podrá detectar las frecuencias más altas. Si muestrea demasiado rápido, se quedará sin memoria y no podrá detectar las frecuencias más bajas.
Y, como dije, el Arduino simplemente no es capaz de alcanzar altas tasas de muestreo.

Respuestas (2)

Este es un problema con muchos aspectos, pero como mínimo, no debe vincular la cantidad de muestras que toma a la resolución de su pantalla. En su lugar, tome muestras lo más rápido que pueda o, si tiene un filtro anti-aliasing analógico (como debería hacerlo), a la velocidad de Nyquist o por encima de ella para el ancho de banda del filtro.

Luego, cuando pintas las muestras que has tomado en la pantalla, puedes elegir cómo hacerlo. Algunas formas simples de implementar:

  • Para cada columna de la pantalla, encuentre todas las muestras que caen dentro de ese rango y llene desde el nivel mínimo hasta el nivel máximo de esas muestras. Esto evitará la creación de alias adicionales y es una técnica de visualización común en los editores de audio.
  • Dibuja todas las muestras individualmente como puntos, sin importar cuántos puntos terminen en la misma columna. Esto muestra más detalles pero requiere más interpretación por parte del usuario.

Además de evitar el alias innecesario, separar el muestreo y la visualización también le permite implementar capturas de un solo disparo seguidas de zoom/desplazamiento panorámico de la vista, lo que ayudará con la usabilidad de su visualización de baja resolución.


En cuanto al rango automático: una vez que haya muestreado lo mejor que pueda, puede aplicar su conteo de frecuencia o cualquier otro algoritmo a esos datos para elegir un zoom inicial. Pero si muestrea lentamente, ya ha descartado datos, y eso es un problema. (Sin embargo, es posible que tenga problemas para almacenar suficientes datos para trabajar en un amplio rango de frecuencia sin RAM externa).


Dependiendo de sus objetivos, podría ser un ejercicio interesante implementar un osciloscopio en una PC utilizando la entrada de una tarjeta de sonido. De esa manera, puede jugar con procesamiento de señales y algoritmos de pintura con menos restricciones de recursos; y las tarjetas de sonido USB se pueden encontrar fácilmente con una frecuencia de muestreo de hasta 192 kHz (aunque a menudo acopladas a CA). Luego puede tomar lo que aprendió y descubrir cómo encajarlo en el Arduino.

Con una resolución horizontal de 160 píxeles, desea al menos 2,5 muestras por frecuencia de onda sinusoidal máxima dependiendo de la sincronización del disparador para evitar el aliasing. Eso define el número de cruces por cero por captura de cuadro. Desafortunadamente, su resolución de píxeles es baja.

pero si su ADC es al menos 2.5 veces más rápido que el espectro de entrada BW, entonces es posible el eje X de rango automático si puede mostrar la escala. Sin embargo, para una precisión vertical, se necesitan 10x muestras por seno.

Justo lo contrario de la escala automática DMM, que verifica el desbordamiento, usted comienza en la tasa de muestreo máxima y cuenta los cruces por cero y la tasa de muestreo decreciente.

Recuerdo que el TD autocal mostraba 4 ciclos de la fundamental. En su ejemplo, hay 4 ráfagas de 10 ciclos, por lo que 1 ráfaga de 10 ciclos podría ser ideal. La activación es un truco con diezmado y filtrado para encontrar lo fundamental.

Los primeros TEK usaban PLL para suavizar la frecuencia de actualización pero capturaban la frecuencia fundamental. Una pantalla tosca tendrá demasiada fluctuación de disparo.

Esta página indica una frecuencia de muestreo de 100 KHz cuando se registra en una tarjeta SD y más con un ADC externo. Valores ADC de 8 bits a 100.000 muestras por segundo. La precisión estimada es de 7,3 ENOB

https://forums.adafruit.com/viewtopic.php?f=31&t=30557