Vai al contenuto
PLC Forum


interrupt zero crossing


sorecaro

Messaggi consigliati

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??

Link al commento
Condividi su altri siti


Migliorare in che cosa?

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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 

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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 

 

 

Modificato: da sorecaro
Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

 

Link al commento
Condividi su altri siti

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?
  •  

 

Link al commento
Condividi su altri siti

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. 

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

  • 3 weeks later...

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.

 

Link al commento
Condividi su altri siti

Se vuoi ti posso mandare anche la configurazione hardware.

 

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

Link al commento
Condividi su altri siti

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 .

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...