You are on page 1of 8
2017 67 ‘Tutoriales PIC: Codlicadores en cusatura Tutoriales PIC ndamentos de microcontroladores aplicados a la familia PIC de Microchip. Proyectos y Aplicaciones herpes on tr eee WERE, 1 OE FEBRERO 2019 hotnas vs7As EN TOTAL Codiicadores on cuadratura hon 702,017 “Tas un largo parértesis impuesto pore trabajo, retomo el blog. En les siguientes entradas varmos @ sseancunhis ovo _aplicar la salida PWM cel micro un motor OC con capacidad para manejatlo en amas drecciones. Nuestro objetiva final serd escribir un céaigo ce control para hacer que el motor aleance una posicién ‘daca y se detenge 0 se mueva con velocidad constante, Para ella necesitaremos algda tipo de Informacién sobre fa posicién del matory su velocidad. La forma mas comin de obtener dicha nformacién LOMAS VISTO ESTE MES ‘esa través ce cocificadores en cuacratira, vosasisn put ube ‘igen Modulation) scar Enesta entraca describiremos su concepto y los diferentes modos en los que pocemos monitorizaros (ex) convertor ADC Iatarugdeon cneon Achvos de cago anole a esta enna: qund.c src Una tip fsa doberman den moto (usm postive eto) en cua Use ge temporindres postion, vloctady deci xc uso de 2 coamcncoes en contra (que encodes), nomamente ‘Suess como cna Ay onl de rigs vrves Son un oni TIMER, {Un motor con encoders contaré tpicamente con 6 conexiones: Mz y Me = las de un motor normal (conectadas alas salidas OUT y OUT2 del L293) ProvEctos: ‘audio con PWM ‘Almentacin de los encodars (a nveles légicos): Ve (5.0 3.3V) y GND. Brus eecrnica Levtacor mapnéticn 2 salidas con los datos de ambos canales, CH_A y CH_8 que conectaremos a sendos pines (configurades como entradas) del microcontrolador Neder de potancia Meriter pulse cariaco Las fotos siguientes muestran das motores que he usado en los siguientes ejemplos. de a izquierda (Maxon G20) es un pequefio motor muy bien acabaco y relativarnente care. El de la foto de la ancuvo oe aLoe ‘derecha es un motor més grand y econémico (unos $35, http:/wnw.pololucom/estaloa/cateaory/116). 2013 (16) ‘Sin embargo, de cara 2 estos ejemplos, ambos cuentan con codificadores ce dos caneles en cuadratura y 6 conexiones como las descritas antes, por lo que son electricamente intercambiables (ambos funcionan > noviembre (1) ominalmente 2 6V) septemore (1) agosto (2) sutto 2) > junio > arin(a) ¥ Febrero (4) Proysct: Levtadar ‘mognsce Contrclaer PID para ‘oslelon de un tor Be onefo de motores OC ‘sande Pe La figura siguiente stra el funcionamiento de un encoger con 2 canales, Ay 8. Los canales pueden cocttcaderee on verse como 2 sensores (p.c. de lz) fjos. Una pantalla epaca gra con el eje del motor y alterativamente ‘sncrabire “eclpsa” a uno v otro sensor Podemos suponer que por Gefecto los canales estén a un nivel ato y ‘cuando son "rapados” caen 2 un nivel bao. Enlaiustracién siguiente los sensores estén posicionads a » 2012 113) ‘90° la pantalla cubre media circunferencia Antonio Ver todo mi pert ip lpcferaia Blogspot mx/2013)dtccdicadores-on-cuadatura hint 8 2017-67 ‘Tutoriales PIC: Codlicadores en cuadatura -»- BAGS ste ome Ls oe ae os oe La figura iustra la sada de los sensores cuando el eje gira en sentido antinoraro, Las fechas marcan los eventos (caidas 0 ascensos de un canal) a r tapandase olberéndose los sensores. El resultaco es un par de sefales (ch A y ch B) con una serie de pulsos en cuadratura (desplazamienta de fase de 909 0 un cuarte de vera). La frecuencia de los pulsos nos incica la velocidad de giro del motor En este caso simpliicade cada Derlodo de ch A. ch B corresponde exactamente a una vuete del eje Para que son necesarios dos canales? Con uno solo podemes medir velocidad de giro pero no su sentido. {Al tener dos canales en cuadratura, depenciendo del sentido de gio, uno se eclipsaré antes que el oto En este caso de gir antinoraro lo que le pase a A le pasard un poco més tarde (un cuarco de vuelta después) a 8, La seal en A precede a a del canal 8, Como programariamos nuestro microcontrolador para detectar la posicién del motor? Lo mis eficaz seria conectar el canal A 3 RBO y usar una Inte-rupcién que se dspara ante un cambio externo de un pin (p.es INTO asociada a cambios de RBO). Activariames la interrupcién INTO y la configurarfamos pare pe. sltar ante una subida. Cada vez que A pase de 0 a 1 se dispararia la interrupciény se Incrementaré/cecrementara un contador de wveltas. cbmo podemos saber si incrementar 0 decrementar el contador? En la siguiente figure ilstrames el caso contraria, cuando giramos en el sentica horaro y el canal 8 es el que va adelartado, swt r)D ee Supongamos que monitorizames el canal A (el conectaco a REO), no importa sia sublda © la bajada. Si nos fijamos en la figure iniial vemos que cade vez que hay un cambio en A justo @ continuacién los canales se encuentran en estados opuestos. Perel contraro, en la segunda figura, tas cada cambio de A (10 3) ambos canales estén en el misme estado. Es esa condicign la que usaremos para detectar el sentido del giro y decidir sl incrementar 0 disminulr el contador El siguiente eécigo itustra come cadficariemas esto dentro de larutina asaciada @ Ia interrupeién del NTO: El e6digo incrementa una variable (quad) si RBD (ch A) == RBA (ch B), esto es, si estamos girando en sentido horare. En caso contran se decrementa el contador Encoder en modo 23 El eédigo anterior corresponde a lo que se denorina un encoder 1X, ya que sole moniterizamos bien as subidas o las bajadas cel canal A, pero no ambas. Enel caso descrit, la resalucin es de 1 vueka del je, ‘ya que el canal Ase eclipsa 1 ver por vu Si deseamos més resolucién podemes montorizar tanto las bajadas como las subidas. En ambos casos haremas lo mismo que antes, comparar el estado de RBO y RB1 y aumentar/cisminur el contador En este casa come A sube y baja 2 veces por wuelta tendremos el dable (2X) de resolucié, ip lpcferaia Blogspot mx/2013)dtccdicadores-on-cuadatura hint 2017-67 ‘Tutoriales PIC: Codlicadores en cuadatura I IC solo permite configura’ la interrupcién coma de subica o de bajada. éCéme podemos detectar tanto las subias como las bajadas? Sencillo: basta cambiar la confguracién de la interupcién cada vez que suceda (esto es, dentro cel digo dela ISR). El eédigo quedarta ¢ (PORTBoIte.RBL--PORTBDLte.ABO) quadi+7 else quad Basta afacr una linea que cambia el bit que define el sentido de la deteccién (INTCON2.INTEDGO). Si tentramos por una Subida, se cambla y la préxima ver detectaremos la bajada. Cuando volvamos a entrar por una bajada, se quecaré confgurado para saltar a la sigulente subida. En resumen, atrapamos todos los cambios (y sin tener que preacuparnes por nade ya que todo lo hace la interrupcién). La linea de incrementar/decrementar el contacor no hace falta cambiara ya que la condlcibn de chA=chB 0 cha Lltjgt;en8 ne cambiaba en subidas © bajacas, sar un encoder 2x es muy recomendable ya que: + No requiere hardware ni interrupciones adicionales (usames la misma interrupeién INTO que antes). + Sélo requiere una linea agcional de cédigo. + Duplica la resolucién de nuestro contador (ahora cuenta en 1/2 vueltas) [Ademés de la mayor resolucién hay una razén mas importante para usar slempre por defecto un encoger 2, Un encoder 1X es perfectamante vilido (salvo por su manor resolucién) en el caso de un motor cue se mueve en una sola dreccién. Sin embargo puede Introducrerrores sI nuestro moter puede cambiar Su dieccién. Consideremos la figura siguiente: 93-9 Tenemos un movimiento de vaiven y el borde de la pantalla tapa y bere alternativamente al sensor A (el sensor 8 estd siempre libre). Esto provoca una serie de pulsos en A y ningin cambio en 8, on un encoder 1X viglando p.c. las subidas de A contariams 2 subidas de A (verifcando que chs tmchB) que causarian 2 incrementos del contador, cuance claramente ne hemos completado ninguna vuelta En cambio, con un encoder 2x también veriamos 2 bajadas de A (veriicando esta vez que cht=0e>I=ch8) por lo que decrementariamas el contador en dos ocasiones, cancelando los incrementos anteriores, Esta (y no la mejore ce [a resolucién que puede no ser importante en nuestra aplicacién) es I razén por la que se recomienda el uso de un codiicador 2X en estas aplicaciones, Encoder en modo 43 Si por alguna razén ceseames mayor resolucin en nuestro contador podemos implementar un encoder 4X, Se tata de monitorizar eventos (subidas y bajadas) en ambos canales simuténeamente. Precisamos eso si, que ol canal B esté conectado a otro pin con capacidad de Interrupcién (por ejemplo RL, usando le interrupeién INT), Ahora tenemos que eserbircédigo para las dos posioies interrupciones: 30 te ip pcferaia Blogspot m/2013)dtccicadores-on-cuadatura hil 2017-67 ‘Tutoriales PIC: Codlicadores en cuadatura ae f (INTL_E2ag) // ABI (2h 8) cha c Le (FORTDRIte.ABIM~PORTEDILs.200) quad JORTBItS.RBD) quads els: : [Al contrario que el encoder 2X, el uso de un encoder 4X si que tiene un “gasto" adiciona. Necesitamos ‘que la segunda linea (ch B) también tenga asociade una interrupelén. Esto no era necesatto en el caso 2X ‘donde la segunda linea (ch B) podria ser cualquier pin defrido como entrada. Por ejemplo, en el caso del PIC 2520/4520 tenemas 3 interrupciones externas INTO (RBO), INT (RBA) © [INT2 (RB2) por lo que podriames monitorizar hasta 3 pares de canales (3 matores) an redo 2X (conectando los respectivos canales A 2 los tes pines ctados). Por el contrerlo, en modo 4X sélo pocriamas monitorzar un solo metar (ya que gastariamos RA0 y RBI para ese Fr. Enlos programas siguientes de control de motores usaremos por defecto los encoders configurados en mode 2x. Encoders con mas de un ciclo por vuelta, Por simplicdad hemes ilustrados los ejemplos anteriores con el caso de un par de sensores separados por ‘99° y una pantalla de 280° lo que provaca una resolucin de 1 vuelta (modo 1X), 1/2 vuelta (2X) © 1/4 vvueka (4%), Es posible aumentar la resolucién ‘por hardware", situando més cerca los sensores A y B y usando una pantalla conde se alteren varios perlacos de paso/bloqueo en cada vuelta, Algo asf como lo ilustrado en te figura Sie she, Si, ay ay US Esto corresponde a una configuraciin que en moda 1X tendré une resolucién de 10 unidades (de 362) por ‘vuelta (las 10 aspas del grfico) y en modo 2X de 20 unidades (18°) por vuelta Las aspas pueden ser efectivamente una “hélice® que eclipsa/dela pasar alternativemente Ia luz sobre una pareja de fotodiodos (sensores A y B). Esto sucedia asi en el caso de los vies ratones de bela. Més ‘comnmente, los sensores A y 8 son un par de sensores Hall de campo magnétco. Las "aspas” son lentonces una serie de imanes de polos alternados N y $ que hacen cambiar el estado de los sensores de forma alternatva [Agemés, en muchos motores los sensores de cuadratura estén montados sobre el eje “érecto" del motor Si luego el motor ene una reductora, la resolucién sobre el je de Salida de la reductora fe increment notablemente, Por ejemplo, el motor GM-20 de Maxon que uso en estos ejemplos tlene un encoder magnético de 16 pulsos por vuelta y una reductora de 55.1:1. Eso se traduce en que cada vuclta cel eje de salida son 55.1 vueltas del eje motor y por consigulente 55.1x16 = 881.6 pulsos del encoder (en modo 1X). En modo 2X tendriames unos 1765 ticks por vuelta, lo que corresponde a una resoluciin de 3609/1765 = 0.29. Implementacién: quadi.c El programa quad implementa una lecture de los canales Ay & de un motor En esta primera prueba solo conectaremos las salias de los canales Ay 8 (@ RBO y RBI respectivamente) y [a allmentacién (SV) y masa {dela Ligica de los sensores, No conectaremas las conexiones del matory lo moveremes a mano para verticar la Lectura de los canales ip lpcferaia Blogspot mx/2013)dtccdicadores-on-cuadatura hint 2017-67 ‘Tutoriales PIC: Codlicadores en cuadatura Como nuestro objetivo final en préximas entradas serd un sistema de control, uadl.c esté escrito con esa idea en mente, Ademas de las interrupciones para contar los pulsos de los canales, tendremos otra Interupeién asociada a un timer (THRO). A dcha rutina se le suele med denominar "eéigo cel serve", ya que en una aplcacia de control, seréla M$ ay encargada de montorizarlo que esté heciendo el motor y actuar en Bis conseevencia. en este primer ejemplo lo Unico que hard seré ceterminar la $8 tA ccupate) oe CO et Velocidad y posiciin del motor (contador del encoder) ee En principio, la velociéad del motor se expresaré en cuantas "ticks" se hayan contado curante el ciclo del servo, Para pasar de dicha velocidad a otras medidas como revoluciones por ‘minuto (rpm) 0 similares tencremos que conocer los datos particulares de nuestro motor (ticks/ vue Si estamos en modo 1X,2X 0 4X y Falmente la frecuencia con que se ejecuta el céiga del servo La interrupcién del canal A (INTO) se declararé de ALTA prioridad, mientras que la Gel servo (TMRO) seré de BAIA priordad. La razén es que ro pedemos permitimes perder ningin pulso por lo que la legada de tun pulso debe interrumpir cualquier otra tare. Enrelacién con esto también es necesario considerar de que tipo vamos a defini la variable quad que llevaré la cuenta de los pulsos (a medios pulsos en modo 2x) recibides. En principio, en un motor gando dicho contador puede ser muy alto, por lo que podriames usar un entero can signe de 32 bts (int32). Sin embargo, es0 hace que en cada interrupcién INTO (en la que nos interesa demorarnos lo menos posible) tengamos que incrementar 0 decrementar un entero de 4 bytes. Otro problema seria que mientras estamos accedlendo @ ese contador desde le rutina del servo, pocriamas ser iterrumpices por INTO y dicho contador meciicado, Esto pedr'alegar a corromper nuestros datos, Para evitar estos problemas una alterativa es declarar quad de tipo més pequefo,int6 o Incluso come un byte, Las ventajas so: + La interrupciin INTO dura la menos posible ya que solo tiene que incrementar un byte. + Cuando accedamos al valor de quac en la rtina del servo, al ser un nico byte lo leeremos en una sole instruccién, por le que na hay problemas de quedames a mecles del proceso, La desventaja es que si el motor gra muy rSpido, es posible que un byte sea insuficiente, Serd sufciente Si el Incremento/decremento del contador en un ciclo del servo es inferior 128. En la rutina del servo comparareos el valor del contador con el dltime y determinaremos cuanto se ha movido y hacia donde. El siguiente cécigo corresponde a la rutina del servo, que en este ejempl (reloj de 20 Mhz, preescaler 1:2 en THRO y un contador de 50000 entre cade cada interrupcién) se ejecita con une frecuencia de 50 es Fservo = (Fosc/4)/(Pre * cont) = Siihz / 100000 = 50 Hz F (@eneasgt;228) deitan2s6r 17 corzect, El e6digo caleula la dferencla entre sucesivas observaciones (delta) y lo acumule en una varlable de posicién (esta si un entero de 4 bytes, int32). El cédigo detecta posibles rollovers de la variable quad. Si le eiferencia (delta) entre observaciones excede +128 o ~228 asumimos que el contador ha dado la ip lpcferaia Blogspot mx/2013)dtccdicadores-on-cuadatura hint 2017-67 ‘Tutoriales PIC: Codlicadores en cuadatura ‘vueka y corregimes en consecuencia (restande 0 sumando 256). Es por esto por lo que no es posible contabilzar velocidaces mayores de +/-128 en cada ciclo cel serv. SI nuestro motor puede girar muy répido (0 tlene muchos pulsos por vuelta) deberemos recucir el ciclo del servo para evitar overflow. Si esto no es posible ne nos quedard ms remedio que declarar quad de ‘mayor tamavo, Un entero de 16 bits seré suficiente en la mayora de los casos El programa principal simplemente arranca el timer THRO y configura adecuadamente las interupciones. La comunicacién es a través del puerto sere a 9600 bauds. Enel bucle principal el programa vuelea por el puerto serie los valores de la posicidn y velocidad (celta) del motor, ambos en pulses del encoder. Se ha aadido ls opcién de elegir entre mado 1X y 2X pulsando 1 6 2 en el terminal. El motor usado en este ejemplo es un MAXON GM-20 con un encader de 16 pulsos gor vuelta y una Fecuctora de 55.1:1, Por lo tanto, en modo 2X tendremos 16 x 55.1 = 881.6 teks por Vuelta, EM modo 2X: subiremes al doble, 1763 tiks/vuelta. La frecuencia del servo es de SO Hz (20 me) porlo que pare pasar del valor deta obtenido @ revoluclones por minuto nariamos: ‘yueltas = delta / 1763 tiempo = 20s rom = 60% (50 x delta) / 1763 = 1.7015 x delta Este motor en sus especificaciones recomienda un maximo de 200 rpm en su eje de salide (tras la Fecuctora) para 6V. Eso corresponde a unas 3.2lgo rps = 6000 ticks/sec . Con una frecuencia del servo e 50 Hz el mximo incremento seria de 6000/50 = 120. Por lo tanto, estariamos dentro de las Iimitaciones de nuestro enfoque de usar une variable de tipo byte como contador ET video final ustra el funcionariento del programa, moviendo el motor de forma manual. Se muestra como en modo 2X una vuelta completa corresponde a 1765 "ticks" y ala mitad (unas 880) en moco 1X. Conectando los bores del motor a une bateria observarnes una velocidad de 90 tcks (med 2X) par perlodo del servo, lo que se traduce unas 1,70x $0 = 150 rpm. quad Publicado por Antonio 60 com 11 comentarios: “Tengo un proyecto donde esto me puede servir de mucho, usando como base este esquema pod hacerse una contiguracién donde la pe detecte en que sentido se mueve la puerta antes un impulse, © sea, lestando el motor en su posiién inci derle Un impulse, ya sea hacia Ta izqulerda 0 13 derecha, y haces fue s2 se siga desplazand en esa dreccin clena canted de teks y después que vuels a su postion Inica?, ala me puedas ayudar con eso, ploshky@omalcom es. mi eatreo 0 si No por aaul nos comunicamos, como sea desde ya te doy [as gracias, es muy buena tu pagina, buenos proyectos y bien fexplicaces, salucos Responder © fess ttre ass 6 Suponge que toque quieres es una puerta automica que se active con un pequeioempujén en [Uno u otr sentido y Bas abrise vulva a su posieién inal ip pcferaia Blogspot mx/2013)dtccdicadores-on-cuadatura hint 2017-67 ‘Tutoriales PIC: Codlicadores en cuadatura fen euadratura es independiente de que el motor ests active 0 no. Una ver detectado ‘movimiento inical estableceriamos una posicén objetivo de + XXX elices o OKK clk (correzpongente ala puerta abies) ‘ras esperar un pace, valveriamas a establecer un target depos = 0 para “erra a puerta. Para est fase puedes usar os concepts de control expiiados en la estrada de contra de metores hipipiternais. blogspot.com. es/2023/02,eontelralr-pe-pare-posicion-de-un. ent Las principales pagas que le veo seran de tipo préctic, tals como establecer umbrales iicales pera que le puerta no se active "sola" (el motor debe quedar en un estado "no bloqedsde Cuando Ia puerta este crrada)o detectar un obsticule durante el mevimients y detener el moto Espero haberte servi de ayusa, Antonio, ‘Responder © Botte sere cease ate fs verdad, quiero aplcar esto al contol de una puerta automatica que sea caper de "saber" en que firecein moverse si alguien Ia empuja desde adentro fuera ¥ que después pueda valver su posiisy orignal, veré ef nil que te me deste, qracas *) Responder 207 ae 1 video que publces es privace, Responder Respuestas Antonio 29 de marzo de 2014, 16:54 Es verdac, yo ests arreplad. Antonio Responder [Anénimo 25 de marzo ce 2014, 23:36 me gustare preguntarte de done obtuviste el valor de $0,000 par el calle de TMRO ty lo propusiste @ fen funcion de que lo obtuvist, Gracias. PD. Magnifce Blog Responder Respuestas Antonio 29 de morzo de 2014, 17:08, a interrupcién del tmar THRO se dsparara cuando al contador llague 2 65536 (contador de 16 bi) Cada vez que entro en la interrupeié, programe el contador a 15536, le que hace que le fallen ‘50000 "eins" para rebesar sot TMRO(25536); // re-enters after 50000 tieks 2 sith 1:2 PS @ 20M = 50 #2 ‘Como estoy usando un cristal ce 20 Ma, las frecuencia de instruccione (1/4 Fosc) es de 5 Miz IN Uso un prescaler de 1:2, so [a mitad de esos pulsos provacah un un Ineremento del TMRO Por consiguiente, el contador TMAD se inerementa 2500000 veces por segunde. Como Jebo esperar que cuente hasta 50000 sara asparar la Interupcién eso pasaré 2,500,000/50,000 = 2350/5 = 50 veces por segundo, a frecuencia de 50 Hz es arbvarla, simplemente he decicdo que es adecuado mirar cuanto se Fen movigo los motores con esa Ireevenea (cade 20 milsegundos) ara echar un vistaze 2 las concepts hisios sobre timers puedes mires a entrada: hipplternalis. blogspot com.s/2012/06/usonde-temporizadores-timers. hem Responder Burroprimaveral 4 de octubre de 2014, 1:57 ip lpcferaia Blogspot mx/2013)dtccdicadores-on-cuadatura hint 2017-67 ‘Tutoriales PIC: Codlicadores en cuadatura Responder DB ore ire 2 ee e086 020 (Como obtengo el valor delta para hacer un valtimetro comin old y pederpromediar una medicién Responder [Be re ets 00 Como ebtengo el valor celta para hacer un valtimetro comin gle y pacer premedar una mesicn Responder Anénimo 21 de julo de 2016, 20:59 Hola, gracias por Ia Informaciin brindada, y tengo una duds con referente al valor de +-128 que sepun ‘como lo describes es el limite det contador’ cCame obtienes exe valor? Seludos Responder oo svar Entrada més reciente Pagina principal Entrada antigua Suscribirse a: Enviar comentarios (Atom) ip pcferaia Blogspot my/2013)dtccicadores-on-cuadatura hint

You might also like