Autor Tópico: PIC16f877A instavel  (Lida 2436 vezes)

Description:

0 Membros e 1 Visitante estão vendo este tópico.

Offline rprb

  • Novato
  • *
  • Posts: 17
  • Sexo: Masculino
  • GUIA CNC
PIC16f877A instavel
« Online: 09 de Maio de 2011, 16:32 »
Boas pessoal! mais uma vez preciso da vossa ajuda. Eu nem sei se é bem aqui que tenho de postar o problema porque nao sei se o problema é da PIC se é da electrónica  :confused:

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.

Código: [Selecionar]
#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-"); 
   }
}

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:PIC16f877A instavel
« Resposta #1 Online: 09 de Maio de 2011, 17:14 »
Como é seu nome?

Offline rprb

  • Novato
  • *
  • Posts: 17
  • Sexo: Masculino
  • GUIA CNC
Re:PIC16f877A instavel
« Resposta #2 Online: 09 de Maio de 2011, 17:18 »
Rui

Offline minilathe

  • How to ask questions - The Smart Way...
  • Moderadores
  • CNCMASTER
  • ******
  • Posts: 4295
  • Sexo: Masculino
  • http://science-lakes.com/article43-html.html
  • Cidade - UF: Rio de Janeiro - RJ
  • Nome:: Gil Pinheiro
  • Profissão: Engenheiro e professor universitário
Re:PIC16f877A instavel
« Resposta #3 Online: 09 de Maio de 2011, 17:53 »
Olá Rui,

É comum circuitos com microcontroladores apresentarem problemas de ruído, decorrente do acionamento de cargas indutivas (válvulas solenóide), relés mais parrudos, motores, etc. Para eliminar essa dúvida, aconselho a colocar leds, primeiramente no lugar dos motores e depois no lugar dos relés e ver se o RESET persiste.

Se for confirmado que o problema é ruído, vários aspectos devem ser considerados: usar capacitores nos circuitos de alimentação, inibir o RESET externo do PIC, melhorar o lay-out da placa de circuito impresso, separando parte de potência (saída para os motores) do PIC, colocar diodos supressores nos motores e nos relés, colocar capacitores em paralelo com os motores CC, ....

Offline rprb

  • Novato
  • *
  • Posts: 17
  • Sexo: Masculino
  • GUIA CNC
Re:PIC16f877A instavel
« Resposta #4 Online: 09 de Maio de 2011, 18:16 »
Obrigada. ta resolvido o assunto! coloquei os condensadores nas alimentações da PIC e funciona.

 

/** * */