Tabla de contenido:

Generador de formas de onda Arduino: 5 pasos (con imágenes)
Generador de formas de onda Arduino: 5 pasos (con imágenes)

Video: Generador de formas de onda Arduino: 5 pasos (con imágenes)

Video: Generador de formas de onda Arduino: 5 pasos (con imágenes)
Video: ARDUINO: CÓMO GENERAR ONDA CUADRADA PERFECTA DE 1 HZ 2024, Mes de julio
Anonim
Generador de forma de onda Arduino
Generador de forma de onda Arduino

Actualización de febrero de 2021: consulte la nueva versión con 300 veces la frecuencia de muestreo, basada en Raspberry Pi Pico

En el laboratorio, a menudo se necesita una señal repetitiva de cierta frecuencia, forma y amplitud. Puede ser para probar un amplificador, verificar un circuito, un componente o un actuador. Los generadores de forma de onda potentes están disponibles comercialmente, pero es relativamente fácil hacer uno útil usted mismo con un Arduino Uno o Arduino Nano, vea por ejemplo:

www.instructables.com/id/Arduino-Waveform-…

www.instructables.com/id/10-Resister-Ardui…

Aquí está la descripción de otro con las siguientes características:

* Formas de onda precisas: salida de 8 bits con R2R DAC, forma de 256 muestras

* Rápido: frecuencia de muestreo de 381 kHz

* Preciso: rango de frecuencia de pasos de 1mHz. Tan preciso como el cristal Arduino.

* Fácil operación: forma de onda y frecuencia configurables con un solo codificador rotatorio

* Amplia gama de amplitudes: milivoltios a 20V

* 20 formas de onda predefinidas. Sencillo de agregar más.

* Fácil de hacer: Arduino Uno o Nano plus componentes estándar

Paso 1: consideraciones técnicas

Hacer una señal analógica

Una deficiencia de Arduino Uno y Nano es que no tiene un convertidor de digital a analógico (DAC), por lo que no es posible hacer que emita un voltaje analógico directamente en los pines. Una solución es la escalera R2R: se conectan 8 pines digitales a una red de resistencias para que se puedan alcanzar 256 niveles de salida. A través del acceso directo al puerto, el Arduino puede configurar 8 pines simultáneamente con un solo comando. Para la red de resistencias, se necesitan 9 resistencias con valor R y 8 con valor 2R. Usé 10kOhmios como valor para R, que mantiene la corriente de los pines a 0.5mA o menos. Supongo que R = 1kOhm también podría funcionar, ya que Arduino puede entregar fácilmente 5 mA por pin, 40 mA por puerto. Es importante que la relación entre las resistencias R y 2R sea realmente 2. Eso se logra más fácilmente poniendo 2 resistencias de valor R en serie, para un total de 25 resistencias.

Acumulador de fase

La generación de una forma de onda se reduce a enviar repetidamente una secuencia de números de 8 bits a los pines de Arduino. La forma de onda se almacena en una matriz de 256 bytes y esta matriz se muestrea y se envía a los pines. La frecuencia de la señal de salida está determinada por la rapidez con la que se avanza a través de la matriz. Una forma robusta, precisa y elegante de hacerlo es con un acumulador de fase: un número de 32 bits se incrementa a intervalos regulares y usamos los 8 bits más significativos como índice de la matriz.

Muestreo rápido

Las interrupciones permiten muestrear en momentos bien definidos, pero la sobrecarga de las interrupciones limita la frecuencia de muestreo a ~ 100 kHz. Un bucle infinito para actualizar la fase, muestrear la forma de onda y configurar los pines toma 42 ciclos de reloj, logrando así una frecuencia de muestreo de 16MHz / 42 = 381kHz. Girar o presionar el codificador rotatorio causa un cambio de pin y una interrupción que sale del bucle para cambiar la configuración (forma de onda o frecuencia). En esta etapa, los 256 números de la matriz se vuelven a calcular para que no sea necesario realizar cálculos reales de la forma de onda en el bucle principal. La frecuencia máxima absoluta que se puede generar es de 190 kHz (la mitad de la frecuencia de muestreo), pero solo hay dos muestras por período, por lo que no hay mucho control de la forma. Por lo tanto, la interfaz no permite establecer la frecuencia por encima de 100 kHz. A 50 kHz, hay 7-8 muestras por período y a 1,5 kHz y por debajo de todos los 256 números almacenados en la matriz se muestrean en cada período. Para formas de onda en las que la señal cambia suavemente, por ejemplo, la onda sinusoidal, omitir muestras no es un problema. Pero para las formas de onda con picos estrechos, por ejemplo, una onda cuadrada con un ciclo de trabajo pequeño, existe el peligro de que para frecuencias superiores a 1,5 kHz, perder una sola muestra pueda provocar que la forma de onda no se comporte como se esperaba.

Precisión de la frecuencia

El número en el que se incrementa la fase en cada muestra es proporcional a la frecuencia. Por tanto, la frecuencia puede ajustarse a una precisión de 381 kHz / 2 ^ 32 = 0,089 MHz. En la práctica, esta precisión casi nunca es necesaria, por lo que la interfaz se limita a establecer la frecuencia en pasos de 1 mHz. La precisión absoluta de la frecuencia está determinada por la precisión de la frecuencia del reloj Arduino. Esto depende del tipo de Arduino, pero la mayoría especifica una frecuencia de 16.000MHz, por lo que una precisión de ~ 10 ^ -4. El código permite modificar la relación de la frecuencia y el incremento de fase para corregir pequeñas desviaciones del supuesto de 16MHz.

Buffering y amplificación

La red de resistencias tiene una impedancia de salida alta, por lo que su voltaje de salida cae rápidamente si se conecta una carga. Eso se puede resolver almacenando en búfer o amplificando la salida. Aquí, el almacenamiento en búfer y la amplificación se realiza con un amplificador operacional. Usé el LM358 porque tenía algunos. Es un amplificador lento (velocidad de respuesta de 0,5 V por microsegundo), por lo que a alta frecuencia y alta amplitud la señal se distorsiona. Lo bueno es que puede manejar voltajes muy cercanos a 0V. Sin embargo, el voltaje de salida está limitado a ~ 2 V por debajo del riel, por lo que el uso de una potencia de + 5 V limita el voltaje de salida a 3 V. Los módulos elevadores son compactos y económicos. Alimentando + 20V al opamp, puede generar señales con voltaje de hasta 18V. (NB, el esquema dice LTC3105 porque ese fue el único paso adelante que encontré en Fritzing. En realidad, usé un módulo MT3608, vea las imágenes en los siguientes pasos). Elijo aplicar una atenuación variable a la salida del R2R DAC, luego uso uno de los amplificadores operacionales para amortiguar la señal sin amplificación y el otro para amplificar en 5.7, de modo que la señal pueda alcanzar una salida máxima de aproximadamente 20V. La corriente de salida es bastante limitada, ~ 10 mA, por lo que puede ser necesario un amplificador más fuerte si la señal debe impulsar un gran altavoz o electroimán.

Paso 2: componentes necesarios

Para el generador de forma de onda del núcleo

Arduino Uno o Nano

Pantalla LCD 16x2 + recortador de 20kOhm y resistencia serie 100Ohm para retroiluminación

Codificador rotatorio de 5 pines (con pulsador integrado)

25 resistencias de 10kOhm

Para el búfer / amplificador

LM358 u otro opamp dual

módulo elevador basado en MT3608

Resistencia variable de 50 kOhmios

Resistencia de 10 kOhmios

Resistencia de 47kOhmios

Condensador de 1muF

Paso 3: construcción

Construcción
Construcción
Construcción
Construcción

Soldé todo en una placa prototipo de 7x9cm, como se muestra en la imagen. Como se ensució un poco con todos los cables, traté de colorear los cables que llevan voltaje positivo en rojo y los que llevan tierra en negro.

El codificador que utilicé tiene 5 pines, 3 en un lado, 2 en el otro lado. El lado con 3 pines es el codificador real, el lado con 2 pines es el botón integrado. En el lado de 3 pines, el pin central debe estar conectado a tierra, los otros dos pines a D10 y D11. En el lado de 2 clavijas, una clavija debe estar conectada a tierra y la otra a D12.

Es la cosa más fea que he hecho en mi vida, pero funciona. Sería bueno instalar un gabinete, pero por ahora el trabajo adicional y el costo realmente no lo justifican. El Nano y la pantalla están conectados con encabezados de pines. No volvería a hacer eso si construyera uno nuevo. No puse conectores en la placa para captar las señales. En cambio, los recojo con cables de cocodrilo de trozos de alambre de cobre que sobresalen, etiquetados de la siguiente manera:

R - señal sin procesar del R2R DAC

B - señal con búfer

A - señal amplificada

T - señal de temporizador del pin 9

G - tierra

+ - voltaje positivo 'alto' del módulo elevador

Paso 4: el código

El código, un boceto de Arduino, se adjunta y debe cargarse en Arduino.

Se han predefinido 20 formas de onda. Debería ser sencillo agregar cualquier otra ola. Tenga en cuenta que las ondas aleatorias llenan la matriz de 256 valores con valores aleatorios, pero el mismo patrón se repite en cada período. Las verdaderas señales aleatorias suenan como ruido, pero esta forma de onda suena mucho más como un silbido.

El código establece una señal de 1 kHz en el pin D9 con TIMER1. Esto es útil para verificar la sincronización de la señal analógica. Así es como descubrí que el número de ciclos de reloj es 42: si asumo 41 o 43, y genero una señal de 1 kHz, claramente tiene una frecuencia diferente de la señal en el pin D9. Con el valor 42 combinan a la perfección.

Normalmente, Arduino interrumpe cada milisegundo para realizar un seguimiento del tiempo con la función millis (). Esto perturbaría la generación de señal precisa, por lo que la interrupción en particular se deshabilita.

El compilador dice: "Sketch usa 7254 bytes (23%) del espacio de almacenamiento del programa. El máximo es 30720 bytes. Las variables globales usan 483 bytes (23%) de memoria dinámica, dejando 1565 bytes para las variables locales. El máximo es 2048 bytes". De modo que hay un amplio espacio para un código más sofisticado. Tenga en cuenta que es posible que deba elegir "ATmega328P (antiguo gestor de arranque)" para cargar correctamente al Nano.

Paso 5: uso

El generador de señal se puede alimentar simplemente a través del cable mini-USB del Arduino Nano. Es mejor hacerlo con un banco de energía, de modo que no haya un bucle de tierra accidental con el aparato al que se puede conectar.

Cuando se enciende, generará una onda sinusoidal de 100 Hz. Al girar la perilla, se puede elegir uno de los otros 20 tipos de onda. Al girar mientras se presiona, el cursor se puede configurar en cualquiera de los dígitos de la frecuencia, que luego se puede cambiar al valor deseado.

La amplitud se puede regular con el potenciómetro y se puede utilizar la señal tamponada o amplificada.

Es realmente útil usar un osciloscopio para verificar la amplitud de la señal, en particular cuando la señal suministra corriente a otro dispositivo. Si se consume demasiada corriente, la señal se cortará y la señal estará muy distorsionada.

Para frecuencias muy bajas, la salida se puede visualizar con un LED en serie con una resistencia de 10kOhm. Las frecuencias de audio se pueden escuchar con un altavoz. Asegúrese de configurar la señal muy pequeña ~ 0.5V, de lo contrario, la corriente aumentará demasiado y la señal comenzará a recortarse.

Recomendado: