Saluti
interrupt zero crossing
Moderatore:
Paolino
33 messaggi
• Pagina 3 di 4 • 1, 2, 3, 4
0
voti
grazie del consiglio. Ho già letto quel post ( più volte). Rilevo il passaggio con l'interrupt che ho sul piedino GP3 del pic12f675. Sto sbagliando qualcosa???WALTERmwp
- Codice: Seleziona tutto
void interrupt (void){
if (INTCON.GPIF){ //se c'è stato interrupt
if((gpio.f3==1) && (stato==0)) //se gp3 è 1 e stato 0 allora
{
gpio^=porta;
delay_us(250);
gpio^=porta;
stato=1; //imposta stato a 1
}
if ((gpio.f3==0) && (stato==1)) //se c'è stato un fronte di discesa
{
gpio^=porta;
delay_us(250);
gpio^=porta;
++i;
stato=0;
}
INTCON.GPIF=0;
}
}
Ora sto testando questa routine. I triac vengono innescati ma con un tipo di lampada a led ho un piccolo sfarfallio fastidioso. Qualche consiglio?
1
voti
intanto ripeterei il controllo con la strumentazione, come correttamente avevi gia' fatto, invece di affidarmi ad un riscontro dell'effetto luci.sorecaro ha scritto:(...) Qualche consiglio?
Come ho gia' scritto, indipendentemente dallo stato del codice, non mi pare di avere letto lo stato dell'arte per quanto riguarda l'interfacciamento hardware: mi pare una ovvieta' scriverlo ma e' fondamentale sapere "come" il segnale arriva su quel pin.
Tra un crossing e il successivo hai 10 ms e mi pare che di margine ce ne sia in abbondanza quindi, in teoria, non ci dovrebbero essere difficolta' nel rilevare i transiti.
Se "ogni tanto" qualcuno viene perso non si dovrebbe scrivere che funziona: di fatto non funziona.
Di cosa altro si deve occupare o preoccupare quel software non so ma spero che dopo ogni esecuzione del codice della routine di interrupt il GIE venga rigorosamente ripristinato.
Molto dipende dalla elaborazione del compilatore (che non conosco).
In difetto di altre informazioni formulare ipotesi e' un esercizio fine a se stesso.
Riscrivo, ancor prima del codice bisognerebbe essere certi dell'affidabilita' dell'interfaccia.
Saluti
W - U.H.F.
-

WALTERmwp
30,2k 4 8 13 - G.Master EY

- Messaggi: 8986
- Iscritto il: 17 lug 2010, 18:42
- Località: le 4 del mattino
0
voti
prima cosa grazie per la risposta. Il pin gp3 é collegato direttamente alla tensione di rete tramite una resistenza da 10Mohm. Sto testando la routine e controllo l'innesco dei triac tramite oscilloscopio, fino ad ora tutto ok. Domani faró altri test.Comunque se hai qualche consiglio su come ottimizzare il codice te ne sarei grato . Il compilatore che sto usando é mikroC.WALTERmwp
0
voti
Sei sicuro che quello che stai implementando sia un rilevatore di zero crossing?
L'interrupt-on-change confronta il livello logico attuale con quello presente nel latch e se diverso scatta l'iterrupt, ma livello logico 0 in elettronica non significa sempre 0V, bensì tra 0V ed x V, come livello logico 1 non significa sempre 5V ma tra x V e 5V.
Io condizionerei il segnale alternato che arriva con un circuito a monte del pin di interrupt del PIC, eliminando le semi onde negative con diodo e trasformandole in onda quadra con un trigger.
In questo modo quando il segnale ottenuto è maggiore (o minore) di quei tot V, è molto meno in ritardo (o in anticipo) rispetto al vero 0 del segnale sinusoidale.
L'interrupt-on-change confronta il livello logico attuale con quello presente nel latch e se diverso scatta l'iterrupt, ma livello logico 0 in elettronica non significa sempre 0V, bensì tra 0V ed x V, come livello logico 1 non significa sempre 5V ma tra x V e 5V.
Io condizionerei il segnale alternato che arriva con un circuito a monte del pin di interrupt del PIC, eliminando le semi onde negative con diodo e trasformandole in onda quadra con un trigger.
In questo modo quando il segnale ottenuto è maggiore (o minore) di quei tot V, è molto meno in ritardo (o in anticipo) rispetto al vero 0 del segnale sinusoidale.

1
voti
direi che non ne valga la pena.
Un circuito minimal, quale una semplice resistenza che sfrutta i diodi di protezione degli ingressi va abbastanza bene per fare uno ZCD.
Non è molto importante che lo ZCD sia preciso perché una piccola perdita di fase non è significativa, perché il circuito "satura" alla Vdd del micro che è assolutamente trascurabile rispetto al massimo della tensione di rete.
Se poi si vuole proprio fare i pignoli si può implementare una piccola correzione software senza troppe difficoltà, ma direi che non sia il caso.
Per quanto riguarda lo sfarfallio delle lampade led, l'OP può postare la marca e il modello della lampada in questione?
Grazie
Ciao,
Pietro.
Un circuito minimal, quale una semplice resistenza che sfrutta i diodi di protezione degli ingressi va abbastanza bene per fare uno ZCD.
Non è molto importante che lo ZCD sia preciso perché una piccola perdita di fase non è significativa, perché il circuito "satura" alla Vdd del micro che è assolutamente trascurabile rispetto al massimo della tensione di rete.
Se poi si vuole proprio fare i pignoli si può implementare una piccola correzione software senza troppe difficoltà, ma direi che non sia il caso.
Per quanto riguarda lo sfarfallio delle lampade led, l'OP può postare la marca e il modello della lampada in questione?
Grazie
Ciao,
Pietro.
-

PietroBaima
90,7k 7 12 13 - G.Master EY

- Messaggi: 12206
- Iscritto il: 12 ago 2012, 1:20
- Località: Londra
0
voti
Potresti spiegarmi meglio???IlGuru
Sei sicuro che quello che stai implementando sia un rilevatore di zero crossing?
Per quanto riguarda la lampada a led purtroppo non c'è scritto nulla, ma propio nulla.
Come dicevo il circuito è già assemblato su PCB e non posso cambiare nulla.
Ho modificato la routine in questo modo, ora non ho nessun problema con lampade a led e lampade ad incandescenza. Sicuramente non è scritta "bene" ma non riesco a farla in modo diverso.
- Codice: Seleziona tutto
void interrupt (void){
if (INTCON.GPIF){ //se c'è stato interrupt
if((gpio.f3==1) && (stato==0)) //se gp3 è 1 e stato 0 allora
{
for(imp=0; imp<=400; imp++) {
gpio^=porta;
delay_us(2);
gpio^=porta;
}
stato=1;
}
if ((gpio.f3==0) && (stato==1)) //se c'è stato un fronte di discesa
{
for(imp=0; imp<=400; imp++){
gpio^=porta;
delay_us(2);
gpio^=porta;
}
++i;
stato=0;
}
INTCON.GPIF=0;
}
}
0
voti
Il rumore presente sulla sinusoide di rete, magari introdotto dalla stessa lampada, potrebbe rendere alquanto caotico l'attraversamento dello zero. Non conosco alcun filtro adatto a livello ISR, forse bisognerebbe ripetere la lettura per tot microsecondi per confermare l'attraversamento. Provato con un condensatorino? Per inciso, come è ricavata dalla rete la tensione per alimentare il micro?
0
voti
.sorecaro ha scritto:Ho modificato la routine in questo modo, ora non ho nessun problema con lampade a led e lampade ad incandescenza.
Quindi il circuito funziona, non ho capito dove sta il problema.
-

lelerelele
4.899 3 7 9 - Master

- Messaggi: 5505
- Iscritto il: 8 giu 2011, 8:57
- Località: Reggio Emilia
33 messaggi
• Pagina 3 di 4 • 1, 2, 3, 4
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 8 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)


pigreco]=π
