PoC - Controlar un AMux con la señal EoS del SAR ADC PSoC5LP

El proposito de este proyecto es controlar las entradas del AMuxHw empleando solamente señales generadas por el hardware interno del PSoC5LP.

En este caso lo hice usando una señal que veo poco en los foros de Cypress, es el EoS (End of Sample), cuando esta señal presenta un flanco de subida nos indica que el canal del ADC fue sampleado, pero ¿Por que no usar la señal EoC (End of Convertion)?, como su nombre lo indica, el EoC presenta un flanco de subida cuando la conversion fue terminada, es decir el valor analogo presente en el pin del ADC fue convertido a su valor binario equivalente.

Entonces ¿Por que usar el EoS?, como ya vimos la señal EoS presenta un flanco de subida cuando termino el sampleo del canal del ADC, es decir, la diferencia entre la señal EoC y EoS es el tiempo que tarda el ADC en la conversión de analogo a binario, con esto en mente, podemos cambiar la entrada del AMuxHw tenemos la señal EoS, esta entra a trabajar funcionando como clock para un BasicCounter que tiene como salida el mismo número de bits que necesita el AMuxHw para ser controlado.

La configuración del ADC es la siguiente:
Use el sampleo en modo Hardware Trigger para tener control sobre cuando inicia la conversión del ADC, fuente de reloj externa, para poder verla con el analizador lógico y habilité la señal de salida EoS.

La configuración del AMuxHw es la siguiente:
Como podemos ver, los canales de entrada estan configurados como sencillos o 'single' ya que tambien podemos usar señales diferenciales, y 4 canales de entrada, con esto sabemos que necesitamos un bus de 2 bits para seleccionar que canal estamos usando.

La configuración del BasicCounter es la siguiente:
La única opción es la anchura de la salida del contador, esta es de 2 bits, será la que controle el AMuxHw.

El esquematico completo es el siguiente, los pines de salida solo los use para poder capturar las señales con el analizador logico.
Vemos las cuatro entradas analogicas y a su derecha el AMuxHw, este manda el canal que tiene seleccionado a la entrada del ADC, a la salida del ADC use una etiqueta para mandar la señal del EoS a la entrada de clock del BasicCounter (EoS_Clock), algunos componentes estan girados por conveniencia.

Y lo 'maravilloso' de esto es que la unica linea de código que es necesaria es la que inicializa la configuración de nuestro ADC. Aqui el main:

/* ========================================
 *
 * PoC: Driving Multiple ADC inputs with no
 * SW involved.
 * 
 * ========================================
*/
#include 

int main()
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    ADC_Start();

    for(;;)
    {
        /* Place your application code here. */
    }
}

/* [] END OF FILE */

Para terminar, la asignación de los pines que vamos a utilizar:

Las capturas del analizador lógico:

El primer canal del AMuxHw que sampleamos es el 0. 

Como podemos notar si utilizaramos el EoC como señal para cambiar de canal del AMuxHw se desperdician 13 ciclos de reloj :/ .

A la siguiente señal EoS cambiamos de canal:
Y con los otros dos canales:

TODO:
  • Usar una LUT entre el AMuxHw y el BasicCounter para que podamos samplear los canales en el orden que queramos.
  • Cambiar los pines de las entradas analogicas con el Analog Router y mejorar su desempeño.
  • Usar la señal EoC como trigger para un canal de DMA y mandar el resultado de la conversión a una locación de memoria, y al finalizar la transferencia de, por ejemplo 200 conversiones, usar la señal nrq del DMA para mandar todos los resultados de la memoria por un bloque UART a cualquier consola serial en nuestra computadora.

Aqui el proyecto: PSoC5LP_EoS

Comentarios

Entradas más populares de este blog

PSoC Creator Tools

sprintf en PSoC Creator 3.0 y 3.1