Firmware - USB-EC3883-III-2019/EC3883-G09 GitHub Wiki
Diagrama de flujo del proceso por etapas
En la siguiente imagen se puede observar con mayor detalle el proceso de medicón. En ella, la columna de el medio representa el flujo principal del programa mientras que las columnas laterales representan los procesos de interrupciones y como afectan al programa principal. El proceso se repite dos veces e "i" representa la variable iterativa.
Diagrama de flujo de la etapa de mediciones
En síntesis, el proceso se inicia habilitando una interrupción temporal que se encargará de cambiar el estado del trigger del sonar de alto a bajo cuando hayan transcurrido 50us. Posteriormente, el proceso principal se mantendrá en estado IDLE mientras la señal de echo no termine su proceso. La interrupción de tipo capture es la que se encarga de hacer el manejo de la señal de echo: cada vez que haya un flanco de subida o de bajada, se mide el tiempo transcurrido desde el último reset (la primera vez ocurre un error porque se empieza a contar desde que el programa comienza), pero solo se almacena la duración del echo cuando ocurre la interrupción por un flanco de bajada; posteriormente, se resetea el contador. Luego de que la interrupción generada por el flanco de bajada termina, el programa principal continua.
Como se mencionó en el parrafo anterior, para medir la duración (ancho temporal) de la señal de echo, se utilizó el módulo Capture de Processor Expert que emplea un contador cuya resolución depende del timeout que se le coloque. Dada la cantidad de bits que se dispone en la trama definida para la comuniación serial, se configura el timeout a 4ms, lo que implica que la resolución del contador es de 61.035156us que al dividirlo entre 58 para llevarlo a centímetros, da como resultado que la resolución con la que el sonar es capaz de medir distancias es aproximadamente 1.05cm.
Respecto al lidar, puesto que el sensor se actualiza cada 50ms, se implementó una interrupción temporal que ocurre cada 60ms que habilita la medición; mientras la interrupción no ocurra, el programa permanece en estado IDLE. Esta interrupción se habilita antes de comenzar las mediciones y se deshabilita luego de concluir el proceso completo, es decir, luego de las iteraciones.
Luego de que termine el proceso de medición, se procede al movimiento del motor. La secuencia de las señales de control del motor se encuenta definida como un arreglo global y constante, denominado steps en el archivo main.c. En este mismo archivo, se define una variable global denominada STEPS_MODE a la que se le asigna el valor 1 si se desea que el motor se mueva a medios pasos o 0 si se desea que se mueva a pasos completos. Si se configura para que el motor se mueva a medios pasos, el arreglo steps se recorre de a uno en uno mienteas que si se configura para que se mueva a pasos completos, el arreglo se recorre de a dos en dos.
En cuanto a la resolución de los pasos, se tiene que el motor tiene que dar 96 medios pasos o 48 pasos completos para completar los 360°, esto implica que el motor gira 3.75° cada medio paso o 7.5° cada paso completo.
El motor se debe mover luego de que las mediciones se hayan realizado. Para garantizar esto y dado que el programa solo realiza dos mediciones, se implementó una interrupción temporal cada 150ms, tiempo suficiente para que las mediciones y el resto de procesos hayan culminado.
El filtro implementado calcula el promedio de las mediciones realizadas (dos). El filtro se puede activar y desactivar pulsando el botón PTA2 del DEMOQE128; al activarlo, se enciende el LED PTC1 y al desactivarlo, el LED se apaga. Cuando el filtro se encuentra desactivado, el valor que se envía por el puerto serial es el de la última medición.
Para la comuniación serial entre el microcontrolador y la PC, se definió una trama para el envío de los datos que consta de 4 bytes que, además de incluir los datos, incluye bytes de cabecera para la sincronización.
Trama para el envío de datos. P: posición del motor. S: data del SONAR. L: data del LIDAR