Jump to content
rprb

PIC16f877A instavel

Recommended Posts

rprb

Boas pessoal! mais uma vez preciso da vossa ajuda.  :thumbsup:

Bem é o seguinte. Tenho um projecto que o objectivo é movimentar uma grua. Para isso utilizo motores de passo e um motor continuo (para fazer descer e subir um objecto). os motores de passo são alimentados a 24V e o motor continuo a 3V e a PIC a 5V, logo tenho 3 fontes para isso. mas agora estou aqui com uma problema que não me deixa fazer nada, quando estou a trabalhar com a grua a PIC reinicia. tenho todas as massas interligadas, também tenho no circuito dois reles que fazes a inversão de sentido do motor continuo. Alguém tem alguma ideia do que possa provocar isto?

Deixo aqui o código da PIC pode ajudar.

#include <16f877A.h>
#fuses XT, NOWDT, NOPROTECT, PUT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use FAST_IO(A)                                            // portA sob meu controle 
#use FAST_IO(B)                                            // portB sob meu controle 
#use FAST_IO(C)                                            // portC sob meu controle 
#use FAST_IO(D)                                            // portD sob meu controle 
#use FAST_IO(E)                                            // portE sob meu controle 

#byte    porta = 5                                         // endereco do port a 
#byte    portb = 6                                         // endereco do port b
#byte    portc = 7                                         // endereco do port c 
#byte    portd = 8                                         // endereco do port d 
#byte    porte = 9                                         // endereco do port e 

char rcv_pc;
char motor1[] = {0b00000001, 0b00000010, 0b00000100, 0b00001000};
char motor2[] = {0b00000001, 0b00000010, 0b00000100, 0b00001000};

int ct_motor1 = -1;
int ct_motor2 = -1;
int estado_subir=0;
int estado_descer=0;

void motors(char passo);
int posicao_rotacao();
int posicao_curso();
void iman();


void main()
{
   set_tris_a(0b00000000);
   set_tris_b(0b00000000);
   set_tris_c(0b10000000);
   set_tris_d(0b00000000);
   set_tris_e(0b00000000);

   printf("Comunicacao RS232 com exito");
   
   porta = 0b00000000;
   portb = 0b00000000;
   portd = 0b00000000;
   porte = 0b00000000;
   
   while(true)
   {
      rcv_pc = getchar();
      
      if(rcv_pc == 'c')
      {
         iman();
      }
      else if(rcv_pc == 'r')
      {
         reset_cpu();
      }
      else
      {
         motors(rcv_pc);
      }
     
   }
}

void motors(char passo)
{
   switch(passo)
   {
   case 'q':   //motor principal andar para a esquerda
      {         
         if(ct_motor1 == 3)
            ct_motor1 = -1;
         
         ++ct_motor1;
         
         portb = motor1[ct_motor1];
         printf("-rodouP-");
         //delay_ms(20);
         break;
      }
   case 'w':   //motor principal andar para a direita
      {     
         if(ct_motor1 == 0 || ct_motor1 == -1)
            ct_motor1 = 4;
            
         --ct_motor1;
         
         portb = motor1[ct_motor1];
         printf("-rodouP-");
         //delay_ms(20);
         break;
      }
   case 'a':   //motor secundario andar para a traz
      {
         if(posicao_curso() != 1)
         {
            if(ct_motor2 == 0 || ct_motor2 == -1)
               ct_motor2 = 4;
               
            --ct_motor2;
            
            porta = motor2[ct_motor2];
            printf("-rodouS-");
            
            //delay_ms(20);
         }
         break;
      }
   case 's':   //motor secundario andar para a frente
      {
         if(posicao_curso() != 2)
         {
            if(ct_motor2 == 3)
               ct_motor2 = -1;
            
            ++ct_motor2;
            
            porta = motor2[ct_motor2];
            printf("-rodouS-");
            
            //delay_ms(20);
         }
         break;
      }
   case 'e':   //motor terceario andar para a cima
      {
         if(input(PIN_E1)==0)
         {
            if(estado_subir == 0)
            {
               output_high(PIN_E0);
               estado_subir = 1;
               printf("subir ON ");
            }
            else
            {
               output_low(PIN_E0);
               estado_subir = 0;
               printf("subir OFF ");
            }
         }
         else
            printf("descer ON ");
         
         break;
      }
   case 'd':   //motor terceario andar para a baixo
      {
         if(input(PIN_E0)==0)
         {
            if(estado_descer == 0)
            {
               output_high(PIN_E1);
               estado_descer = 1;
               printf("descer ON ");
            }
            else
            {
               output_low(PIN_E1);
               estado_descer = 0;
               printf("descer OFF ");
            }
         }
         else
            printf("subir ON ");
         
         break;
      }
   }
}

int posicao_rotacao()
{
   if(input(PIN_D0) == 1)
   {
      printf("-0-");
      //delay_ms(10);
      return 1;
   }
   else if(input(PIN_D2) == 1)
   {
      printf("-90-");
      //delay_ms(10);
      return 1;
   }
   else if(input(PIN_D3) == 1)
   {
      printf("-180-");
      //delay_ms(10);
      return 1;
   }
   else if(input(PIN_D4) == 1)
   {
      printf("-270-");
      //delay_ms(10);
      return 1;
   }
   else
      return 0;
}

int posicao_curso()
{
   if(input(PIN_D5) == 1)
   {
      printf("-traz-");
      //delay_ms(10);
      return 1;
   }
   else if(input(PIN_D6) == 1)
   {
      printf("-frente-");
      //delay_ms(10);
      return 2;
   }
   else
   {
      return 0;
   } 
}

void iman()
{
   if(input(PIN_E2))
   {
      output_low(PIN_E2);
      printf("-iman OFF-"); 
   }
   else
   {
      output_high(PIN_E2);
      printf("-iman ON-");  
   }
}

Share this post


Link to post
Share on other sites
asena

Ruido. Dos motores e a entrar em tudo o que é electrónica.

# o GND está ligado em estrela, onde o ponto central é a fonte de alimentação ?

# os pinos de alimentação do PIC têem um condensador de 100nF lá encavalitado ?

# o pino de RESET tem um filtro RC ?

# os relés têem díodos aos terminais da bobina ?

# uns condensadores de 1nF aos terminais dos motores ajudam...

# as alimentações são separadas ou provêem da mesma e usam LDOs para baixar a tensão ?  filtros LC ou RLC podem ajudar...

# fios pelo ar captam a ruideira toda

# os pinos de entrada/saida pode ser protegidos com malha filtro RC

# ... e por aí fora...

Não olhei para o código. Bastou dizer que o PIC está sempre a fazer RESET.

Share this post


Link to post
Share on other sites
rprb

Eu sou muito novato em electrónica por isso so tenho mesmo o básico - fios :thumbsup:

O que é GND em estrela?

a alimentação da PIC não tem condensadores;

O que é um Filtro RC? eu so tenho um switch no pino de RESET;

os reles tem sim diodos.

como meto os condensadores nos terminais do motor?

a alimentação são separadas. antes tinha os 5V e 3V da mesma alimentação (Uma fonte de alimentação de um computador)

nao tenho fios pelos ares :(

e nao tenho malha filto RC

Share this post


Link to post
Share on other sites
rprb

Obrigado pessoal! esta resolvido! coloquei o condensador nas alimentações da PIC e esta a funcionar! Obrigada  :thumbsup:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.