Você está na página 1de 11

PIC Encoder con un 16F628A.

El funcionamiento de este encoder es extremadamente sencillo. Un bucle se encarga de comprobar el estado de las entrada RA0 y RA1 (A y B respectivamente en el grfico de abajo) en el menor tiempo posible. En condiciones normales la velocidad de lectura suele rondar unas 25.000 veces por segundo para un cristal de 4MHz dependiendo de la longitud del programa. Esto es ms que suficiente para poner el encoder directo al eje de la mayora de los motores, para un mximo de 5 pulsos por vuelta del motor. Aunque con 4MHz funciona perfecto, aumentando los MHz del cristal consegirs velocidades de lectura mayores. Con 8MHz doblars la velocidad de lectura, con 12MHz la triplicars (...), con 20MHz la quintuplicars. Cada aumento de 4MHz incrementas una vez el factor de multiplicacin y esto es debido a que una instruccin en ensamblador necesita 4 ciclos de reloj para ejecutarse. Ten mucho cuidado con el nombre del PIC porque se puede llamar igual y soportar 4MHz 20MHz mximo; Esto lo sabrs por la letras que hay despus del nombre del PIC y

mirando el Datasheet.

Como puedes ver en la imagen, hemos de detectar cundo hay un flanco de subida o de bajada en la entrada 'A' (un cambio de estado) siempre que 'B' est a '1'. Si A es el bit bajo (LSB) y B es el bit alto (MSB), al considerar los dos bits como un nmero tenemos que si hubo un cambio de 2 (10 en binario) a 3 (11 en binario), se ha producido un flanco de subida, por tanto hemos de incrementar el contador. Y al revs, cuando el PIC detectar que en las entradas hubo un 3 (11 en binario) y pasa a 2 (10 en binario), es decir, un flaco de bajada, ha de decrementar el contador. En el programa para el PIC el valor 'anterior' se almacena en la variable AUX, y el valor 'actual' se almacena en la variable ENC; la variable que hace de contador se llama X. A continuacin tienes los programas en CCS C y en Pronton IDE. Haciendo clic aqu vers el cdigo para un 16F84A en Proton IDE; el esquema sigue siendo el mismo porque ambos PICs son idnticos, aunque el 16F628A tiene muchas ms funciones internas.

Programa PIC Encoder con 16F628A en CCS: The translation could modify the code. Use the code without translating. #include <16F628A.h> #FUSES NOWDT, XT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD #use delay(clock=4000000) #byte porta = 0x05 // Asignamos PortA.

#byte portb = 0x06

// Asignamos PortB.

// ---------- Programa Principial ---------void main() { port_b_pullups(FALSE); // Sin resistencias pullups a las salidas del puerto B. setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Al no usar el TIMER configuramos lo ms bsico. setup_comparator(NC_NC_NC_NC); // Sin comparadores. setup_vref(FALSE); // Al no usar comparadores no necesitamos Vref. //---- Fin de la configuracin del 16F628A ---int8 x; // Declaramos el valor de X como byte, se corresponder con los 8 LEDs de salida. int8 enc; // Se almacenar el valor actual de RA0 y RA1, hasta la siguiente comparacin. int8 aux; // Se almacenar el valor anterior de RA0 y RA1, hasta la siguiente comparacin. set_tris_a(0b11111); // Puerto A como entradas. Slo usamos RA0 y RA1. set_tris_b(0b00000000); // Puerto B como salidas, para los 8 LEDs. portb=0; // Inicialmente ponemos a cero el puerto B. x=0; // Inicialmente ponemos a cero la variable que se usa para contar. enc=0; // Inicialmente ponemos a cero la variable que tomar los valores de RA0 y RA1. While (true) { aux=enc; // Igualamos 'AUX' y 'ENC' para luego comparar cuando cambie 'ENC'. enc=porta & 3; // Aislamos RA0 y RA1 como un nmero de 2 bits y se carga en la variable 'ENC'. If ((aux==2)&&(enc==3))// Si en la comparacin hay flanco de subida, { x++; // entonces incrementar una unidad el valor de X. } If ((aux==3)&&(enc==2))// Si en la comparacin hay flanco de bajada, { x--; // entonces decrementar una unidad el valor de X.

} portb = x; } } // El valor de X sale por el puerto B, los 8 LED de salida.

Programa PIC Encoder con 16F628A en Proton IDE: The translation could modify the code. Use the code without translating. Device=16F628A REMINDERS = False Config XT_OSC, PWRTE_ON, CP_OFF, WDT_OFF, BODEN_OFF, LVP_OFF REMINDERS = True ALL_DIGITAL = True ' Entradas/Salidas todas digitales. TRISA = %11111 ' Puerto A como entradas. Slo usamos RA0 y RA1. TRISB = %00000000 ' Puerto B como salidas, para los 8 LEDs. PORTB=0 ' Inicialmente ponemos a cero el puerto B.

Dim x As Byte ' Declaramos el valor de X como byte, se corresponder con los 8 LEDs de salida. Dim Aux As Byte ' Se almacenar el valor anterior de RA0 y RA1, hasta la siguiente comparacin. Dim Enc As Byte ' Se almacenar el valor actual de RA0 y RA1, hasta la siguiente comparacin. x=0 Aux=0 Enc=0 While 1=1 ' Ponemos todas las variables a cero.

' Bucle infinito.

Aux = Enc ' Igualamos 'AUX' y 'ENC' para luego comparar cuando cambie 'ENC'. Enc = (PORTA & 3) ' Aislamos RA0 y RA1 como un nmero de 2 bits y se carga en la variable 'ENC'. If Aux = 2 And Enc = 3 Then Inc x ' Si en la comparacin hay flanco de subida, incrementamos X. If Aux = 3 And Enc = 2 Then Dec x ' Si en la comparacin hay flanco de bajada, decrementamos X.

PORTB = x salida. Wend End

' El valor de X sale por el puerto B, los 8 LED de

Buscando la sencillez para comprender mejor el funcionamiento del programa, el encoder est limitado a una resolucin de 8 bits. Si aades unas pocas lneas de programacin podrs aumentar la resolucin hasta 11 bits (para el 16F628A y el 16F84A, en otros PICs podran ser ms) si aprovechas las patillas que no se usan. El encoder funcionar perfecto si usas un acondicionador de seal de tecnologa TTL tipo 74LS14 7414. Si te es posible, evita usar tecnologa CMOS, como por ejemplo el 74HC14 el 74HCT14. El acondicionador slo lo necesitamos cuando se utilizan foto barreras tipo TCST 1103, aunque en principio puede ser cualquier otro modelo. Si usas sensores Hall digitales entonces no te har falta el acondicionador y podrs inyectar las seales del encoder directamente al PIC (altamente recomendado). Sobre los encoders tipo potencimetro en principio lo puedes colocar directamente y sin el acondicionador de seales. Si ves que no cuenta bien con los "tipo potencimetro" entonces ponles un condensador de unos 100nF entre las salidas de las seales del encoder y masa.

Encoder Introduccin. Existen dos tipos de encoder: el absoluto y el incremental. Voy a tratar exclusivamente el encoder incremental porque es el ms sencillo de construir, econmico y adems puede tener la resolucin que desees. Una vez que tienes la posicin "cero", el encoder incremental se comporta igual que un encoder absoluto. Si necesitas una introduccin bsica sobre el funcionamiento de los encoders haz clic aqu.

Los encoders que aqu se describen estn hechos, en principio, a base de barreras infrarrojas, se les llaman encoders pticos. Sin embargo aconsejo usar Encoders con efecto Hall (son magnticos), porque simplifica el circuito y no le afecta la contaminacin ambiental, cosa que en el ptico s estara afectado.

En la foto de arriba a la izquierda puedes ver simples foto-barreras. Est compuesto por un emisor y un receptor de infrarrojos (IR) enfrentados a corta distancia. En este caso el modelo es el TCST 1103. Necesitamos dos de estas barreras foto dectectoras para formar el encoder. La foto central es un encoder experimental con el disco montado sobre el eje de un motor y con las dos fotobarreras (pegadas la una contra la otra) leern los pulsos y estos ms tarde se transformarn en una posicin determinada. La imagen de la derecha es el esquema con las conexiones y sus valores. Haz clic en las imgenes si necesitas ampliacin visual.

El disco no ha de ser de plstico porque la luz infrarroja suele atravesar la mayora de ellos. La mejor opcin es usar cartn rgido o chapa de una lata, ambos se pueden "mecanizar" con unas simples tijeras. El cartn rgido lo puedes conseguir de alguna vieja libreta de "tapa dura". Usa un pin de plstico o pequeo engranaje que encaje con el eje del motor y pegar el disco dentado con pegamento instantneo al pin o engranaje para hacer de base al disco del encoder. De esta forma evitars que el disco se mueva fuera de donde debe y se mantenga siempre plano. Las aspas (o dientes) y los vacos entre las aspas (o dientes) han de ser igual o un poco mayor que las dos foto barreras juntas. No utilices fotolito para crear el disco a no ser que tengas mucha experiencia en este tema, aparte de que necesita una electrnica un poco especial para

acondicionar las seales de salida.

Los encoders mecnicos o "tipo potencimetro" (imagen izquierda) son tiles para movimientos lentos, como por ejemplo el control del volumen del sonido. Desaconsejo utilizarlos como control de posicin en una reductora con motor porque sufrira mucho desgaste debido a que funcionan por contacto mecnico. Las salidas han de llevar un filtrado capacitivo, es decir, a cada salida hay que ponerle un condensador para compensar el "rebote" que tienen los contactos mecnicos, as se evita el falso conteo. Los condensadores actan en este caso como un anti-rebotes pasivo. De todas formas hay casos en el que no es necesario ese filtrado capacitivo, pero por regla general y para curarse en salud es mejor ponerlo y una vez que veas que funciona correctamente prueba sin ellos.

Los encoders incrementales tienen 2 salidas bsicamente que sirven para saber el sentido de giro y pulso correspondiente. Normalmente para el reset o posicin cero puede servir un simple pulsador que vaya a la electrnica del contador o del PIC, segn el caso, como veremos ms adelante.

Por muy buen encoder ptico que construyamos necesitamos acondicionar las dos seales de salida A y B. Si no acondicionamos estas seales, el encoder ptico no funcionar correctamente. Es muy importante entender esto. Hasta tal punto es importante que yo lo considero (metafricamente hablando) como "el alma del encoder ptico". Usaremos inversores con disparador Schmitt para acondicionar las seales de salida de las foto-barreras.

No basta con que sea disparador de Schmitt, adems ha de ser de tecnologa TTL. Esto quiere decir que slo usaremos la tecnologa de puertas NOT con disparador Schmitt de este tipo: 7414 74LS14. Son las que yo he probado y funciona de maravilla. Evita usar tecnologa CMOS, por ejemplo 74HC14 (HC y HCT es CMOS), porque te podra fallar, especialmente en el encoder por hardware. Expongo dos tipos de encoder dentro de los encoders incrementales. El encoder por Hardware (electrnico puro) es el ms rpido, pero tiene como contrapartida ms componentes que el encoder a travs de un PIC. Todo depende de las necesidades del proyecto. El encoder por Software se hace a travs de un micro-controlador (PIC). Recomiendo este porque es muy sencillo de fabricar y tiene muy pocos componentes. Para velocidades normales trabaja sin problemas: Uso un disco de 5 dientes o aspas puesto en el eje de un motor de 3V y funciona perfectamente para las revoluciones por minuto de este tipo de motores. Es ms, he alimentado con 12 voltios motores de 3V para conseguir altas velocidades de rotacin durante las pruebas y sigue funcionando perfectamente bien; esto es hasta donde yo he probado. Si te parece poco 5 vueltas por revolucin, has de pensar que se hace desde el eje del motor. Si en vez de colocarlo en el eje del motor pones el encoder en uno de los engranajes de la caja de reduccin, obviamente perders resolucin. Mi preferencia es siempre colocarlo directamente en el eje del motor y as tengo la mxima resolucin posible y esto se traduce en precisin. Todo lo que comento aqu se refiere a los optoacopladores o fotoclulas que describo arriba en esta misma pgina, en otros tipo de sensores puede o no ser necesario cuestiones que aqu se describen. Ya vers en otras secciones

referentes a encoders que no siempre se necesita acondicionar las seales de salida. Lo ideal es hacer las pruebas tal y como las describo y luego probar a quitar elementos para comprobar si sigue funcionando, o probar con otras tecnologas de puertas lgicas. Por ejemplo, para el encoder por hardware en mi caso particular slo me ha funcionado el encoder usando tecnologa TTL como acondicionador de seal, es por ello que me curo en salud recomendando hacerlo siempre con esa tecnologa. Lo que aqu se describe es de precisin, no existe perdidas de pulso y tampoco existen fallos al intentar poner el encoder entre dos posiciones ni tan siquiera haciendo vibrar al motor a propsito, siempre y cuando se siga a rajatabla las indicaciones que expongo y teniendo en cuenta que en el encoder por software pondremos como mximo 5 aspas o dientes en el eje del motor, es hasta donde he probado y puedo garantizar su funcionamiento. En el encoder por hardware puedes poner tantas aspas o dientes como desees y acepta todas las revoluciones por minuto que necesites. Si necesitas contar muchos pulsos por vuelta, es el ideal.

Você também pode gostar