Interrupciones de Netduino afectadas por PWM - Diagnóstico del problema

0

Tengo un problema divertido con las interrupciones y las señales PWM que están provocando que se activen falsas interrupciones. Lo que está sucediendo exactamente es que estoy usando un codificador rotatorio en cuadratura de hardware rebotado. Los impulsos del codificador están conectados a interrupciones que luego puedo determinar la dirección de rotación. Rutina bastante estándar. Esto funciona bien por sí mismo.

Ahora,introduzcounasalidaPWMenmiproyecto.Enestecaso,digamosqueestoyatenuandounLED.Cargomiprogramayelledfuncionabien.Cuandogiroelcodificadorun"clic", parece que hay varias interrupciones que se activan en el codificador ... en el orden de aproximadamente 16 veces la cantidad esperada.

He simplificado el código hasta el final y he probado diferentes combinaciones de pines PWM e Interrupción y la respuesta es siempre la misma. Lo único extraño que observo es que si desconecto el cable de puente del pin PWM al LED, el problema desaparece y el codificador comienza a comportarse como debería. Estoy desconcertado y no puedo entender qué está pasando aquí.

¿Cómo puedo depurar o probar esto? ¿Qué pasa con el puente PWM, desenchufe e interrumpe el funcionamiento correctamente? ¿Cómo suena esto?

Además, he hecho esta pregunta en los foros de electrónica de Netduino y GHI y no he recibido ninguna solución.

simular este circuito : esquema creado usando CircuitLab

Circuito actual:

Actualización: Basándome en la ayuda de los comentarios, he descubierto que hay un tipo de ruido inducido en los cables de puente PWM que afecta a los cables de puente conectados al codificador rotatorio. Cuando los cables de puente PWM están cerca de los cables de puente del codificador, existe la condición de problema. Cómo eliminar este ruido, aparte de mantener los cables de puente separados unos de otros. Además, ¿cómo eliminar este ruido en el caso de trazas de PCB?

    
pregunta GisMofx

1 respuesta

1

Use software debouncing: En su rutina de interrupción, desactive las interrupciones (para que no haya otras interrupciones después de que se haya activado la actual) y luego establezca una marca, que se llamó la interrupción.

En la rutina principal, compruebe el indicador, actúe sobre él y luego vuelva a activar las interrupciones. Tal vez agregue un pequeño retraso antes de habilitar las interrupciones nuevamente.

Esta parece ser otra solución para la eliminación de software:

 private static void Button1_OnInterrupt(uint data1, uint data2, DateTime time) {
        // glitch filter. events within 50 milliseconds of the first event are discarded
        if (Button1LastPushed.AddMilliseconds(50) > time)
            return;
        // Debug.Print("Button 1 Interrupt");
        Button1LastPushed = time;
        // actions on interrupt here
}

Por supuesto, necesita adaptarlo a su PWM.

PS: los LED tienen una pequeña corriente hacia atrás, esto podría ser la fuente de su problema.

    
respondido por el cgross

Lea otras preguntas en las etiquetas