Autor Tema: encoder rotativo  (Leído 6283 veces)

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

Desconectado socket83

  • PIC10
  • *
  • Mensajes: 6
encoder rotativo
« en: 17 de Enero de 2011, 06:24:14 »
Muy Buenas,

Soy nuevo en esto de programacion y necesito saber con cual comando de basic puedo ejecutar el siguiente proceso.
Primero os explico el proyecto.
Se trata de un encoder rotativo el cual tiene 3 patitas, una para gnd y las otras dos las de señal, si le añado dos leds a las salidas el resultado es que si giro hacia la derecha me da una secuencia de: ledA=0, ledB=0 / ledA=0, ledB=1 / ledA=1, ledB=1 / ledA=1, ledB=0. Entonces lo que quiero consegir es que cuando se cumpla esa secuencia en el pic aparezca un "1" en la salida (p ej en RB0) y si giro el decoder para la izquierda (que logicamente es una secuencia distinta) aparezca un "1" en otra salida distinta a la de antes (p ej. en RB1).
Lo que realmente necesito en el codigo fuente en HEX para programarlo ya, por si hay alguno ya hecho, pero si no hay pues tendre que intentar programarlo en basic (que es mas facil) pero necesito saber que comando sirve para que esas secuncia se cumplan por ejemplo:

Cuando.....

PORTA.0 (comando secuencia) 00011110 (en el) PORTB.0 = 1
PORTA.1 (comando secuencia) 01001011 (en el) PORTB.1 = 1

No se como seria, igual es algo como eso...

Bueno, muchas gracias por la atencion y un gran saludo!!

Nacho

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: encoder rotativo
« Respuesta #1 en: 17 de Enero de 2011, 07:00:05 »
Algo como esto:

Alldigital
IF RA.0 = 1 AND RA.1 = 0 AND ...... THEN RB.0 = 1
.
.
.
Saludos desde Granada, España.

Desconectado socket83

  • PIC10
  • *
  • Mensajes: 6
Re: encoder rotativo
« Respuesta #2 en: 17 de Enero de 2011, 15:38:02 »
ante todo gracias por la respuesta,  e hecho una prueba pero no a dado resultado
Creeis que seria una cosa asi???:

AllDigital

TRISA = %11111111
TRISB = %00000000


inicio:

If PORTA.0 = 0 And PORTA.1 = 0 And PORTA.0 = 0 And PORTA.1 = 1 Then PORTB.0 = 1
If PORTA.0 = 1 And PORTA.1 = 1 And PORTA.0 = 1 And PORTA.1 = 0 Then PORTB.0 = 1
If PORTA.0 = 0 And PORTA.1 = 0 And PORTA.0 = 1 And PORTA.1 = 0 Then PORTB.1 = 1
If PORTA.0 = 1 And PORTA.1 = 1 And PORTA.0 = 0 And PORTA.1 = 1 Then PORTB.1 = 1

WaitMs 100

Low PORTB.0
Low PORTB.1

Goto inicio

End           

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 229
Re: encoder rotativo
« Respuesta #3 en: 17 de Enero de 2011, 19:02:52 »
Hola socket, yo tenia el mismo problema, estaba haciendo algo parecido para USB, cuando giro para un lado activaba un boton, cuando giro para otro lado, otro boton, y tenia fallas, a veces me detectaba pulso y otras no, o algunas veces hacia 2 para un lado y otro para otro lado, lo solucione buscando en google "encoder pic" y me baje varios documentos, entre esos el que te adjunto, la solucion es tratar las 2 entradas como si fueran un codigo GRAY, con ello puedes eliminar errores, despues de implementar eso las fallas desaparecieron y anda de maravillas, espero te sirva.

Saludos.
Alejandro.

Desconectado socket83

  • PIC10
  • *
  • Mensajes: 6
Re: encoder rotativo
« Respuesta #4 en: 18 de Enero de 2011, 10:41:19 »
muchas gracias ale!! mira que yo e buscado y buscado por la red sin exito, la verdad es que a mi lo que me interesa son los pulsadores. tengo un sintetizador que para recorrer por el menu utiliza dos pulsadores (up, down) y quisiera sustituirlo por un encoder rotativo, entondes seria a la derecha = up y a la izquierda = down, con el pdf que me muestras se podria sacar algo asi? abria que modificar el codigo pero ese lenguaje  no lo conozco, bueno, solo conozco basic y apenas.

saluudos!!

Desconectado ALE1973

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 229
Re: encoder rotativo
« Respuesta #5 en: 18 de Enero de 2011, 10:53:52 »
Socket, el documento esta en un asm de parallax creo, yo tampoco lo conozco bien, pero es muy parecido al asm de microchip, es bastante intuitivo, pero lo que interesa es lo que dice el texto mas que el codigo, basicamente hace esto.

Toma el valor del puerto y le hace un and con 0b00000011 o sea le interesan los 2 primeros bits
luego compara ese valor con el guardado el ciclo anterior
si es distinto, quiere decir que el encoder se movio, entonces analiza si fue para a derecha o izq
y guarda el valor actual leido del puerto como el valor a comparar en el ciclo siguiente.

si lees el pdf te vas a dar cuenta, es simple.

Saludos.
Cualquier duda, consulta...

Alejandro.

Desconectado Moyin

  • PIC16
  • ***
  • Mensajes: 102
Re: encoder rotativo
« Respuesta #6 en: 18 de Enero de 2011, 12:49:27 »
Hola socket, mira hace tiempo relizé un programa en Mikrobasic para trabajar con un encoder y que me pudiera arrojar el sentido de giro así como las revoluciones que da una posible flecha a la que se acopla el encoder, esta aplicación fué solo un ejercicio que hice pero que no tenía en su momento algun uso específico, espero te pueda servir de referencia.

Saludos
Código: [Seleccionar]
program Encoder
rem programa para trabajo con encoder optico incremental salida en cuadratura
'Entrada A y B que representan las señales de salida del encoder

symbol VA = porta.0       'Alias designados para cad pin entrada del PortA
symbol VB = porta.1
symbol Sent = porta.2

dim E as byte
dim conta,vuelta as byte
dim msj1,msj2 as char[8]

dim salida1 as string[3]
dim salida2 as string[3]

sub procedure  sentido    'Rutina que imprime en el LCD sentido de giro
 if sent=1 then
    lcd_out(2,10,msj1)
 end if
    if sent=0 then
       lcd_out(2,10,msj2)
    end if
end sub

main:
adcon1=7
TRISA=3
TRISB=0
TRISC=0
conta=0
E=0
msj1="Der >>>"
msj2="Izq <<<"
vuelta=0
     Lcd_Init(PORTB)                  'Initializa LCD en PORTB
     Lcd_Cmd(Lcd_CURSOR_OFF)          'Cursor apagado
     lcd_out(1,1,"*Encoder optico*")
     Lcd_out(2,1," Incremental V1")
     delay_ms(300)
     Lcd_Cmd(Lcd_Clear)


Inicio:
      If (E=2) and ((VA=1) and (VB=1)) then
          E=3
          sent=1
          sentido
          inc(conta)
      end if

            If (E=2) and ((VA=0) and (VB=0)) then
                E=0
                sent=0
                sentido
                dec(conta)
            end if

      If (E=3) and ((VA=1) and (VB=0)) then
          E=1
          sent=1
          sentido
          inc(conta)
      end if
     
            If (E=3) and ((VA=0) and (VB=1)) then
               E=2
               sent=0
               sentido
               dec(conta)
            end if

      If (E=1) and ((VA=0) and (VB=0)) then
          E=0
          sent=1
          sentido
          inc(conta)
      end if
     
             If (E=1) and ((VA=1) and (VB=1)) then
               E=3
               sent=0
               sentido
               dec(conta)
             end if

      If (E=0) and ((VA=0) and (VB=1)) then
          E=2
          sent=1
          sentido
          inc(conta)
      end if
     
             If (E=0) and ((VA=1) and (VB=0)) then
               E=1
               sent=0
               sentido
               dec(conta)
             end if
             
rem **Verifica si se cumplió el número de pulsos para alcanzar una revolución**
 if conta=15 then
    vuelta=vuelta + 1
    conta=0
 end if

rem *****Preparación de salida al LCD******
   ByteToStr(conta, salida1)      'Convierte variables byte a string
   ByteToStr(vuelta, salida2)
   Lcd_Out(1, 1, salida1)         'Imprime número de pulsos recibidos
   Lcd_Out(2, 1, salida2)         'Imprime número de giros realizados
   Lcd_Out(2, 5, "Rev")           'Imprime unidad de revolución
   Lcd_Out(1, 5, "Pulsos")        'Imprime unidad de pulsos

  goto inicio                     'Repite el ciclo de medición
 
 end.


     
     
Sonrie Cristo te ama

Desconectado socket83

  • PIC10
  • *
  • Mensajes: 6
Re: encoder rotativo
« Respuesta #7 en: 18 de Enero de 2011, 15:32:22 »
Moyin, voy a probar tu programa, me parece muy interesante, el circuito constaría de un encoder, dos leds (izq-der) y un lcd, ¿no?, veo que tiene port a, b y c ¿podria utilizar un 16f876?, perdona mi ignorancia pero es que de electronica entiendo algo pero de programacion.... :? , soy autodidacta y no conozco a nadie en persona que entienda de esto, me compre un pic trainer y quiero sacarle partido.
Bueno, volviendo al tema... sabes en que puertas irian los leds y el encoder?? el lcd no importa.

Muchas gracias Moyin

Saludos!!

Nacho

Desconectado Moyin

  • PIC16
  • ***
  • Mensajes: 102
Re: encoder rotativo
« Respuesta #8 en: 18 de Enero de 2011, 18:54:53 »
Socket, respecto a tu pregunta el PIC que puedese emplear puede ser cualquiera de los clásicos 16F873, 16F877, 16F628 incluso el 16F84.hora que si quieres ahorra espacio hasta la serie "enanos" 12F675 por ejemplo. En lo personal como empleo un LCD use el 16F873 en el cual conecte el display al puerto B, RA0 y RA1 son las entradas para el pic proveniente del encoder, RA2 es una salida en la cual pongo un LED que me indique si el encoder esta girando en un sentido (led on) u otro (led off). Este programa te indica el numero de pulsos del encoder y vueltas que puede estar dando si se conecta a una flecha como señalé en el post anterior. La verdad es que el programa lo amplie mucho pero para el fin que pretendes puedes eliminar la parte del LCD y trabajarcon un par de leds para indicar cada sentido, osea conectar un led en cada uno de los pines que elijas por ejemplo RA0 para el LED1 y RA1 para el LED2 pero esto tu ya lo elijes a tu conveniencia.
Espero haberme explicado
Saludos :)
Sonrie Cristo te ama