L'ho realizzato da poco per dimmerare le luci di casa in un progetto domotico.
Per prima cosa i serve il segnale a 50Hz della rete, da usare come sincronismo per il PWM.
In pratica ogni volta che la tensione della sinusoide passa per lo zero (zero crossing detection) deve partire il contatore che "sfasa" l'accensione del TRIAC.
Un'onda sinusoidale a 50Hz ha un periodo di 20 milliSec, ma in realtà sono 10, perchè devi considerare che sono 100 semionde, comprese in 50 cicli (50 positive + 50 negative).
Quindi, al passaggio per lo zero, devi aspettare un tempo X, che produrrà anche il valore medio della tensione che arriverà al carico.
Se accendi subito il TRIAC, questi rimarrà acceso per tuta la semionda (poi con lo zero si "sgancia" e si spegne da solo). Se lo accendi dopo 5 milliSec, avrai una tensione media di circa la metà.
Se lo accendi dopo 7-8milliSec, avrai una tensione media molto bassa, perchè dopo soli 2-3 millisec arriva lo zero e il TRIAC sgancia.
Quindi un codice del genere:
Funzione zeroCross ()
Cont = x \\ valore compreso tra 0 (Luce max o V max in uscita) e 8 (oppure usi delayMicros() con valori da 0 a 800-900
se zeroCross = 1, fai partire il contatore delay(Cont) e dopo acendi il piedino 4 (uno a caso)
delay 10-15microsecondi // devi lasciarlo ON un poco se no non riesce ad accendersi
spegni il piedino 1
Non esagerare con il ritardo, perchè se ti avvicini troppo allo zero cross successivo, rischi che il TRIAC dia i numeri con accensioni semi-casuali.
in questa immagine si capisce bene il principio:
