Claramente, querían obtener una estimación más precisa de la fase de las transiciones de la señal de entrada en relación con el reloj de la CPU, que probablemente sea del orden de 33-40 MHz (\ $ \ frac {1} {30 \ text {ns}} \ $ a \ $ \ frac {1} {25 \ text {ns}} \ $).
Las entradas GPIO se alimentan a través de FF dentro del microcontrolador para evitar problemas con el muestreo asíncrono y la posible metastabilidad. Esto limita su capacidad para medir la fase de una transición al período de reloj (25 ns). Al proporcionar múltiples copias retrasadas de la señal de esta manera, puede determinar la fase con una resolución de 5 ns mirando el patrón de bits capturados en las FF.
_________________|__________________________
signal _______________/ |
____________|__________________________
signal + 5ns ______________/ |
_______|__________________________
signal + 10ns ___________________/ |
__|__________________________
signal + 15ns ________________________/ |
| ________________________
signal + 20ns ___________________________|_/
| _____________________
signal + 25ns ___________________________|______/
|
+---> 111100
Por ejemplo, si el reloj de la CPU debería caer en el lugar donde dibujé la línea vertical, leerá un patrón de "111100", que le indica que la transición de la señal ocurrió entre 15 y 20 ns antes del reloj. borde. Esto le da la misma resolución de tiempo que obtendría con un reloj de muestra de 200 MHz, pero sin requerir un procesador que pueda funcionar tan rápido.
Por cierto, el término genérico para este tipo de codificación es "código de termómetro".
Si el objetivo del sistema es medir la frecuencia o el período de la señal de entrada, este enfoque le permite alcanzar un nivel de precisión dado en 1/5 del tiempo de integración, lo que podría ser significativo en un entorno de producción.