Come potrei fare per programmare un interruttore (basato su relè a stato solido o triac) che si innesca sulla potenza di attraversamento zero?
Per coloro che non hanno familiarità con il soggetto: accendere l'alimentazione a 230 V, quando l'onda sinusoidale della linea di alimentazione attraversa lo zero - il risultato è ridurre al minimo i disturbi elettromagnetici derivanti da un rapido picco di corrente.
In particolare, preferirei passare il più possibile al software. Il circuito di rilevamento costituito da un piccolo trasformatore, un diodo e una coppia di resistori per mantenere sotto controllo livelli e correnti fornisce "1" quando la potenza di ingresso AC è nella metà positiva, "0" in negativo, collegata a un pin GPIO di ingresso. L'uscita è composta da alcuni relè a stato solido e elementi essenziali per mantenerli in esecuzione (pull-up, ecc.), Collegati ai pin GPIO di uscita.
Il problema è il tempismo: con 50Hz AC otteniamo 100 incroci zero in un secondo, un mezzo ciclo è 10ms. Per raggiungere una distanza ragionevole dall'attraversamento zero per mantenere bassa la suddetta EMI, non dovremmo attivare l'output di oltre il 10% oltre (o prima) l'evento di attraversamento dello zero, ciò significa tolleranza + -1ms. Ciò non significa un tempo di reazione di 1 ms - possiamo ragionevolmente aspettarci che il prossimo passaggio per lo zero avvenga esattamente 10 ms dopo il primo, o il quarto - 40 ms. Riguarda la granularità: se consentiamo 20ms di reazione, deve essere compreso tra 19 e 21ms, non 18 o 22.
Come posso implementare un tale timer - innescare l'uscita GPIO entro 1ms poiché l'ingresso rileva un fronte o entro un multiplo fisso di 10ms da allora - preferibilmente con tolleranza per alcuni bias negativi (diciamo, il trasformatore e il relè introducono un ritardo di 1,6ms; quindi voglio che il trigger si disattivi 8.4+ (n * 10) ms dall'impulso di ingresso, in questo modo il bias contrasta il ritardo introdotto dal circuito.) - ovviamente "su richiesta dell'utente", ad esempio, l'utente scrive "1 "in un file / sys / class / ... e all'opportunità (approssimativamente) più vicina l'output diventa" on ". L'utente scrive "0" e quando arriva l'attraversamento zero, il relè specifico si disattiva.
Credo che ciò richiederebbe la scrittura o l'hacking di un modulo del kernel. Potresti indicarmi cosa gestisce i pin GPIO di Raspberry Pi nel kernel e quale tipo di timer posso collegarvi (a meno che non ce ne siano già in atto) per ottenere questo tipo di funzionalità?