Autor Tema: Encoder de 2 canales  (Leído 3679 veces)

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

Desconectado JJcorps

  • PIC12
  • **
  • Mensajes: 51
    • Proyectos de JJcorps
Encoder de 2 canales
« en: 05 de Octubre de 2007, 13:00:43 »
Hola!

He estao cacharreando con un encoder de 2 canales, los tipicos que tienen un canal desfasado 90º en un PIC 16F876 he conseguido echarlo a andar conectando un canal a la interrupcion externa de tal manera que cuando me interrumpe actualizo la cuenta de los pasos q ha dado y miro el sentido en el otro canal.

De esta manera no aprovecho toda la capacidad del encoder ya que con este tipo de encoder se puede sacar el doble o el cuadruple de pasos por canal.

En la imagen de arriba le sacan el doble de presicion atendiendo al cambio de estado en cualquier canal.  Y en la imagen de abajo sacan el cuadruple de presicion atendiendo al cada flanco ya sea del canal A o del canal B.

¿Mi pregunta es como conseguir la maxima precision? usando un pic claro  :P Aunque haya q usar alguna logica externa o algun otro chip.

Gracias
« Última modificación: 05 de Octubre de 2007, 16:04:35 por JJcorps »

Desconectado JJcorps

  • PIC12
  • **
  • Mensajes: 51
    • Proyectos de JJcorps
Re: Encoder de 2 canales
« Respuesta #1 en: 06 de Octubre de 2007, 06:50:41 »
Aqui os dejo el codigo que hice para la lectura del encoder en simple precision.
Código: [Seleccionar]
///////////////////////////////////////////
//    Lectura de Encoder de 2 canales    //
//          SIMPLE PRECISION             //
//                                       //
// Por: JJcorps                          //
///////////////////////////////////////////
#include <16F876.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

char BorraLCD=12;
int16 pasos=0;
int sentido=1;
#int_EXT
void  EXT_isr(void)
{
   
   if(input(PIN_B1))    //Miro el estado de el otro canal q me indica el sentido
   {
      sentido=1;
      pasos=pasos+1;
   }
   else
   {
      sentido=0;
      pasos=pasos-1;
   }
}



void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL);

   // TODO: USER CODE!!
   while(1)
   {
      printf("%cPasos: %Li\rSentido: ",BorraLCD,pasos);
      if(sentido==1)
         printf("derecha");
      else
         printf("izquierda");
      delay_ms(100);
     
   }
}

Un canal lo tengo conectado a la interrupcion externa y el otro canal lo tengo conectado al pin B1. La filosofia para saber el sentido del encoder es de la siguiente manera:

La interrupcion externa interrumpe por flanco de subida (creo, pero da igual) Si nos fijamos en la imagen de mi anterior post, los flancos de subida del canal A (mirando de izquierda a derecha) corresponden con el estado a nivel alto del canal B, y si nos fijamos ahora de derecha a izquierda corresponde con el nivel bajo del canal B. Ya  que asi funciona el encoder el problema del sentido esta resuelto.

Para saber lo que ha avanzado simplemente tenemos que contar los pulsos que da un canal.

Desconectado JJcorps

  • PIC12
  • **
  • Mensajes: 51
    • Proyectos de JJcorps
Re: Encoder de 2 canales
« Respuesta #2 en: 06 de Octubre de 2007, 07:15:18 »
Siguiendo en mis treces de intentar conseguir la maxima resolucion he optado por conectar los canales a los pines B6 y B7 del puerto B (el resto esta conectado a tierra) y en vez de usar la interrupcion externa uso la interrupcion del puerto B, pero sorprendentemente para mi no hace ninguna cuenta a pesar de la simpleza del codigo. Aqui os lo dejo por si me podeis echar una mano con el. Gracias de antemano.

Código: [Seleccionar]
#include <16F876.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use fast_io(b)

char BorraLCD=12;
unsigned int16 pasos=0;
#int_RB
void  RB_isr(void)
{
   pasos=pasos+1;
}


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   enable_interrupts(INT_RB);
   enable_interrupts(GLOBAL);
   SET_TRIS_B(0x00);
   // TODO: USER CODE!!
   while(1)
   {
      printf("%cPasos: %Lu",BorraLCD,pasos);
      delay_ms(100);
     
   }
}

He estado tentado en ponerlo en otro hilo distinto pero como es para el mismo tema he creido mejor postearlo aqui aunque me este pasando de posteos a mi mismo  :P


Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Encoder de 2 canales
« Respuesta #3 en: 06 de Octubre de 2007, 22:21:48 »
Hola JJcorps. Yo estoy siguiendo el tema en forma callada ya que no puedo aportar nada (porque no se), y no me parece correcto postear para nada. Ahora lo hago para alentarte y que sigas para adelante.

Saludos.  :-/ :-/
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado JJcorps

  • PIC12
  • **
  • Mensajes: 51
    • Proyectos de JJcorps
Re: Encoder de 2 canales
« Respuesta #4 en: 07 de Octubre de 2007, 05:49:53 »
Gracias por postear Leon Pic, esto se iva pareciendo a una bitacora mas que un foro. Todavia tengo mas cartuchos que gastar antes de darme por vencido en este tema conforme los vaya probando los ire posteando.

Desconectado Vayadespiste

  • PIC12
  • **
  • Mensajes: 53
Re: Encoder de 2 canales
« Respuesta #5 en: 07 de Octubre de 2007, 06:05:15 »
NO se si es la respuesta correcta o si la he entendido yo bien la cuestión pero el terminar con lo de "algún otro chip "...., ´¿has mirado la serie de pics 18F2331,2431, 4331, 4431; todos estos llevan incorporado en hardware un modulo de control QEI que funcionan a x4.

Un saludo

Desconectado JJcorps

  • PIC12
  • **
  • Mensajes: 51
    • Proyectos de JJcorps
Re: Encoder de 2 canales
« Respuesta #6 en: 07 de Octubre de 2007, 09:30:06 »
NO se si es la respuesta correcta o si la he entendido yo bien la cuestión pero el terminar con lo de "algún otro chip "...., ´¿has mirado la serie de pics 18F2331,2431, 4331, 4431; todos estos llevan incorporado en hardware un modulo de control QEI que funcionan a x4.

Un saludo

Mi idea final es hacer lectura de ese encoder y mandar los datos por USB al pc y usar los pic18 que van por usb, por desgracia ninguno de ellos tienen QEI por eso me puse con un 16f876 que tengo por ahi mientras me llegan los samples. Con lo de "algun otro chip" me referia a algun integrado que me resolviera la lectura de este encoder, pero claro esta que esto seria mi ultimo recurso prefiero aprender a controlar estos encoders.

Saludos