Introducción.
Existen dos tipos de encoder: el absoluto y el incremental. Voy a tratar exclusivamente el encoder incremental porque es el más sencillo de construir, económico y además puede tener la resolución que desees. Una vez que tienes la posición "cero", el encoder incremental se comporta igual que un encoder absoluto
Los encoders que aquí se describen están hechos, en principio, a base de barreras infrarrojas, se les llaman encoders ópticos. Sin embargo aconsejo usar Encoders con efecto Hall (son magnéticos), porque simplifica el circuito, es más barato que la barrera foto-detectoras y no le afecta la contaminación ambiental, cosa que en el óptico sí estaría 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 foto-barreras (pegadas la una contra la otra) leerán los pulsos y éstos más tarde se transformarán en una posición determinada. La imagen de la derecha es el esquema con las conexiones y sus valores. Haz clic en las imágenes si necesitas ampliación visual.
El disco no ha de ser de plástico porque la luz infrarroja suele atravesar la mayoría de ellos. La mejor opción es usar cartón rígido o chapa de una lata, ambos se pueden "mecanizar" (cortar en este caso) con unas simples tijeras. El cartón rígido lo puedes conseguir de alguna vieja libreta de "tapa dura". Usa un piñón de plástico o pequeño engranaje que encaje con el eje del motor y pegar el disco dentado con pegamento instantáneo al piñón o engranaje para hacer de base al disco dentado del encoder. De esta forma evitarás que el disco se mueva fuera de donde debe y se mantenga siempre plano. Las aspas (o dientes) y los vacíos 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 electrónica un poco especial para acondicionar las señales de entrada.
Tampoco hemos de usar encoders mecánicos (imagen de arriba). Este tipo de encoder, pese a ser muy atractivo y aparentemente funcional, da problemas. La razón se debe a que contiene contactos metálicos que hacen de "interruptor"; esta forma de funcionar produce mucho ruido eléctrico (además sufre desgaste) y requiere de un filtrado capacitivo (cada salida con un capacitor a masa). Son útiles para movimientos lentos, como por ejemplo el control de volumen del sonido. Desaconsejo usar este tipo de encoder
Los encoders incrementales tienen 2 salidas básicamente que sirven para saber el sentido de giro y pulso correspondiente. Normalmente para el reset o posición cero puede servir un simple pulsador que vaya a la electrónica del contador o del PIC, según el caso, como veremos más adelante.
Por muy buen encoder óptico que construyamos necesitamos acondicionar las dos señales de salida A y B. Si no acondicionamos estas señales, el encoder óptico no funcionará correctamente. Es muy importante entender esto. Hasta tal punto es importante que yo lo considero (metafóricamente hablando) como "el alma del encoder". Usaremos inversores con disparador Schmitt para acondicionar las señales de salida de las foto-barreras.
No basta con que sea disparador de Schmitt, además ha de ser de tecnología TTL. Esto quiere decir que sólo usaremos la tecnología de puertas NOT con disparador Schmitt de este tipo: 7414 ó 74LS14. Son las que yo he probado y funciona de maravilla. Nunca uses tecnología CMOS, por ejemplo 74HC14 (HC y HCT es CMOS), porque te fallaría más que una escopeta de feria (comprobado).
Expongo dos tipos de encoder dentro de los encoders incrementales. El encoder por Hardware (electrónico puro) es el más rápido, pero tiene como contrapartida más componentes que el encoder a través de un PIC. Todo depende de las necesidades del proyecto.
El encoder por Software se hace a través 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 más, he alimentado con 12 voltios motores de 3V y sigue funcionando perfectamente bien; esto es hasta donde yo he probado.
Todo lo que aquí se describe es de precisión, 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 propósito, siempre y cuando se siga a rajatabla las indicaciones que aquí se exponen y teniendo en cuenta que en el encoder por software pondremos como máximo 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.
Encoder por Hardware
El encoder por hardware tiene la particularidad de ser tremendamente rápido y los que aquí se describen pueden llegar a funcionar a más de 500 KHz de frecuencia de entrada (y diría que soportan varios MHz). Si estás buscando cómo construir un encoder extremadamente rápido esta información te será muy útil.
Se trata de detectar cuándo hay un flanco de subida, dando un pulso muy corto (de nano-segundos) pero suficiente para excitar la entrada de un contador reversible. Se describen dos tipos de encoder por Hardware: uno es para contadores reversibles con Up y Down independientes; el otro es para contadores reversibles que tiene una entrada llamada U/D (Up/Down) y la otra entrada se llama CP o Clock Pulse.
La idea principal es obtener un nano pulso cada vez que A está a 1 y en B se produce un flanco de subida. Sucede que si el encoder se mueve hacia la derecha obtenemos el nano pulso en el flip-flop de arriba (ver esquema de abajo). Cuando el encoder lo movemos hacia la izquierda deja de cumplirse esta condición porque estaría entrando flancos de bajada por tanto no daría pulsos este flip-flop. Lo mismo sucede en el flip-flop de abajo pero al revés, ya que la entrada tiene el CP (o también llamado Clock Pulse) negado con respecto al flip-flop de arriba.
Las dos salidas del encoder iría a un contador reversible con entradas Up y Down independientes.
El siguiente esquema ejemplifica la teoría.
Con más detalle: las señales entran por Encoder A y Encoder B. Cada vez que el CP (o clock) de cualquiera de los 74xx74 recibe un flanco de subida, y si la entrada D de los Flip-Flops está a 1, Q se pone a 1 y /Q se pone a 0. La señal de /Q va a una red de atraso de 4 inversores para crear el nano-pulso. Cuando esto sucede hay un tiempo de demora (de nano-segundos = 10^-9) provocado por cuatro puertas NOT consecutivas. Una vez que la señal se hace presente en el reset del Flip-Flop, Q pasa a valer 0. Dependiendo de si el disco del encoder va hacia delante o hacia atrás, sucede en un flip-flop o en el otro, nunca ocurre en los dos a la vez.
Si quieres montarlo en una protoboard te será más sencillo usar como red de atraso el integrado 74LS240 porque es un buffer inversor con 8 entradas/salidas. Se usa 4 puertas NOT (de las 8 que tiene el 74LS240) para el flip-flop de arriba y las otras 4 para el flip-flop de abajo. Queda así:
Necesitarás un contador reversible con salidas a LED para poder probar el circuito, si no, no podrás ver nada, ya que estos encoders funcionan con nano-pulsos y estos son invisibles a la vista.
Sólo los contadores son capaces de percibir periodos de pulsos tan pequeños, cualquier otra electrónica no sería capaz de contabilizarlos. Es obligatorio usa contadores reversibles.
Normalmente los contadores reversibles son de 4 bits. Poniendo 2 contadores en cascada tienes 8 bits de resolución (0..255), y poniendo 4 contadores reversibles tienes 16 bits de resolución (0..65535), así sucesivamente dependiendo de la resolución que necesites.
Aquí tienes el esquema completo para ver el conjunto de funcionamiento con un contador reversible con UP y Down independientes:
No todos los contadores reversibles tienen Up y Down independientes. Los más usados (y baratos) tienen una entrada llamada U/D (Up/Down) y la otra entrada se llama CP (Clock Pulse). Para este último tipo de contadores el esquema queda así:
Al igual que en el primer esquema podemos usar un 74xx240 para la red de atraso, quedando así:
Necesitarás un contador reversible con salidas a LED para poder probar el circuito, si no, no podrás ver nada, ya que estos encoders funcionan con nano-pulsos y estos son invisibles a la vista.
Sólo los contadores son capaces de percibir periodos de pulsos tan pequeños, cualquier otra electrónica no sería capaz de contabilizarlos. Es obligatorio usa contadores reversibles.
El esquema completo con un contador reversible con entradas CP y U/D queda así:
Recuerda usar disparadores Schmitt de tecnología TTL (7414 ó 74LS14) para acondicionar las señales del encoder óptico. Nunca uses disparadores Schmitt de tecnología CMOS (HC y HCT es CMOS), como por ejemplo el 74HC14, te daría fallos intermitentes, para el resto del circuito puedes usar la tecnología que quieras. Y ni qué decir que los encoder tipo potenciómetro (mecánicos) sólo dan problemas porque emiten mucho ruido eléctrico ya que funcionan por contacto mecánico.
Siempre es aconsejable poner condensadores de 100nF en las alimentaciones de los integrados (entre VCC y GND), especialmente en circuitos secuenciales: contadores, registros de desplazamientos, Flip-Flops (también llamadas "básculas", PICs, etc.
Encoder por Software
En esta página verás cómo hacer un PIC Encoder sencillo usando el PIC 16F876, y en general podrás usar cualquier PIC de la serie 16F. Si quieres ver un ejemplo para hacerlo con el PIC 18F4550 o con cualquiera de la serie 18Fxx5x, sin USB y con USB haz clic aquí. Las entradas A y B sólo vale para la contrucción de un encoder tipo foto barrera, usando por ejemplo dos TCST 1103. Para más información haz clic aquí. Y si usas sensores Hall digitales entonces puedes eliminar los dos acondicionadores de señal de entrada, en el esquema son los dos 74LS14.
La forma más eficaz de hacer un encoder a través de un micro-controlador (PIC) es usar la interrupción externa RB0/INT. Sucede que cuando salta una interrupción externa, el micro deja lo que estaba haciendo y se va a atender la interrupción inmediatamente. Esto sería una interrupción por Hardware, en nuestro caso es la interrupción RB0/INT. Gracias a esta característica y a que modificamos el registro INTEDG en cada flanco, sea éste de subida o de bajada, no pierde pulsos al contar. Uso en mis pruebas un disco con 5 aspas o dientes. Esto quiere decir que por cada vuelta que da el motor cuento 5 pulsos. En los test de pruebas hice muchas comprobaciones y siempre ha funcionado correctamente. He puesto el motor a toda velocidad, pruebas de vibración, de ponerlo entre dos estados, etc., y el encoder funciona correctamente. Por esta razón dejé la línea de fabricar el encoder por hardware (no confundir con las interrupciones por hardware de un PIC que en este apartado usamos) y me pasé al encoder por software que aquí se describe.
De momento sólo vamos a usar el encoder para moverlo a mano y ver a través de los LED cómo cuenta el PIC. Uso el PIC 16F876A, pero puede ser cualquier PIC que tenga INT/RB0 y conozcas bien. He escogido este PIC porque es muy conocido, económico y tiene suficientes entradas/salidas para poner los LED como puerto independiente y así la programación se hace más sencilla de entender. Recuerda que, si tu encoder es óptico, es esencial usar como acondicionador de señal un inversor disparador de Schmitt TTL, tipo 7414 o bien 74LS14. Nunca uses como acondicionador de señal la NOT convencional 7404 (porque no es Trigger Schmitt), ni tampoco usar tecnología CMOS, como por ejemplo el 74HC14 (HC y HCT es CMOS), porque te fallaría (comprobado). Y ni qué decir que los encoder tipo potenciómetro (mecánicos) sólo dan problemas porque emiten mucho ruido eléctrico ya que funcionan por contacto mecánico.
Si usas el encoder con sensores Hall digitales no hace falta poner las dos puertas NOT con disparador Schmitt a las entradas de este circuito, porque el encoder con sensores Hall digitales ya las lleva incluida dentro de su electrónica y puedes conectarlo directamente al PIC. Para más información haz clic en cualquiera de los enlaces indicados en azul de este párrafo.
Expongo dos versiones del programa PIC Encoder: en CCS y en Proton IDE.
Código PIC Encoder en CCS:
#include <16F876A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#ZERO_RAM
#byte porta = 0x05 // Asignamos PortA (No lo usamos).
#byte portb = 0x06 // Asignamos PortB (Usamos RB0 y RB1).
#byte portc = 0x07 // Asignamos PortC (8 salidas a LED).
// ------ Variables Globales ------
int8 x=0; //Declaramos el valor de X como byte, es decir, 8 bits.
// ---------- Interrupción ----------
#INT_EXT
void IntRB0()
{
//disable_interrupts(int_EXT);
if (bit_test(portb,0))
{
ext_int_edge(H_TO_L);
if (bit_test(portb,1))
{
x++;
}
}
else
{
ext_int_edge(L_TO_H);
if (bit_test(portb,1))
{
x--;
}
}
//enable_interrupts(int_EXT);
}
// ---------- Programa Principial ----------
void main()
{
port_b_pullups(FALSE);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//---- Fin de la configuración del 16F876A ----
enable_interrupts(int_ext); //Activar Interrupcion Externa.
ext_int_edge(L_TO_H); //Inicialmente Interrupción por Flaco de Subida.
enable_interrupts(GLOBAL); //Interrupciones Generales Activadas.
set_tris_a(0b111111); //Puerto A como entrada (No usado).
set_tris_b(0b11111111); //Puerto B como entrada (sólo usamos RB0 y RB1).
set_tris_c(0b00000000); //Puerto C todo como salida (Salida a LED, 8 bits).
While (true)
{
portc = x; //El valor de X sale por el puerto C, 8 LED de salida.
}
}
________________________________________
Código PIC Encoder en Proton IDE:
The translation could modify the code. Use the code without translating.
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 dispare
' por 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 por 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 por 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.
Context Restore ' Restablece el contexto de los registros tal como estaban antes de la
' interrupción.
SI te interesa puedes visitar mi este post mio acerca de la construccion de encoders con efecto hall:
Existen dos tipos de encoder: el absoluto y el incremental. Voy a tratar exclusivamente el encoder incremental porque es el más sencillo de construir, económico y además puede tener la resolución que desees. Una vez que tienes la posición "cero", el encoder incremental se comporta igual que un encoder absoluto
Los encoders que aquí se describen están hechos, en principio, a base de barreras infrarrojas, se les llaman encoders ópticos. Sin embargo aconsejo usar Encoders con efecto Hall (son magnéticos), porque simplifica el circuito, es más barato que la barrera foto-detectoras y no le afecta la contaminación ambiental, cosa que en el óptico sí estaría 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 foto-barreras (pegadas la una contra la otra) leerán los pulsos y éstos más tarde se transformarán en una posición determinada. La imagen de la derecha es el esquema con las conexiones y sus valores. Haz clic en las imágenes si necesitas ampliación visual.
El disco no ha de ser de plástico porque la luz infrarroja suele atravesar la mayoría de ellos. La mejor opción es usar cartón rígido o chapa de una lata, ambos se pueden "mecanizar" (cortar en este caso) con unas simples tijeras. El cartón rígido lo puedes conseguir de alguna vieja libreta de "tapa dura". Usa un piñón de plástico o pequeño engranaje que encaje con el eje del motor y pegar el disco dentado con pegamento instantáneo al piñón o engranaje para hacer de base al disco dentado del encoder. De esta forma evitarás que el disco se mueva fuera de donde debe y se mantenga siempre plano. Las aspas (o dientes) y los vacíos 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 electrónica un poco especial para acondicionar las señales de entrada.
Tampoco hemos de usar encoders mecánicos (imagen de arriba). Este tipo de encoder, pese a ser muy atractivo y aparentemente funcional, da problemas. La razón se debe a que contiene contactos metálicos que hacen de "interruptor"; esta forma de funcionar produce mucho ruido eléctrico (además sufre desgaste) y requiere de un filtrado capacitivo (cada salida con un capacitor a masa). Son útiles para movimientos lentos, como por ejemplo el control de volumen del sonido. Desaconsejo usar este tipo de encoder
Los encoders incrementales tienen 2 salidas básicamente que sirven para saber el sentido de giro y pulso correspondiente. Normalmente para el reset o posición cero puede servir un simple pulsador que vaya a la electrónica del contador o del PIC, según el caso, como veremos más adelante.
Por muy buen encoder óptico que construyamos necesitamos acondicionar las dos señales de salida A y B. Si no acondicionamos estas señales, el encoder óptico no funcionará correctamente. Es muy importante entender esto. Hasta tal punto es importante que yo lo considero (metafóricamente hablando) como "el alma del encoder". Usaremos inversores con disparador Schmitt para acondicionar las señales de salida de las foto-barreras.
No basta con que sea disparador de Schmitt, además ha de ser de tecnología TTL. Esto quiere decir que sólo usaremos la tecnología de puertas NOT con disparador Schmitt de este tipo: 7414 ó 74LS14. Son las que yo he probado y funciona de maravilla. Nunca uses tecnología CMOS, por ejemplo 74HC14 (HC y HCT es CMOS), porque te fallaría más que una escopeta de feria (comprobado).
Expongo dos tipos de encoder dentro de los encoders incrementales. El encoder por Hardware (electrónico puro) es el más rápido, pero tiene como contrapartida más componentes que el encoder a través de un PIC. Todo depende de las necesidades del proyecto.
El encoder por Software se hace a través 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 más, he alimentado con 12 voltios motores de 3V y sigue funcionando perfectamente bien; esto es hasta donde yo he probado.
Todo lo que aquí se describe es de precisión, 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 propósito, siempre y cuando se siga a rajatabla las indicaciones que aquí se exponen y teniendo en cuenta que en el encoder por software pondremos como máximo 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.
Encoder por Hardware
El encoder por hardware tiene la particularidad de ser tremendamente rápido y los que aquí se describen pueden llegar a funcionar a más de 500 KHz de frecuencia de entrada (y diría que soportan varios MHz). Si estás buscando cómo construir un encoder extremadamente rápido esta información te será muy útil.
Se trata de detectar cuándo hay un flanco de subida, dando un pulso muy corto (de nano-segundos) pero suficiente para excitar la entrada de un contador reversible. Se describen dos tipos de encoder por Hardware: uno es para contadores reversibles con Up y Down independientes; el otro es para contadores reversibles que tiene una entrada llamada U/D (Up/Down) y la otra entrada se llama CP o Clock Pulse.
La idea principal es obtener un nano pulso cada vez que A está a 1 y en B se produce un flanco de subida. Sucede que si el encoder se mueve hacia la derecha obtenemos el nano pulso en el flip-flop de arriba (ver esquema de abajo). Cuando el encoder lo movemos hacia la izquierda deja de cumplirse esta condición porque estaría entrando flancos de bajada por tanto no daría pulsos este flip-flop. Lo mismo sucede en el flip-flop de abajo pero al revés, ya que la entrada tiene el CP (o también llamado Clock Pulse) negado con respecto al flip-flop de arriba.
Las dos salidas del encoder iría a un contador reversible con entradas Up y Down independientes.
El siguiente esquema ejemplifica la teoría.
Con más detalle: las señales entran por Encoder A y Encoder B. Cada vez que el CP (o clock) de cualquiera de los 74xx74 recibe un flanco de subida, y si la entrada D de los Flip-Flops está a 1, Q se pone a 1 y /Q se pone a 0. La señal de /Q va a una red de atraso de 4 inversores para crear el nano-pulso. Cuando esto sucede hay un tiempo de demora (de nano-segundos = 10^-9) provocado por cuatro puertas NOT consecutivas. Una vez que la señal se hace presente en el reset del Flip-Flop, Q pasa a valer 0. Dependiendo de si el disco del encoder va hacia delante o hacia atrás, sucede en un flip-flop o en el otro, nunca ocurre en los dos a la vez.
Si quieres montarlo en una protoboard te será más sencillo usar como red de atraso el integrado 74LS240 porque es un buffer inversor con 8 entradas/salidas. Se usa 4 puertas NOT (de las 8 que tiene el 74LS240) para el flip-flop de arriba y las otras 4 para el flip-flop de abajo. Queda así:
Necesitarás un contador reversible con salidas a LED para poder probar el circuito, si no, no podrás ver nada, ya que estos encoders funcionan con nano-pulsos y estos son invisibles a la vista.
Sólo los contadores son capaces de percibir periodos de pulsos tan pequeños, cualquier otra electrónica no sería capaz de contabilizarlos. Es obligatorio usa contadores reversibles.
Normalmente los contadores reversibles son de 4 bits. Poniendo 2 contadores en cascada tienes 8 bits de resolución (0..255), y poniendo 4 contadores reversibles tienes 16 bits de resolución (0..65535), así sucesivamente dependiendo de la resolución que necesites.
Aquí tienes el esquema completo para ver el conjunto de funcionamiento con un contador reversible con UP y Down independientes:
No todos los contadores reversibles tienen Up y Down independientes. Los más usados (y baratos) tienen una entrada llamada U/D (Up/Down) y la otra entrada se llama CP (Clock Pulse). Para este último tipo de contadores el esquema queda así:
Al igual que en el primer esquema podemos usar un 74xx240 para la red de atraso, quedando así:
Necesitarás un contador reversible con salidas a LED para poder probar el circuito, si no, no podrás ver nada, ya que estos encoders funcionan con nano-pulsos y estos son invisibles a la vista.
Sólo los contadores son capaces de percibir periodos de pulsos tan pequeños, cualquier otra electrónica no sería capaz de contabilizarlos. Es obligatorio usa contadores reversibles.
El esquema completo con un contador reversible con entradas CP y U/D queda así:
Recuerda usar disparadores Schmitt de tecnología TTL (7414 ó 74LS14) para acondicionar las señales del encoder óptico. Nunca uses disparadores Schmitt de tecnología CMOS (HC y HCT es CMOS), como por ejemplo el 74HC14, te daría fallos intermitentes, para el resto del circuito puedes usar la tecnología que quieras. Y ni qué decir que los encoder tipo potenciómetro (mecánicos) sólo dan problemas porque emiten mucho ruido eléctrico ya que funcionan por contacto mecánico.
Siempre es aconsejable poner condensadores de 100nF en las alimentaciones de los integrados (entre VCC y GND), especialmente en circuitos secuenciales: contadores, registros de desplazamientos, Flip-Flops (también llamadas "básculas", PICs, etc.
Encoder por Software
En esta página verás cómo hacer un PIC Encoder sencillo usando el PIC 16F876, y en general podrás usar cualquier PIC de la serie 16F. Si quieres ver un ejemplo para hacerlo con el PIC 18F4550 o con cualquiera de la serie 18Fxx5x, sin USB y con USB haz clic aquí. Las entradas A y B sólo vale para la contrucción de un encoder tipo foto barrera, usando por ejemplo dos TCST 1103. Para más información haz clic aquí. Y si usas sensores Hall digitales entonces puedes eliminar los dos acondicionadores de señal de entrada, en el esquema son los dos 74LS14.
La forma más eficaz de hacer un encoder a través de un micro-controlador (PIC) es usar la interrupción externa RB0/INT. Sucede que cuando salta una interrupción externa, el micro deja lo que estaba haciendo y se va a atender la interrupción inmediatamente. Esto sería una interrupción por Hardware, en nuestro caso es la interrupción RB0/INT. Gracias a esta característica y a que modificamos el registro INTEDG en cada flanco, sea éste de subida o de bajada, no pierde pulsos al contar. Uso en mis pruebas un disco con 5 aspas o dientes. Esto quiere decir que por cada vuelta que da el motor cuento 5 pulsos. En los test de pruebas hice muchas comprobaciones y siempre ha funcionado correctamente. He puesto el motor a toda velocidad, pruebas de vibración, de ponerlo entre dos estados, etc., y el encoder funciona correctamente. Por esta razón dejé la línea de fabricar el encoder por hardware (no confundir con las interrupciones por hardware de un PIC que en este apartado usamos) y me pasé al encoder por software que aquí se describe.
De momento sólo vamos a usar el encoder para moverlo a mano y ver a través de los LED cómo cuenta el PIC. Uso el PIC 16F876A, pero puede ser cualquier PIC que tenga INT/RB0 y conozcas bien. He escogido este PIC porque es muy conocido, económico y tiene suficientes entradas/salidas para poner los LED como puerto independiente y así la programación se hace más sencilla de entender. Recuerda que, si tu encoder es óptico, es esencial usar como acondicionador de señal un inversor disparador de Schmitt TTL, tipo 7414 o bien 74LS14. Nunca uses como acondicionador de señal la NOT convencional 7404 (porque no es Trigger Schmitt), ni tampoco usar tecnología CMOS, como por ejemplo el 74HC14 (HC y HCT es CMOS), porque te fallaría (comprobado). Y ni qué decir que los encoder tipo potenciómetro (mecánicos) sólo dan problemas porque emiten mucho ruido eléctrico ya que funcionan por contacto mecánico.
Si usas el encoder con sensores Hall digitales no hace falta poner las dos puertas NOT con disparador Schmitt a las entradas de este circuito, porque el encoder con sensores Hall digitales ya las lleva incluida dentro de su electrónica y puedes conectarlo directamente al PIC. Para más información haz clic en cualquiera de los enlaces indicados en azul de este párrafo.
Expongo dos versiones del programa PIC Encoder: en CCS y en Proton IDE.
Código PIC Encoder en CCS:
#include <16F876A.h>
#FUSES NOWDT, XT, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#ZERO_RAM
#byte porta = 0x05 // Asignamos PortA (No lo usamos).
#byte portb = 0x06 // Asignamos PortB (Usamos RB0 y RB1).
#byte portc = 0x07 // Asignamos PortC (8 salidas a LED).
// ------ Variables Globales ------
int8 x=0; //Declaramos el valor de X como byte, es decir, 8 bits.
// ---------- Interrupción ----------
#INT_EXT
void IntRB0()
{
//disable_interrupts(int_EXT);
if (bit_test(portb,0))
{
ext_int_edge(H_TO_L);
if (bit_test(portb,1))
{
x++;
}
}
else
{
ext_int_edge(L_TO_H);
if (bit_test(portb,1))
{
x--;
}
}
//enable_interrupts(int_EXT);
}
// ---------- Programa Principial ----------
void main()
{
port_b_pullups(FALSE);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//---- Fin de la configuración del 16F876A ----
enable_interrupts(int_ext); //Activar Interrupcion Externa.
ext_int_edge(L_TO_H); //Inicialmente Interrupción por Flaco de Subida.
enable_interrupts(GLOBAL); //Interrupciones Generales Activadas.
set_tris_a(0b111111); //Puerto A como entrada (No usado).
set_tris_b(0b11111111); //Puerto B como entrada (sólo usamos RB0 y RB1).
set_tris_c(0b00000000); //Puerto C todo como salida (Salida a LED, 8 bits).
While (true)
{
portc = x; //El valor de X sale por el puerto C, 8 LED de salida.
}
}
________________________________________
Código PIC Encoder en Proton IDE:
The translation could modify the code. Use the code without translating.
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 dispare
' por 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 por 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 por 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.
Context Restore ' Restablece el contexto de los registros tal como estaban antes de la
' interrupción.
SI te interesa puedes visitar mi este post mio acerca de la construccion de encoders con efecto hall:

