Vai al contenuto
PLC Forum


Strano Comportamento Pic


Edge

Messaggi consigliati

Buongiorno a tutti,

volevo porvi una domanda su un problema che mi sta capitando. Ho realizzato una semplicissima scheda con a bordo un PIC18F1220 che realizza una banalissima logica di comando di una coppia di elettrovalvole su una piccola macchina semovente ambito vigneti. In genere non uso mai i micro in tale tipologia di macchine perchè piene di rumori e operanti in ambienti poco felici. Preferisco realizzare la logica via hardware. Ad ogni modo, questa volta, considerata la logica della macchina veramente banale ho optato per l'uso del micro.

Riporto il codice dell'applicazione (scritto in linguaggio C) :



#define PREMUTO 1

#define OFF 0


int var=0; // variabile di appoggio

int cont=0; // variabile di appoggio


void main()

{

ADCON1=0xFF;

TRISB=0x07;  // RB0,RB1, RB2 = INPUT  - da RB3 a RB7 = OUTPUT

TRISB=0x07;

PORTB=0;

PORTB=0;

var=0;

cont=0;

PORTB.F6=0;

PORTB.F6=0;

PORTB.F7=0;

PORTB.F7=0;

while(1)

{


/*---------------------------------------------------*/

  //LOGICA 1

/* Premo il pulsante su RB2 e la macchina è abilitata in quanto segnala la

presenza di uomo a bordo. L'uscita va ad agire su relè.

Il rilascio del medesimo pulsante di uomo presente è ritardato di circa

mezzo secondo per evitare false segnalazioni di uomo non presente*/



if(PORTB.F2==PREMUTO)

{

   Delay_ms(100);

   {

    if(PORTB.F2==PREMUTO)

    {

	 PORTB.F7=1;

	 PORTB.F7=1;

	 var=1;

	 var=1;

    }

   }

  }


if((PORTB.F2==OFF)&&(var==1))

{

   Delay_ms(100);

   {

    if((PORTB.F2==OFF)&&(var==1))

    {

    Delay_ms(500);

	 PORTB.F7=0;

	 PORTB.F7=0;

	 var=0;

	 var=0;

    }

   }

  }



/*-----------------------------------------------------------*/

  //LOGICA 2

/* Premo il pulsante su RB0 e dopo un ritardo di circa 2s vado ad azionare

l'elettrovalvola.

Agendo nuovamente sul medesimo pulsante si disattiva l'elettrovalvola*/



if((PORTB.F0==OFF)&&(cont==0))

{

   Delay_ms(800);

    if((PORTB.F0==OFF)&&(cont==0))

    {

	 Delay_ms(1000);

	    PORTB.F6=1;

	    PORTB.F6=1;

	    cont=1;

	    cont=1;

	    while(PORTB.F0==OFF){};

	    Delay_ms(50);

	 }

}


if((PORTB.F0==OFF)&&(cont==1))

{

   Delay_ms(100);

    if((PORTB.F0==OFF)&&(cont==1))

	   {

	    PORTB.F6=0;

	    PORTB.F6=0;

	    cont=0;

	    cont=0;

	    while(PORTB.F0==OFF){};

	    Delay_ms(50);

	   }

}

}

}

Come si può vedere ci sono due funzioni banalissime. Durante il debug del firmware non ho riscontrato nessun problema, e non ho nessun problema quando realizzo il circuito (di cui allego lo schema) e lo provo in laboratorio. Quando vado però a montare la scheda sulla macchina capita (purtroppo casualmente, non è sistematica la cosa) che il sistema si blocca, non funziona più nulla e per poter riutillizare la macchina, o si spegne e si riaccende l'impianto girando la chiave, oppure l'operatore deve dare una accelerata alla macchina e dopo circa 2 secondi riparte tutta la logica. E' come se improvvisamente ci fosse un buco di tensione nell'impianto che mi manda in palla il micro. Ovviamente ho provato a misurare se si verificassero dei buchi di tensione ma non ho riscontrato nulla. Come si vede la macchina deve solo comandare due elettrovalvole in tutto, non dovrebbero verificarsi comunque dei buchi così significativi.

Ho provato anche mettendo sull'alimentazione un condensatore con diodo di blocco. Pensavo di aver risolto ma alla fine si è verificata comunque l'anomalia.

Non ho ancora provato perchè lo utilizzo raramente, ma magari sfruttare il watchdog timer puntato a 2,3 secondi potrebbe essere una idea.

Se avete qualche suggerimento in merito è ben accetto.

Edge

Link al commento
Condividi su altri siti


E' un problema HW. Per questo tipo di applicazioni tutti gli I/O da e verso il controllore devono essere disaccoppiati galvanicamente. L'alimentazione deve essere derivata tramite alimentatore PWM con trasformatore, magari seguito da regolatore serie con filtraggio pesante prima del regolatore, non dopo come nel tuo caso.

Il disaccoppiamento, da effettuarsi tramite foto accoppiatori, e la separazione dell'alimentazione tramite trasfo, son necessari per non avere masse in comune evitando la conduzione di distrubi.

Nella logica di funzionamento bisogna anche assolutamente evitare dia vere ingressi normalmente appesi a +Vdd, ma invece devono essere tenuti a 0 tramite resistori di basso valore (<=1k). assolutamente non ci devono essere ingresssi intilizzati lasciati appesi e flottanti, ma devono essere ancorati a 0 V direttamente o conresistori di basso valore.

Il circuito deve essere alloggiato in contenitore metallico ferroso, così da costituire una schermatura magnetica.

Link al commento
Condividi su altri siti

Intanto ti ringrazio Livio per la tua risposta.

E' un problema HW. Per questo tipo di applicazioni tutti gli I/O da e verso il controllore devono essere disaccoppiati galvanicamente. L'alimentazione deve essere derivata tramite alimentatore PWM con trasformatore, magari seguito da regolatore serie con filtraggio pesante prima del regolatore, non dopo come nel tuo caso.
Difatti normalmente eseguo sempre questa metodologia, però sono circuiti puramente hardware essendo "hardwerista" e poco "softwerista". Questa volta, vuoi la problematica di spazio che avevo a disposizione e vuoi la banalità della logica da fare, ho pensato bastasse un circuito di questo tipo sopravvalutando la robustezza del micro.
Nella logica di funzionamento bisogna anche assolutamente evitare dia vere ingressi normalmente appesi a +Vdd, ma invece devono essere tenuti a 0 tramite resistori di basso valore (&lt;=1k).
Ok, vada per i pull-down.
assolutamente non ci devono essere ingresssi intilizzati lasciati appesi e flottanti, ma devono essere ancorati a 0 V direttamente o conresistori di basso valore.
Ok. Mi basta porre a zero gli altri ingressi per evitare effetti "antenna" dai pin inutilizzati o devo proprio ancorarli a massa sul PCB? L'unica cosa su cui posso avere problemi è l'utilizzo del trafo di isolamento ma per motivi di spazio (e di costo). Hai qualche sigla in merito sul quale potrei utilizzare per tale applicazioni? Edge Modificato: da Edge
Link al commento
Condividi su altri siti

Forse un DC/DC traco (TMA 1205S) da 1W - 200mA dovrebbe bastare.

A me sembra un'ottima soluzione.

ho pensato bastasse un circuito di questo tipo sopravvalutando la robustezza del micro.

Il micro è molto rubusto, infatti non si è ancora rotto. :P

Il problema sono i disturbi! Alimentato a 5 V ha un'immunità teorica di 2 V circa. Avendo elevatissima impedenza d'ingresso basta pochissima energia per far commutare la porta. Non solo, se il disturbo è abbastanza forte può sporcare il program counter ed allora il micro va farfalle, per un po' fa il pazzerellone poi, casualmente ripassa per lo zero del program counter e riparte in modo corretto sino al prossimo disturbone.

Le apparcchiature industriali (serie) vengono sottoposte sempre a test di immunità ai disturbi condotti. La prova minima consiste nel far passare tutti i fili di collegamento da e per il campo, alimentazione compresa, entro le armature di una specie di condensatore. Questo è uno strumento appositamente studiato per questo test. In pratica si generano disturbi pseudo random con ampiezza di 2 kVpp. L'apparato deve funzionare regolarmente per almeno 15' con questi disturbi. Se supera il test è (quasi) certo che non ci saranno problemi sul campo.

In un'applicazione "automotive" i disturbi sono ancora più severi.

Link al commento
Condividi su altri siti

Il micro è molto rubusto, infatti non si è ancora rotto

In effetti :P ...

Grazie mille Livio per la delucidazione. Come sempre chiara ed estremamente utile :smile: .

Edge

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