Firmware - adrihigu/Proyecto-afinador GitHub Wiki
En esta sección abordamos los aspectos relacionados a la programación del módulo DEMOQE, así como el desarrollo del proyecto en Processing, explicando las soluciones implementadas para cubrir los requerimientos técnicos necesarios para la entrega y que caracterizan la versión actual.
Programación en CodeWarrior
El microprocesador DEMOQE fue programado a partir de esta herramienta, y juega un papel fundamental en la etapa de muestreo y cuantización de las señales analógicas provenientes de cada canal de adquisición. Además, realiza la codificación de dichos datos para la transmisión por puerto serial a una computadora.
Figura 1. Formato del protocolo
El protocolo utilizado se estructura tal como se muestra en la figura 1. Como puede verse, fue alterado para cubrir los requerimientos de diseño, ajustándose a las limitaciones de la tasa de bits de transmisión: se tiene que el máximo posible es de 115200 baud, y se desea tener una cantidad suficiente de muestras de la señal de micrófono para que la detección del tono en la etapa de procesamiento sea buena. Si siempre se envían los datos de potenciómetro simultáneamente con los del micrófono en un mismo bloque, la máxima frecuencia de muestreo es de 2880 Hz (incluso menor, por razones que serán explicadas posteriormente), lo cual otorga un bajo número muestras por ciclo a mayor frecuencia y esto puede perjudicar la detección del tono.
Por ello, se planteó enviar por separado ambas lecturas, diferenciadas por dos encabezados distintos en el protocolo: 0xF1 (3 bytes), con los datos del micrófono y dos pulsadores del microprocesador, y 0xF2 (5 bytes), que además contiene la lectura del potenciómetro y los dos pulsadores restantes. Se explota el hecho de que la señal del potenciómetro es de muy baja frecuencia, muestreándola a 60Hz. En teoría, lo anterior permite muestrear a la frecuencia de 4700Hz, alcanzando el objetivo descrito previamente.
Sin embargo, solo fue posible muestrear a la frecuencia de 3640.89, esto es debido a que existen dos bits de control por byte de la transmisión serial, que ocupan ancho de banda adicional. Al tomarse en cuenta, disminuyen la frecuencia de muestreo máxima hasta los 3740 Hz, pero se asignó el tiempo de interrupción que daba la frecuencia mencionada debido a que es el aquel CodeWarrior permitía.
Las interrupciones utilizadas para el muestreo de las señales fueron implementadas a través del bloque "TimerInt" de CodeWarrior, que se dispara cada 274,658 us. En la subrutina que maneja la interrupción, se cambia el estado del primer canal de conversión analógico-digital a "MEDIR", además, hay un contador que aumenta cada vez que se entra a la interrupción y que al alcanzar el valor 78, cambia el estado del segundo canal analógico a "MEDIR". Así, se tiene la frecuencia de muestreo de 60Hz para el segundo canal del ADC.
Figura 2. Resistencia de Pull Up
Para los sensores digitales fueron utilizados cuatro bloques "BitIO" asignados como entrada a los registros de los pulsadores del DEMOQE. Estos fueron configurados como resistencias del Pull Up, cuya representación es mostrada en la figura 2. Cuando el pulsador está levantado, se mide la caida de voltaje de Vcc (bit 1), mientras que cuando es presionado se cortocircuita la salida a tierra (bit 0).
En la parte principal del programa, se tiene una máquina de estados con la siguiente lógica:
ESPERAR: estado por defecto del sistema. Espera al disparo de la interrupción
MEDIR: guarda en una variable la medida del canal 1 y, si el contador es 78, guarda la medida del canal 2 y reinicia la cuenta. Cambia el estado del sistema a "ENVIAR"
ENVIAR: codifica el valor de la medida del canal 1 de acuerdo al protocolo de la figura 1 (incluyendo los valores de los sensores digitales), y si el estado del canal 2 es "MEDIR", también codifica la medida del canal 2. Luego, realiza el envío por puerto serial de los datos codificados.
Por otro lado, la cuantización se hizo en 12 bits para ambos canales de adquisición, esto es, 4095 niveles de decisión.