Jump to content
PLC Forum


Sign in to follow this  
sorecaro

interrupt zero crossing

Recommended Posts

sorecaro

Salve a tutti, avrei la necessità di rilevare lo zero tramite l'ingresso GP3 di un pic12f675. 

Fino ad ora ho usato questa routine di interrupt (funziona)

void interrupt (void){
if (INTCON.GPIF){              //se c'è stato interrupt

      if((gpio.f3==1)   &&   (stato==0))
      {
              zero_crossing=1;
             stato=1;
             INTCON.GPIF=0;
                              
         }

      if ((gpio.f3==0)  &&   (stato==1))
       {
       zero_crossing=1;
              ++i;
             stato=0;
             INTCON.GPIF=0;
         }

          }
          }

Ora volevo chiedervi, è possibile migliorarla??

Share this post


Link to post
Share on other sites

Livio Orsini

Migliorare in che cosa?

DOvresti leggerti l'AN di Microchip specifica sulle tecniche di zero crossing per avere un'idea generale del metodo ottimizzato.

Share this post


Link to post
Share on other sites
sorecaro

Volevo avere dei pareri sula routine che ho scritto. Comunque seguirò il tuo consiglio .

Share this post


Link to post
Share on other sites
Livio Orsini

Se non si sa cosa vuoi ottenere non si può giudicare se la funzione è ottimizzata o meno.

Poi dependa anche dal compilatore usato, ad esempio con CSC non potrei scriverla in quel modo.

Share this post


Link to post
Share on other sites
sorecaro

In questo modo la routine funziona. Ho un impulso ogni passaggio per lo zero. La curiosità era se il codice poteva essere ottimizzato in altro modo, é sempre un bene confrontarsi con altri . Il compilatore che uso é mikroc 

Share this post


Link to post
Share on other sites
Livio Orsini

Se ti serve un impulso di durata fissa quella routine è ridondante.

Share this post


Link to post
Share on other sites
Livio Orsini

Non vedo altro modo di dirtelo; se devi solo ottenere un impulso al passaggio per lo zero la funzione che hai scritto non è ottimizzata.

Share this post


Link to post
Share on other sites
sorecaro

Ok. Ho cambiato la funzione in questo modo:

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;

}

}  3

Stasera vorrei provare a cambiare il primo if. Invece di gpio.f3==1 modificarlo in gpio.f3==0 in modo tale da avere un impulso ogni volta che ho uno zero su gpio.f3 

 

 

Edited by sorecaro

Share this post


Link to post
Share on other sites
Livio Orsini

Hai peggiorato e di molto la situazione, perchè hai anche introdotto dei ritardi bloccanti di 250 µs, un'eternità.

Share this post


Link to post
Share on other sites
sorecaro

Livio saresti così gentile di farmi un esempio di codice ? Non voglio la pappa pronta, sia ben chiaro, ma una linea da seguire,se possibile. Ho letto i vari AN della microchip ma non ne vengo a capo

 

Share this post


Link to post
Share on other sites
Livio Orsini

Dovresti almeno spiegare:

  • Come ottieni il segnale di passaggio per lo zero
  • Cosa vuoi avere da quel segnale. Un impulso? di durata min. - max ? altro?
  •  

 

Share this post


Link to post
Share on other sites
sorecaro

Ok. Il pin gp3 é collegato direttamente alla tensione di rete con una resistenza da 10Mohm. Vorrei avere un impulso per ogni passaggio per lo zero di 250uS per innescare i triac. 

Share this post


Link to post
Share on other sites
sorecaro

Purtroppo non posso, la scheda é già assemblata in questo modo 

Share this post


Link to post
Share on other sites
Livio Orsini

Ok. Il pin gp3 é collegato direttamente alla tensione di rete

Veramente pessimo.

Oltre alla pericolosità non hai una rilevazione sicura e costante del passaggio per lo zero.

Devi mettere un minimo di circuiteria attorno. Anche se la scheda è già assemblata puoi sempre fare un modulino esterno con il circuito che ha suggerito Roberto.

Comunque quando ho un poco di tempo e di voglia do una controllata al micro che hai usato e ti adatto una routine delle mie.

Share this post


Link to post
Share on other sites
Livio Orsini

Ho dato un'occhiata al tuo micro, veramente lilipuziano.

Comunque il primo problema che hai da risolvere è la rivelazione del passaggio per lo zero. Il sistema che usi tu non ti garantisce alcunchè.

Il pin gp3 é collegato direttamente alla tensione di rete con una resistenza da 10Mohm

Questo non lo puoi fare, devi metterci almeno un diodo per avere l'unidirezionalità della corrente. Poi in questo modo non riveli il passaggio per lo zero ma avrai una commmutazione della porta piuttosto aleatoria.

Devi mettere un circuito esterno; l'ideale sarebbe l'impiego del circuito suggerito da Roberto o qualche altro simile.

Un'alternativa povera la puoi realizzare con un ponte di diodi a cui applichi la rete a 230V; l'uscita la colleghi tramite un rsistore da 150k - 2W ad uno zener da 4.7 V. Lo zener lo colleghi al tuo ingresso.

Avrai 2 interruzioni ad ogni passaggio per lo zero essendo l'interrupt sul livello. Se vuoi accendere il tuo triac ad ogni passaggio per lo zero ti basta dare l'uscita alta al primo interrupt ed abbasarla al secondo secondo.

Share this post


Link to post
Share on other sites
sorecaro

Livio grazie per i consigli. Purtroppo non posso cambiare hardware. Sto testando la routine di interrupt,  fino ad ora funzionano. 

Share this post


Link to post
Share on other sites
Livio Orsini

Non sono le funzioni software ad avere problemi, ma è proprio la parte Hw che può procurarteli.

Share this post


Link to post
Share on other sites
sorecaro

Grazie Livio.  Vedrò se passo mettere una scheda esterna per il rilevamento dello zero crossing come consigliato 

Share this post


Link to post
Share on other sites
ic910

Ciao Sorecaro .Se vuoi rilevare lo zero-cross solo con una resistenza prendi un 12f1612 (sempre un 8 pin come il 12f675) ha lo zero-cross integrato ed è possibile rilevare solo con una resistenza da dimensionare con relativa formula posta nel datasheet (pag.177).

Se invece vuoi mantenere il 12f675 puoi aggiungere solo un transistor e pochi altri componenti per rilevare lo zero-cross .In questo modo andrai a prendere in considerazione le variazioni del livello logico da 0 a 1 da 1 a 0 . In questo modo anche senza ponte puoi ottenere tutti i passaggi per lo zero.

Se vuoi ti posso mandare anche la configurazione hardware.

 

Share this post


Link to post
Share on other sites
Livio Orsini

Se vuoi ti posso mandare anche la configurazione hardware.

 

perchè non metti lo schema sul forum? potrebbe interessare molti utenti.

Share this post


Link to post
Share on other sites
ic910

Servono veramente pochi componenti per rilevare lo zero-cross ecco lo schema che ho utilizzato.

http://it.tinypic.com/view.php?pic=adghh2&s=8#.Vf7iR31wTK9.

Nel software però si deve con questo hardware rilevare sia i fronti di salita che i fronti di discesa . Si deve impostare l'interrupt per ogni variazione logica presente sul collettore del transistor (Bc 547)  da 0 a 1 da 1 a 0.

Spero di essere stato utile .

Share this post


Link to post
Share on other sites
Livio Orsini

Questo circuito da un passaggio per lo zero molto approssimativo e per nulla costante. Può andar bene se basta una precisione di più o meno 2 spanne.

Inoltre c'è la pericolostità di non essere separato galvanicamente da rete.

Però per certe applicazioni può anche essere sufficiente.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...