¿Cómo podría programar un interruptor (basado en un relé de estado sólido o un triac) que se dispara con potencia de cruce por cero?
Para aquellos que no están familiarizados con el tema: encienda la alimentación de 230 V cuando la onda sinusoidal de la línea de alimentación cruza el cero; el resultado es minimizar las perturbaciones electromagnéticas resultantes de un pico rápido en la corriente.
Específicamente, preferiría moverme tanto al software como sea posible. El circuito de detección que consiste en un pequeño transformador, un diodo y un par de resistencias para mantener controlados los niveles y las corrientes proporciona "1" cuando la potencia de entrada de CA está en la mitad positiva, "0" en negativo, conectado a un pin GPIO de entrada. La salida consta de unos pocos relés de estado sólido y elementos esenciales para mantenerlos en funcionamiento (pull-ups, etc.), conectados a los pines GPIO de salida.
El problema es el tiempo: con 50 Hz de CA obtenemos 100 cruces por cero en un segundo, un medio ciclo es de 10 ms. Para estar a una distancia razonable del cruce por cero para mantener dicho EMI bajo, no debemos activar la salida más del 10% después (o antes) del evento de cruce por cero, eso significa tolerancia + -1ms. Eso no significa un tiempo de reacción de 1 ms: podemos esperar razonablemente que el próximo cruce por cero ocurra exactamente 10 ms después del primero, o el cuarto - 40 ms. Se trata de granularidad: si permitimos 20 ms para la reacción, debe ser entre 19 y 21 ms, no 18 o 22.
¿Cómo puedo implementar dicho temporizador? GPIO de salida de disparo, ya sea dentro de 1 ms desde que la entrada detecta un borde, o dentro de un múltiplo fijo de 10 ms desde entonces, preferiblemente con margen para algunos sesgos negativos (por ejemplo, el transformador y el relé introducen un retraso de 1.6 ms; así que quiero que el disparador salga 8.4+ (n * 10) ms desde el pulso de entrada, de esa manera el sesgo contrarresta el retraso introducido por el circuito.) - por supuesto "a pedido del usuario", digamos, el usuario escribe "1 "a un archivo / sys / class / ... y en la oportunidad más cercana (más o menos) la salida se" enciende ". El usuario escribe "0", y cuando llega el cruce por cero, el relé específico se desactiva.
Creo que esto requeriría escribir o piratear un módulo del núcleo. ¿Podría indicarme qué maneja los pines GPIO de Raspberry Pi en el núcleo, y qué tipo de temporizadores podría adjuntarle (a menos que ya existan algunos) para obtener este tipo de funcionalidad?