|
Stepper motor con Micro-gt |
|
Progetto numero 10
progetto |
autore |
|
note |
Funzionamento steppermotor con Micro-gt e PIC 16f877a |
Daniele Scaranaro |
daneel16@gmail.com |
Linguaggio C, compilatore HITECH-MICROCHIP, microcontrollore 16F877A |
Premessa
I motori detti 'STEP' o, in italiano, motori 'PASSO-PASSO' vengono impiegati per azionamenti di precisione come macchine a controllo numerico, stampanti, pantografi, frese, distributori automatici e molto altro.
Il loro funzionamento è ben visibile in questa animazione (figura1):
figura 1
Anche se molto semplificato, si può notare come il movimento sia generato modificando la polarità degli avvolgimenti presenti nello statore.
Per tale motivo i lati degli avvolgimenti vengono marcati come A e A negato e B e Bnegato (nell'esempio usa X e Y ma è lo stesso).
Creiamo una tabella dove inseriamo sulle colonne i nomi dei lati avvolgimenti e mettiamo il numero '1' dove viene collegata la +Vcc e zero dove colleghiamo la massa, è facile intuire come il motore possa venire pilotato dalla ripetizione di una 'MATRICE BINARIA' (la tabella in figura è esplicativa)
Schema elettrico con descrizione
figura 2
Nella realizzazione ho utilizzato la scheda Micro-gt che monta a bordo un integrato chiamato L298 che si occupa di pilotare il motore ricevendo la 'MATRICE DI PASSO' in ingresso.
Notate nello schema ,in figura2, l'integrato L298 che riceve i 4 bit in ingresso tramite i dip-switch S14 e pilota il motore sui connettori X4-1e2 e X5-1-2 .
figura 3
-----------------------------------------------------------------------------------
figura 4
Ho collegato 8 pulsanti al PORTB per comandare l'esecuzione della matrice di passo a varie velocità figura 5
figura 5
Le 4 uscite del PORTD cioè RD0,RD1,RD2,RD3 tramite un cavetto sono state portate all'ingresso del dip-switch S14 di figura2.
Ecco il sorgente in C:
/**********************************************************************
* STEPPER MOTOR WITH Micro-GT *
* 07/07/2012 *
*hardware Micro-GT versatile IDE->L298 integrated module *
* PIC16F877A *
* MpLab 8.60 compiler Hitech C16 *
* performed by SCARANARO DANIELE *
* assistente al corso ZIP edizione 2012 *
***********************************************************************/
#define _LEGACY_HEADERS
#include <pic.h>
#include "delay.h"
#include "settaggi.h"
#define stepper PORTD
void main (){ //start main function body
settaggi();
while(1){
if(RB0==0 && RB1==1 && RB2==1 && RB3==1 && RB4==1 && RB5==1 && RB6==1 &&
RB7==1){
stepper =10;
DelayMs(3);
stepper =6;
DelayMs(3);
stepper =5;
DelayMs(3);
stepper =9;
DelayMs(3);
}
if(RB0==1 && RB1==0 && RB2==1 && RB3==1 && RB4==1 && RB5==1 && RB6==1 &&
RB7==1){
stepper =9;
DelayMs(3);
stepper =5;
DelayMs(3);
stepper =6;
DelayMs(3);
stepper =10;
DelayMs(3);
}
/******************low speed 1************************/
if(RB0==1 && RB1==1 && RB2==0 && RB3==1 && RB4==1 && RB5==1 && RB6==1 &&
RB7==1){
stepper =9;
DelayMs(6);
stepper =5;
DelayMs(6);
stepper =6;
DelayMs(6);
stepper =10;
DelayMs(6);
}
/******************low speed 2************************/
if(RB0==1 && RB1==1 && RB2==1 && RB3==0 && RB4==1 && RB5==1 && RB6==1 &&
RB7==1){
stepper =9;
DelayMs(10);
stepper =5;
DelayMs(10);
stepper =6;
DelayMs(10);
stepper =10;
DelayMs(10);
}
/******************low speed 3************************/
if(RB0==1 && RB1==1 && RB2==1 && RB3==1 && RB4==0 && RB5==1 && RB6==1 &&
RB7==1){
stepper =9;//step matrix 1010
DelayMs(20);
stepper =5;
DelayMs(20);
stepper =6;
DelayMs(20);
stepper =10;
DelayMs(20);
}
/******************low speed 4************************/
if(RB0==1 && RB1==1 && RB2==1 && RB3==1 && RB4==1 && RB5==0 && RB6==1 &&
RB7==1){
stepper =9;
DelayMs(30);
stepper =5;
DelayMs(30);
stepper =6;
DelayMs(30);
stepper =10;
DelayMs(30);
}
/******************low speed 5************************/
if(RB0==1 && RB1==1 && RB2==1 && RB3==1 && RB4==1 && RB5==1 && RB6==0 &&
RB7==1){
stepper =9;
DelayMs(60);
stepper =5;
DelayMs(60);
stepper =6;
DelayMs(60);
stepper =10;
DelayMs(60);
}
/*******block motor*******************************/
if(RB0==1 && RB1==1 && RB2==1 && RB3==1 && RB4==1 && RB5==1 && RB6==1 &&
RB7==0){
stepper =9;
}
else{
stepper=0;
}
}
}
download programma in HITEC C16
Potete notare che alle uscite PORTD ho assegnato un 'alias' in parole povere un nome mnemonico che renda più facile lo scrivere il programma.
Si nota che per far girare il motore basata mandare alle uscite PORTD (stepper) una serie di numeri che si ripetono.
La velocità di ripetizione di questi numeri regola la velocità del motore, nel nostro esempio sono stati mandati alle uscite del pic i numeri 9,5,6,10 che in binario sono:
9 = 1001
5 = 0101
6= 0110
10= 1010
E adesso piccola domanda per vedere se avete compreso il funzionamento del motore passo-passo.......se invece di ripetere la serie di numeri 9,5,6,10 mettessi un numero fisso?
Ovvio.....il motore resta fermo con il rotore bloccato, e questo è uno dei vantaggi di questo tipo di azionamento.
Nel codice, il pulsante RB7 fa proprio il blocco motore, mettendo il numero 9 (1001) alle uscite.
Il filmato del funzionamento lo trovate qui:
http://www.youtube.com/watch?v=s49aBz7C5iw&feature=youtu.be
Questo progetto è ridistribuibile secondo i termini di licenzaCreative Commons Attribuzione-Condividi allo stesso modo 3.0 Italia
Note aggiuntive
Questo argomento e' stato trattato durante il corso do programmazione dei Microcontroolori PIC tenutosi a Padova tra giugno e luglio 2012 in cui Daniele Scaranaro ha svolto le funzioni di assistente.
di Marco Gottardo.
Buon divertimento e buon lavoro.
Ing. Marco Gottardo as ad.noctis