Al diseñar un reemplazo de estado sólido para un subsistema de visualización de tubos de vacío y CRT radar, me pegué en un sistema adecuado de tiempo entre el pulso de sincronización y el pulso de eco. El pulso de sincronización y el pulso de eco se capturaron en los dos pernos de un Arduino. La debida Arduino tiene un reloj MCLK/2 de 42 MHz, que me daría una resolución de 23,81 nanosegundos (ns) que, para la velocidad de la luz, se traduciría a una distancia de 6,86 metros. Quería una mejor resolución.
Después de buscar soluciones utilizando osciladores de alta velocidad y su lógica discreta ICs (contadores, registros de cambio), FPGAs y las soluciones de la plataforma cuesta en el rango de USD 2.000 /-, decidí examinar la ESP8266 de alguna solución a mi problema.
Para mi deleite, he descubierto dos funciones de la API de ESP8266 de Arduino, es decir, ESP.getCycleCount() y ESP.reset()
ESP.getCycleCount() cuenta los ciclos de instrucción desde el comienzo, en una variable de 32 bits sin signo interna, susceptibles de desbordamiento cada 28 segundos o menos. Un un microsegundo período dará 160 ciclos de instrucción. Ahora para medir el software arriba requerido por el software, necesitará sólo cuenta los ciclos de instrucción que cuenta con su rutina por un 1 microsegundo retrasan y restarán 160 de esa cuenta, para darle el software encima de la cabeza en la adquisición de la cuenta. 1 retraso microsegundo, tengo un conteo de 213. Que elaboró a 213-160 = 53 puntos (53 x 6.25 = 331,25 nanosegundos) sobrecarga de software para la adquisición de la cuenta. Restando 53 de cada cuenta me da una cuenta exacta a dentro de unas pocas decenas de picosegundos, por períodos de 30 microsegundos a unos 500 microsegundos.