Vai al contenuto
PLC Forum


controllo ciclo motore con pulsante e sensore hall


slavin89

Messaggi consigliati

Buongiorno a tutti

 

recentemente mi avete aiutato a comandare l'arresto di un motore utilizzando un sensore hall e tutto è avanzato bene, ora sto sviluppando il programma definitivo nel quale devo controllare l'avvio motore tramite la pressione di un pulsante con l'istruzione

 

if(!BTN1)

{

MOTORE=1;

}

 

poi utilizzando gli interrupt sull'ingresso del pic dove è collegato il sensore eseguo l'arresto

void interruptISR(void)

{

if(INTF)

{

MOTORE=0;

INTF=0;

}

}

 

 

il problema è che se tengo il pulsante premuto il motore si arresta e riparte di continuo mentre io vorrei che il ciclo fosse:

 

premo il pulsante->motore parte

arresto pilotato dal sensore hall (INTF)

se il pulsante continua ad essere premuto->nessuna azione

se il pulsante viene rilasciato e ripremuto->rieseguo il ciclo di avvio e arresto tramite sensore

 

secondo voi come potrei fare?

 

ciao e grazie in anticipo

 

Link al commento
Condividi su altri siti


per prima cosa dovresti dire con quale PLC stai lavorando e quindi si sposta la discussione nel forum appropriato, anzi era giusto se tu l'avessi aperta nel forum PLC e nella sezione relativa al tipo di PLC che stai usando.

 

per fare quello che vuoi il pulsante non deve comandare direttamente il motore, ma deve alzare e abbassare un flag, ovvero un bit di memeoria.

 

Premo il pulsante, alzo il flag di marcia. Se tutte le condizioni sono corrette il motore parte.

Premo nuovamente il pulsante, se il flag è alto lo abbasso. Se il flag è basso il motore si ferma.

 

Però non sipuò, per motivi di sicurezza, usare un unico pulsante per fare marcia e arresto.

E' necessario usare un pulsante di marcia ed uno di arresto, separati.

Link al commento
Condividi su altri siti

in realtà sto utilizzando un PIC12f629.

Io con il pulsante comando solo la marcia perchè l'arresto viene pilotato dal sensore hall.

 

La cosa che non riesco a fare è di non far ripartire il motore se il pulksante non viene rilasciato..cioè se premo il pulsante devo fare un ciclo che si arresta quanto il sensore hall dà il consenso e per riavere un avvio motore devo primare togliere la pressione dal pulsante e ripremerlo.

Quindi se tengo premuto il pulsante devo fare sempre e solo un ciclo 

 

spero di essere stato chiaro

Link al commento
Condividi su altri siti

Devi sentire solo transizione di stato.

Il pulsante di marcia alza un flag che comada la marcia; alza inoltre un flag di memoria.

Il flag di marcia sarà abbassato solo dal sensore che comanda l'arresto.

Il flag di memoria sarà abbassato solo dopo che il pulsante sia stato aperto. Se questo flag non è basso lo stato di chiusura del pulsante non influenza il flag di marcia.

 

Spero che tu l'acquisizione del pulsante la faccia con un debouncing software.

Link al commento
Condividi su altri siti

si l'anti rimbalzo lo faccio software..non ho voluto appesantire le istruzioni qui nella discussione..

però non riesco a tradurre in codice quello che mi hai scritto..puoi farmi un esempio?

Link al commento
Condividi su altri siti

forse ci sono..dovrebbe essere cosi

if(FLAG==0)

{

if(!BTN1)

{

MOTORE=1;

FLAG=1;

}

else

{

FLAG=0;

}

 

poi utilizzando gli interrupt sull'ingresso del pic dove è collegato il sensore eseguo l'arresto

 

void interruptISR(void)

{

if(INTF)

{

MOTORE=0;

INTF=0;

}

}

 

vi sembra corretta?

Link al commento
Condividi su altri siti

I flags sono 2: uno flg_puls ti da lo stato del pulsante, l'altro fgl_start è il comando di marcia.

Se si considera vero lo stato del pulsante premuto sarà (in pseudo "C"):

If ((in_pusante == vero ) and (flg_puls == falso) and (flg_start == falso))

  {

    flg_ start = vero;

  }

If (in_pulsante == falso)

      flg_pulsante = falso;

 

poi nell'interruopt metti falso il flg_start.

Link al commento
Condividi su altri siti

Si non l'ho scritto nelle istruzioni, perchè lo avevo messo nella descrizione generale.

Attenzione in "C", ma anche con arduino, quando usi "==" è solo per confronto, invece quando vuoi forzare lo stato devi usare "=".

Link al commento
Condividi su altri siti

  • 4 months later...

Buongiorno a tutti

riprendo questa discussione perchè nel tempo il mio progetto si è leggermente evoluto e riscontro qualche problema spero mi possiate aiutare..per riassumere si trattava di un progetto in cui dovevo controllare la marcia di un motore tramite un pulsante e l'arresto con un sensore hall, utilizzando un pic 12f629.

La problematica attuale èche nello stesso circuito ho inserito due sensori hall che debbono comandare due azioni diverse tramite interrupt, per fare questo ho abilitato l'interrupt IOC e analizzato quanto la sorgente di interrupt è la porta "0"..nel caso sia la porta "0" deve arrestarmi il motorino.

Di seguito il codice

 

    while(1)
        {

        if ((!PULSANTE) && (PULS_PREM==0) && (START==0))
        {
        PULS_PREM=1;
        START=1;

        }

        if (PULSANTE)
        {

       PULS_PREM=0;
        }            
        }
    }
           
        
void interruptISR(void)
    {
    if (GPIF)
    {    
    if (GPIO,0)
    {
        START=0;
    }
    GPIF=0;
    }

}        

 

il problema è che il motore si avvia solo se tengo premuto il pulsante e nel contempo il sensore passa davanti ad un magnete ma poi l'arresto non avviene, come se non individuasse più l'interrupt eppure ho azzerato il flag dovrebbe rilevarlo nuovamente ..cosa sbaglio secondo voi?

Link al commento
Condividi su altri siti

E' inutile, perchè l'interrupt scatta su di una transizione da 0-->1 o da 1-->0, e questo viene deciso nella configurazione.

Se vuoi azzerare il flag START ti basta scrivre nella routine di in terrupt
 

if ((GPIO, O) == 0)

{

   START = 0

}

 

Link al commento
Condividi su altri siti

  • 2 months later...

Buongiorno a tutti..andando avanti con il mio progetto ho terminato di realizzare la parte hardware del progetto ma in fase di test qualcosa non va..in pratica il pulsante avvia il mio motore e l'arresto viene effettuato dal sensore hall ma se il pulsante lo tengo premuto il motore non si arresta mai come se non venisse tenuto in considerazione il flag del pulsante premuto..non ho utilizzato le resistenze di pull up esterne bensi ho abilitato quelle interne al pic..può essere quello il problema secondo voi?

di seguito il codice

 

AVVIO è l'uscita per pilotare il motore

PULSANTE è l'ingresso dal pulsante

pulsante è il flag del pulsante premuto (dichiarato come bit nel setting)

avvio è il flag di motore in marcia (dichiarato come bit nel setting

 

void main(void)
{
    setting();
    AVVIO=0;
    
    while(1) // eseguo un ciclo finito
        {

        if ((!PULSANTE)&&(pulsante==0)&&(avvio==0))
        {
        pulsante=1;
        avvio=1;
        }
        
        
        if (PULSANTE)
        {
        pulsante=0;
        }
    
        
        if (avvio==1)
        {
        AVVIO=1;
        }
        else
        {
        AVVIO=0;
        }
        
        
        }
    }
    
        
        
void interruptISR(void)
    {
    if (INTF)
    {
    avvio=0;
    INTF=0;
    }
    }        

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