Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

interrupt zero crossing

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] interrupt zero crossing

Messaggioda Foto Utentesorecaro » 29 ago 2015, 18:51

Salve, tempo fa ho realizzato un piccolo programma per ricavare lo zero crossing per gestire l'accensione di 4 lampade tramite triac con un pic12f675. Il programma funziona bene ma ho notato che con alcune lampade si crea uno sfarfallio molto fastidioso. Controllando con l'oscilloscopio ho notato che a volte viene a mancare una sinusoide ma non capisco il perché.
Questa è la routine di interrupt.
Se avete qualche consiglio :D :D :D
Codice: Seleziona tutto
void interrupt (void){
if (INTCON.GPIF){              //se c'è stato interrupt


      if((gpio.f3==1)   &&   (stato==0))
      {
              gpio.f4=1;
             stato=1;
             INTCON.GPIF=0;
             gpio.f4=0;                  //flag di controllo
         }

      if ((gpio.f3==0)  &&   (stato==1))
       {
       zero_crossing=1;
       gpio.f4=1;
              ++i;
             stato=0;
             INTCON.GPIF=0;
             gpio.f4=0;                 //flag di controllo
         }

          }
          }
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[2] Re: interrupt zero crossing

Messaggioda Foto Utentelelerelele » 30 ago 2015, 10:28

Ti sei chiesto se eventualmente il problema possa essere dovuto alle lampade?
Nello specifico usando lampade a gas, (neon), oppure a led, (non dimmerabili alimentate a condensatore).

Per quanto riguarda la routine mi pare che ci siano troppe righe all'interno dell'ìnterrupt, (da tenere al minimo indispensabile), ed il controllo l'ho sempre ottenuto da contatore, ma non credo che siano questi i motivi del difetto, mi spiace ma sono un novellino su firmware, non è che ti posso aiutare molto.


Saluti.
Avatar utente
Foto Utentelelerelele
2.146 2 7 8
Expert EY
Expert EY
 
Messaggi: 2418
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[3] Re: interrupt zero crossing

Messaggioda Foto UtenteEcoTan » 30 ago 2015, 10:57

Gpio.f3 è l'input dalla sinusoide di rete, come fa a ricevere entrambe le semionde? Altrimenti rischia di non settare lo stato.. c'ho provato.
Avatar utente
Foto UtenteEcoTan
5.340 4 10 13
Expert EY
Expert EY
 
Messaggi: 3190
Iscritto il: 29 gen 2014, 8:54

0
voti

[4] Re: interrupt zero crossing

Messaggioda Foto Utentesorecaro » 30 ago 2015, 16:16

Ecotan sto provando ora l'interrupt e rilevo il passaggio per lo zero, ma ho notato una cosa. Ogni tanto mi perde una semionda
Ultima modifica di Foto Utentesorecaro il 30 ago 2015, 16:49, modificato 1 volta in totale.
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[5] Re: interrupt zero crossing

Messaggioda Foto Utentesorecaro » 30 ago 2015, 16:35

lelerelele
ogni aiuto è bene accetto. Tu come scriveresti la routine di interrupt?
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[6] Re: interrupt zero crossing

Messaggioda Foto Utentelelerelele » 30 ago 2015, 17:01

questo lo avevo scritto per CCS.

Codice: Seleziona tutto
#INT_ext

void PortaSincronismo(void)
{
    if (UpDown==1)
    {ext_int_edge(H_TO_L);
    UpDown=0;
    }
    else
    {
    ext_int_edge(L_TO_H);
    UpDown=1;
    };
eventoInt=!eventoInt;
set_timer1(TempoMaxContatore-duty);
}



Puoi notare la riga
Codice: Seleziona tutto
ext_int_edge(H_TO_L)
ext_int_edge(L_TO_H);

che inverte il fronte ad ogni semionda.
e la riga
Codice: Seleziona tutto
set_timer1(TempoMaxContatore-duty);

che ripristina il timer ad ogni semionda, il cui interrupt origina l'impulso di innesco del triac.

saluti.
Avatar utente
Foto Utentelelerelele
2.146 2 7 8
Expert EY
Expert EY
 
Messaggi: 2418
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[7] Re: interrupt zero crossing

Messaggioda Foto Utentesorecaro » 30 ago 2015, 17:08

ext_int_edge(H_TO_L)
ext_int_edge(L_TO_H);


grazie. una domanda.
queste sono istruzioni del compilatore??? scusami ma non riesco a tradurla in mikroC
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[8] Re: interrupt zero crossing

Messaggioda Foto Utentelelerelele » 30 ago 2015, 17:34

Come ti dicevo...è scritto in C per ambiente CCS.

Comunque lo scopo è invertire il fronte di lettura dell'interrupt ad ogni semionda,
Se vai a pag.14 del datasheets trovi INTEDG, che seleziona il fronte SALITA/DISCESA che innesca l'interrupt, cosi facendo vai a temporizzare con precisione sia il fronte di salita che il fronte di discesa.

Non conosco il tuo ambiente di programmazione, ma basta che controlli questo flag con il software.

saluti.
Avatar utente
Foto Utentelelerelele
2.146 2 7 8
Expert EY
Expert EY
 
Messaggi: 2418
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[9] Re: interrupt zero crossing

Messaggioda Foto Utentesorecaro » 30 ago 2015, 17:47

Ho già visto il datasheet, ma quella opzione è solo per il GP2, io sto usando l'interrupt su GP3 e non posso cambiare pin
Avatar utente
Foto Utentesorecaro
36 3 7
Frequentatore
Frequentatore
 
Messaggi: 233
Iscritto il: 26 feb 2013, 19:30

0
voti

[10] Re: interrupt zero crossing

Messaggioda Foto Utentelelerelele » 30 ago 2015, 18:05

Rileggendo pag15 con la nota.1 pare che questi interrupt possono essere abilitati su entrambi i fronti, IOC.

saluti.
Avatar utente
Foto Utentelelerelele
2.146 2 7 8
Expert EY
Expert EY
 
Messaggi: 2418
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite