/* stepper.c * Programa exemplo para controlar um motor de passo unipolar de quatro fases * atraves da placa de interface PCL724. * O motor roda N passos para a frente e para tras ate que o utilizador * prima uma tecla. */
#include <conio.h> #include <dos.h>
/* * Registos da placa PCL724 */ #define BASE 0x20C #define PortA BASE #define PortB BASE+1 #define PortC BASE+2 #define CONFIG BASE+3
char roda(int stp, char currStp);
#define N 750
main(){ char posicao;
outportb(CONFIG, 0x80); do{ posicao= roda(N,0x01); posicao= roda(-N, posicao); } while(!kbhit());
}
char roda(int stp, char currStp){ /* * currStp - contem o padrao activo no motor de passo * stp - contem o numero de passos que se pretendem dar */ #define T 105 /* tempo entre passos para um arranque seguro */ #define DT 2 /* constante de aceleracao */
char directo[4]={0x01, 0x02, 0x04, 0x08}; char inverso[4]= {0x08, 0x04, 0x02, 0x01}; char i, t, *ptab; int stp1, stp2, stp3, passo;
/* Inicializa variaveis */
if(stp<0){ ptab=inverso; stp= -stp; } else ptab= directo;
/* procura indice correspondente a currStp */ for(i=0; ptab[i] != currStp; i++); i++; t=T;
/* calcula num_passos em cada fase */ if(stp>100) stp1= stp3= 50; else stp1= stp3= stp/2; stp2= stp-(stp1+stp3);
/* aceleracao */ for(passo=0; passo<stp1; passo++){ i &= 0x03; outportb(PortA, ptab[i++]); delay(t); t-=DT; }
/* full speed */ for( ; passo<stp1+stp2; passo++){ i &= 0x03; outportb(PortA, ptab[i++]); delay(t); }
/* desaceleracao */ for( ; passo<stp; passo++){ i &= 0x03; outportb(PortA, ptab[i++]); delay(t); t+=DT; }
return(ptab[--i]); }
/* Back */