Encoder Lazo Cerrado
Encoder Lazo Cerrado
Curso: 6R1
Fecha de entrega: 16/05/2020
Alumno:
· CAMOLETTO, Ivan Leg. nº:68500
1. Introducción---------------------------------------------------3
2. Especificaciones---------------------------------------------3
3. Solución Propuesta-----------------------------------------4
4. Componentes------------------------------------------------4
a. Detector de
Flancos---------------------------------------------------4
b. Contador 11 bits---------------------------------------6
c. Mux-4-Automático-------------------------------------7
d. Decodificador-Hex-7Seg----------------------------9
e. Contador-4-bit----------------------------------------10
f. Generador-Barrido----------------------------------11
7. Simulaciones finales--------------------------------------19
8. Test Bench-------------------------------------------------23
9. Conclusiones-----------------------------------------------24
2
Introducción
Un encoder se compone básicamente de un disco conectado a un eje giratorio. El disco está
hecho de vidrio o plástico y se encuentra “codificado” con unas partes transparentes y otras
opacas que bloquean el paso de la luz emitida por la fuente de luz (típicamente emisores
infrarrojos). En la mayoría de los casos, estas áreas bloqueadas (codificadas) están arregladas
en forma radial.
A medida que el eje rota, el emisor infrarrojo emite luz que es recibida por el sensor óptico
(o foto-transistor) generando los pulsos digitales a medida que la luz cruza a través del disco
o es bloqueada en diferentes secciones de este. Esto produce una secuencia que puede ser
usada para controlar el radio de giro, la dirección del movimiento e incluso la velocidad.
Como su nombre lo indica, es un encoder que determina el ángulo de posición por medio de
realizar cuentas incrementales. Esto quiere decir que el encoder incremental provee una
posición estratégica desde donde siempre comenzará la cuenta. La posición actual del
encoder es incremental cuando es comparada con la última posición registrada por el sensor.
Los encoders incrementales son un tipo de encoder óptico y este en este tipo de encoder cada
posición es completamente única.
Dentro de los encoders incrementales, se encuentran los encoders de cuadratura
corresponden a un tipo de encoder incremental que utiliza dos sensores ópticos posicionados
con un desplazamiento de 1⁄4 de ranura el uno del otro, generando dos señales de pulsos
digitales desfasada en 90º o en cuadratura. A estas señales de salida, se les llama comúnmente
A y B. Mediante ellas es posible suministrar los datos de posición, velocidad y dirección de
rotación del eje. Usualmente, si la señal A adelanta a la señal B (la señal A toma valor lógico
“1” antes que la señal B, por ejemplo), se establece el convenio de que el eje está rotando en
sentido horario, mientras que si B adelanta a A, el sentido será antihorario.
En este informe se utilizará un encoder incremental de cuadratura, con la salvedad que se
controlará por lazo cerrado con el fin de posicionar al encoder en un punto de interés, para el
usuario y con una precisión aceptable.
Especificaciones
3
● La señal de PWM debe ser máxima para una diferencia +- de 100 entre la cuenta de
los pulso (contador Up Down) y la de referencia.
● Se debe simular variaciones de posición del motor en forma aceleración y
desaceleración en el punto de referencia para demostrar el funcionamiento del PWM.
Solución Propuesta
Se propone realizar una descripción de VHDL en el simulador de Xilinx, el Ise 12.1, con el
fin de describir este PWM modificado. Se procederá a explicar cada componente por
separado hasta llegar al módulo VHDL principal siendo este el TOP del programa.
Componentes
Detector de Flancos
4
Este componente detecta los flancos y el sentido de giro del encoder. La secuencia que ve en
sentido horario el detector es 10-11-01-00, cuando se modifica la señal A, la salida auxiliar
sOutA se vuelve un 1 lógico y si la señal A no presenta cambios, sOutA sera un 0 lógico, esto
permite obtener un pulso de un ciclo de reloj y no una señal continua, cuando se detecta un
flanco.
La particularidad ocurre que cuando se detecta el flanco, podremos saber el sentido de giro
del encoder si la señal A es distinta a la señal B, si no ocurre esto, el encoder se mueve en
sentido antihorario y pSentido será igual a 0.
sOutB es análogo a sOutA en funcionamiento
Por último se tiene 2 salidas, pFlancos que serán todos los pulsos detectados en sentido
horario y antihorario. Para diferenciarlos se encuentra la otra salida pSentido.
5
Contador 11 bits
6
disminuyendo, debe pasar de 0 a 1999. sLoadUp y sLoadDown son señales que valdrán un 1
lógico, en los casos de desbordamiento del contador análogamente.
sLoad es una señal que se usa para determinar una condición, si es '1' se encuentra el
contador en los puntos límites y se iniciara la lógica de control. Si no, seguirá contando ya
sea en sentido Up o Down.
Este código (pág.7) permite multiplexar a cada display 7 segmentos un número hexadecimal.
Ps0/1/2/3, le corresponden vectores de 4 bits que son los números hexadecimales siendo Ps0
el menos significativo. Como se observará en el código del Top se obtienen estos valores del
contador de 11bits. Continuando con la descripción de la entidad se presentan 2 salidas, la
propia del multiplexor ¨pOut¨ y otra salida para controlar los displays pSel.
Como se observa por ciclo de reloj se muestra uno de los displays, comenzando con el
menos significativo y barriendo. En cuanto a la descripción se utiliza una plantilla de
multiplexor usando Case/When.
7
La simulación se la adjunta con el componente siguiente, el decodificador de hexadecimal a
7 segmentos.
8
Decodificador-Hex-7Seg
9
Contador-4-bit
Se agrega un contador de 4 bits para transformar el clk de 15Khz rápido en uno más lento
para los displays, en este caso de 1khz. Cabe destacar que en la implementación se puede
elegir hasta 3 clks externos, se puede implementar 2 clks de 15 Mhz y otro de 15 Khz.
Entonces con este contador de 4 bits obtener un clk de 1 Khz para los displays.
10
Generador-barrido
El propósito de este bloque es generar una salida PWM, proporcional a la diferencia que hay
entre la posición actual y la ingresada.
Para este bloque se ingresa 2 señales de 11 bits: La señal de carga ingresada por el usuario
(iValFijo) y la señal del contador de 11 bits(iValActual) que varía a medida que rote el
motor.
11
El primer paso es restar estas señales para saber cuál alejado se encuentra iValActual del
valor deseado. Para ello se realizará una resta donde la salida sea el módulo (sDif) y el signo
se encontrará en la señal (sSentido).
Para la generación del PWM se utiliza el método del contador, donde se genera una señal en
diente de sierra y se le asigna la diferencia de las señales en el medio, dado que cuando son
iguales, el ciclo de trabajo es al 50%.
En nuestro caso el rango de trabajo es de 200 y la referencia se encuentra en 100. Para llevar
la señal a ésta escala, a sDif se le sumará 110 en caso de que la señal esté por debajo o se le
restará a 110.
Se pueden apreciar dos detalles en lo dicho anteriormente:
- Se utiliza 110 en lugar de 100, para generar 10 cuentas donde el valor inferior sea si o si '0'
y así generar el margen inferior del 5%.
- Se toma los números como enteros sin signo, por lo que la resta 110 - sDif podría desbordar
hacia abajo. Para evitar esto, cuando solo ocurra este caso, si sDif es mayor a 100, se fija el
valor en 100. Con esta implementación se evita crear complejidad trabajando con números
negativos y el resultado obtenido es el mismo ya que la salida para una diferencia mayor a
100 es siempre la misma.
En sPWM se almacena esta señal generada por la comparación del contador, pero todavía
falta el margen superior. Para ello cuando el contador supera los 210, se genera un PWM que
con 5% de ciclo de trabajo, y se combina con una compuerta OR para generar la señal final
que excursiona entre 5% y el 95%.
Esto se determina, para no trabajar con duty cycles de 0 y 100% que son contraproducentes,
para la vida útil del encoder.
12
Simulación 4 : Duty Cycle al 50%
13
Simulación 6 : Duty Cycle al 5%
TOP: Encoder-Lazo-Cerrado
or último se presenta el Top del programa, cabe aclarar que las simulaciones del anterior
P
componente (Generador_Barrido), son en realidad las simulaciones del sistema completo solo
que enfocado en el análisis del PWM, en este Top se agrega la decodificación a 7 segmentos
y la instanciación de todos los componentes. Entonces se procederá a mostrar el código del
programa y las simulaciones del programa con la presentación del display. Si analizamos a la
descripción total como una caja negra, obtendremos 5 entradas. Estas son las señales de
cuadratura A y B del encoder, un clk de 15Mhz, un reset sincrónico y iLoad que será la
posición que busque el usuario del encoder desde 0 a 1999 pulsos presentado en binario
(11bits). En cuanto a las salidas se encuentran, la salida PWM (oPWM), el vector de
seleccion para los displays (oSelector) y el vector de salida para los 7 segmentos (oDisplay).
14
Se anexa a continuación el diagrama en bloques del TOP
Se procede con el código y por último se muestran las simulaciones POST FIT finales
15
16
17
Simulación 7 : Simu del Encoder muestra de los 7 segmentos
En la simulación 10 se muestra el correcto funcionamiento del display, mientras los display
0,2 y 3 presentan un 0, el display 1 presenta un 4. Formano un 0040 en hexa equivalente a 64
en decimal observado en la simulación.
18
Simulación 9 : Duty Cycle forzado al 95%
En las anteriores simulaciones se comprueba una vez más el buen funcionamiento, del
generador_barrido que nos brinda la salida del PWM, como se explicó anteriormente cuando
el valor requerido por el usuario se encuentra por encima de los +/-100 pulsos, se obtendrá
automáticamente un duty Cycle del 5% si el valor actual del contador es mucho más grande
que el pedido y viceversa.
19
Simulación 11 : Barrido segunda parte
n las simulaciones 10, 11 y 12 se realizó un barrido para apreciar al control del encoder
E
oscilando entre el 5% al 95%
20
Test Bench
21
22
En cuanto al test bench usado, es un loop para simular la señal en cuadratura del encoder, se
resetea al sistema y luego se procede a colocar como valor requerido por el usuario
(iValorFijo) igual a 192.
Conclusiones
El proyecto fue simulado en Ise 12.1 con la placa Spartan 3A XC3S200A. Cabe remarcar
que la convención del uso del sentido del PWM, se puede modificar con un inversor a la
salida del sistema. Así el 95% le corresponderá al control del encoder para su movimiento en
sentido horario del encoder y el 5% al sentido antihorario.
Toma relevancia el control de lazo cerrado, en esta clase de dispositivos debido a la
necesidad de la precisión, aun haciendo un control simple de PWM se obtiene muy buenos
resultados.
23