Visita mi canal de youtube

domingo, 16 de julio de 2017

Proyecto: osciloscopio y generador de funciones


Introducción

Hemos creado un osciliscope digital y un generador de funciones asequibles que son capaces de trazar y producir (al mismo tiempo) señales eléctricas generadas (voltaje) que cambian con el tiempo a lo largo de una escala calibrada. El dispositivo proporciona la funcionalidad básica de osciliscope digital de trazar el voltaje variable en un monitor de escritorio y la capacidad básica del generador de funciones para producir ondas periódicas de amplitudes y frecuencias variables. El usuario del dispositivo es capaz de aprovechar algunas de las características más avanzadas disponibles en un Oscilliscope que incluyen (pero no se limitan a): guardar gráficos generados en una tarjeta SD, la medición de pico a pico de voltaje de un gráfico generado y Alterando el esquema de tiempo (zoom) para las señales eléctricas detectadas para visualizar mejor la parcela. Algunas de las funciones de generación de funciones más avanzadas incluyen: frecuencia, amplitud y el tipo de onda (Seno, Cuadrado y Diente de sierra). Todas estas funciones de Oscilliscope y Generación de Funciones están disponibles a través de una GUI intuitiva e interactiva.

"PicBerry: un osciliscope digital asequible y un generador de funciones".

Project Sound Bite
Mientras que los osciloscopios digitales y los generadores de funciones en el laboratorio son funcionalmente útiles, no hacen para los productos portátiles o rentables. Nuestro osciliscope digital y generador de funciones proporciona una alternativa simple y fácil de usar que proporciona la funcionalidad de ambos dispositivos por menos de $ 50; Incluso mejor, puede llevar nuestro dispositivo con usted en su mochila (y esperamos que en su bolsillo, pronto) para que usted no necesita entrar en el laboratorio cada vez que tiene que depurar un proyecto de microcontroladores o equipos eléctricos. Hay otros proyectos que han intentado crear la función Digital Oscilliscope y la función Generador de funciones por separado. Algunos proyectos similares de Oscilliscope Digital incluyen BitScope y PiScope. El proyecto BitScope es un hardware especial diseñado para ser un osciloscopio programable basado en PC, un analizador de lógica, un generador de onda y reloj y un analizador de espectro. El proyecto más similar que podemos encontrar es el PiScope, pero todavía está en desarrollo temprano. También utiliza una pantalla LCD para mostrar (en lugar de un monitor) y no tiene algunas de las características avanzadas disponibles en nuestro proyecto (como guardar tramas y measurin) y no es capaz de generar ondas (seno, cuadrado, diente de sierra ). Nuestro proyecto es único porque ofrecemos un osciliscope digital y un generador de funciones en un solo dispositivo, y contamos con algunas de las características avanzadas proporcionadas por los osciloscopios de laboratorio. En la Figura 2 se muestra una imagen con todos los componentes.
Diseño de Alto Nivel top

Hardware

El hardware para el osciliscope digital y el generador de funciones consta de un PIC32, un Raspberry Pi, un DAC y un potenciómetro. El Raspberry Pi es responsable de trazar los datos en un monitor de escritorio y el PIC32 es explotado por sus propiedades en tiempo real de ser capaz de probar el ADC y generar funciones analógicas (formas de onda) con el DAC de manera oportuna. El Pi de la frambuesa y el PIC32 comunican a través de SPI. Un potenciómetro se añadió como parte de la demostración para mostrar que los diferentes voltajes son detectados en nuestro osciliscope digital. Se crearon circuitos divisores de tensión para cada una de las entradas en la MCU PIC32. Los diagramas para cada componente se pueden encontrar en la sección Hardware, junto con descripciones más detalladas de los componentes.

Software

El software se encargó de aprovechar los componentes de hardware, el ADC y DAC, para realizar el trazado en tiempo real de las señales de tensión de entrada al ADC y la generación en tiempo real de funciones periódicas (seno, cuadrado, diente de sierra) (DDS). El Raspberry Pi ejecuta una interfaz gráfica de usuario de Python con la que el usuario interactúa para aprovechar las características del Oscilliscope y del Generador de Funciones de nuestro dispositivo. Un diagrama de estilo Matplotlib está incrustado en la GUI que muestra la señal de voltaje detectada en el pin de entrada ADC en cualquier instante. La GUI está equipada con deslizadores y botones fáciles de usar e intuitivos que permiten al usuario cambiar los parámetros de las funciones que desean generar; Es decir, el usuario puede cambiar la frecuencia y la amplitud de una función periódica generada usando deslizadores y puede cambiar el tipo de onda generado pulsando un botón en la GUI proporcionada.


Con el fin de realizar la tarea de trazar la señal de voltaje detectada en el pin de entrada ADC, el software en el PIC32 programa una rutina de servicio de interrupción para leer constantemente un lote de voltajes en el pin ADC. El PIC32 envía y envía la información de la señal de voltaje, leída después de la conversión analógica a digtálica (en el ADC), a la Frambaya Pi sobre el protocolo SPI. Tenga en cuenta que el protocolo SPI es full-duplex y esto significa que la comunicación está sucediendo en ambos sentidos constantemente. Por lo tanto, aprovechamos esta característica del protocolo para enviar también información sobre los parámetros de generación de funciones (seleccionados por el usuario en la GUI) al PIC32 que utilizó técnicas DDS para generar una forma de onda con el DAC. Mientras el usuario selecciona los parámetros de entrada para la generación de funciones, también observará un gráfico de Matplotlib que representa la señal de voltaje detectada por el pin de entrada del ADC del PIC32. El software de lado Raspberry Pi almacenará los datos de voltaje digital enviados a través de SPI desde el PIC32 y lo representará en la GUI cada 30 ms en el diagrama de Matplotlib incorporado. Los 30 ms se eligen para asegurar que el usuario no observa visualmente un retraso en el gráfico GUI.




Hardware    top

Schematic

Below is main schematic:




Figure 2: Main Schematic for PicBerry Digital Oscilliscope and Function Generator.

Figure 3: Voltage Divider Circuit protecting ADC input on PIC32.




Pinout

La Tabla 1 es una lista de la asignación de pines MCU (PIC32 y Frambuesa Pi) con respecto a las entradas de hardware mencionados anteriormente y salidas (como se hizo una demostración). A saber, el DAC no es necesario que la salida no necesita estar conectado a la entrada del ADC, pero lo fue para los propósitos de demostración (para mostrar tanto la generación de funciones y la función de osciloscopio al mismo tiempo).





PIC32

Para el microcontrolador responsable de la lectura de datos, así como la generación de funciones / formas de onda, elegimos utilizar el PIC32. Como se ha indicado anteriormente, queríamos utilizar un microcontrolador capaz de operar muy rápidamente en tiempo real para que pueda mostrar y leer valores a una frecuencia muy alta. Este microcontrolador fue suficiente para este objetivo, aunque este diseño puede haberse beneficiado de una opción más cara. Para romper el PIC32, se utilizó el Microstick 2. Este código permitido para ser cargado en el PIC32 a través de USB. Esto también nos permitió conectar el PIC32 en la tabla de paneles para que pudiéramos conectar fácilmente los cables a los pines.

En nuestro proyecto específico, funcionamos el PIC32 en el defecto 40 megaciclos. Puede haber sido posible aumentar esta frecuencia, lo que nos permite adquirir y enviar muestras más rápido. Sin embargo, esto permitió un diseño más simple. El PIC32 también fue programado usando un MPLAB v3.05 en conjunción con el compilador XC32 proporcionado por Microchip Technologies.

Frambuesa Pi 3

A pesar de que el PIC32 se destaca en computación y cálculo en tiempo real, estábamos buscando un dispositivo capaz de generar una interfaz de usuario sencilla y fácil de usar. Este Pi de frambuesa nos permitió hacer esto con facilidad. Para preparar el Raspberry Pi, necesitamos instalar Linux. Una vez que esto fue terminado, podríamos utilizar el Pi de la frambuesa como haríamos cualquier otra computadora. El Pi de frambuesa entonces funcionaría como un dispositivo que sería capaz de controlar el PIC32 (en el modo maestro de SPI), instruyéndolo para enviar datos para las capacidades de generación de osciliscope y función de nuestro dispositivo. En respuesta, el PIC32 seguiría (como esclavo) las instrucciones enviadas por el Pi y, en consecuencia, devolvería los datos de otra manera para la función Oscilliscope para el PicBerry, en particular.

MCP4822

Este IC es un convertidor digital a analógico de 12 bits SPI. Esto se utilizó junto con el PIC32 para crear funciones de voltaje mediante síntesis digital directa.

Potenciómetro

Se usó un potenciómetro para probar el diseño inicialmente cuando el generador de funciones no funcionaba. Esto fue fijado de modo que pudiéramos barrer la tensión entre 3.3 y 0 V. Se conectó al convertidor análogo-digital en el PIC32. Esto sirvió como una forma rápida de verificar la funcionalidad de Oscilliscope de nuestro dispositivo.
Software top

PIC32

Osciloscopio
El osciloscopio se implementó utilizando un ADC. Primero, necesitamos configurar el ADC para que funcione correctamente. Esto se hizo pasando parámetros a la función OpenADC10 (). Nuestros parámetros fueron los siguientes:

ADC_FORMAT_INTG16 - La salida del ADC es un entero sin signo de 16 bits
ADC_CLK_AUTO - Conversión de disparador automáticamente
ADC_AUTO_SAMPLING_ON - Muestra automáticamente
ADC_VREF_AVDD_AVSS - Ajuste VDD y VSS a VREF para hacer el rango de tensiones legibles
ADC_OFFSET_CAL_DISABLE - Desactiva el modo de calibración de offset
ADC_SCAN_OFF - Desactiva el modo de escaneo
ADC_ALT_BUF_OFF - Desactivar el búfer alternativo (salida simple)
ADC_ALT_INPUT_OFF - Desactiva la entrada alternativa (entrada simple)
ADC_CONV_CLK_PB - Utilice el reloj de bus periférico (PBCLK)
ADC_SAMPLE_TIME_5 - Establecer el tiempo de muestra
ADC_CONV_CLK_Tcy2 - Divide PBCLK por 2
ENABLE_AN9_ANA - Utilice AN9 (pin 26)
SKIP_SCAN_ALL - Desactivar la exploración
ADC_CH0_NEG_SAMPLEA_NVREF - Usar tierra para la entrada A canal 0
ADC_CH0_POS_SAMPLEA_AN9 - Utilice AN9 para la entrada A
También utilizamos el suelo como referencia negativa y AN4 para la entrada utilizando la función SetChanADC10. El ADC se leyó en un ISR que funcionaba a 25 kHz (discutido en la sección del generador de funciones). El valor se añadió a un buffer de 600 muestras antes de ser enviado a la frambuesa Pi.

Generador de funciones
El generador de funciones se implementó mediante síntesis digital directa y un DAC controlado por SPI de 12 bits. Decidimos probar las tablas de funciones (seno, cuadrado y diente de sierra) a 25 kHz. Elegimos 25 kHz porque este valor es lo suficientemente alto para que el valor de error más alto de la onda sinusoidal resultante sea superior a 20 dB en magnitud inferior a la fundamental. Utilizamos un temporizador que activó una interrupción para muestrear las tablas de funciones a la frecuencia deseada. El temporizador se configuró para activar cada 1600 ciclos de reloj (esto es el resultado de dividir la frecuencia de reloj de 40 MHz por la frecuencia de muestreo de 25 kHz).

A continuación, se generaron las tablas de funciones. Cada tabla contenía 256 valores que oscilaban entre -1023 y 1023, que describían un ciclo completo de la función. La tabla de coseno se generó usando una función de coseno multiplicada por 1023. La tabla de onda cuadrada se generó ajustando la mitad de la tabla a -1023 y la otra mitad a 1023. La tabla de ondas de dientes de sierra se generó ascendiendo y descendiendo linealmente entre -1023 y 1023.

También necesitamos crear un canal SPI entre el PIC32 y el DAC. Esto se hizo creando y abriendo un canal en el código PIC32. También lo declaramos como 16 bits de ancho para que pudiera transmitir un paquete de 12 bits entero en una transmisión.

La mayor parte de DDS se realiza en el ISR. Dos de las principales variables involucradas en DDS son phase_accum_main y phase_incr_main. El entero unsigned phase_accum_main es responsable de la indexación a través de la tabla de coseno. Los 8 primeros bits se utilizan directamente como un índice y los últimos 24 bits se utilizan para crear más tiempo entre incrementos de la parte superior 8. El entero sin signo phase_incr_main se utiliza para incrementar phase_accum_main cada vez que se llama ISR. Esta variable cambia según la frecuencia deseada. Podemos calcular esta variable usando la siguiente fórmula:







Equation 1: Phase Accumulator Equation.
Este valor se agrega a phase_accum_main. Antes de que se indexen las tablas de funciones, el ISR comprueba para qué tipo de función se está utilizando comprobando la variable wType. Entonces, phase_accum_main se desplaza hacia la derecha por 24 tal que sólo quedan los 8 bits superiores. A continuación, se utiliza para indexar esta tabla de funciones. El valor resultante se multiplica por la amplitud definida por el usuario. Esto se discutirá más adelante. Por último, la selección de chip se establece bajo para indicar el inicio de una transacción. El paquete que se envía consiste en los datos de la tabla de funciones añadido a un desplazamiento de 2048 para que no pueda ser negativo. Esto es OR con bits de configuración para hacer la salida de DAC al canal A. La selección de chip se fija entonces en alto para indicar el final de la transacción.

Comunicación SPI
En nuestro esquema de SPI, el Pi de la frambuesa es el amo y el PIC32 es el esclavo. El PIC32 envía constantemente nuevas lecturas a la frambuesa Pi para trazar, y la frambuesa Pi envía ocasionalmente un paquete al PIC32 para cambiar la salida del generador de la función. El paquete enviado desde el Pi al PIC32 se empaquetó de manera que dos bytes menos significativos contenían la frecuencia, el segundo byte más significativo contenía la amplitud y el byte más significativo contenía el tipo de onda (0 para el seno, 1 para el cuadrado y 2 para diente de sierra). El paquete enviado desde el PIC32 al Raspberry Pi es de 16 bits de datos de voltaje (si no es el paquete de encabezado).

Primero, necesitamos abrir un canal SPI para implementar esta funcionalidad. Usando la función OpenSPI2 (), inicializamos el SPI para estar en el modo de 32 bits como esclavo. Optamos por utilizar 32 bits para que los valores que envía a la frambuesa Pi puede tener un alto grado de precisión, mientras que también permite un mayor rango para los ajustes enviados por la frambuesa Pi (es decir, tipo de onda, frecuencia y amplitud).

Una vez que esto fue inicializado, necesitamos enviar datos a la Frambuesa Pi. También necesitamos ser capaces de recibir datos de la Frambuesa Pi siempre que esté disponible. Por lo tanto, siempre que se envían los datos, también verificamos si hay un paquete de la Frambuesa Pi. Si lo hay, se descompone de la siguiente manera:
 freq1 = data & 0xFFFF; 
amplitudeData = (data >> 16) & 0xFF; 
amplitude = fix2float7(amplitudeData);
wType = (data >> 24) & 0x3;
Donde fix2float7 representa una función usada para convertir el número de 8 bits recibido en un número de punto fijo con el punto después del primer bit. Antes de enviar datos, comprobamos que el buffer asignado en el ISR está lleno de datos. Si este es el caso, entonces enviamos paquetes predefinidos para indicar el inicio del buffer a la Frambuesa Pi. Decidimos que esto era 0xFFFF0000. Si el búfer no estaba lleno, enviaríamos un 0. Luego iteraremos a través del búfer para convertir y transmitir cada valor. La salida del ADC es un valor entre 1008 y 0, por lo que para normalizar esto a un voltaje, tomamos el valor en el buffer, lo dividimos por 1008 y lo multiplicamos por 3.3. A continuación, convertir este valor a un punto fijo de 16 bits número. Luego se transmite a través de SPI al Raspberry Pi.

Pi de la frambuesa

Matplotlib
La GUI para el osciloscopio y el generador de funciones se basó en Matplotlib. Esta biblioteca nos permitió generar y actualizar gráficas utilizando los datos enviados desde el PIC32. También nos permitió usar "widgets" para permitir al usuario cambiar la configuración del generador de funciones.

En nuestro diseño final, utilizamos la biblioteca de animación para actualizar la trama en tiempo real. En esta configuración, teníamos una función llamada "animate" que fue llamada repetidamente.

Comunicación SPI
Utilizamos la biblioteca spidev para ejecutar la comunicación SPI en el Pi de frambuesa. Abrimos el canal y establecimos la frecuencia SPI a 20 MHz. Entonces, creamos una función llamada spi_writeread para leer y escribir datos en el PIC32. Primero definiría el chip select low para indicar el inicio de una transacción, enviar los datos que se dieron como el argumento de la función, y luego leer los datos de SPI. A continuación, establecer el chip select high para terminar la transacción y devolvió el voltaje que recibió a través de SPI.

Osciloscopio
Primero, la Frambuesa Pi leería repetidamente del canal SPI usando la función spi_writeread que definimos anteriormente para buscar el paquete de encabezado. Una vez encontrado esto, recibimos el resto de las 600 muestras enviadas desde el PIC32. Elegimos 600 porque nos permitió trazar una cantidad significativa de datos sin ralentizar la animación de una cantidad significativa. Estos datos se agregaron a una lista. A continuación, estos datos se establecieron como los datos descritos por una línea en la trama. A continuación, actualizar el gráfico para que los datos aparecieron en la pantalla del osciloscopio.

También implementamos un zoom X e Y. El ajuste de cualquiera de estos deslizadores daría lugar a extender o contraer el eje respectivo. También se implementó el ahorro de trazado, que se activó haciendo clic en los botones de opción en el lado izquierdo de la GUI.
Generador de funciones
Para permitir las capacidades del generador de funciones, queríamos crear una GUI para que el usuario pudiera controlar fácilmente los parámetros. Por suerte, Matplotlib permite el uso de "widgets". Nos deslizamos por la frecuencia y la amplitud, así como un botón de opción para seleccionar el tipo de onda. Conectamos estos valores a la función fcn_gen () de modo que cuando se cambia cualquiera de estos valores, la función sería llamada. Esta función generó un paquete de 32 bits para ser enviado al PIC32, como se describe en este diagrama:

La función spi_writeread () fue llamada con este dato como argumento para ser enviado al PIC32 y desempaquetado.

Pruebas y depuración top

Hemos probado y depurado utilizando técnicas de hardware y software. Aunque, dada la naturaleza de nuestro proyecto, tuvimos que depender en gran medida de la depuración con el Oscilliscope. La metodología general que utilizamos para las pruebas era probar trozos de código más pequeños antes de proceder a un componente diferente. Es decir, primero nos aseguramos de que los periféricos se configuraron correctamente, luego pasamos a implementar y probar la interfaz SPI en cada uno de los microcontroladores, seguido por la implementación del trazado, a continuación, la GUI para el proyecto. Nos dimos cuenta de que confiábamos más en las técnicas de depuración, en comparación con las pruebas de software automatizadas, debido a la naturaleza del proyecto. A continuación, se delinearon algunas de las técnicas específicas de depuración y pruebas que implementamos a lo largo del proyecto:

Pruebas de Software y Depuración

Nos basamos en las pruebas de software para poder resolver problemas con la GUI (si se detectaron detectores de mouseclicks). Intentamos agregar pruebas para las transacciones de SPI entre los dos dispositivos haciendo eco de lo que se envió a través del Bus por el otro dispositivo, pero encontramos que esto no era útil (ya que se hizo difícil determinar dónde estaba fallando la transacción SPI); Las razones de los fracasos se hicieron claras una vez que conectamos los pasadores CS, MOSI, MISO, SCLK al Oscilliscope del Laboratorio. Por último, en el software, implementamos una prueba de retorno (también usada para demo) para conectar la salida DAC a la entrada ADC para poder verificar que estábamos mostrando la misma onda en el Oscilliscope implementado que habíamos generado usando el Función generada.

Pruebas de Hardware (Lab Oscilliscope) y depuración

Nos basamos en el Oscilliscope del laboratorio pesadamente para poder primero detectar la integridad de la comunicación de SPI entre el PIC32 y el Pi (según lo mencionado arriba); El Oscilliscope fue particularmente útil para determinar si habíamos ajustado correctamente la Polaridad del Reloj (CPOL) y otros parámetros SPI. Nosotros también utilizamos el Osciliscope de Laboratorio para poder verificar que nuestra propia salida de osciloscopio coincidía con la salida en el Osciliscope de Laboratorio, dado que se generó una función de período a partir de los Generadores de Funciones disponibles en el Laboratorio.
Resultados top

Los resultados de este proyecto es un osciloscopio efectivo y un generador de funciones muy inexpertos. Este diseño es capaz de lograr una precisión sorprendente mientras mantiene una agradable y fácil interfaz de usuario. Cuando se considera contra el equipo que puede funcionar hasta miles de dólares, nuestro diseño es increíblemente eficaz. Sin embargo, definitivamente hay margen para mejorar con este diseño, que es el resultado del limitado tiempo y recursos.

Nuestro diseño de osciloscopio fue capaz de recibir y mostrar aproximadamente 2000 muestras por segundo. También era capaz de leer frecuencias de hasta aproximadamente 2 kHz antes de que la señal comenzara a ser fragmentada y difícil de leer, como se puede ver en la Figura 10. Un osciloscopio típico es capaz de leer en el rango de muestras de giga por segundo, Capaz de mostrar señales en el rango de mHz. Además, nuestro osciloscopio sólo era capaz de leer señales entre 0 y 3,3 voltios debido al hecho de que el PIC32 es alimentado por y sólo capaz de salida en este rango. Esta limitación podría ser eludido utilizando hardware como divisores de voltaje, sin embargo, no tuvimos tiempo para implementar tales aumentos. Nuestro diseño también presentó la funcionalidad presente en osciloscopios como el zoom y las mediciones de pico a pico de voltajes. Sin embargo, estos también fueron algo limitados. No pudimos pan o compensar la ola. Tampoco tuvimos ninguna activación. Un osciloscopio típico también debe ser capaz de muchas mediciones diferentes, tales como la frecuencia.

Nuestro diseño del generador de la función era capaz de salir de las ondas sinusoidales, de las ondas cuadradas, y de las ondas del sawtooth. También le dio al usuario un control directo sobre la amplitud y la frecuencia. Era capaz de generar ondas entre 0 y 3.3 V y teticamente hasta aproximadamente 12 kHz (ya que el DAC estaba muestreando a 25 kHz). Sin embargo, hubo fragmentación notable debido a la DAC a frecuencias más bajas como se ve en la Figura 14, donde el DAC está enviando una onda de 2 kHz. Un generador de funciones típico debe ser capaz de crear ondas en una amplia gama de voltajes y debe ser capaz de alcanzar frecuencias en el rango de MHz.

Aunque está claro que los resultados de nuestro diseño carecen de algunas características de los osciloscopios profesionales y los generadores de funciones, es importante considerar que nuestro osciliscope se puede hacer en potencialmente $ 20 (usamos el más caro Frambuesa Pi, debido a la falta de acceso a La más barata), que es aproximadamente 20 veces más barato que incluso los más básicos y los generadores de funciones disponibles en el mercado. En conjunto, fuimos capaces de alcanzar un alto grado de éxito con recursos y tiempo muy limitados.

Hay una serie de dificultades significativas que enfrentamos a lo largo del proceso de creación de este proyecto. El mayor retroceso fue el resultado de un esquema de trazado defectuoso usando Matplotlib y el ADC. Nuestra primera aproximación a este proyecto fue intentar trazar puntos en tiempo real, es decir, la trama se actualizaría a medida que recibía puntos; El pensamiento era que esto aumentaría grandemente el funcionamiento pues podríamos fácilmente el cambio del contexto entre el trazado y la comunicación de datos (colección) vía SPI en el lado del Pi de la frambuesa. En el lado de PIC32, estábamos leyendo y enviando una muestra de ADC a la vez. Esto nos llevó a usar multiprocesamiento, donde un proceso de recolección de datos envía datos a través de una cola a una función de trazado. Pasamos una cantidad significativa de tiempo implementando multiprocesamiento. Finalmente, nos dimos cuenta de que la lectura de datos desde el ADC y el envío de datos a través de SPI punto por punto (o uno por uno) desde el PIC32 llevó a slinkying onda trazada en la GUI con la frecuencia de la forma de onda en constante cambio, incluso Aunque tal comportamiento no era característico de la onda generada. Dado que el ADC estaba muestreando el pin de entrada en instantes variables en el tiempo, comenzamos a muestrear el ADC periódicamente usando interrupciones del temporizador. Este enfoque en el PIC32 nos lleva a utilizar un enfoque en el que los datos se recogieron y enviados a través de SPI, y trazados en lotes (todos a la vez) en la frambuesa Pi. Sin embargo, este enfoque combinado con el muestreo ADC en una interrupción del temporizador todavía conduciría a "respiración", donde varios ciclos se expandirían y se encogerían. Para corregir esto, cambiamos el código para que solo transmitiera lotes de datos a través de SPI para ser mostrados como un lote en el Pi de Frambuesa. Después de pasar un tiempo muy largo tratando de adaptar el código de multiprocesamiento, descubrimos que ya que ya no estamos trazado en tiempo real punto por punto, el multiprocesamiento fue algo inútil. Esto nos lleva a eliminar la mayor parte de nuestro código Python y reiniciar usando la biblioteca de animación de Matplotlib. Esto fue muy lento, sin embargo, esto conduce a un diseño mucho mejor y coherente.
La mayoría de las otras dificultades además de esto eran bastante menores. Por ejemplo, tuvimos muchos problemas para sincronizar la comunicación SPI entre el PIC32 y Raspberry Pi. El periférico SPI en el lado PIC32 tenía que ser configurado correctamente; Era difícil determinar cuál era la anchura correcta de la transmisión y las polaridades del reloj debido a la documentación inadecuada para el PIC32 en modo esclavo SPI. Después de una cantidad significativa de prueba y error, finalmente conseguimos una corriente muy confiable de comunicación entre los dos dispositivos.

Imágenes

A continuación se muestran imágenes de algunos de los gráficos que generamos con la GUI y el dispositivo PiBerry.


Figure 4: GUI display with 200 Hz Sine wave with Amplitude at 0.5 V.




Figure 5: GUI display with 200 Hz Square wave with Amplitude at 0.5 V.


Figure 6: GUI display with 200 Hz SawTooth wave with Amplitude at 0.5 V.





Figure 7: GUI display with 500 Hz Sine wave with Amplitude at 0.5 V.






Figure 8: GUI display with 200 Hz Sine wave with Amplitude at 1.0 V.


Figure 9: GUI display with 200 Hz Sine wave with Amplitude at 0.5 V Zoomed in.



Figure 10: GUI display with 2000 Hz Sine wave with Amplitude at 0.5 V Zoomed in.


Figure 11: GUI display with 2000 Hz Sine wave with Amplitude at 0.5 V Zoomed in.



Figure 12: Oscilliscope display with 50 Hz Sine wave with Amplitude at 0.5 V.


Figure 13: Oscilliscope display with 200 Hz Sine wave with Amplitude at 0.5 V.


Figure 14: Oscilliscope display with 2000 Hz Sine wave with Amplitude at 0.5 V.



Conclusión

Expectativas y trabajo futuro

Hemos sido capaces de crear un osciliscope digital y un generador de funciones que emularon con éxito el Tektronix Digital Oscilliscope y el generador de funciones en el laboratorio. Al igual que con cualquier proyecto de diseño de curso, tenemos algo de mejora. Si repitáramos el diseño y la construcción del proyecto, intentaríamos añadir un cursor para medir las propiedades de una función periódica, soporte FFT y desencadenadores de configuración. Esencialmente, intentaríamos agregar como funciones más avanzadas proporcionadas por el osciliscope digital y el generador de funciones.

Utilizamos el Matplotlib de Python para proporcionar nuestras tramas, pero reconocimos que no tenía la capacidad de actualizar parcelas con un flujo de actualizaciones de datos fácilmente. Podemos tratar de usar otra biblioteca u otro idioma (MATLAB) que se ajuste mejor a las necesidades de nuestro proyecto.

Finalmente, crearíamos una carcasa para los dos Microcontroladores, con el fin de hacer nuestro producto más estéticamente atractivo y funcionalmente más fácil de usar.

Estándares aplicables

Utilizamos la comunicación serial SPI (un estándar de facto desarrollado por Motorolla en los años 80) para interconectar el PIC32 y el Raspberry Pi. También observamos que para poder usar el Oscilliscope PicBerry y el Generador de Funciones, se requiere que el usuario interactúe con una interfaz basada en clics estándar (también llamada Punto y clic); Por lo tanto, lo incluiremos como un estándar en nuestro proyecto.

Consideraciones éticas

Con respecto al Código de Ética de IEEE, nuestro equipo se adhirió a las 10 propiedades bajo la Sección 7 (Actividades Profesionales). En particular, al señalar las limitaciones del PicBerry en términos de frecuencias soportadas en el Oscilliscope PicBerry, la falta de disponibilidad de varias características de Oscilliscope y Function Generator, seguimos el compromiso de "ser honesto y realista en declarar reclamaciones o estimaciones basadas en los datos disponibles". Además, el crédito apropiado fue dado a los individuos y la documentación que utilizamos para guiarnos a través del diseño e implementación del proyecto. En términos de prevenir cualquier posible lesión, la seguridad siempre fue asegurada mientras se usaba el Osciliscope PicBerry y el Generador de Funciones evitando el contacto con las señales eléctricas utilizadas para encender tanto el PIC32 como el Pi; También, nos aseguramos de conectar a tierra todos los periféricos correctamente y agregamos un circuito divisor de voltaje para evitar que los pines en el PIC32 y Pi soplen hacia fuera (y potencialmente causando un incendio). Por último, el contacto y uso del dispositivo (es decir, los circuitos, Pi y PIC32) se limitó a los miembros del grupo que trabajaban en el proyecto, todos ellos calificados para manejar cuidadosamente el dispositivo y trabajar en el proyecto.

Con respecto al compromiso de "mejorar la comprensión de la tecnología; Su aplicación apropiada y sus posibles consecuencias ", nuestro equipo se adhirió a esta propiedad al asegurar que el PicBerry sólo se utilizaba para su propósito de servir como un generador de funciones y un teclado que interfiere a través de USB con una computadora.

Consideraciones legales e IP

En términos de consideraciones legales, no prevemos ningún problema, ya que todas las partes fueron tomadas del suministro de componentes de laboratorio, a la que se nos concedió el acceso por nuestro profesor el profesor Bruce Land y el profesor Joe Skovira. No se utilizaron partes de muestra de los fabricantes, por lo que no necesitamos firmar ningún acuerdo de no divulgación. No hicimos ingeniería inversa en ningún diseño, ni tampoco usamos los diseños de ningún otro individuo. Además, no encontramos ningún producto existente que coincidiera exactamente con nuestro particular osciloscopio digital y dispositivo de generación de funciones; Sin embargo, hay un par de proyectos similares que se han hecho utilizando un Pi de frambuesa. Este proyecto fue principalmente educativo y no planeamos fabricar Oscilliscope Digital y Generador de Funciones para la venta. Por lo tanto, no violaremos ningún problema de propiedad intelectual / marca registrada. Hemos previsto oportunidades de publicación en línea, así como en diversas revistas y artículos de revistas que se centran en nuestro método particular de aplicación.






























0 comentarios:

Publicar un comentario