CURSO DE SENSORES Y TRANSDUCTORES
PRACTICA 8: SENSORES DE POSICIÓN Y VELOCIDAD CON ENCODERS.
1.1. INTRODUCCIÓN.
La creciente presencia de sistemas digitales para el tratamiento y presentación de lainformación en los
sistemas de medida y control hace muy atractivos aquellos transductores que ofrecen directamente a su
salida una señal en forma digital, por la sencillez que suponeel acondicionamiento de señales y su mayor
inmunidad a las interferencias electromagnéticas.Hay quedestacar que no existe prácticamente ningún
fenómeno cuya transducción ofrezca directamente una salida digital.Lo que se hace es convertir una
magnitud analógica de entrada en una señal digital por medio de un transductor, sin necesidad de
convertir una tensión analógica en su equivalente digital.Las aplicaciones de los codificadores de posición
son relativas a la medida y control de posición lineal y angular de alta resolución. Se emplean así en
robótica, plotters, máquinas y herramientas, posicionamiento de cabezales de lectura en discos
magnéticos y de fuentes de radiación en radioterapia, radares, orientación de telescopios...Esta práctica
se va a centrar en los transductores digitales, concretamente en los encoders.
1.2. ENCODERS INCREMENTALES.
En un codificador de posición incremental hay un disco, con poca inercia, que se desplaza solidario a la
pieza cuya posición se desea determinar, por ejemplo,el eje de un motor. El disco posee dos tipos de
zonas: transparente (agujeros) y opaca,dispuestas de formaalternativa y equidistante, tal como muestra la
figura(1.2.1)
Figura 1.2.1. Disco del encoder incremental
Mediante un cabezal de lectura fijo óptico se detecta el cambio de posición angular. La simplicidad y
economía de esta técnica no admiten duda, pero tiene una serie deinconvenientes que conviene señalar:
1.La información sobre la posición se pierde en cuanto falla la alimentación del sistema, o simplemente
cuando se desconecta, y en presencia de fuertes interferencias.
2.Es necesario un contador bidireccional para poder tener una salida digital compatible con los elementos
de entrada-salida de un ordenador.
3.No permite detectar el sentido de avance si no se dispone de elementos adicionales a los indicados en
la figura anterior.
En este caso, la diferenciación de las zonas o sectores se lleva a cabo de forma óptica, pero existen otras
formas como la magnética o la eléctrica. En cualquier caso, la salida básica es un tren de pulsos con un
ciclo de trabajo del 50%. Si se deriva esta señal, se obtiene un pulso por cada flanco ascendente o
descendente, con lo que es posible aumentar por dos el número de cuentas obtenido con un
desplazamiento dado.
Figura 1.2.2. Salidas de la señal en el encoder
Los codificadores ópticos pueden estar basados en sectores:
-Opacos y transparentes.
-Reflectores y no reflectores.
-Franjas de interferencia.
En cualquier caso, en el cabezal de lectura fijo hay siempre una fuente de luz (normalmente un LED) y un
fotodetector (LRD, célula fotoeléctrica o fototransistor).
Los problemas asociadosa este tipo de transductor son:
-Influencia del polvo ambiental.
-Variación temporal y térmica de las características de los elementos optoelectrónicos.
-Efecto de las vibraciones sobre los posibles sistemas de enfoque.
Cuando se emplean sectores opacos y transparentes (cromo sobre vidrio, metal ranurado...),el emisor y
el detector deben situarse uno a cada lado del elemento móvil, haciendo las veces de barrera
fotoeléctrica y el disco ranurado de objeto a detectar.
Los codificadores que ofrecen mayor resolución son los ópticos. La resolución obtenida conun encoger
óptico angular es del orden de 100 a 6000 pulsos por vuelta.
Para poder determinar el sentido de avance es necesario añadir otro elemento de lectura y, a veces, otra
pista codificada, junto con los circuitos electrónicos adecuados. Normalmente con unos biestables o unas
puertas lógicas se consigue obtener una señal indicadora del sentido de giro.
31.42 ras
100 pulsos 5 vueltas === 10pi
5vueltas/s ---5hz
10pi/s =10*31.416/s
20 pulsos ---------------- 1 vuelta
80 pulsos ---------------- x
X = 80 pulsos* 1vuelta/20pulsos = 4 vueltas
Figura 1.2.3. Señales de salida del Encoder Incremental.
En los encoders ópticos se añade una línea de sectores codificados que esté ligeramente desfasada
respectoa la primera y con su elemento de lectura correspondiente.En lailustración anterior se presenta
este disco codificado y las salidas que ofrecenlos cabezales de lectura A, B y C. Se observa que hay una
marca de referencia (cero) que indica vuelta completa.Si se desea realizar un posicionado absoluto es
necesario un contador bidireccional al que se le apliquen los pulsos de salida procesados por un circuito
como el de la siguiente figura:La señal B determina el sentido de giro, por tanto, determina si el contador
bidireccional varía de forma ascendente o descendente. La señal A determina la posición que se desea
medir, por esto se lleva a la entrada de reloj del contador. La señal C (un pulso por cada vuelta) sirve
como marca de referencia, puesta a cero o indicador de vuelta completa. El siguiente apartado explica el
funcionamiento de este sistema más detalladamente.
2.1 OBJETIVOS
Aprender los principios básicos de funcionamiento de un encoder de pulsos
Detectar su posición mediante una tarjeta de adquisición de datos (Microcontrolador, Arduino)
3. ELEMENTOS UTILIZADOS
4. MARCO TEORICO
4.1. CODIFICADOR DE CUADRATURA
Funcionamiento:
Básicamente consiste en un disco giratorio, el cual posee un gran número de
ranuras. Una fuente de luz estacionaria se encuentra montada fija a un lado del
disco, en el lado opuesto directamente enfrente del emisor de luz se hallan
ubicadas dos fototransistores.
Dichos fototransistores se encuentran desalineadas
respecto a las ranuras del disco giratorio en en una
distancia de 1/4 de la distancia existente entre dos ranuras, lo que permite
disponer de las señales Va y Vb desfasadas 90º entre sí. Este desfasamiento
nos permitirá discernir sobre el sentido de giro del disco. Por lo tanto, al girar el
disco las ranuras interrumpen el paso de la luz hacia las fototransistores,
obteniéndose de éstas las tensiones Va y Vb con un corrimiento de 1/4 de ciclo
o sea con un desfasadas 90º entre sí.
El numero de ranuras (N) que posee el disco dará la resolución en pulsos por
vuelta del codificador y se obtendrá un pulso de tensión cada 360º/N grados de
rotación del eje.
La señal que se obtiene de las fototransistor, debe ser acondicionada de
manera de hacerla compatible con los niveles de tensión TTL.
Cuando el disco gira en la dirección de las manecillas del reloj se observa que el fototransistor 'A' recibe
luz, mientras que el fototransistor 'B' está a oscuras, pero luego de una rotación adicional de 1/4 de la
distancia entre ranuras, la celda 'B' tendrá luz incidente.
Cuando el disco gira en la dirección contraria de las manecillas del reloj se observa que el fototransistor
'B' es la que recibe la luz, mientras que el fototransistor 'A' está a oscuras, pero luego de una rotación
adicional de 1/4 de la distancia entre ranuras, la celda 'A' tendrá luz incidente.
Por lo tanto para un giro continuo del eje del encoder se obtendrá la siguiente secuencia de valores
binarios:
*Girando el eje en el sentido de las agujas del reloj, se obtendrá:
2 - 3 - 1 - 0 - 2 y así sucesivamente.
*Girando el eje en el sentido contrario de las agujas del reloj, se obtendrá:
1 - 3 - 2 - 0 - 1 y así sucesivamente.
5. DESARROLLO
5.1. Descripción y Grafica de las salidas de los Encóders incrementales sin contacto Incremental, 128,
320 a 4096 Impulses per turn ( pulsos /rev ), según DNI. Si DNI termina en: 0 o 1128 pulsos/rev;
2320 pulsos /rev…. Si DNI termina :94096 pulsos/rev o utilizar encóders incrementales:
10 pulsos/rev, 15, 20, 30, 40, 50, 60, 100, 120, 125, 150, 180, 200, 240, 250, 256 (DNI termina en 0),
300 (DNI termina en 1), 360 (DNI termina en 2), 400 (DNI termina en 3), 480 …, 500 …, 512 …, 600
…, 720 …, 740 (DNI termina en 9), 800, 900, 960, 1000, 1024, 1200, 1250, 1440, 1500, 1800, 2000,
2048, 2500 pulsos/rev.
5.2. Cálculos de conversión: desplazamiento, velocidad y sentido de giro. En Hz, rpm grados y radianes
(encoder según DNI)
5.3. Diseño del circuito
5.4. Desarrolle un programa, para un microcontrolador o Arduino con pantalla Led
5.5. Simulación.
6. REFERENCIAS
7. ANEXOS REFERENCIALES
PROGRAMA REFERENCIAL 1.
La subrutina es llamada cada vez que se produce una interrupción por un cambio en el estado lógico de
los pines PB4-PB5 (recordar que los microcontroladores PIC poseen está característica).
Las variables utilizadas son:
AB_Bits_V -> indica el estado anterior de las líneas 'A' y 'B'.
AB_Bits_N -> indica el estado actual de las líneas 'A' y 'B'.
EncRotCont -> Contador de pulsos del encoder
Esta rutina determina si se ha producido algún error en la secuencia de los pulsos, en caso de error se lo
indica con el flag 'flgEncRotOK = LO'.
Haciendo uso de la función lógica or exclusivo entre el estado lógico anterior y actual de las lineas 'A' y 'B'
es posible determinar de manera muy sencilla el sentido de giro del eje del encoder.
El sentido de giro del encoder es indicado a través del flag 'flgEncRotDir'
#include <pic.h>
#include "encoder.h"
#include "general.h"
unsigned char EncRotCont;
bit flgEncRotDir;
bit flgEncRotOK;
void Rot_Encoder(void)
{
static unsigned char AB_Bits_V;
unsigned char AB_Bits_N, Aux;
AB_Bits_N = ((ENCODER_PORT) & ENCODER_MASK)>>4; // Leo port del encoder y desplazo la
cantidad
// de bits necesarios
// para obtenar la alineación correcta
Aux = AB_Bits_N ^ AB_Bits_V; // Or exclusivo
flgEncRotOK = LO; // Indico todavía no se sabe si hubo algún error
if (Aux==0) // Determino condiciones de error
goto RotEncNOcmb;
else if (Aux==3)
goto RotEncError;
if(((AB_Bits_V<<1) ^ AB_Bits_N)&0x02)
{
flgEncRotDir = ENC_GIRA_IZQUIERDA; // Indico que se gira hacia la IZQUIERDA
EncRotCont--; // Decremento el contador
}
else
{
flgEncRotDir = ENC_GIRA_DERECHA; // Indico que se gira hacia la DERECHA
EncRotCont++; // Incremento el contador
}
flgEncRotOK = HI; // Indico que se rotó el encoder
RotEncNOcmb:
RotEncError:
AB_Bits_V = AB_Bits_N; // Para que o haya errores
}
PROGRAMA REFERENCIAL 2.
DIEÑO Y CÁLCULO PARA LAS REVOLUCIONES POR MINUTO
Tiempo es la variable que contiene la cantidad de pulsos que existen en la ventana de tiempo. Se
multiplica por 60 porque un minuto tiene 60s
Si tempo =24, es decir 24 pulsos que hay en la ventana de 1 segundo del pic, entonces las revoluciones
serian, entonces habría 60 rpm. Si tempo es 48, entonces seria 120RPM.
ALGORITMO
Para hacer el algoritmo usamos el programa CCS, para el pic 16F873.
#Include <16F873.h> // Usamos el PIC 16F876A.
#Fuses NOWDT, XT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#Use Delay( Clock = 4000000 ) // Usamos un cristal de 4MHz, por ejemplo.
#Byte PortA = 0x05 // Dirección del puerto A
#Byte PortB = 0x06 // Dirección del puerto B
#Byte PortC = 0x07 // Dirección del puerto C
#define LCD_E PIN_C0
#define LCD_RS PIN_C1
#define LCD_RW PIN_C2
#define LCD_DB4 PIN_C4
#define LCD_DB5 PIN_C5
#define LCD_DB6 PIN_C6
#define LCD_DB7 PIN_C7
#include <flex_lcd.c>
// ------ Variable Global ------
int x=0;
int tempo=0; // Declaramos el valor de X como Byte, es decir, 8 bits. Esta variable
int S, conta;
long RPM=0;
// --------- Interrupción ---------
#Int_Ext // Interrupción Externa por RB0: Decodificación de Encoder.
Void IntRB0()
{
If (Bit_Test(PortB, 0)) // Si RB0 se ha puesto a 1 (flanco de subida),
{
Ext_Int_Edge(H_TO_L); // entonces activar la siguiente interrupción por flanco de bajada.
If (Bit_Test(PortB, 1)) // Si RB1 está a 1,
{
x++; // entonces incrementar una unidad el valor de X.
S=1;
}
}
Else // Si RB0 se ha puesto a 0 (flanco de bajada),
{
Ext_Int_Edge(L_TO_H); // entonces activar la siguiente interrupción por flanco de subida.
If (Bit_Test(PortB, 1)) // Si RB1 está 1,
{
x++; // entonces incrementar una unidad el valor de X
S=0;
}
}
}
#int_TIMER0
void TIMER0_isr(void)
{
conta++;
if (conta==250)
{
tempo=x;
x=0;
conta=0;
}
}
Void Main() // Inicio y configuración.
{
lcd_init () ;
Port_b_pullups(FALSE); // Configuración para el PIC 16F876A.
Setup_adc_ports(NO_ANALOGS); // Sin comparadores ni ADCs, todo digital, etc...
Setup_adc(ADC_CLOCK_DIV_2);
Setup_spi(SPI_SS_DISABLED);
Setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16);
Setup_timer_1(T1_DISABLED);
Setup_timer_2(T2_DISABLED,0,1);
Ext_Int_Edge(L_TO_H); // Inicialmente detectar interrupción por flanco de subida.
Enable_Interrupts(Int_Ext); // Activar Interrupción Externa.
enable_interrupts(INT_TIMER0);
Enable_Interrupts(GLOBAL); // Interrupciones Generales Activadas.
Set_Tris_A(0b111111); // Puerto A todo entradas (en este caso no usamos el Puerto A).
Set_Tris_B(0b11111111); // Puerto B todo entradas (sólo usamos las entradas RB0 y RB1).
Set_Tris_C(0b00000000); // Puerto C todo salidas (8 bits que irán a los LEDs).
// ---------- Programa Principial ----------
While (True)
{
RPM=tempo*2.5;
if (S==1)
{
lcd_gotoxy(1,1);
printf(lcd_putc," Horario \n %4lu RPM",RPM); // El valor de X sale por el Puerto C a los
8 LED de salida.
}
else if (S==0)
{
lcd_gotoxy(1,1);
printf(lcd_putc," Antihorario \n %4lu RPM",RPM); // El valor de X sale por el Puerto C a los
8 LED de salida.
}
}
SIMULACION DEL CIRCUITO
Se Mostrara la simulación para una velocidad de 365 RPM en sentido Horario.
SW1
B1
12V
SW-DPDT
LCD1
LM016L
U1
9 21
OSC1/CLKIN RB0/INT
10 22
OSC2/CLKOUT RB1
1 23
MCLR/Vpp/THV RB2
24
RB3/PGM
VDD
VSS
VEE
RW
2 25
RS
D0
D1
D2
D3
D4
D5
D6
D7
RA0/AN0 RB4
E
3 26
RA1/AN1 RB5
4 27
RA2/AN2/VREF- RB6/PGC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
5 28
RA3/AN3/VREF+ RB7/PGD
6
RA4/T0CKI
7 11
RA5/AN4/SS RC0/T1OSO/T1CKI
12
RC1/T1OSI/CCP2
13
RC2/CCP1
14
RC3/SCK/SCL
15
RC4/SDI/SDA
16
RC5/SDO
17
RC6/TX/CK
18
RC7/RX/DT
PIC16F873
Ahora se muestra las revoluciones para 365RPM en sentido anti horario.
SW1
B1
12V
+353
SW-DPDT
LCD1
LM016L
U1
9 21
OSC1/CLKIN RB0/INT
10 22
OSC2/CLKOUT RB1
1 23
MCLR/Vpp/THV RB2
24
RB3/PGM
VDD
VSS
VEE
RW
2 25
RS
D0
D1
D2
D3
D4
D5
D6
D7
RA0/AN0 RB4
E
3 26
RA1/AN1 RB5
4 27
RA2/AN2/VREF- RB6/PGC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
5 28
RA3/AN3/VREF+ RB7/PGD
6
RA4/T0CKI
7 11
RA5/AN4/SS RC0/T1OSO/T1CKI
12
RC1/T1OSI/CCP2
13
RC2/CCP1
14
RC3/SCK/SCL
15
RC4/SDI/SDA
16
RC5/SDO
17
RC6/TX/CK
18
RC7/RX/DT
PIC16F873
Ahora se reducirá la velocidad
Se coloca 120 y el 50% es 60, entonces las revoluciones son 60 RPM.
SW1
B1
12V
+59.3
SW-DPDT
LCD1
LM016L
U1
9 21
OSC1/CLKIN RB0/INT
10 22
OSC2/CLKOUT RB1
1 23
MCLR/Vpp/THV RB2
24
RB3/PGM
VDD
VSS
VEE
RW
2 25
RS
D0
D1
D2
D3
D4
D5
D6
D7
RA0/AN0 RB4
E
3 26
RA1/AN1 RB5
4 27
RA2/AN2/VREF- RB6/PGC
1
2
3
4
5
6
7
8
9
10
11
12
13
14
5 28
RA3/AN3/VREF+ RB7/PGD
6
RA4/T0CKI
7 11
RA5/AN4/SS RC0/T1OSO/T1CKI
12
RC1/T1OSI/CCP2
13
RC2/CCP1
14
RC3/SCK/SCL
15
RC4/SDI/SDA
16
RC5/SDO
17
RC6/TX/CK
18
RC7/RX/DT
PIC16F873