Autor Tema: detector de cambio de giro  (Leído 2441 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado fopy

  • PIC10
  • *
  • Mensajes: 35
detector de cambio de giro
« en: 24 de Diciembre de 2003, 04:55:00 »
Otra vez yo, esta vez los molesto para saber si a alguien se le ocurre como hacer un detector de cambio de giro para un cuentavueltas.

Mi idea hasta ahora es colocar 2 optocopladores, en un disco ranurado de manera que las señales obtenidas serian:

a izquierda:

opto 1

_____---------------______________

opto 2

__________----------------_________

y a la derecha

opto 1

__________----------------_________


opto 2


_____---------------_______________

hasta ahi todo bien

este es el codigo (CCS)

 while(1)
            {
            dato=INPORT_A();   //lectura completa
             opto_1=dato&1;    //pata 1 de PORTA
             opto_2=dato&2;    //pata 2 de PORTA

             if(opto_1&&!opto_2)              //giro izq
               {
                  while(opto_1)
                  {
                    dato=INPORT_A();   //lectura completa
                    opto_1=dato&1;    //pata 1 de PORTA
                    opto_2=dato&2;    //pata 2 de PORTA
                    if(opto_2)
                       {
                        contador++;
                         break();
                         }
                    }
                 }
             if(opto_2&&!opto_1)              //giro der
                {
                 while(opto_2)
                  {
                    dato=INPORT_A();   //lectura completa
                    opto_1=dato&1;    //pata 1 de PORTA
                    opto_2=dato&2;    //pata 2 de PORTA
                    if(opto_1)
                       {
                        contador--;
                         break();
                         }
                    }
                 }            

              }

bueno pero todo esto produce rebotes, que puedo hacer

gracias!!!

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: detector de cambio de giro
« Respuesta #1 en: 24 de Diciembre de 2003, 09:30:00 »
los amigos de ccs ya lo hizieron


/////////////////////////////////////////////////////////////////////////
////                          EX_ENCODE.C                            ////
////                                                                 ////
////  This program connects to a 2 bit optical encoder.  The encoder ////
////  input is on pins A0 and A1.  A number is input on port B.      ////
////  The software will output a square wave on pin A3 representing  ////
////  the encoder RPM divided by the number on port B.  If there     ////
////  is an error from the encoder pin A2 is made high.              ////
////                                                                 ////
////  This example will work with the PCB, PCM and PCH compilers.    ////
////  The following conditional compilation lines are used to        ////
////  include a valid device for each compiler.  Change the device,  ////
////  clock and RS232 pins for your hardware if needed.              ////
/////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services         ////
//// This source code may only be used by licensed users of the CCS  ////
//// C compiler.  This source code may only be distributed to other  ////
//// licensed users of the CCS C compiler.  No other use,            ////
//// reproduction or distribution is permitted without written       ////
//// permission.  Derivative programs created using this software    ////
//// in object code form are not restricted in any way.              ////
/////////////////////////////////////////////////////////////////////////


#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 1

#elif defined(__PCB__)
#include <16c56.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A3, rcv=PIN_A2)  // Jumpers: 11 to 17, 12 to 18

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)  // Jumpers: 8 to 11, 7 to 12
#endif

byte const sequence[4] = {0,2,3,1};
byte seq_index;
byte error_count;

void resync() {
   int value;

   if(error_count==4)
      output_high(pin_a2);
   else
     error_count++;

   value=input_a() & 3;
   if(value==sequence[0])
     seq_index=0;
   else if (value==sequence[1])
     seq_index=1;
   else if (value==sequence[2])
     seq_index=2;
   else if (value==sequence[3])
     seq_index=3;
}

void main() {
   short output;
   long  count,max_count;

   error_count=0;
   resync();

   do {
      while((input_a() & 3)==sequence[seq_index]) ;
      seq_index=(seq_index+1)&3;
      if ((input_a() & 3)!=sequence[seq_index])
        resync();
      else {
         if(error_count==0)
           output_low(pin_a2);
         else
           --error_count;
         max_count=input_b()>>2;
         count++;
         if(count>max_count) {
           output=!output;
           output_bit(pin_a3,output);
           count=0;
         }
      }
   } while (true);
}


Desconectado fopy

  • PIC10
  • *
  • Mensajes: 35
RE: detector de cambio de giro
« Respuesta #2 en: 24 de Diciembre de 2003, 10:23:00 »
muchas gracias lo voy a probar,

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: detector de cambio de giro
« Respuesta #3 en: 10 de Enero de 2004, 12:15:00 »
estoy usando uno en mi proyecto conectado a rbo y rb1 usando la int ext.

va de lujo:

//interrupcion de PIN_B0
#INT_EXT
void ext_isr() {
  delay_ms(5);             // reatrdo

   if( input(PIN_B1)==input(PIN_B0))        // si las dos entradas son iguales se esta girando a la derecha
   {
      cuenta+=1;
      printf(lcd_putc,"f%X",cuenta);
   }
   else                       // si no a la izquierda
   {
      cuenta-=1;
      printf(lcd_putc,"f%X",cuenta);    

   }
   if(input(PIN_B0))         // cambiamos la interrupcion
       ext_int_edge(H_TO_L);    
       else
      ext_int_edge(L_TO_H);  
   delay_ms(10);             // retardo antirrebotes
}


creo que te puede ser util.

Desconectado fopy

  • PIC10
  • *
  • Mensajes: 35
RE: detector de cambio de giro
« Respuesta #4 en: 11 de Febrero de 2004, 12:11:00 »
Muchas gracias por sus rtas. Pero ya lo acomode con el prog que estaba haciendo, claro que tuve en cuenta alguna de sus sugerencias.

Muchas gracias, lo unico que me esta causando algunos problemas son unos delay_ms(10) que puse para darle cierta persistencia a los displays, pero me retrasan toda la cuenta, escucho sugerencias!!!

Muchas gracias de nuevo!

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: detector de cambio de giro
« Respuesta #5 en: 11 de Febrero de 2004, 13:08:00 »
bueno ya sabes que las interrupciones deben ser lo mas rapidas posibles y un delay dentro te jode el invento

prueba de esta forma:

lo que debes hacer es usar un int para el encoder y usar la interrupcion del timer para refresca los datos en la pantalla cada 200 o 300 milisegundos
#INT_EXT
ext()
{

  if( input(PIN_B1)==input(PIN_B0)) // si las dos entradas son iguales se esta girando a la derecha
      dcha=1;
   else                       // si no a la izquierda
   dcha=0;
variable+=dcha
}

de esta forma tienes el sentido de giro y la suma en tu variable..

saludos