Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
Tota27

RESOLVIDO Motor de passo com mikroc

Recommended Posts

Eae pessoal beleza? Ainda sou iniciante em microcontroladores, então, fiz um projeto com motor de passo simples, mas queria implementar esse projeto travando o motor(1 dos fios acionados) quando o motor de por exemplo 20 passos na esquerda(S1) e travar, e só destravar quando apertar para direita(S2)... já tentei algumas coisas mas sem sucesso...

*

#define S1 PORTA.RA1
#define S2 PORTA.RA0
#define S3 PORTA.RA7
#define S4 PORTA.RA6

#define M1 PORTB.RB7
#define M2 PORTB.RB6
#define M3 PORTB.RB5
#define M4 PORTB.RB4

unsigned short sequencia = 0x00;
unsigned short motor[] = {0x10, 0x20, 0x40, 0x80};
unsigned short ii = 0;

void main()
{
 CMCON = 0x07; //desabilita comparadores
 TRISA = 0xFF; //ENTRADA
 TRISB = 0x00; //SAÍDA
 PORTA = 0x00; //INICIA EM NIVEL BAIXO
 PORTB = 0x00; //INICIA EM NIVEL BAIXO

       while(1)
       {
               if(S1)
               {
                     PORTB = motor[sequencia];
                     sequencia++;
                     delay_ms(10);
                     if(sequencia >= 4){sequencia = 0;}
               }
               
               if(S2)
               {
                     PORTB = motor[sequencia];
                     sequencia--;
                     delay_ms(10);
                     if(sequencia == 255){sequencia = 3;}
               }
       }//FIM while
}//FIM void main

E mais coisa teria como eu colocar algo assim sequencia*20 (motor der 20 passos)direto sem precisar colocar no while os 20 passos, isso seria uma correção de posição... Obg

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

algo como isso??
 

       while(1)
       {
ii=20;
        if(S1)
           {
           while(ii--)
             {
             PORTB = motor[sequencia];
             sequencia++;
             delay_ms(10);
             if(sequencia >= 4){sequencia = 0;}
             while(!S2);
             }
           }
 ii=20;             
        if(S2)
          {
          while(ii--)
             {
             PORTB = motor[sequencia];
             sequencia--;
             delay_ms(10);
             if(sequencia == 255){sequencia = 3;}
             while(!S1);
             }
           }
       }//FIM while

Não é nada bom deixar 1 fio do motor de passo acionado

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obg isadora, MAS ainda tm um problema, quando inicio,por ex: aperto S1 um pino fica aciona e trava e só funciona corretamente quando aperto o S2... quando inicio apertando S2 também....?????

Compartilhar este post


Link para o post
Compartilhar em outros sites

ops! acho que coloquei o while no lugar errado. sorry. vê isso...

ii=20;
        if(S1)
           {
           sequencia=0;
           while(ii--) //dá 20 passos
             {
             PORTB = motor[sequencia];
             sequencia++;
             delay_ms(10);
             if(sequencia > 3){sequencia = 0;}//acho melhor assim
             }
          PORTB=0;//desliga tudo
	      while(!S2); //e espera acionar S2
          }
 ii=20;             
        if(S2)
          {
          sequencia=3;
          while(ii--)
             {
             PORTB = motor[sequencia];
             sequencia--;
             delay_ms(10);
             if(sequencia >3){sequencia = 3;} //acho melhor assim
             }
		  PORTB=0;	
          while(!S1);//e espera acionar S1

Seria isso? Tenta a sorte. Mas sorte não te basta! Tenta entender o que está (estamos) fazendo! Colabora aí mano!

E agradeço a gentil mp kk

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

muito obg Isadora... Poderia me ajudar em mais uma coisa que para mim era simples... Mas quando fiz o laço for o motor não parou quando chegou a 20

while(1)
       {
       for(ii = 0; ii < 20; ii++)        //Isso vai servir para quando iniciar o programa o motor ira centralizar na posição escolhida
      {
             PORTB = motor[sequencia];
             sequencia++;
             delay_ms(100);
             if(sequencia >= 4){sequencia = 0;}
    
      }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

este laço 'for' está dentro do loop eterno e se for SÓ  ele não vai parar mesmo. Tente algo como:

while(1)
       {
       for(ii = 0; ii < 20; ii++)        //Isso vai servir para quando iniciar o programa o motor ira centralizar na posição escolhida
      {
             PORTB = motor[sequencia];
             sequencia++;
             delay_ms(100);
             if(sequencia >= 4){sequencia = 0;}
    
      }
      while(S1);while(!S1);//espera algum evento. No caso mudança de estado de S1
       }

Pra uma ajuda mais efetiva sugiro que publiques o real propósito do projeto bem como algum esquemático mas não sem antes obter algum progresso no projeto por si só.

Compartilhar este post


Link para o post
Compartilhar em outros sites

então isadora, meu proposito é fazer uma maquina de fumaça ficar girando, mas de um ponto A até um ponto B, no começo coloquei botões (muito obg pela ajuda) mas depois em outros posts vi um laço for....

Primeiro quando iniciar o motor gira para uma auto correção, na carcaça do meu motor de um PINO q trava o motor, mas quando trava o motor treme muito(estou tentando fazer algo mas até o momento nada)...se tiver alguma ideia muito obg :):) 

Compartilhar este post


Link para o post
Compartilhar em outros sites

auto correção você quer dizer ponto zero é isso? Neste caso hás de colocar um sensor de fim de curso algo como reed switch, sensor ótico ou algo do gênero no lugar o próximo onde está o tal PINO senão o trem treme mesmo uai! No seu sw hás de avaliar o status do reed. Algo como...

 

#define FIM_DE_CURSO RB0
...
//home
while (FIM_DE_CURSO) // ou início
			{
             PORTB = motor[sequencia];
             sequencia++;
             delay_ms(100);
             if(sequencia >= 4){sequencia = 0;}
       		}
//...continua

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo agradeço as mp´s. No entanto prefira prosseguir por aqui. Se quiser clique em @mencionar. O sistema do forum me notifica automaticamente ok?

 

Agora é um bom momento pra você mostrar seu esquemático. Sugiro também dar uma olhada nos conceitos de c e ter algum conhecimento mínimo de binários, lógica e afins. De fato - apesar de eu ter lustrado minha bola de cristal recentemente - estou com dificuldade em deduzir seu nível técnico.

 

"while(S1);while(!S1);// COMO USAR ESSE LAÇO SEM BOTÕES"(SIC)

De fato o laço acima faz isso

while(S1); //espera cair de um pra zero

while(!S1);//espera subir a um

Ou seja, espera uma transição

Perceba que que Sx não precisa ser botão. Eles são pinos do mc.  

Bem.... Esquema elétrico por gentileza. E o mais importante... já fez um pisca led com sucesso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×