/* 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 */