Jump to content
PLC Forum


Sign in to follow this  
slavin89

controllo ciclo motore con pulsante e sensore hall

Recommended Posts

slavin89

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

 

Share this post


Link to post
Share on other sites

Livio Orsini

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.

Share this post


Link to post
Share on other sites
slavin89

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

Share this post


Link to post
Share on other sites
Livio Orsini

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.

Share this post


Link to post
Share on other sites
slavin89

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?

Share this post


Link to post
Share on other sites
slavin89

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?

Share this post


Link to post
Share on other sites
Livio Orsini

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.

Share this post


Link to post
Share on other sites
slavin89

buongiorno a tutti e grazie Livio..ha funzionato ma ho dovuto aggiungere il controllo flag pulsante.

grazie mille

Share this post


Link to post
Share on other sites
slavin89

flg_puls== vero dopo aver portati a vero anche il flg_ start

Share this post


Link to post
Share on other sites
Livio Orsini

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

Share this post


Link to post
Share on other sites
slavin89

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?

Share this post


Link to post
Share on other sites
Livio Orsini

Cosa è GPF e quando è vero?

       

Share this post


Link to post
Share on other sites
slavin89

GPIF e' il flag che individua gli interrupt su cambio di stato

della porta

Share this post


Link to post
Share on other sites
Livio Orsini

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

}

 

Share this post


Link to post
Share on other sites
slavin89

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;
    }
    }        

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