Generador de forma de onda arbitraria, por ~ 20 $: 6 pasos

Generador de forma de onda arbitraria, por ~ 20 $: 6 pasos

Tabla de contenido:

Anonim

Un generador de forma de onda arbitrario (AWG) es una pieza útil pero a menudo costosa de un equipo de prueba (puede ser de risa). Úselo para determinar la respuesta de frecuencia del componente, generar señales portadoras, como un medidor LCR si tiene un alcance, afine circuitos resonantes, reproduce sonidos o simplemente dibuje gráficos geniales en su alcance. ¡También tiene muchos otros usos, tanto benignos como siniestros, usa tu imaginación (bajo tu propio riesgo)!

Este proyecto describirá cómo hacer un AWG que pueda producir ondas sinusoidales decentes hasta aproximadamente 2Mhz y, por supuesto, todo tipo de otras formas de onda, por alrededor de 20 $ (suponiendo que sea propietario de un programador stk500 o equivalente).

Este proyecto asume que el constructor está familiarizado con el lenguaje ensamblador, los microcontroladores atmel y sus programadores, el uso del osciloscopio y la electrónica básica. Todas las nuevas ideas y esquemas se publican bajo la GPL, todas las imágenes no esquemáticas se publican bajo una licencia Creative Commons.

Partes:

2x 10 pF capacitores

1x cristal, preferiblemente 16Mhz, usé 14Mhz

Regulador de voltaje 1x 5v

Batería 2x 9v

7x 50kohm resistencias, 1%

10x 100kohm resistencias, 1%

2x 4.7kohm resistencias

1x 100kohm potenciometro

1x 10kohm potenciometro

1x OPA2132 op-amp, o cualquier op-amp con el que estés familiarizado

Condensadores electrolíticos 2x 220uF, con capacidad nominal de 18 V o más

Finalmente, necesitará las hojas de datos para el atmega16-16pu, y su opamp de elección. En el circuito del amplificador, etiqueté los pines por función y no por número, la hoja de datos le mostrará qué pines son cuáles (usé el mismo esquema de denominación que la hoja de datos).

La versión html original de este proyecto está disponible en

La foto muestra una onda sinusoidal de 1Mhz generada por el dispositivo.

Suministros:

Paso 1: Primer Circuito.

Este circuito contiene el microcontrolador y el convertidor digital a analógico (llamado red R / 2R) que genera la forma de onda. La forma de onda generada está entre 0 y + 0.2v, la resistencia de 100kohm y el potenciómetro actúan como un sesgo para hacer que esté entre -0.1v y + 0.1v.

MUY IMPORTANTE: a menos que desee incluir interruptores que cambien el tipo / frecuencia de la forma de onda … No lo hice porque implica un compromiso de rendimiento … reprogramará este microcontrolador con frecuencia. Sea elegante e incluya ISP, o haga lo que hice: suelde un conector IC a la placa de circuitos, y también aloje el microcontrolador en otro conector IC … el contacto eléctrico entre los dos conectores IC está bien, y la extracción del IC La herramienta te permite sacarla con la mínima fuerza.

Alternativamente, gastar unos pocos dólares adicionales y obtener un zócalo ZIF. Si tuviera que rehacer este proyecto, esto es lo que haría.

Cuando se completa esta etapa, tiene un generador de forma de onda en funcionamiento … que debe proceder a probar con su alcance (¡probar el sesgo!). Un paso posterior incluirá un enlace a un sitio útil que tiene un código de ensamblaje compatible con este microcontrolador que generará varias formas de onda.

A continuación, agregaremos una etapa de amplificador para aumentar el voltaje de la señal a niveles útiles.

Paso 2: Amplificador y fuente de alimentación de amperios

Ahora, construimos un amplificador y una fuente de alimentación para él. Algunos de ustedes pueden reconocer este circuito como un amplificador cmoy bastardizado.

La ganancia es controlada por un potenciómetro de 10kohm, que se conectó de una manera bastante tonta pero todavía funciona bien. Al tener tres derivaciones, la resistencia entre las que están en los extremos es siempre de 10k, y la resistencia entre un extremo y la mitad cambia según la posición del dial … de esta manera, usamos el potenciómetro como dos resistencias en lugar de solo una. Si observa la hoja de datos del OPA 2132, mire la fórmula para determinar la ganancia … verá por qué esto no es óptimo, pero aún funciona. Puede solucionar este problema utilizando dos potenciómetros de 10k para las resistencias determinantes de ganancia que se muestran en la hoja de datos.

La fuente de alimentación le da a nuestro amp +9, -9 y 0 voltios rieles. Sin las dos baterías de 9 voltios, el amplificador se comporta de forma extraña y puede "cortar" las partes más altas y más bajas de las formas de onda, lo que sería triste. Con la fuente de alimentación de doble riel, las formas de onda se pueden amplificar a +/- 1.5 voltios, YMMV. Además, ayuda a compensar el drenaje diferencial de las baterías … uno tiene que ejecutar un microcontrolador y un amplificador, y el otro ejecuta el sesgo y el amplificador.

Con estos circuitos hechos, estás listo para hacer algunas olas.

EDITAR: Originalmente me referí al circuito de la fuente de alimentación como un circuito virtual de tierra (la foto aún lo hace). Este es un artefacto de un diseño más antiguo para el AWG. No estoy completamente seguro de si es un verdadero campo virtual o no, así que lo he cambiado de nombre. Agradezco a los lectores sus comentarios informativos sobre el tema.

Paso 3: Onda Sinusoidal, 1.790Mhz

Esta es una onda sinusoidal generada a 1.790Mhz. ¿Por qué esta frecuencia? Usé un cristal de 14.3 mhz … y la onda sinusoidal se genera al producir una secuencia de 8 valores repetidamente (es decir, sin (pi / 4, pi / 2,3pi / 4 …). Nuestro programa conceptualmente se ve así:

Reiniciar:

r1 = 255 * sin (0)

r2 = 255 * sin (pi / 4)

r3 = 255 * sin (pi / 2)

r4 = 255 * sin (3pi / 4)

r5 = 255 * sin (pi)

r6 = 255 * sin (5pi / 4)

r7 = 255 * sin (3pi / 2)

Lazo:

puerto de salida N, r1

puerto de salida N, r2

puerto de salida N, r3

puerto de salida N, r4

puerto de salida N, r5

puerto de salida N, r6

puerto de salida N, r7

bucle rjmp

La pequeña "caída" irregular en la forma de onda es causada por la instrucción rjmp que toma 2 ciclos de reloj para procesarse. Para solucionar esto, copie / pegue la secuencia en la función de bucle muchas veces seguidas, produciendo muchos períodos de la forma de onda para cada bucle. Esta foto es de una secuencia de 10 períodos por bucle, el atmega16-16pu tiene suficiente memoria para diez veces más fácil.

Para hacer otras frecuencias, necesitas ser creativo:

- cambie la resolución (pi / n), siempre que tenga en cuenta que los valores más altos de n requieren más registros.

- use la instrucción nop (no hace nada y requiere un ciclo de reloj para hacerlo)

- usar temporizadores

- Utilice una tabla sinusoidal en EEPROM

- trucos extraños: observe cómo el artefacto rjmp lleva el voltaje por debajo del valor cero de la forma de onda … esto se debe a que representa el valor 0 existente para 3 ciclos de reloj, y cualquier cable de prueba que use tendrá una cierta capacitancia e inductancia que Resiste los cambios en corriente y voltaje. Podría hacer que su programa produzca una forma de onda asimétrica reemplazando r1 con un entero positivo distinto de cero, de modo que la tensión disminuya exactamente al "punto cero" del resto de la forma de onda durante 2 ciclos de reloj. Si puedes hacer esto, entonces me quito el sombrero.

Paso 4: Caso

Es muy útil poner este proyecto en un caso. Como mínimo, proporciona un agarre cuando se extrae el microcontrolador para programarlo.

Además, tuve este buen caso … que desafortunadamente se llenó con un enrutador dlink. Proporciono el ejemplo actual como evidencia de que los productos de esta compañía son buenos para algo, después de todo.

Que se sepa que dlink fabrica casos excelentes pero costosos, que desafortunadamente vienen con enrutadores inalámbricos gratuitos.

Los dos interruptores conectan las baterías, los diales son para polarización / ganancia. La salida es a través de un conector RC. Los conectores BNC o coaxiales también habrían sido buenos.

La foto con el visor muestra una onda de diente de sierra de 2,5 kHz. Si conecta las salidas a un pequeño altavoz, ¡también puede escucharlo!

N.B.: Las fotografías de alcance son principalmente de las formas de onda que fotografié antes de construir el amplificador. No pude ver ninguna distorsión producida por el amplificador, lo que demostró una ganancia sorprendentemente uniforme para los rangos de frecuencia producidos por este dispositivo.

Finalmente, aquí hay una referencia que me hubiera parecido útil si la hubiera encontrado antes de construir esto:

www.avr-asm-tutorial.net/avr_en/AVR_DAC.html

Paso 5: Programando el AWG

Aquí hay una guía para programar este dispositivo. Comenzaré con el programa utilizado para generar la onda sinusoidal de 1.7 Mhz:

COMIENZO:

.include "m8515def.inc"; este es un archivo de definición, algo muy útil de usar. Si necesita una copia, busque en Google el nombre del archivo.

REGISTROS0:

ldi r16,0x00

ldi r17,0x25

ldi r18,0x7F

ldi r19,0xD9; Cargue los registros primero, de esa manera, más tarde, su código puede producir ~ 1 salida por ciclo de reloj

ldi r20,0xFF; Estos valores se determinaron mediante 127 * sen (x) (pi / 4), para valores enteros positivos de x.

fuera DDRB, r20

2Mhz sine0

fuera portb, r18

fuera portb, r19

fuera portb, r20

fuera portb, r19

fuera portb, r18

fuera portb, r17

fuera portb, r16

PORTB, r17; un período de onda sinusoidal a 2 Mhz si utiliza una velocidad de reloj de 16 Mhz

rjmp 2Mhz sine0

Los siguientes son ejemplos de ondas sinusoidales de 1Mhz, generadas de dos maneras diferentes.

1Mhz sine0:

fuera portb, r18

nop

fuera portb, r19

nop

fuera portb, r20

nop

fuera portb, r19

nop

fuera portb, r18

nop

PORTB, r17; un período de onda sinusoidal a 1 Mhz si utiliza una velocidad de reloj de 16 Mhz

nop

PORTB, r16; esta es la manera perezosa.

nop

out PORTB, r17; El siguiente ejemplo se mostrará de la mejor manera.

rjmp 1Mhz sine0

REGISTROS1:

ldi r16,0x7F

ldi r17,0xAB

ldi r18,0xD1

ldi r19,0xF6

ldi r20,0xFE

ldi r21,0x53; ¡Note que hemos cargado 9 registros en la memoria! Anote cuántos registros tiene, y

ldi r22,0x2D; haz buen uso de ellos. Donde 127 * sin (x) (pi / n), n puede ser cualquier número de registros

ldi r23,0x08; donde el número de registros más 1 se divide por 2 … ¡a menos que esté equivocado!

ldi r24,0x00

1Mhz sine1:

fuera portb, r16

fuera portb, r17

fuera portb, r18

fuera portb, r19

fuera portb, r20

fuera portb, r19

fuera portb, r18

fuera portb, r17

fuera portb, r16

fuera portb, r21

fuera portb, r22

fuera portb, r23

fuera portb, r24

fuera portb, r23

fuera portb, r22

fuera portb, r21

rjmp 1Mhz sine1

Lo anterior es un buen ejemplo de la compensación entre resolución y frecuencia. Al reducir a la mitad la resolución, puede duplicar la frecuencia. Un lector perceptivo

Habrá notado que ambas formas de onda utilizan 0x7F (127) como un punto cero, independientemente del orden en que se cargan los registros … Puede determinar que

el punto cero es más útil para ciertas formas de onda … pero para las simétricas, como es muy probable que use, 0x7F es óptimo.

Ahora, pasamos a un tema más complicado … ¿cómo generamos una forma de onda de 1.5Mhz? Considerar:

seno (x) (pi / 6)

cuál sería la resolución correcta a utilizar … pero, como esta resolución se divide uniformemente en 2pi, pero no en p / 2 … nuestra forma de onda se verá extraña,

¡porque en ningún punto la salida es igual al mínimo o al máximo de la función, es decir, algo cercano a 0x00 o 0xFF! Para alta

Frecuencias, la forma de onda puede ser aproximadamente correcta de todos modos, debido a la capacitancia e inductancia naturales en cualquier circuito. Esto resiste cualquier cambio.

en corriente o voltaje, por lo tanto, a frecuencias más altas, si emite 0x00 diez veces, luego 0xFF dos veces … el segundo 0xFF le dará un valor algo más alto

que el primero Pruébelo y vea, puede o no funcionar dependiendo de variables que son demasiado complejas para discutir aquí.

El punto es que es difícil o imposible generar frecuencias que no sean fracciones binarias de la velocidad del reloj … A muy alta

Frecuencias en las que podría "hacer trampa" usando capacitancia e inductancia parásitas … y ciertamente a frecuencias más bajas, el problema se vuelve irrelevante.

como veremos en el siguiente ejemplo … pero ciertamente hay algunas frecuencias que no se pueden generar.

Un ingeniero inteligente (es decir, no yo) instalará un zócalo para sostener el oscilador de cristal usado en este dispositivo … de esa manera, él / ella puede cambiar trivialmente el

Frecuencia fundamental del dispositivo y obtenga esencialmente cualquier frecuencia que desee dentro de las especificaciones del microcontrolador.

(He visto … 2 $ … cajeros automáticos que funcionan a velocidades de reloj de hasta 20Mhz).

Ahora, aquí hay algo de código para una forma de onda de frecuencia decididamente más baja. Es básicamente el código del sitio web que enumeré como referencia:

www.avr-asm-tutorial.net/avr_en/AVR_DAC.html

La forma de onda es una onda de diente de sierra. Visite el sitio web, ya que es muy útil y el código allí es realmente bueno para las formas de onda de baja y media frecuencia.

.include "m8515def.inc"

COMIENZO:

ldi r18,0xFF

fuera DDRD, r18

DIENTE DE SIERRA:

fuera portad, r18

inc r18

rjmp diente de sierra

Esto genera una forma de onda de aproximadamente 2,5 kilohertz. Puede aumentar / disminuir la frecuencia agregando pausas (nop) o temporizadores, o puede aumentar la frecuencia

al disminuir la resolución … en lugar de inc (incremento) simple, agregue un número a r18. Si sumas 2, la frecuencia se duplicaría. Si sumas 3 y una pausa

(nop), la frecuencia aumentará en 1,5 veces.

Para hacer una onda triangular, agregue una declaración cpi para probar si r18 es igual a 0xFF, y si es así, bifurque a una función similar que disminuye o resta de r18. Por supuesto, esa función debe probar si r18 = 0x00, y si es así, volver a la primera función.

Terminaré este tutorial con algunas pistas sobre cómo usar inteligentemente este dispositivo:

-Utilice las funciones de temporizador adecuadas para crear con precisión formas de onda de baja frecuencia. Es más difícil de lo que piensa realizar un seguimiento de los ciclos de reloj de los programas en su cabeza.

-Si las funciones del temporizador lo asustan (me asustan), cuente los ciclos de reloj en su cabeza y luego pruébelo en su alcance para asegurarse de que sea correcto.

-Un convertidor de decimal a hexadecimal es muy útil para determinar cuáles deberían ser los valores de los registros.

-No conecte este dispositivo a una antena y utilícelo para comunicaciones inalámbricas a menos que tenga una licencia y sepa lo que está haciendo.

-Probablemente puede programar hasta una onda cuadrada de 4Mhz con este dispositivo … utilícelo como una fuente de reloj variable, o para inyectar comunicaciones seriales en un circuito.

-8 de estos junto con un reloj común harían una fuente lógica paralela programable realmente genial.

-Generar potenciales de acción neuronales con él, y sin duda ahorrar mucho dinero a su laboratorio de biología.

-Hacer un piano con eso.

-Este dispositivo deja muchas entradas en el atmega sin uso. Si desea que el dispositivo sea más conveniente pero tiene funciones restringidas, podría crear un

interfaz para él y un programa inteligente para que pueda generar un rango de formas de onda y frecuencias sin reprogramar.

-Recuerda que rjmp toma ciclos de reloj y crea un artefacto! Evita esto incluyendo muchos períodos en tu programa antes de hacer un bucle. Hacer buen uso

De todo ese recuerdo en las atmegas!

Desactualizado (Legion Labs es un esfuerzo de investigación nuevo, sin fines de lucro, que no requiere titulación y que actualmente se encuentra en Montreal. No estamos afiliados a ninguna otra organización.

Actualmente tiene un miembro, ya que recientemente he considerado expandir el alcance de esta operación.)

Actual: Legion Labs es miembro de un esfuerzo de ingeniería / investigación sin fines de lucro con sede en Montreal junto con otras personas, que alquilan un taller industrial como un lugar para juguetear.

Paso 6: Mejoras en curso

Las posibles mejoras mencionadas anteriormente incluyen:

- Use un tubo termorretráctil para proteger las resistencias en el R / 2R del cortocircuito.

- Use zócalos ZIF, al menos en su STK500, si puede pagarlo.

- No seas tan perezoso como era: crea un mejor amplificador para tener un rango de voltaje mayor.

- Incluya más rango de sesgo de señal si lo desea.

- Añadir ISP + interfaz USB!

Ahora, se habló de agregar una fuente de reloj variable. Intenté conectar las salidas de un inversor hexagonal a sus entradas, pero la resistencia / capacitancia interna de la frecuencia del dispositivo se limitó a un máximo de aproximadamente 4,5 Mhz.

La teoría es que se conecta una resistencia y un condensador de modo que el condensador se cargue a una cierta velocidad y haga que el inversor hexadecimal … err … invierta la lógica. Esto luego hace que la carga en el capacitor se agote, causando que se invierta nuevamente, y así sucesivamente. Una resistencia variable le permite controlar la frecuencia.

No obstante, esta técnica puede ser útil en un proyecto futuro donde las frecuencias más bajas están bien, y necesito controlarlas con precisión.

Invito a los lectores a sugerir métodos alternativos, o un inversor hexadecimal que produzca una salida de reloj variable de hasta 16Mhz, o incluso 20 Mhz.