Pagina 1 di 4

interrupt zero crossing

MessaggioInviato: 29 ago 2015, 18:51
da sorecaro
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
         }

          }
          }

Re: interrupt zero crossing

MessaggioInviato: 30 ago 2015, 10:28
da lelerelele
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.

Re: interrupt zero crossing

MessaggioInviato: 30 ago 2015, 10:57
da EcoTan
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.

Re: interrupt zero crossing

MessaggioInviato: 30 ago 2015, 16:16
da sorecaro
Ecotan sto provando ora l'interrupt e rilevo il passaggio per lo zero, ma ho notato una cosa. Ogni tanto mi perde una semionda

Re: interrupt zero crossing

MessaggioInviato: 30 ago 2015, 16:35
da sorecaro
lelerelele
ogni aiuto è bene accetto. Tu come scriveresti la routine di interrupt?

Re: interrupt zero crossing

MessaggioInviato: 30 ago 2015, 17:01
da lelerelele
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.

Re: interrupt zero crossing

MessaggioInviato: 30 ago 2015, 17:08
da sorecaro
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

Re: interrupt zero crossing

MessaggioInviato: 30 ago 2015, 17:34
da lelerelele
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.

Re: interrupt zero crossing

MessaggioInviato: 30 ago 2015, 17:47
da sorecaro
Ho già visto il datasheet, ma quella opzione è solo per il GP2, io sto usando l'interrupt su GP3 e non posso cambiare pin

Re: interrupt zero crossing

MessaggioInviato: 30 ago 2015, 18:05
da lelerelele
Rileggendo pag15 con la nota.1 pare che questi interrupt possono essere abilitati su entrambi i fronti, IOC.

saluti.