Proyecto Encoder Incremental de 2 Canales Por USB
Proyecto Encoder Incremental de 2 Canales Por USB
Proyecto Encoder Incremental de 2 Canales Por USB
TODOPIC Microcontroladores PIC * PROYECTOS * (Moderadores: J1M, jfh900, MGLSOFT, Modulay, Sasin, LABmouse) Proyecto Encoder Incremental de 2 canales por USB Pginas: [1]
Autor
JJcorps
PIC 12 De scone ctado Se x o: Espaa Me nsaje s: 51
Tema: Proyecto Encoder Incremental de 2 canales por USB (Ledo 7131 veces)
Proyecto Encoder Incremental de 2 canales por USB
: 13 de Abril de 2008, 05:05:06
Hola! Este es un antiguo proyecto que he retomado ahora. La razn de no continuar con el antiguo hilo es pq hace 6 meses de ese hilo por eso he decidido crear uno nuevo. La definicin del proyecto es simple: sacar toda la informacion posible de un encoder de 2 canales. Dicha informacin es: posicin actual del encoder (pasos), sentido, velocidad actual, velocidad media y velocidad de transferencia de los paquetes USB. El funcionamiento de este encoder esta explicado en el antiguo hilo pero voy a volver a exponerlo para tenerlo todo centralizado en este hilo, adems de miedo a que se borre debido al tiempo q ha pasado.
ENCODER INCREMENTAL
Un encoder incremental es un dispositivo que transforma un movimiento rotatorio en pulsos digitales. Estos pulsos pueden ser usados para controlar desplazamientos de tipo angular o de tipo lineal si se asocia a una cremallera o un husillo
El encoder se compone de 3 partes: Un disco ranurado formado con lineas opacas y transparentes Un diodo LED Uno o varios Fototransistores El funcionamiento es el siguiente: cuando el sistema comienza a funcionar, el led crea un haz de luz que incide en el foto transistor; a medida que el eje vaya girando, se producirn una serie de pulsos de luz en el receptor, correspondientes a la luz que atarviesa los huecos entre las marcas. Llevando una cuenta de esos pulsos es posible conocer la posicin del eje.
METODOS DE CONTROL
El encoder que voy a usar es un encoder incremental de 2 canales desfasados 90 hay algunos pic que incorporan el modulo QEI que es especifico para el control de estos encoders, por desgracia, ningun picUSB los incorpora. Este tipo de encoder se puede usar de 3 maneras (sin modulo QEI):
www.todopic.com.ar/foros/index.php?topic=21309.0
1/8
14/05/12
Modo 1X: Usando solo un canal para el conteo y el otro obtener el sentido
Este modo es el mas sencillo de hacer solo se tiene que conectar el C anal A a la interrupcin externa del pic, configuramos la interrupcin por flanco de subida (aunque se puede hacer por flanco de bajada). El otro canal lo podemos conectar a cualquier patilla de configurada como entrada en el pic, esta patilla nos dara el sentido. El funcionamiento de este mtodo es el siguiente: Al girar el encoder de izquierda-derecha los flancos de subida son los flancos izquierdos del C anal A, fijandose en la imagen anterior, el nivel del C anal B en todos los flancos de subida del C anal A es nivel alto. Si el encoder gira derecha-izquierda los flancos de subida son los flancos derechos del C anal A, que coinciden con el nivel bajo del C anal B. C digo:
i n t 1 6p a s o s = 0 ; i n ts e n t i d o = 1 ; # i n t _ E X T v o i d E X T _ i s r ( v o i d ) { i f ( i n p u t ( P I N _ B 1 ) ) { s e n t i d o = 1 ; p a s o s = p a s o s + 1 ; } e l s e { s e n t i d o = 0 ; p a s o s = p a s o s 1 ; } } / / M i r oe le s t a d od ee lo t r oc a n a lqm ei n d i c ae ls e n t i d o
Modo 2X: Atendiendo a los cambios de nivel para el conteo y para el sentido
Por Hacer....
PROGRAMACION DE APLICACIN
El lenguaje que uso para la aplicacn es el Visual C # 2005 express. La aplicacin hace un puleo al USB pidiendo el estado del encoder al pulsar el boton de Muestreo, mostrando el numero de pasos del www.todopic.com.ar/foros/index.php?topic=21309.0
2/8
14/05/12
Proyecto Encoder Incremental de 2 canales por USB pidiendo el estado del encoder al pulsar el boton de Muestreo, mostrando el numero de pasos del encoder en el Label. Para ello he hecho 2 mtodos nuevos en la clase PicUSBAPI:
C digo:
p u b l i cv o i dP u l e a ( L a b e lp a s o s ) { p o o l l i n g=t r u e ; w h i l e( p o o l l i n g ) { A p p l i c a t i o n . D o E v e n t s ( ) ; S u m a P I C ( 1 0 ,1 0 ) ; p a s o s . T e x t=( R e s u l t a d o P I C ( ) ) . T o S t r i n g ( ) ; } } p u b l i cv o i dP a r a r P u l e o ( ) { p o o l l i n g=f a l s e ; } # d e f i n eAP I N _ B 7 # d e f i n eBP I N _ B 1 Descargate el cdigo # d e f i n ed e r e c h a1 # d e f i n ei z q u i e r d a0 AYUDA i n t 1 6p a s o s = 0 ; i n t 1s e n t i d o = 1 ; queria pediros vuestra ayuda en como implementar los modos 2X y 4X de los Despues de este rollo i n t 1A _ o l d ; / /V a l o r a n t e r i o r d e rpida A metodos de control, de la manera mas posible ya que cuanta mas precision tiene el metodo mas veces i n t 1 va A _ n interrumpir e w ; / /V a l o al r pic. a c t u a ld eA i n t 8a u x ; / /V a r i a b l ea u x i l i a rp a r al e e re lp u e r t oB
Gracias
En lne a
gu1llermo
a u x = i n p u t _ b ( ) ; / /L e e m o se lp u e r t oB
Hola! JJcorps, muy organizado y til lo que ests haciendo, yo tambin tuve que disear un programa f( ( A _ o l d = = 1 ) & & ( A _ n e w = = 0 ) ) { / /' A ' s u f r i u n at r a n s i c i n d e s c e n d e n t e ? ? parai interpretar las seales de los encoders, pero en mi caso eran dos encoders con un solo pic, ms i f( i n p u t ( B ) ) puedes { dos conversiones AD, lo leer aqu ya lo implement y funciona, pero no fu tan ordenado como t
s e n t i d o = d e r e c h a ; p a s o s + + ; / /I n c r e m e n t a m o sp a s o s
} que haces mencin yo los conozco como 1X, 2X y 4X, me es ms fcil e intuitivo llamarlos Los modos e l s e { 1X: Leo 1 flanco en todo el perodo, 2X: leo 2 flancos y 4X: 4 flancos as, porque digo,
2X: Lo hara por interrupcin de los pines RB7:RB4, vamos a elegir el pin RB7 como entrada para la p a s o s ; / /D e c r e m e n t a m o sp a s o s seal A } y otro pin distinto a RB6:RB4 para la seal B, por ejemplo RB1 como }esto: C digo: / /d ee s t a d oe ne lp i nR B 7g e n e r al ai n t e r r u p c i n el cdigo sera algo as
s e n t i d o = i z q u i e r d a ;
e l s e { / /E n t o n c e ss u f r i u n at r a n s i c i na s c e n d e n t e ,p o r q u es o l oe lc a m b i o i f( i n p u t ( B ) ){ s e n t i d o = i z q u i e r d a ; p a s o s ; / /D e c r e m e n t a m o sp a s o s } e l s e { s e n t i d o = d e r e c h a ; p a s o s + + ; / /I n c r e m e n t a m o sp a s o s } } A _ o l d = A _ n e w ; / /A c t u a l i z a m o se lv a l o ra n t e r i o r ,o j o ! ,m u yi m p o r t a n t e !
} v o i dm a i n ( ) { . . . a u x = i n p u t _ b ( ) ; / /L e e m o sl as e a lA ,u n as o l av e zn a d am s ,e sp a r at e n e ru nv a l o r / /r e f e r e n c i a l A _ o l d = b i t _ t e s t ( a u x ,7 ) ; . . . }
www.todopic.com.ar/foros/index.php?topic=21309.0 3/8
14/05/12
ltima modificacin: 14 de Abril de 2008, 08:19:21 por gu1llermo "Una pe rsona pue de triunfar e n cualquie r ocupacin e n la cual ponga todo su e ntusiasm o." En Ne obux ganas dine ro con solo por hace r click s R e gistro aqu Y aqu, con solo ve r e l siguie nte vde o ya te pagan 1Euro: http://e s.be ruby.com /prom ocode /vide o/uZx c8U
En lne a
JJcorps
PIC 12 De scone ctado Se x o: Espaa Me nsaje s: 51
Gracias gu1llermo por la contestacion. Sobe los codigos, ire actualizando el post inicial con ellos en cuanto lo tenga mas presentable, por ahora # d e f i me n eestoy AP I N dedicando _ B 7 mas a la aplicacion en Visual C . He cambiado el nombre # d e f i n ed e r e c h a 1 de los modos a 1X 2X y 4X como decia gu1llermo, con esos nombres los conocia yo tambien pero # d e f i n ei z q u i e r d a 0 no me salieron a la hora de escribir el post
# d e f i n eBP I N _ B 1
i n t 1 6p a s o s = 0 ; i n t 1s e n t i d o = 1 ; i n t 1A _ o l d ; / /V a l o ra n t e r i o rd eA i n t 1A _ n e w ; / /V a l o ra c t u a ld eA i n t 8a u x ; / /V a r i a b l ea u x i l i a rp a r al e e re lp u e r t oB # i n t _ R B v o i d r b _ i s r ( v o i d ) {
Lealadrian
PIC 10 De scone ctado En lne a
s e n t i d o = d e r e c h a ; p a s o s + + ; / /I n c r e m e n t a m o sp a s o s
Los modos que e l s e { haces mencin yo los conozco como 1X, 2X y 4X, me es ms fcil e intuitivo llamarlos as, porque s digo, 1X: Leo 1 flanco e n t i d o = i z q u i e r d a ;en todo el perodo, 2X: leo 2 flancos y 4X: 4 flancos 2X: Lo hara por interrupcin de los pines RB7:RB4, vamos a elegir el pin RB7 como entrada para la } seal el cdigo sera algo as }A y otro pin distinto a RB6:RB4 para la seal B, por ejemplo RB1 como esto: e l s e { / /E n t o n c e ss u f r i u n at r a n s i c i na s c e n d e n t e ,p o r q u es o l oe lc a m b i o C digo:i f( i n p u t ( B ) ){
p a s o s ; / /D e c r e m e n t a m o sp a s o s
/ /d ee s t a d oe ne lp i nR B 7g e n e r al ai n t e r r u p c i n s e n t i d o = i z q u i e r d a ; p a s o s ; / /D e c r e m e n t a m o sp a s o s } e l s e { s e n t i d o = d e r e c h a ; p a s o s + + ; / /I n c r e m e n t a m o sp a s o s } } A _ o l d = A _ n e w ; / /A c t u a l i z a m o se lv a l o ra n t e r i o r ,o j o ! ,m u yi m p o r t a n t e !
} v o i dm a i n ( ) { . . . a u x = i n p u t _ b ( ) ;
www.todopic.com.ar/foros/index.php?topic=21309.0 4/8
14/05/12
a u x = i n p u t _ b ( ) ; / /L e e m o sl as e a lA ,u n as o l av e zn a d am s ,e sp a r at e n e ru nv a l o r / /r e f e r e n c i a l A _ o l d = b i t _ t e s t ( a u x ,7 ) ; . . . }
PD1: JJcorps, gracias a tu post me he dado cuenta que hubiese podido optimizar el programa que hice aquella vez (que no hace mucho tiempo tampoco) y con ste pic16f fcilmente podramos leer las seales de 5 encoders al mismo tiempo en modo 1X, 4 conectados en los pines RB7:RB4 y 1 conectado a RB0, me refiero a su seal A por supuesto, y la seal B conectarla en cualquier otro pin.
PD2: Sera bueno que en vez de mostrar partes de cdigos, se realizara el cdigo completo y simulado en proteus de una vez Saludos.
Hola queria saber si podes pasar este codigo a ASEMBLER ya que necesito leer un encoder de iguales caracteristicas y todavia no manejo el C no me interesa la coneccion USB. MI Intencion es que cada paso o pulso del encoder corresponda a 1 mm lineal, lo que lograre con una rueda de un determinado diametro, acoplada al eje del encoder, para poder medir una barra, la long. total de la barra sera de 6000 mm, y se efectuaran medidas intermedias de distintos valores pejem. 2530 mm, 3255 mm, 500 mm, etc. Lo q tendre que hacer es utilizar un sistema de 16 Bits. les agradesere en lo que puedan ayudarme gracias
En lne a
Oceano
PIC 10 De scone ctado Se x o: Turk s and C aicos Islands Me nsaje s: 13
Propongo un encoder con el PIC 16F876A, pero en principio puede ser cualquier PIC que tenga Int/RB0. Pongo dos cdigos, uno para CCS y otro para Proton IDE , antes de nada el esquema:
www.todopic.com.ar/foros/index.php?topic=21309.0
5/8
14/05/12
Funciona por la interrupcin RB0/INT y cada vez que detecta un flanco (sea de subida o de bajada) hace cambiar el registro INTEDG. As se consigue no perder pulsos, no cuenta de ms ni de menos y es muy rpido. Uso un disco de 5 aspas (o dientes) en el eje de un motorcillo de juguete, lo alimento a 12 (es de 3v.) y pese a la velocidad que coge no pierde pulsos. Probar este cdigo slo te llevar un momento. Es esencial poner como acondicionador de seal del encoder un disparador Schmitt tipo 7414 74LS14 (ver circuito de arriba); son puertas NOT con tecnologa trigger Schmitt y TTL, funcionan la mar de bien. Evita usar como acondicionador de seal tecnologa C MOS, como por ejemplo el 74HC 14, porque al menos a mi me ha dado problemas intermitentes con esta tecnologa. Para ms info haz clic en el enlace final de este post. Cdigo para CCS C digo:
# i n c l u d e< 1 6 F 8 7 6 A . h >
/ / U s a m o se lP I C1 6 F 8 7 6 A .
/ /-V a r i a b l e sG l o b a l e si n t 8 x = 0 ; / / D e c l a r a m o se lv a l o rd eXc o m ob y t e ,e sd e c i r ,8b i t s . / /-I n t e r r u p c i n# I N T _ E X T v o i dI n t R B 0 ( ) { / / d i s a b l e _ i n t e r r u p t s ( i n t _ E X T ) ; i f( b i t _ t e s t ( p o r t b , 0 ) ) { e x t _ i n t _ e d g e ( H _ T O _ L ) ; Cdigo para i f Proton ( ( b i t _ t IDE e s t ( p o r t b , 1 ) )= =1 ) { C digo: x + + ; } D e v i c e = 1 6 F 8 7 6 A } e l s e R E M I N D E R S=F A L S E { C o n f i g X T _ O S C , P W R T E _ O N , C P D _ O F F ,W D T _ O F F ,B O D E N _ O F F ,L V P _ O F F e x t _ i n t _ e d g e ( L _ T O _ H ) ; R E M I N D E R S = R U E i fT ( ( b i t _ t e s t ( p o r t b , 1 ) )= =1 ) { S y m b o lI N T Fx = I N T C O N . 1 'R B 0E x t e r n a lI n t e r r u p tF l a g ; S y m b o lI N T E =I N T C O N . 4 'R B 0E x t e r n a lI n t e r r u p tE n a b l e } S y m b o l G I E = I N T C O N . 7 ' G l o b a l I n t e r r u p t E n a b l e } S y m b o l I N T E D G = O P T I O N _ R E G . 6 ' l a g=0F l a n c ob a j a d a .F l a g=1F l a n c os u b i d a . / / e n a b l e _ i n t e r r u p t s ( i n t _ E X T ) ;F } O n _ I N T E R R U P TG o T oI n t e r r u p c i o n 'I n t e r r u p c i np o rH a r d w a r e( e sl am sr p i d a ) . / /-P r o g r a m aP r i n c i p i a lG I E =1 'A c t i v ai n t e r r u p c i o n e sg e n e r a l e s . I N T E =1 'A c t i v al ai n t e r r u p c i ne x t e r n aR B 0 / I N T . www.todopic.com.ar/foros/index.php?topic=21309.0
6/8
14/05/12
I N T E =1 I N T E D G=1
A L L _ D I G I T A L=T R U E
Informacin de este proyecto aqu: T R I S A =% 1 1 1 1 1 1 http://sites.google.com/site/proyectosroboticos/encoder/encoder-por-software Informacin sobre encoder con sensor Hall aqu: T R I S C =% 0 0 0 0 0 0 0 0 'P u e r t oCc o m os a l i d ap a r av i s u a l i z a rat r a v sd el o sL E D . http://sites.google.com/site/proyectosroboticos/encoder/encoder-con-hall Informacin sobre encoder electrnico puro aqu: http://sites.google.com/site/proyectosroboticos/encoder/encoder-por-hardware Pic x = 0 Encoder USB: http://sites.google.com/site/proyectosroboticos/encoder/pic-encoder-usb
T R I S B =% 1 1 1 1 1 1 1 1
'P u e r t oAyBt o d oe n t r a d a s .
D i mxA s B y t e
'V a r i a b l eX>c o n t a d o rd ep o s i c i na c t u a l .
W h i l e1 = 1 P O R T C=x
'| -P r o g r a m aP r i n c i p a l|
E n d
voc
PIC 10 De scone ctado Me x ico Me nsaje s: 2
En lne a
Que tal soy nuevo en el foro.. y eh esado leyendo muchos de los interesantes temas que se encuentran. C o n t e x tS A V E 'S a l v ae nc o n t e x t od el o sr e g i s t r o sa n t e sd eo p e r a rc o nl ai n t e r
I n t e r r u p c i o n :
' -D e c o d i f i c a d o rd eE n c o d e r-
pues me tope que con este que en lo particular es de mi interes.. y pues anos ala obra encuanto lo vi.. I fP O R T B . 0=1 T h e n 'S iR B 0s eh ap u e s t oa1( f l a n c od es u b i d a ) , implemente el primero de los emtodos que se publica .. I N T E D G = 0 ' e n t o n c e s a c t i v a r l a s i g u i e n t e i n t e r r u p c i n p a r af l a n c od eb a j a d per0 he tenido algunos detalles.. con perdida de pulsos. I fP O R T B . 1=1T h e n 'S ique R B 1 e s t a1 estoy utilizando el pic18f252 y el eocnder estoy utilizando me genera 2048 pulsos por vuelta.... pero como necesito I n c x estar monitoreando 'e cuantos n t o n c e s pulsos i n c r e se m e han n t a r contado. e lc o n tengo t a d o r habilitada X . tmb la interrupcion del E n d I f RTC C .. para que me E n d I f attive un flag y de ahi mandar a imprimir. por el puerto serie en el cuerpo de codigo.. pero al momento que se ejecuta esta interrupcion.. los pulsos que llegaron en ese momento no me los cuenta...
I fP O R T B . 0=0 T h e n 'S iR B 0s eh ap u e s t oa0( f l a n c od eb a j a d a ) , I N T E D G = 1 ' e n t o n c e s a c t i v a r l a s i g u i e n t e i n t e r r u p c i n a r af l a n c od es u b i d Entonces he tenido la idea de quiza contar con el timer1 que me cuente los pulsos externos.p bueno con I fP O R T B . 1=1T h e n 'S iR B 1e s t 1 dos timers.. porque solo contarian podria contar cuando girea un lado y con otro cuando gire D e c x entonces con uno 'e n t o n c e sd e c r e m e n t a re l c o n t a d o r X . hacia le otro yf luego restarlos! xD E n d I jjejej E no se n d I fle he estado pensado..
saludos.. si alguien ha tenido algun problema de este tipo.. o si me dan una idea.. de antemano I N T F=0 'B o r r ae l" f l a g "d el ai n t e r r u p c i nR B 0 / I N Tp a r ap o d e rp e r m i t i r gracias!
C o n t e x tR e s t o r e
Oceano
PIC 10 De scone ctado Se x o: Turk s and C aicos Islands Me nsaje s: 13
Hablo sin conocimiento: pienso que un pic (los que yo conozco: serie 16F y 18F) no puede contar tantos pulsos en una sola revolucin y de forma bidireccional (en ambos sentidos y sin perdidas de pulsos). Si estuviera en lo cierto, se necesitara una electrnica que contara esos pulsos, y el PIC leyera esa electrnica. Hacerlo directamente para esa resolucin de encoder por vuelta no lo conozco. C reo que algunos DSPIC s lo pueden hacer. Te pongo un enlace: http://techtrain.microchip.com/webseminars/documents/dsPIC QEI_033005.pdf Por otra parte, tambin me paso que si haca comunicaciones por el puerto serie (C OM1 por ejemplo), no es que perdiera pulsos (uso interrupciones por RB0/Int), sino que la comunicacin fallaba y se enviaba caracteres errneos. Ahora he probado hacerlo por USB (en el anterior post est el enlace de cmo lo hice) y no me ha dado problemas ni en el contaje ni en la informacin que recibo (los nmeros salen correctos en el monitor del PC ). Desconozco la resolucin que tiene mis encoders con PIC . Slo s que poniendo un disco de 5 aspas o dientes a un motor de 3V, lo alimento con 12 voltios y pese a la velocidad que coge sigue contando correctamente, sin perdidas de pulsos.
www.todopic.com.ar/foros/index.php?topic=21309.0
7/8
14/05/12
TODOPIC
En lne a
Pginas: [1]
ante rior prx im o Ir a:
ir
Todo sobre PIC 16F628/F88 44 proyectos,videos,36 tutoriales Programacin ensamblador y ANSI C www.puntoflotante.net Curso c para PICS Curso-taller c para PIC16f887 Diplomado de programacin de pics
www.commtechcomputers.net
Spring-Pin JTAG Connector Plugs Directly to your PCB Zero Component Cost Per Board! www.Tag-Connect.com
Powe re d by SMF 1.1.16 | SMF 2006-2008, Sim ple Machine s Pgina cre ada e n 0.116 se gundos con 23 consultas.
www.todopic.com.ar/foros/index.php?topic=21309.0
8/8