CONTROLLO MOTORE STEPPER UNIPOLARE

Schema e Codice per Controllare la Direzione e la Velocità di un Motore Stepper Unipolare (28BYJ-48) con Microcontrollore…

 

 

 
 



 

INTRO

Il seguente schema permette di controllare un motore stepper unipolare con un microcontrollore ed è in gradi di fermarlo e farlo partire, controllare la sua direzione e la sua velocità. Il motore può essere controllato con mezzo step o step intero, inoltre inserendo un controllo è possibile inserire solo un certo numero di passi, controllando quindi la posizione a cui si giunge con il motore.

Il motore 28BYJ-48 è un motore unipolare e viene usato in questo articolo come test per il codice e lo schema. Lo schema è composto anche da un driver e come driver viene usato un ULN2004. Il driver ULN2003 si potrebbe usare pure, ma supporta solo ingressi a 3.3V, quindi bisognerebbe alimentare tutto a 3.3V oppure solo il microcontrollore.

Come microcontrollore viene usato un PIC18F252 e con due interruttori si può controllare l’accensione e la direzione. Per controllare la velocità viene usata una resistenza variabile connessa all’ingresso dell’ADC.

 





 
CODICE

Il codice è il seguente:

#define Output PORTC                                              //Connessione driver-microcontrollore

bit Direzione;                                                    //Variabili
bit start;
unsigned int Conversione;
unsigned char Velocita;
unsigned char pattern_count = 1;
/*#define MAX_PATTERN 8                                          //Mezzo step
const code unsigned char pattern[MAX_PATTERN] = {0b1000,
                                                 0b1100,
                                                 0b0100,
                                                 0b0110,
                                                 0b0010,
                                                 0b0011,
                                                 0b0001,
                                                 0b1001}; */

#define MAX_PATTERN 4                                           //Full step
const code unsigned char pattern[MAX_PATTERN] = {0b1100,
                                                 0b0110,
                                                 0b0011,
                                                 0b1001};

void interrupt(){                                               //controllo motore
  if(T0IF_bit){                                                 //flag interrupt timer
    T0IF_bit = 0;                                               //Resetta flag
    if(start == 0) Output = 0;                                //se spento output = 0
    else{                                                       //altrimenti...
      pattern_count += Direzione<<1;                            //Shifta in funzione di direzione
      pattern_count--;                                          //Cambia valore del pattern
      if(pattern_count == 0)                                    //Se si arriva alla fine ricomincia
        pattern_count = MAX_PATTERN;
      if(pattern_count == MAX_PATTERN+1)
        pattern_count = 1;
        Output = pattern[pattern_count - 1];                    //Invia in uscita il pattern
    }
    TMR0L = Velocita;                                           //Inserisci velocità nel timer counter
  }
}

void main() {

  TRISB = 0b00000011;                      //PB0 e PB1 ingressi
  TRISC = 0b00000000;                      //PORTC uscite
  T0CON = 0b11000010;                      //Timer counter 8bit on con prescaler 8 (con quarzo 8MHz)
  INTCON = 0b11100000;                     //Abilita interrupt e interrupt TMR0
  ADC_init();                              //Inizializza ADC

  while(1){
    START = PORTB.F0;                      //On off dipende da PB0
    Direzione = PORTB.F1;                  //Direzione dipende da PB1
    Velocita = ADC_Get_Sample(0) >> 1;     //Velocità dipende da ADC
  }
}

Prima di tutto si definiscono le PORTC come uscite e poi si inizializzano le variabili per la conversione, la velocità, e il conto del pattern. I pattern sono due, uno composto da 8 valori per avere i mezzi step mentre l’altro, composto da 4 elementi serve per eseguire passi interi del motore.

Nell’interrupt si va controllare lo stato dell’accensione e poi si va a scansionare l’array con i valori delle uscite per avere gli step e si va a inviare in uscita il codice.

Nel programma principale si vanno a configurare input e output, il timer counter con prescaler a valore 8 (se si usa un quarzo da 4MHz il prescaler deve essere 4), si inizializza l’interrupt del timer counter e infine l’ADC.

Nel ciclo infinito si vanno semplicemente a leggere i valori di accensione, direzione e velocità. I fuses sono così configurati:


 

SCHEMA

Lo schema è il seguente:

La tensione di alimentazione è a 5V continui e la corrente assorbita dipende dal motore. Il microcontrollore è alimentato dalla tensione a 5V con il positivo al pin 20 e la massa ai pin 19 e 8. Il circuito risuonatore è composto da X1, un quarzo da 8MHz, ed è composto da C1 e C2. Il microcontrollore viene mantenuto in funzione e non in stato di reset grazie alla resistenza di pull-up R3.

La resistenza RV1 serve per controllare la velocità mentre gli switch SW2 e SW1 servono rispettivamente a controllare la direzione e l’accensione del motore.

Il driver del motore è un ULN2004 e può essere a singolo integrato oppure connesso in un modulo come nello schema realizzato. LA tensione di alimentazione del ULN2004 è anch’essa a 5V con il pin 9 al positivo e il pin 8 alla massa. Il motore è connesso come da figura. La tensione di alimentazione al pin 9 dell’integrato ULN2004 può anche essere a più di 5V se il motore lo richiede, l’importante è avere una alimentazione separata per il microcontrollore e una per il driver e il motore.

Lo schema realizzato su breadboard è il seguente:


 

DOWNLOAD

Potete scaricare la simulazione del circuito con PROTEUS e il codice scritto e compilato con MIKROC al seguente LINK!!!



 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *