Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Perfezionamento Driver motore stepper ELECTROYOUaiutami tu!

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] Perfezionamento Driver motore stepper ELECTROYOUaiutami tu!

Messaggioda Foto Utentetorla91 » 16 mar 2012, 14:25

Buon giorno a tutti, ho finito ieri sera di realizzare questa scheda per il controllo di un motore stepper.
il circuito è composto da 3 parti: alimentazione, controllo e una di potenza.
la prima e la terza sono state ottimate, il problema rimane sulla scheda di controllo, cotituita da un PIC16F690.
2012-03-16 02.14.21.jpg
fotopic
2012-03-16 02.14.21.jpg (78.14 KiB) Osservato 7523 volte


Come saprete il motore per girare deve ricevere un vettore di 4 bit che regola l eccitazione delle bobine in modo tale da ruotare in modo ben preciso. Io ho improvvisato un ADC che mi legge il valore di un potenziometro e mi assegna tale valore alla variabile che regola la velocità del motore.
Ho poi inserito 2 pulsanti che mi permettono uno di fare marcia-arresto e uno l inversione di marcia.

purtroppo mi trovo ad affrontare alcuni problemi che non riesco a risolvere, ovvero:
    CONFIGURAZIONE PULSANTI
  • la risposta alla pressione non è interpretata correttamente il 100% delle volte
  • mancanza di antirimbalzo
  • errato codice di interpretazione del pulsante
    CONVERTITORE A/D
  • quando il potenziometro è ruotato completamente la conversione del DAC sballa
  • possibile configurazione errata dei registri

Ecco il codice in MikroC:
Codice: Seleziona tutto
void main(void) {
int clockwise[]={5,9,10,6};                //numero porta output in decimale MOTORE AVANTI
int counter_clockwise[]={6,10,9,5};         //numero porta output in decimale MOTORE INDIETRO
int velocity = 100;                     //velocita' di stepping
int switchedOn=0;                     //decide quando accendere spegnere il dispositivo
int spin_clockwise=1;
int i;
char resV = 0;
/*Init PORTx*/
TRISA = 0b00000100;                  // Input for RA2
TRISC = 0b01100000;                  //RC5, sono input, le altre output
/* Init ADC */
ANSELH = 0;                          // Set PORT AN8 to AN11 as Digital O
ADCON0=0b10001001;                   // select right justify result. ADC port channel 2 ETC P115
ADCON1=0b00010000;                   // Select the FRC for 8 MHz

PORTC = 0x00;                        //azzero la PORTC

while (1) {
   if (switchedOn==0)                              //questa parte è la routine che mi ferma
      while (PORTC&0x32) switchedOn=1;               //e mi fa partire il motore, controllando
               }                                 //lo stato di RC5 che determina la marcia
   else {                                       //o l' arresto.
      while (PORTC&0x32) {switchedOn=0; PORTC = 0x00;}
   }
               
   if (switchedOn==1) {                           //qua invece controllo lo stato di rotazione
      if (spin_clockwise==1)                        //del motore, invertendo la variabile spin_clockwise
         while (PORTC&0x64) spin_clockwise=0;         //tra 0(pulsante non premuto) o 1(il pulsante è stato premuto)
      else
         while (PORTC&0x64) spin_clockwise=1;
   }
    /*ADC CONVERSION START*/
   resV=ADC_Read(2) >> 6;                           //scrivi in resV solo i 4 BIT PIù SIGNIFICATIVI
   velocity = resV*20;
   /*ADC CONVERSION STOP*/

   if(switchedOn==1)                              //questa parte è quella che da l' uscita
      for(i=0; i<=3; i++)  {                        //per l azionamento del motore, controllando lo stato
         if (spin_clockwise)                        //delle variabili switchedOn(marcia o arresto)
            PORTC = clockwise[i];                  //e spin_clockwise(avanti o indietro)
         else
            PORTC = counter_clockwise[i];
                               
         if (velocity==0) velocity=1;
            Vdelay_ms(velocity);                        //Vdelay_ms(velocity) è il ritardo che mi regola così la
      }                                       //velocità di eseguzione del for quindi la velocità
}                                             //del motorino
}


questo invece è lo schema elettrico che rappresenta i collegamenti dei pulsanti e del potenziometro:



COME POSSO QUINDI RISOLVERE I PROBLEMI DI MALFUNZIONAMENTO DEI PULSANTI??? AVETE QUALCHE CONSIGLIO SULLA GESTIONE DELLE FUNZIONI NEL CODICE?

è una delle prime esperienze con i micro e spesso mi perdo in un bichier' d'acqua! scusate le possibili eresie nel codice! GRAZI PER L' AIUTO!
Avatar utente
Foto Utentetorla91
45 1 6
Frequentatore
Frequentatore
 
Messaggi: 100
Iscritto il: 8 feb 2012, 19:10

0
voti

[2] Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

Messaggioda Foto UtentePaolino » 16 mar 2012, 14:34

Per la gestione dei rimbalzi, prova a dare una lettura a questo articolo.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[3] Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

Messaggioda Foto Utentetorla91 » 16 mar 2012, 15:06

eh grazie paolino l'ho visto ma non riesco a capire bene come funziona...avrei bisogno di un codice un po più chiaro per il mio caso..

data corrige del codice, mancavano due parentesi!
Codice: Seleziona tutto
void main(void) {
int clockwise[]={5,9,10,6};                //numero porta output in decimale MOTORE AVANTI
int counter_clockwise[]={6,10,9,5};         //numero porta output in decimale MOTORE INDIETRO
int velocity = 100;                     //velocita' di stepping
int switchedOn=0;                     //decide quando accendere spegnere il dispositivo
int spin_clockwise=1;
int i;
char resV = 0;
/*Init PORTx*/
TRISA = 0b00000100;                  // Input for RA2
TRISC = 0b01100000;                  //RC5, sono input, le altre output
/* Init ADC */
ANSELH = 0;                          // Set PORT AN8 to AN11 as Digital O
ADCON0=0b10001001;                   // select right justify result. ADC port channel 2 ETC P115
ADCON1=0b00010000;                   // Select the FRC for 8 MHz

PORTC = 0x00;                        //azzero la PORTC

while (1) {
   if (switchedOn==0){                              //questa parte è la routine che mi ferma
      while (PORTC&0x32) switchedOn=1;               //e mi fa partire il motore, controllando
               }                                 //lo stato di RC5 che determina la marcia
   else{                                       //o l' arresto.
      while (PORTC&0x32) {
      switchedOn=0; PORTC = 0x00;}
             }
             }

   if (switchedOn==1) {                           //qua invece controllo lo stato di rotazione
      if (spin_clockwise==1){                        //del motore, invertendo la variabile spin_clockwise
         while (PORTC&0x64) spin_clockwise=0;}         //tra 0(pulsante non premuto) o 1(il pulsante è stato premuto)
      else {
         while (PORTC&0x64) spin_clockwise=1;
      }
   }

    /*ADC CONVERSION START*/
   resV=ADC_Read(2) >> 6;                           //scrivi in resV solo i 4 BIT PIù SIGNIFICATIVI
   velocity = resV*20;
   /*ADC CONVERSION STOP*/

   if(switchedOn==1)                              //questa parte è quella che da l' uscita
      for(i=0; i<=3; i++)  {                        //per l azionamento del motore, controllando lo stato
         if (spin_clockwise){                        //delle variabili switchedOn(marcia o arresto)
            PORTC = clockwise[i];}                  //e spin_clockwise(avanti o indietro)
         else {
            PORTC = counter_clockwise[i]; }

         if (velocity==0) velocity=1;
            Vdelay_ms(velocity);                        //Vdelay_ms(velocity) è il ritardo che mi regola così la
      }                                       //velocità di eseguzione del for quindi la velocità
                           //del motorino
}
Ultima modifica di Foto Utenteelettrodomus il 26 mag 2012, 18:46, modificato 1 volta in totale.
Motivazione: Usa il tasto RISPONDI, non il tasto CITA (se non serve)
Avatar utente
Foto Utentetorla91
45 1 6
Frequentatore
Frequentatore
 
Messaggi: 100
Iscritto il: 8 feb 2012, 19:10

0
voti

[4] Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

Messaggioda Foto UtenteAjKDAP » 16 mar 2012, 20:20

non capisco il motivo ed il senso di istruzioni di questo tipo:

Codice: Seleziona tutto
while (PORTC&0x64) spin_clockwise=0;


Intanto con PORTC&0x64 vai a controllare i bit 2,5 e 6 di PORTC, è giusto? dov'è collegato il pulsante?

Io farei così: ad esempio se il pulsante per il cambio di direzione è collegato il PORTC_RC0:

Codice: Seleziona tutto
if((PORTC&0x01) && switchedON){
      spin_clockwise=!spin_clockwise;
      while(PORTC&0x01);
   }


della serie:
-se il pulsante è premuto ed anche switchedON è attivo,
-allora inverto lo stato di spin_clockwise,
-e successivamente aspetto che il pulsante venga rilasciato.

che ne dici?
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
Avatar utente
Foto UtenteAjKDAP
1.255 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

0
voti

[5] Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

Messaggioda Foto UtenteDonJ » 16 mar 2012, 23:50

Ciao Torla,
occhio che gli ingressi digitali sono flottanti, io cambierei il collegamento così:



In questo modo il pin d'ingresso ha sempre un riferimento verso massa.
Se glielo togli il PIC può "inventarsi" lo stato della porta al momento della lettura.
"Computers, operating systems, networks are a hot mess. They're barely manageable, even if you know a decent amount about what you're doing. Nine out of ten software engineers agree: it's a miracle anything works at all."
@fasterthanlime
Avatar utente
Foto UtenteDonJ
4.611 6 10 13
Master EY
Master EY
 
Messaggi: 2559
Iscritto il: 19 lug 2009, 22:13
Località: Croccamauria

0
voti

[6] Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

Messaggioda Foto Utentetorla91 » 17 mar 2012, 3:33

ciao ficca!! hai ragione mi sono sbagliato nello schema!comunque nel mio caso il PIC è configurato come nel tuo schema con le resistenze di pull-down, mi pare si dica così in gergo!
Ultima modifica di Foto Utenteadmin il 26 mag 2012, 0:57, modificato 1 volta in totale.
Motivazione: eliminata citazione integrale inutile del messaggio che precede. Si deve usare il tasto Rispondi per non duplicare il forum!
Avatar utente
Foto Utentetorla91
45 1 6
Frequentatore
Frequentatore
 
Messaggi: 100
Iscritto il: 8 feb 2012, 19:10

0
voti

[7] Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

Messaggioda Foto Utentetorla91 » 17 mar 2012, 3:38

AjKDAP ha scritto:non capisco il motivo ed il senso di istruzioni di questo tipo:

Codice: Seleziona tutto
while (PORTC&0x64) spin_clockwise=0;


Intanto con PORTC&0x64 vai a controllare i bit 2,5 e 6 di PORTC, è giusto? dov'è collegato il pulsante?



allora il bit da controllare è solo quello su RC6, che se premuto mi inverte il senso di rotazione del motore.
la riga di codice che hai citato in teoria dovrebbe settarmi il valore della variabile che mi determina il senso di rotazione!

sono curioso di provare la tua soluzione! sebra molto funzionale!
Avatar utente
Foto Utentetorla91
45 1 6
Frequentatore
Frequentatore
 
Messaggi: 100
Iscritto il: 8 feb 2012, 19:10

0
voti

[8] Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

Messaggioda Foto UtenteAjKDAP » 17 mar 2012, 14:03

Quindi da dove salta fuori quel 0x64 ?

in binario equivale a : 01100100 quindi come già detto controlli RC2 - RC5 ed RC6 contemporaneamente.

Se devi controllare solo RC6 devi controllare solo il bit 6 -> 01000000 -> 0x40

Quindi fai una "and bit a bit" tra PORTC e 0x40.

Codice: Seleziona tutto
if(PORTC & 0x40)


Prova e facci sapere ! :ok:
'˙˙˙·٠•● Alberto ●•٠·˙˙˙'
________________________
http://www.ajk.altervista.org
Avatar utente
Foto UtenteAjKDAP
1.255 2 6 9
Expert EY
Expert EY
 
Messaggi: 796
Iscritto il: 17 mag 2006, 0:13
Località: nella coda dei pronti

0
voti

[9] Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

Messaggioda Foto Utentetorla91 » 19 mar 2012, 0:37

secondo me ti sbagli, 64 in binario è la potenza sesta di due, ovvero 2^6=64=0b01000000.
il 40 in binario è 101000.
Ultima modifica di Foto Utenteadmin il 26 mag 2012, 0:58, modificato 1 volta in totale.
Motivazione: eliminata citazione integrale inutile del messaggio che precede. Si deve usare il tasto Rispondi per non duplicare il forum!
Avatar utente
Foto Utentetorla91
45 1 6
Frequentatore
Frequentatore
 
Messaggi: 100
Iscritto il: 8 feb 2012, 19:10

0
voti

[10] Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

Messaggioda Foto UtenteDonJ » 19 mar 2012, 0:40

torla91 ha scritto:il 40 in binario è 101000.

Occhio che gli 0x sono numeri in sistema esadecimale
0x40 non è 40d ma è 64d che equivale a 01000000b
e dunque 0x64 non è 64d ma è 100d e cioè 01100100b
"Computers, operating systems, networks are a hot mess. They're barely manageable, even if you know a decent amount about what you're doing. Nine out of ten software engineers agree: it's a miracle anything works at all."
@fasterthanlime
Avatar utente
Foto UtenteDonJ
4.611 6 10 13
Master EY
Master EY
 
Messaggi: 2559
Iscritto il: 19 lug 2009, 22:13
Località: Croccamauria

Prossimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti