Olá,
Esta aplicação trata-se de uma parte de um projeto o qual estou desenvolvendo.
Preciso deslocar o motor de passo bipolar acionado pelo L297 numa determinada quantia de passos a ser especificada por uma IHM.
O motor de passo tem uma resolução de 200 passos. A velocidade será sempre fixa e defini a frequência do clock para o driver em 1khz.
Em um primeiro momento estou apenas desenvolvendo a lógica de acionamento, pois a IHM já está pronta, depois é apenas endereçar as variáveis
adquiridas pela IHM na lógica do acionamento.
Analisando o código (compilador CCS) que postarei abaixo, percebe que se v for menor que q então o motor irá avançar no sentido horário uma volta a cada pulso de sensor, agora, se v for menor que q e maior que zero, ele deverá retroceder um volta a cada pulso de sensor, isso repete-se infinitamente.
O problema está quando simulo no proteus, ele até avança e retrocede mas não conforme a lógica.
float p, pn, v = 0;
#bit sens=porta.3 //deifine essa porta para o sensor
#bit sentido=portc.1 //define essa porta para o sentido de rotação do motor
#bit motora=portc.0 //define essa porta para o clock do motor
void main ()
{
q = 10; //dado de teste, futuramente inserido pela IHM
pn = 200; //dado de teste, futuramente inserido pela IHM
c=0;
v = 0;
p = 0;
sentido = 0;
while (1) // Laço infinito
{
IF (sens && v<q && sentido==0) //Se apertado sensor e se v maior que que e se o sentido for horário, então realiza o bloco
{
while (0<=p<=pn) { //Laço para o clock do motor de passo, faz ele "avançar" em uma frequencia de 1khz durante um valor estimado pela IHM (no caso pn)
v = v + 1/pn; //Incrementa um quando o laço chegar ao fim, fazendo com que o clock seja definido
p = p + 1;
motora = 0;
delay_us(500);
motora = 1;
delay_us(500);
break;
}
}
ELSE IF (sens && v==q && sentido==0) //Se sensor for pressionado e se v for igual a q e se sentido for igual horário, então realiza o bloco
{
sentido = 1; //Define o sentido de rotação para anti-horário
}
ELSE IF (sens && v>0 && sentido==1) //Se sensor for pressionado e se v for maior que zero e se sentido for igual a 1, então realiza o bloco
{
while (0<=p<pn) //Laço para o clock do motor de passo, faz ele "retroceder" em uma frequencia de 1khz durante um valor estimado pela IHM (no caso pn)
{
v = v - 1/200; //Decrementa 1 quando o laço chegar ao fim
p = p - 1; //Decrementa um a cada iteração, fazendo com que o clock seja definido.
motora = 0;
delay_us(500);
motora = 1;
delay_us(500);
break;
}
}
ELSE IF (sens && sentido==1 && v/200==0) //Se sensor for pressionado e se v for igual a q e se sentido for igual horário, então realiza o bloco
{
sentido =0; //Define o sentido de rotação para horário
}
}
fim:
;
}