Tabla de contenido:

Voltajes analógicos súper rápidos de Arduino: 10 pasos (con imágenes)
Voltajes analógicos súper rápidos de Arduino: 10 pasos (con imágenes)

Video: Voltajes analógicos súper rápidos de Arduino: 10 pasos (con imágenes)

Video: Voltajes analógicos súper rápidos de Arduino: 10 pasos (con imágenes)
Video: 10 PRIMEROS PASOS para PROGRAMAR ARDUINO desde 0 2024, Mes de julio
Anonim
Image
Image

Este Instructable muestra cómo generar cambios de voltaje analógicos súper rápidos desde un Arduino y un par simple de resistor y capacitor. Una aplicación en la que esto es útil es la generación de gráficos en un osciloscopio. Hay varios otros proyectos que han hecho esto. Johngineer muestra un árbol de Navidad simple usando modulación de ancho de pulso (PWM). Otros han mejorado ese proyecto mediante el uso de una escalera de resistencia o el uso de un chip convertidor de digital a analógico dedicado.

El uso de PWM provoca mucho parpadeo, mientras que el uso de una escalera de resistencia o un convertidor de digital a analógico requiere más pines de salida y componentes que pueden no estar fácilmente disponibles. El circuito que utilizo es el mismo par de condensadores y resistor simple muerto que se usó en la demostración del árbol de Navidad, pero funciona con un parpadeo significativamente menor.

Primero, lo guiaré a través del proceso de construcción del circuito. Luego te enseñaré cómo agregar tu propia imagen. Finalmente, presentaré la teoría sobre qué lo hace más rápido.

Si te gustó este Instructable, ¡considera votarlo!:)

Paso 1: construcción del circuito

Construyendo el circuito
Construyendo el circuito

Para construir el circuito, necesitará lo siguiente:

a) Un Arduino basado en el Atmel 16MHz ATmega328P, como un Arduino Uno o Arduino Nano.

b) Dos resistencias de valor R de al menos 150Ω.

c) Dos condensadores de valor C tales que C = 0.0015 / R, ejemplos:

  • R = 150Ω y C = 10µ
  • R = 1,5 kΩ y C = 1µ
  • R = 15kΩ y C = 100nF
  • R = 150kΩ y C = 10nF

Las razones para elegir estos valores son dobles. Principalmente, queremos mantener la corriente en los pines del Arduino por debajo de la corriente nominal máxima de 40 mA. El uso de un valor de 150 Ω limita la corriente a 30 mA cuando se usa con el voltaje de suministro de Arduino de 5 V. Los valores más altos de R disminuirán la corriente y, por lo tanto, son aceptables.

La segunda restricción es que queremos mantener el tiempo constante, que es el producto de R y C, igual a aproximadamente 1,5 ms. El software se ha ajustado específicamente para esta constante de tiempo. Si bien es posible ajustar los valores de R y C en el software, existe un rango estrecho alrededor del cual funcionará, así que elija componentes lo más cerca posible de la proporción sugerida.

En la sección de teoría se dará una explicación más completa de por qué la constante RC es importante, después de que le haya mostrado cómo ensamblar el circuito de demostración.

Paso 2: configuración del osciloscopio

Configuración del osciloscopio
Configuración del osciloscopio

La demostración requiere un osciloscopio configurado en modo X / Y. Los cables de prueba deben conectarse como se muestra en los esquemas. Su osciloscopio será diferente al mío, pero seguiré los pasos necesarios para configurar el modo X / Y en mi unidad:

a) Configure el barrido horizontal para que sea controlado por el Canal B (el eje X).

b) Configure el osciloscopio en modo de doble canal.

c) Configure los voltios / div en ambos canales para que pueda mostrar voltajes de 0 V a 5 V. Puse el mío en 0.5V / div.

d) Establezca el modo de acoplamiento en CC en ambos canales.

e) Ajuste la posición de X e Y para que el punto esté en la esquina inferior izquierda de la pantalla cuando el Arduino esté apagado.

Paso 3: descargue y ejecute el software

Image
Image

Descargue el software del repositorio Fast Vector Display For Arduino. El software tiene la licencia GNU Affero Public License v3 y se puede usar y modificar libremente según los términos de esa licencia.

Abra el archivo "fast-vector-display-arduino.ino" en el IDE de Arduino y cárguelo en su Arduino. Momentáneamente, verá una animación de "Feliz año nuevo" en la pantalla de su osciloscopio.

Desarrollé este proyecto como un hackaton personal en las semanas previas a Navidad, por lo que hay un mensaje temático de Navidad y Año Nuevo que puede ver modificando la variable PATTERN en el código.

Paso 4: crea tu propio dibujo personalizado

Comprenda por qué PWM es tan lento
Comprenda por qué PWM es tan lento

Si desea crear su propio dibujo, puede pegar coordenadas de puntos en el boceto de Arduino en la línea que define USER_PATTERN.

Descubrí que Inkscape es una herramienta bastante buena para hacer un dibujo personalizado:

  1. Cree texto con una fuente grande y en negrita, como Impact.
  2. Seleccione el objeto de texto y seleccione "Objeto a ruta" en el menú "Ruta".
  3. Seleccione letras individuales y superpóngalas para hacer una forma conectada
  4. Seleccione "Unión" en el menú "Ruta" para combinarlos en una sola curva.
  5. Si hay agujeros en alguna letra, corte una pequeña muesca dibujando un rectángulo con la herramienta Rectángulo y réstelo del contorno usando la herramienta "Diferencia".
  6. Haga doble clic en la ruta para mostrar los nodos.
  7. Rectángulo, seleccione todos los nodos y haga clic en la herramienta "Hacer esquina de los nodos seleccionados".
  8. Guarde el archivo SVG.

Lo importante es que su dibujo debe tener un solo camino cerrado y sin agujeros. Asegúrese de que su diseño tenga menos de 130 puntos.

Paso 5: pegue las coordenadas del archivo SVG en el IDE de Arduino

  1. Abra el archivo SVG y copie las coordenadas. Estos estarán incrustados en el elemento "ruta". El primer par de coordenadas se puede ignorar; reemplácelos con 0, 0.
  2. Pegue las coordenadas en el boceto de Arduino dentro de los corchetes justo después de "#define USER_PATTERN".
  3. Reemplace todos los espacios con comas, de lo contrario obtendrá un error de compilación. La herramienta "Reemplazar y buscar" puede resultar útil.
  4. ¡Compila y ejecuta!
  5. Si tiene problemas, observe la consola serie para ver si hay errores. En particular, verá mensajes si su patrón tiene demasiados puntos para el búfer interno. En tales casos, la imagen mostrará un parpadeo excesivo.

Paso 6: Comprenda por qué PWM es tan lento

Para empezar, repasemos el comportamiento de un condensador mientras se carga.

Un capacitor que está conectado a una fuente de voltaje Vcc aumentará su voltaje de acuerdo con una curva exponencial. Esta curva es asintótica, lo que significa que se ralentizará a medida que se acerque al voltaje objetivo. Para todos los propósitos prácticos, el voltaje es "lo suficientemente cercano" después de 5 segundos RC. El RC se denomina "constante de tiempo". Como vimos anteriormente, es el producto de los valores de la resistencia y el capacitor en su circuito. El problema es que 5 RC tarda bastante en actualizar cada punto en una pantalla gráfica. ¡Esto genera mucho parpadeo!

Cuando usamos modulación de ancho de pulso (PWM) para cargar un capacitor, no estamos mejor. Con PWM, el voltaje cambia rápidamente entre 0V y 5V. En la práctica, esto significa que alternamos rápidamente entre empujar la carga hacia el condensador y sacar un poco de ella de nuevo; este empujar y tirar es como intentar correr un maratón dando un gran paso hacia adelante y luego un pequeño paso hacia atrás. una y otra vez.

Cuando promedia todo, el comportamiento de cargar un capacitor usando PWM es exactamente el mismo que si hubiera usado un voltaje constante de Vpwm para cargar el capacitor. Todavía nos toma alrededor de 5 segundos RC para que nos acerquemos lo suficiente al voltaje deseado.

Paso 7: pasa de a a B, un poco más rápido

Vaya de a a B, un poco más rápido
Vaya de a a B, un poco más rápido

Suponga que tenemos un capacitor que ya está cargado hasta Va. Suponga que usamos analogWrite () para escribir el nuevo valor de b. ¿Cuál es la cantidad mínima de tiempo que debe esperar a que se alcance el voltaje Vb?

Si adivinó 5 segundos RC, ¡eso es genial! Al esperar 5 segundos RC, el condensador se cargará a casi Vb. Pero si queremos, podemos esperar un poco menos.

Mira la curva de carga. Verá, el condensador ya estaba en Va cuando comenzamos. Esto significa que no tenemos que esperar el tiempo t_a. Solo tendríamos que hacerlo si estuviéramos cargando el condensador desde cero.

Entonces, al no esperar ese tiempo, vemos una mejora. El tiempo t_ab es en realidad un poco más corto que 5 RC.

Pero espera, ¡podemos hacerlo mucho mejor! Mira todo ese espacio encima de v_b. Esa es la diferencia entre Vcc, el voltaje máximo disponible para nosotros, y el Vb que pretendemos alcanzar. ¿Puede ver cómo ese voltaje adicional puede ayudarnos a llegar a donde queremos ir mucho más rápido?

Paso 8: ¡Vaya de a a B, con un turbocargador

¡Vaya de a a B, con un turbocargador!
¡Vaya de a a B, con un turbocargador!

Eso es correcto. En lugar de usar PWM al voltaje objetivo V_b, lo mantenemos en un Vcc constante durante un período de tiempo mucho, mucho más corto. Yo llamo a esto el método Turbo Charger y nos lleva a donde queremos ir muy, muy rápido. Después del retardo de tiempo (que debemos calcular), frenamos de golpe cambiando a PWM en V_b. Esto evita que el voltaje sobrepase el objetivo.

Con este método, es posible cambiar el voltaje en el capacitor de V_a a V_b en una fracción del tiempo que usando solo PWM. ¡Así es como llegas a lugares, bebé!

Paso 9: Comprenda el código

Entender el Código
Entender el Código

Una imagen vale más que mil palabras, por eso el diagrama muestra los datos y las operaciones que se realizan en el código. De izquierda a derecha:

  • Los datos gráficos se almacenan en PROGMEM (es decir, memoria flash) como una lista de puntos.
  • Cualquier combinación de operaciones de traducción, escalado y rotación se combinan en una matriz de transformación afín. Esto se hace una vez al comienzo de cada cuadro de animación.
  • Los puntos se leen uno por uno de los datos gráficos y cada uno se multiplica por la matriz de transformación almacenada.
  • Los puntos transformados se alimentan a través de un algoritmo de tijera que recorta cualquier punto fuera del área visible.
  • Usando una tabla de búsqueda de retardo RC, los puntos se convierten en voltajes de conducción y retardos de tiempo. La tabla de búsqueda de retardo RC se almacena en EEPROM y se puede reutilizar para múltiples ejecuciones del código. Al inicio, se comprueba la precisión de la tabla de búsqueda RC y se actualiza cualquier valor incorrecto. El uso de EEPROM ahorra una valiosa memoria RAM.
  • Los voltajes y retrasos de activación se escriben en la trama inactiva en el búfer de tramas. El búfer de tramas contiene espacio para una trama activa y una trama inactiva. Una vez que se escribe una trama completa, la trama inactiva se activa.
  • Una rutina de servicio de interrupción continuamente vuelve a dibujar la imagen mediante la lectura de valores de voltaje y retrasos del búfer de trama activo. Basado en esos valores, ajusta los ciclos de trabajo de los pines de salida. El temporizador 1 se usa para medir el retardo de tiempo hasta unos pocos nanosegundos de precisión, mientras que el temporizador 2 se usa para controlar el ciclo de trabajo de los pines.
  • El pin con el mayor cambio de voltaje siempre está "turbocargado" con un ciclo de trabajo de cero o 100%, lo que proporciona el tiempo de carga o descarga más rápido. El pin con un cambio menor de voltaje se activa con un ciclo de trabajo elegido para que coincida con el tiempo de transición del primer pin; esta coincidencia de tiempo es importante para garantizar que las líneas se tracen rectas en el osciloscopio.

Paso 10: Con gran velocidad, conlleva una gran responsabilidad

Dado que este método es mucho más rápido que PWM, ¿por qué no lo usa analogWrite ()? Bueno, porque usar solo PWM es lo suficientemente bueno para la mayoría de los programas y es mucho más indulgente. Sin embargo, el método "Turbo Charger" requiere una codificación cuidadosa y solo es adecuado para casos específicos:

  1. Es extremadamente sensible a la sincronización. Una vez que alcanzamos el nivel de voltaje objetivo, el pin de conducción debe cambiarse inmediatamente al modo PWM normal para evitar sobrepasar el voltaje objetivo.
  2. Requiere conocimiento de la constante RC, por lo que estos valores deben ingresarse de antemano. Con valores incorrectos, la sincronización será incorrecta y los voltajes serán incorrectos. Con PWM regular, hay una garantía de que se establecerá en el voltaje correcto después de un tiempo, incluso si no se conoce la constante RC.
  3. Calcular el intervalo de tiempo preciso para cargar el condensador requiere ecuaciones logarítmicas que son demasiado lentas para el cálculo en tiempo real en el Arduino. Estos deben calcularse previamente antes de cada cuadro de animación y almacenarse en la memoria caché en algún lugar.
  4. Los programas que se ocupan de este método deben lidiar con el hecho de que los retrasos son muy no lineales (son, de hecho, exponenciales). Los voltajes objetivo cerca de Vcc o GND tardarán muchos órdenes de magnitud más en alcanzar que los voltajes cerca del punto medio.

Para superar estas limitaciones, mi código de gráficos vectoriales hace lo siguiente:

  1. Utiliza el temporizador 1 a 16 kHz y una rutina de servicio de interrupción para una manipulación y sincronización de salida precisas.
  2. Requiere que se utilice un valor específico de constante de tiempo RC, lo que limita las opciones de los valores del condensador y la resistencia.
  3. Almacena los retrasos de tiempo para todos los puntos en un cuadro de animación en un búfer de memoria. Esto significa que la rutina que calcula los retrasos de tiempo se ejecuta a un ritmo mucho más lento que la rutina del servicio de interrupción que actualiza los pines de salida. Cualquier fotograma dado se puede pintar varias docenas de veces antes de que esté listo para usarse un nuevo conjunto de retrasos para el siguiente fotograma.
  4. El uso de un búfer de memoria limita el número de puntos que se pueden dibujar por cuadro. Utilizo una codificación de espacio eficiente para aprovechar al máximo la RAM disponible, pero todavía está limitada a unos 150 puntos. Más allá de un centenar de puntos aproximadamente, la pantalla comenzaría a parpadear de todos modos, ¡así que es un punto discutible!

Recomendado: