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