Ir ao conteúdo
  • Cadastre-se

Motor de passo com mikroc


Ir à solução Resolvido por .if,

Posts recomendados

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

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
  • Solução

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
Link para o comentário
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;}
    
      }

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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ó.

Link para o comentário
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 :):) 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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?

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...