quinta-feira, 30 de novembro de 2017

Girando motor de passo unipolar nos dois sentidos

     Olá, pessoal que acompanha o blog,para hoje temos uma postagem feita pelo nosso colaborador Renato Lôbo, que consiste em controlar um motor com o pic 12F675, neste projeto o motor de passo funcionará com  uma velocidade de 20 rpm.Projeto feito usado o compilador CCS.
O código fonte:

////////////////////////////////////////////////////////////////////////////////
// Projeto: Girando motor de passo unipolar (28byj-48) nos dois sentidos. //
// Nome: Renato Lôbo Rodrigues                                                //
// Data: 29/11/17                                                             //
// Email: lobosoft@oi.com.br                                                  //
////////////////////////////////////////////////////////////////////////////////

//http://giocarduino.altervista.org/e19-motore-passo-passo.pdf

//dois botões pulsadores no pino 3 e 4 do pic e GND
//0 pino 4 do pic (A3) deve ter um resistor de pull-up 

//pino 7 do pic em 1N1 da placa que acompanha o motor 28byj-48 
//pino 6 do pic em 1N2
//pino 5 do pic em 1N3
//pino 2 do pic em 1N4

//GND em - da placa
//12V em + da placa

//Configuração PIC
#include <12f675.h> 
//inicializando os fusiveis
#fuses INTRC_IO, NOMCLR, NOWDT,PROTECT,PUT,BROWNOUT,CPD
#use delay(clock=4Mhz)        //clock interno de 4mhz                 

#byte tris_portA     = 0x85   //sentido dos pinos do portA

#bit bot1= 0x05.3             //botão sentido horario
#bit bot2= 0x05.4             //botão sentido anti-horario


#bit bob_A1 = 0x05.0          //terminais do motor de passo bobina A e B
#bit bob_A2 = 0x05.1          //
#bit bob_B1 = 0x05.2          //
#bit bob_B2 = 0x05.5          //
                              //se 5 fios lique o center type no GND
                              //se 6 fios ligue os dois center type no GND

int1 roda = false;            //iniciando a variaval roda como falsa
int1 dir  = false;            //iniciando a variaval dir como falsa

int8 pulso =0;                //iniciando a pulso com zero

void motor(int8 num) //configuração de giro do motor em 0.5 passo
{
   switch(num)
   {
      case 0:  bob_A1=1;
               bob_A2=0;
               bob_B1=0;
               bob_B2=0;   
               break;
      case 1:  bob_A1=1;
               bob_A2=1;
               bob_B1=0;
               bob_B2=0;   
               break;
      case 2:  bob_A1=0;
               bob_A2=1;
               bob_B1=0;
               bob_B2=0;   
               break;
      case 3:  bob_A1=0;
               bob_A2=1;
               bob_B1=1;
               bob_B2=0;   
               break;
      case 4:  bob_A1=0;
               bob_A2=0;
               bob_B1=1;
               bob_B2=0;   
               break; 
      case 5:  bob_A1=0;
               bob_A2=0;
               bob_B1=1;
               bob_B2=1;   
               break;               
      case 6:  bob_A1=0;
               bob_A2=0;
               bob_B1=0;
               bob_B2=1;   
               break;
      case 7:  bob_A1=1;
               bob_A2=0;
               bob_B1=0;
               bob_B2=1;   
               break;
      case 8:  bob_A1=0;      //motor desligado
               bob_A2=0;
               bob_B1=0;
               bob_B2=0;   
               break;
   }
}

#int_timer1
void rotina_t1()              //na frenquência de 1khz esse motor gira a 20 rpm 
{
   if(roda)
   {   
      if(dir)
      {
         if(pulso < 7)pulso++;else pulso=0;  //gira anti-horário 
      }else{
         if(pulso > 0)pulso--;else pulso=7;  //gira horário
      }
      motor(pulso);                          //gira 0.5 passo a cada chamada
      roda=false;                            //avisa que terminou 0 0.5 passo
   }
   else
   {
      motor(8);
   }
   set_timer1(64536 + get_timer1());         //preset de contagem do timer1
}



void main ()
{            
   int1 st1 = false,st2 = false;             //status do botão
   
   setup_comparator(NC_NC_NC_NC);            //comparadores desligados
   setup_vref(FALSE);                        //sem valor de referencia
   port_a_pullups(0b00010000);               //pull-up para pino A3
   tris_portA=0b11011000;                    //entrada e saidos dos pinos
   
   bob_A1=0;                                 //todos pinos do motor inicia em zero
   bob_A2=0;
   bob_B1=0;
   bob_B2=0;    
   
   // Timer1 para estouro a cada 1 ms.(Frequência do Ocilador 4Mhz)
   enable_interrupts(global);
   setup_timer_1(t1_internal | t1_div_by_1);
   Enable_interrupts(int_timer1);
   set_timer1(64536);

   while (TRUE)
   {
      if(!roda)
      {
         if( bot1) st1 = false;               
         if(!bot1 && !st1)                   //gira horário 
         {
            dir=false;
            roda=true;
         }
         if( bot2) st2 = false;
         if(!bot2 && !st2)                   //gira anti-horário
         {
            dir=true;
            roda = true;
         }
      }
   }
}

Obrigado a todos. até a próxima!


Nenhum comentário :

Postar um comentário

olá,digite aqui seu comentário!