TODOPIC

Mecatrónica => Robótica => Mensaje iniciado por: alogic.on en 03 de Junio de 2007, 16:32:32

Título: comparadores para encoder
Publicado por: alogic.on en 03 de Junio de 2007, 16:32:32
Hola a todos
tengo un problemilla con el encoder incremental para terminarlo , y es que queria que tuviese tres salidas de esta forma
_XXX_XXX_ esta la conectaria a RB0
__XX__XX_ a RA1
_XX__XX__ a RA2
los estoy haciendo con un par de comparadores, pero como hago para sacar el de RB0 ,ha de ser la suma de los dos , a base de probar entre las salidas de los comparadores a un tercero sale la deRB0 , pero esta aumenta de voltaje cuando coincien los dos pulsos en alto y si se queda uno de los photodiodos entre medias de una de las lineas del disco me da medios pulsos , me explico , que no llega a 5v en la salida del comparador es proporcional al haz de infrarojo que incida sobre fotodiodo en vez de salirme pulsos cuadrados son casi circulares  :shock:
tiene alguien el esquema de un circuito que se use para esto, o si tengo que usar algun componente que no deje salir 5v hasta que los alcance en la entrada ,creo que un zener,o que se usa??

gracias y un saludo
 
Título: Re: comparadores para encoder
Publicado por: todopic en 03 de Junio de 2007, 16:42:34
Hola, prueba este circuito, anda bien  :mrgreen:(http://www.pablin.com.ar/electron/circuito/varios/cruceir/circuito.gif)

suerte!

Norberto
Título: Re: comparadores para encoder
Publicado por: Oceano en 13 de Julio de 2010, 18:00:55
Yo pienso que es mucho más sencillo hacer un encoder si pones como acondicionador de señal un disparador Schmitt tipo 74LS14 ó simplemente un 7414 (evita que sea CMOS, por ejemplo 74HC14, porque suelen dar fallos al ponerlos como encoder). Te pongo un esquema y el programa:

(http://5528662646933850874-a-1802744773732722657-s-sites.googlegroups.com/site/proyectosroboticos/encoder/encoder-por-software/Encoder%2016F876%20FotoBarrera.PNG?attachauth=ANoY7crJ1npGWxl_Z4amVdYbIlVEMlWoap30EjyYge0xh-yAig6M8JRPl_tkKX9ImUsDxAPUOiJvDUrq36t3PqEdvULVYQga2Fn7jFP1ZVGVjetF2I2LzEWVu9NS43NTSg1W7ek_3KRbHqWWjMWZuSqUNLvB3dxUyPgOqmdUAxF0xylaMSp7fKucJi501zTPlaDiCSgp1lZJ7RkhRJhLpy5uo0nACGZxwxOT86GUlmP0t2AZ1MSNCZxmtmvlQkDrmmS1aMjjAkLQiGM1smb9crbtNGvrunOhzA%3D%3D&attredirects=0)

El programa en Proton del encoder incremental queda así:

Código: [Seleccionar]

Device=16F876A

REMINDERS = FALSE
     Config XT_OSC, PWRTE_ON, CPD_OFF, WDT_OFF, BODEN_OFF, LVP_OFF
REMINDERS = TRUE

Symbol INTF   = INTCON.1         ' RB0 External Interrupt Flag
Symbol INTE   = INTCON.4         ' RB0 External Interrupt Enable
Symbol GIE    = INTCON.7         ' Global Interrupt Enable
Symbol INTEDG = OPTION_REG.6     ' Flag = 0 Flanco bajada. Flag = 1 Flanco subida.

On_INTERRUPT GoTo Interrupcion   ' Interrupción por Hardware (es la más rápida).

GIE    = 1                       ' Activa interrupciones generales.
INTE   = 1                       ' Activa la interrupción externa RB0/INT.
INTEDG = 1                       ' Hace que inicialmente la interrupción se habilite
                                 ' para flanco de subida.

ALL_DIGITAL = TRUE               ' Todas las entradas y salidas son digitales.
                                                                              
TRISA  = %111111
TRISB  = %11111111               ' Puerto A y B todo entradas.
TRISC  = %00000000               ' Puerto C como salida para visualizar a través de los LED.
          
Dim x As  Byte                   ' Variable X ---> contador de posición actual.


x=0                              
 
While 1=1                        ' |------ Programa Principal ------|
    
     PORTC = x                   ' El contenido de X se visualiza en el Puerto C a través de los LED.

Wend                             ' |--------------------------------|
            
End                              

    
Interrupcion:                 '-------- Decodificador de Encoder --------------
      
    Context SAVE              ' Salva en contexto de los registros antes de operar con la interrupción.
    
    If PORTB.0 = 1    Then    ' Si RB0 se ha puesto a 1 (flanco de subida),
       INTEDG  = 0            ' entonces activar la siguiente interrupción para flanco de bajada.
       If PORTB.1 = 1 Then    ' Si RB1 está a 1
          Inc x               ' entonces incrementar el contador X.
       EndIf
    EndIf
    
    If PORTB.0 = 0    Then    ' Si RB0 se ha puesto a 0 (flanco de bajada),
       INTEDG  = 1            ' entonces activar la siguiente interrupción para flanco de subida.
       If PORTB.1 = 1 Then    ' Si RB1 está 1
          Dec x               ' entonces decrementar el contador X.
       EndIf
    EndIf
    
    INTF = 0                  ' Borra el "flag" de la interrupción RB0/INT para poder permitir la  
                              ' siguiente interrupción, cuando ocurra.
    Context Restore           ' Restablece el contexto de los registros tal como estaban antes de la
                              ' interrupción.


Más info aquí:

http://sites.google.com/site/proyectosroboticos/encoder/encoder-por-software
Título: Re: comparadores para encoder
Publicado por: willynovi en 23 de Julio de 2010, 19:40:04
no entiendo bien porque usas tres entradas al pic, yo uso los encoders solo con dos entradas, una es la interrupcion y la otra para saber en que dirección esta incrementando.
Como comparador uso LM339 que son 4 y andan muy bien.
Título: Re: comparadores para encoder
Publicado por: alogic.on en 05 de Agosto de 2010, 03:57:36
 :D :D :D este post es de hace pufffff en aquel entonces no sabia como funcionaba, mas bien no lo comprendia. hoy dia lo hago como decís
Título: Re: comparadores para encoder
Publicado por: stk500 en 05 de Agosto de 2010, 04:44:37
 :shock: Joder que chulo te ha quedado macho  :mrgreen:
Título: Re: comparadores para encoder
Publicado por: alogic.on en 05 de Agosto de 2010, 05:01:05
gracias señor :mrgreen: por si teneis curiosidad el hilo del proyecto esta aqui (http://www.todopic.com.ar/foros/index.php?topic=18800.0)