Variaciones en los pulsos generados y leídos por un uC

0

Tengo un 2 uC (LPC1778 y un PIC), que realizan 2 funciones separadas. El PIC genera pulsos que se codifican, donde cada bit del código tiene una duración de pulso de 1 ms y un código completo tiene una longitud de 8 bits (8 ms). Los impulsos generados por el PIC, viajan a través de un relé (con contactos frontal y posterior) y se envían al LPC1778 como entradas.

Al final del LPC1778, muestro los pines de entrada cada 200uS (usando una interrupción del temporizador) y capturo el estado del pin por 32 ms (en el ISR del temporizador), antes de procesar si hay un pulso válido disponible o no. Una vez que se captura una muestra de 32 ms, tomo la mayoría de cada 5 muestras para determinar cuál es el valor de bit real del código. Si el código está presente en cualquier duración de 8 ms de los 32 ms capturados, está bien.

Esta lógica (a mi entender) puede funcionar bien siempre y cuando el período para cada código permanezca en 1 ms.

¿Cuál es mi duda, cuáles son las posibilidades de que el período de tiempo de un pulso pueda variar? Entiendo que mientras mi software genere 1 ms de salida desde un pin (PIC), la entrada en un pin (LPC1778) también debe ser 1 ms porque no es una onda de alta frecuencia y también se conoce de antemano el período de tiempo de cada código .

¿Qué otras consideraciones se deben tener en cuenta para garantizar que lea el código correctamente?

¿Cuáles son las posibilidades de que este patrón simétrico se convierta en asimétrico?

  

Actualización:

No lo estoy utilizando como UART donde los datos pueden variar y, por lo tanto, el tiempo es importante. Sé de antemano qué datos deberían estar siempre en ese pin y, por lo tanto, simplemente estoy comprobando ese valor de 8 ms en una ventana de muestra de 32 ms. No siempre tengo que seguir comprobándolo.

void Read_FCBC(void)
{
    static U8 bSampleNo1=0;/*1st 200us*/
    static U8 bSampleNo2=0;/*2nd 200us*/
    static U8 bSampleNo3=0;/*3rd 200us*/
    static U8 bAllDone=0;
    static U8 bBufferCtrl=1;
    static U8 bBufferCtrl1=0;
    static U8 bBufferCtrl2=0;   

    if(bBufferCtrl)
    {
        dwFC1[bSampleNo1]=dw1Port1;/*200us*/
        dwBC1[bSampleNo1]=dw1Port1;
        bSampleNo1++;   
    }       

    if(bBufferCtrl1)
    {
        dwFC2[bSampleNo2]=dw2Port1;/*captured after delay of 200us wrt to sample 1*/
        dwBC2[bSampleNo2]=dw2Port1;
        bSampleNo2++;       
    }

    if(bBufferCtrl2)
    {
        dwFC3[bSampleNo3]=dw3Port1;/*captured after delay of 400us wrt to sample 1*/
        dwBC3[bSampleNo3]=dw3Port1;
        bSampleNo3++;
    }

    bAllDone++;

    if(bAllDone == 1)
    {
        bBufferCtrl1=1; 
    }

    if(bAllDone == 2)
    {
        bBufferCtrl2=1; 
    }

    if(bSampleNo1==160)
    {
        bBufferCtrl=0;
    }   

    if(bSampleNo2==160)
    {
        bBufferCtrl1=0;
    }   

    if(bSampleNo3==160)
    {
        bBufferCtrl2=0;
    }   

    if((bSampleNo1==160) && (bSampleNo2==160) && (bSampleNo3==160))
    {
        bMeasureDone=0xFF;
        bSampleNo1=0;
        bSampleNo2=0;
        bSampleNo3=0;
        bAllDone=0;
        bBufferCtrl=1;  
    }
}

El código de muestra para el proceso en ISR. Nota: Tengo 16 FC y 16 BC conectados a un puerto de la UC y, por lo tanto, tengo que procesar en main (). Si hay 2 búferes de acuerdo entre sí, utilizaremos lo mejor de 2oo3 dwFCX y dwBCX

    

1 respuesta

1
  

Entiendo que mientras mi software genere 1 ms de salida de un   pin (PIC), la entrada en un pin (LPC1778) también debe ser 1 ms

Sí, pero el LPC1778 está muestreando el nivel cada 200us, por lo que habrá un jitter efectivo de 200us. Esto es solo el 20% del tiempo de bit, por lo que aún debería poder determinar con precisión el valor del bit. Sin embargo, para hacer esto necesita detectar una transición (de '1' a '0' o '0' a '1') para determinar el inicio y final de cada bit. Si no lo hace, sus 5 muestras podrían extenderse a 2 bits y el resultado puede ser indeterminado.

Por lo tanto, el procedimiento de recepción completo sería: -

  1. tomar muestras hasta que se detecte un '1' (ahora estás dentro de un bit de '1')

  2. tomar muestras hasta que se detecte un '0' (ahora está al comienzo de un bit '0')

  3. tomar 5 muestras más. La segunda muestra en este grupo debe ser '0' (de lo contrario, regrese a 1.)

  4. Continúa tomando grupos de 5 muestras, probando la segunda muestra en cada grupo y almacenando su valor de bits hasta que tengas 32 bits.

Para que esto funcione correctamente, el receptor debe continuar probando en medio de cada bit hasta que sea capaz de sincronizarse con otro bit de "inicio" (1 > 0 transición). El error de la tasa de bits se acumulará, por lo que cuantos más bits se reciban entre cada bit de 'inicio', mayor será la precisión con la que el receptor debe seguir la tasa de bits del remitente.

Para leer con precisión cada bit, los tiempos de los bits de envío y recepción deben estar dentro de 400us entre sí, que es una tolerancia de 0.4 / 32 = 1.25% para 32 bits. Esto debería estar bien si ambas MCU están sincronizadas por un resonador de cristal o cerámica, pero pueden causar problemas si uno o ambos usan un oscilador r / c.

Ahora compare este esquema con la señal asíncrona generada por un UART. La única diferencia es que agrega un bit de inicio y parada a cada byte para la sincronización, en lugar de utilizar los propios bits de datos.

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas