Pagina 1 di 2

Perfezionamento Driver motore stepper ELECTROYOUaiutami tu!

MessaggioInviato: 16 mar 2012, 14:25
da torla91
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 7548 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!

Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

MessaggioInviato: 16 mar 2012, 14:34
da Paolino
Per la gestione dei rimbalzi, prova a dare una lettura a questo articolo.

Ciao.

Paolo.

Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

MessaggioInviato: 16 mar 2012, 15:06
da torla91
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
}

Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

MessaggioInviato: 16 mar 2012, 20:20
da AjKDAP
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?

Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

MessaggioInviato: 16 mar 2012, 23:50
da DonJ
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.

Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

MessaggioInviato: 17 mar 2012, 3:33
da torla91
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!

Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

MessaggioInviato: 17 mar 2012, 3:38
da torla91
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!

Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

MessaggioInviato: 17 mar 2012, 14:03
da AjKDAP
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:

Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

MessaggioInviato: 19 mar 2012, 0:37
da torla91
secondo me ti sbagli, 64 in binario è la potenza sesta di due, ovvero 2^6=64=0b01000000.
il 40 in binario è 101000.

Re: Perfezionamento Driver motore stepper ELECTROYOUaiutami

MessaggioInviato: 19 mar 2012, 0:40
da DonJ
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