Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

15
IMPLEMENTACION DE UN CONTROLADOR PID CON UNA FPGA PARA POSICIONAR UN MOTOR DC SEMILLERO ADT EDGAR RODRIGO MANCIPE TOLOZA INTRODUCCION Hoy en día las FPGAs han incrementado su popularidad debido a su fácil adquisición, confiabilidad y bajos costos en el mercado, como consecuencia de ello se puede evidenciar cada vez más aplicaciones de las FPGAs en sistemas de control. A pesar de que los microcontroladores solían dominar este campo debido a su bajo costo, las FPGAs se han convertido en una opción más llamativa, gracias a su principal ventaja de controlar diferentes sistemas en paralelo, dentro de un solo sistema embebido 1 . El objetivo de este informe es presentar los pasos para programar un controlador PI con anti- windup dentro de una FPGA, y así controlar un motor de corriente continua mediante modulación de ancho de pulso (PWM), además de realizar un aporte e incentivar a todos aquellos interesados en el tema de control por hardware. MATERIALES Tarjeta DE0-Nano con FPGA: Cyclone IV EP4CE22F17C6 de Altera (Fig 1) Figura 1. DE0-Nano imagen tomada de http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&No=593&from=enbanner 1 Allen Houng. Interfacing a DC Motor with an FPGA. Terasic Technologies. Aug 10 , 2011

Transcript of Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

Page 1: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

IMPLEMENTACION DE UN CONTROLADOR PID CON UNA FPGA PARA POSICIONAR UN MOTOR

DC

SEMILLERO ADT

EDGAR RODRIGO MANCIPE TOLOZA

INTRODUCCION

Hoy en día las FPGAs han incrementado su popularidad debido a su fácil adquisición, confiabilidad

y bajos costos en el mercado, como consecuencia de ello se puede evidenciar cada vez más

aplicaciones de las FPGAs en sistemas de control. A pesar de que los microcontroladores solían

dominar este campo debido a su bajo costo, las FPGAs se han convertido en una opción más

llamativa, gracias a su principal ventaja de controlar diferentes sistemas en paralelo, dentro de un

solo sistema embebido1.

El objetivo de este informe es presentar los pasos para programar un controlador PI con anti-

windup dentro de una FPGA, y así controlar un motor de corriente continua mediante modulación

de ancho de pulso (PWM), además de realizar un aporte e incentivar a todos aquellos interesados

en el tema de control por hardware.

MATERIALES

• Tarjeta DE0-Nano con FPGA: Cyclone IV EP4CE22F17C6 de Altera (Fig 1)

Figura 1. DE0-Nano imagen tomada de

http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&No=593&from=enbanner

1 Allen Houng. Interfacing a DC Motor with an FPGA. Terasic Technologies. Aug 10 , 2011

Page 2: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

• Motoreductor: Par 18Kgcm

8384 pulsos por vuelta.

http://www.dynamoelectronics.com/components/com_virtuemart/shop_image/product/Mot

oreductor_18K_4c73f49babdca.png

• Display LCD HD44780

Figura 3. LCD alfanumérico 2x16

http://www.dynamoelectronics.com/components/com_virtuemart/shop_image/product/04

02%20LCD%2016x2%20verde.jpg

• Puente H L293D, 36V, 1.2A

Figura 4. Puente H L293D imagen tomada de

http://ca.digikey.com/1/1/394544

• Adicionalmente se hace

potencia

reductor: Par 18Kgcm - 80RPM - 12Vdc. Con encoder de cuadratura resolución de

8384 pulsos por vuelta. (Fig 2)

Figura 2. Motoreductor con encoder imagen tomada

http://www.dynamoelectronics.com/components/com_virtuemart/shop_image/product/Mot

oreductor_18K_4c73f49babdca.png

HD44780 2x16 monocromático (Fig 3)

Figura 3. LCD alfanumérico 2x16 imagen tomada

http://www.dynamoelectronics.com/components/com_virtuemart/shop_image/product/04

02%20LCD%2016x2%20verde.jpg

293D, 36V, 1.2A (Fig 4)

Figura 4. Puente H L293D imagen tomada de

http://ca.digikey.com/1/1/394544-ic-drvr-p-p-4ch-w-diodes-16-dip-l293d.html

Adicionalmente se hace necesario el uso de una fuente DC para alimentar la parte de

. Con encoder de cuadratura resolución de

imagen tomada de

http://www.dynamoelectronics.com/components/com_virtuemart/shop_image/product/Mot

mada de

http://www.dynamoelectronics.com/components/com_virtuemart/shop_image/product/04-03-

l293d.html

necesario el uso de una fuente DC para alimentar la parte de

Page 3: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

COMUNICACIÓN SERIAL

• Convertidor serial USB FT232R

Figura 5. FT232RL. Imagen tomada del datasheet FT232R

USB UART I.C. pag. 7

Adicionalmente se utilizara un convertidor serial USB, con el fin de graficar el error de posición,

tiempo de establecimiento y overshoot en labview, esto ayudara a ver los cambios en el

comportamiento del controlador al variar las ganancias. En este documento no se especificara

acerca del programa implementado para la comunicación serial entre FPGA – PC con el fin de no

extendernos tanto.

DIAGRAMA DE BLOQUES

Antes de empezar a programar la FPGA, es necesario definir la estrategia que se va aplicar para

controlar el sistema. Para ello se representará con un diagrama de bloques el método aplicado

para este caso. En la figura 6 se puede ver un ejemplo de ello.

Figura 6. Diagrama de bloques para el control PI. Fuente: Autor

Page 4: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

Para poder graficar la posición actual en el LCD es necesario tomar la señal del encoder, hacer un

acondicionamiento de señal, pasar la señal por una ROM y enviar los comandos al LCD por una

maquina de estados, de la siguiente forma:

Figura 7. Diagrama de bloques para graficar en un LCD. Fuente: Autor

PROGRAMACION

Una vez definida la estructura a seguir para controlar el motor, se procede a programar la FPGA en

HDL(Hardware Description Language) más explícitamente en Verilog, para ello se utilizará el

programa Quartus II 11.1

La programación se dividirá en diferentes submodulos, con el objetivo de tener un código

ordenado y fácil de entender.

1. SETPOINT:

Primero se programaran 4 posiciones de Set point que serán seleccionadas por 2 dip-switch de la

tarjeta DE0-nano. Dado que el encoder utilizado en esta ocasión genera 8384 pulsos por vuelta, se

deberá calcular el valor para cada posición deseada.

Adicional a este método de Setpoint por dip-switch, se han agregado dos módulos que permiten

variar el Setpoint con potenciómetro a través del ADC de la DE0-Nano.

2. POSICION ACTUAL

Page 5: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

Antes de calcular el error, necesitamos una señal que nos de la posición actual del motor. Debido a

que la posición del motor viene de un encoder de cuadratura, debemos generar un contador que

incremente y disminuya su valor dependiendo del sentido de giro del motor. Para ello se describirá

el circuito de la figura 8.

Figura 8. Quadrature

Decoder. Imagen tomada de http://www.fpga4fun.com/QuadratureDecoder.html

Una vez se describe dicho circuito, se debe delimitar el máximo y mínimo valor del contador,

dependiendo del encoder utilizado. De la siguiente forma:

Después de hacer esto, ya se tiene un valor guardado en un registro el cual se llamará

posicion_actual.

3. ADQUISICION DEL ERROR

A continuación se hace el cálculo del error, tomando la señal proveniente del

encoder(posicion_actual) y el dato seleccionado como set point.

Dado que el error puede ser negativo, es necesario describir un circuito que funcione como valor

absoluto para el error, mediante el complemento a dos a través de un mux 2:1

Page 6: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

4. ACCION DE CONTROL

Para describir el circuito que funcionara como controlador PI es necesario utilizar una maquina de

estados en donde se hace cada muestreo, se asigna la muestra y el error anterior de la siguiente

forma.

Page 7: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

Hay que tener en cuenta que la sintonización del controlador, dependerá del tipo de motor que se

esté utilizando, por lo cual los valores de Kp, Ki y T podrían variar según el caso, además de dichas

constantes, también se debe incluir la frecuencia del reloj encargado de realizar el tiempo de

muestreo. Para este caso las ganancias son las siguientes Kp=6, Ki=2, T=0.01s. la ecuación en

diferencias descreita, hace referencia a un PID, sin embargo en esta aplicación mantendremos la

ganancia derivativa Kp=0, por lo cual queda como un control PI.

5. ANTI-WINDUP

Debido a que los cambios rápidos en el Setpoint pueden saturar el controlador, es necesario

utilizar un anti-windup para ello. Los valores de saturación son 0 y 64000 el mínimo y el máximo

valor del PWM. Cuando la muestra se satura, se desactiva la parte integral y solo funciona la parte

proporcional hasta que baje la saturación. Próximamente en otro proyecto se empleara la técnica

de Armstrong para realizar el anti-windup.

Page 8: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

6. PWM

Para crear el modulador de ancho de pulso, se tomó el concepto de PWM análogo en donde se

usa un comparador con una señal triangular y una señal de continua, en la imagen se puede ver

un ejemplo de ello.

Figura 9. Representación de un PWM análogo. Fuente: Autor

En este caso dentro de la FPGA generaremos una rampa a partir de un contador y utilizaremos un

comparador. La rampa de 16 bits generada será nuestra señal dientes de sierra cuyo valor oscila

entre 0 y 65535. El contador de la rampa funciona con un reloj de 50Mhz, por lo cual la frecuencia

de la señal de salida PWM será de 763Hz. Para nuestro caso, la señal DC será el resultado de la

ecuación en diferencias “m_k”

7. SENTIDO DE GIRO

Para la lógica del sentido de giro se utilizara el bit de signo de la señal de error, dependiendo del

valor de este, se asignara la señal de salida del PWM a uno de los dos pines de control del puente

H.

Page 9: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

Sin embargo hay que tener en cuenta que el controlador al ser digital, el error debe tener una

zona muerta, en donde la acción de control no funcione dentro de dicho rango, esto se hace con el

objetivo de no convertir el control PI en un control ON-OFF para un error muy pequeño.

A continuación se describirán los pasos para graficar la posición en el LCD a partir de los pulsos

provenientes del Encoder de cuadratura.

8. ROM PARA LOS GRADOS

A partir del contador proveniente del modulo encoder_cuadratura, se va a seleccionar un valor

que lo represente en el display, para ello hacemos pasar dicho contador por una ROM de

posiciones, de esta forma obtendremos un valor en ascii para las unidades, decenas y centenas.

9. MAQUINA DE ESTADOS PARA GRAFICAR EN LCD

Una vez obtenidos los valores que representan las unidades decenas y centenas, se construye una

maquina de estados que realizara el proceso de graficar en el lcd

Page 10: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

Como se puede ver los primeros 7 estados son instrucciones para inicializar el display, y los

siguientes son para graficar el ascii seleccionado. Además los dos primeros bit del registro senal,

hacen referencia al comando de escribir.

10. COMPROBACION DEL CONTROLADOR EN LABVIEW

En esta etapa del documento se mostrara una pequeña prueba del funcionamiento del

controlador en labview, para ello se hizo necesario describir un modulo adicional de comunicación

serial USB e implementarlo con el integrado FT232R, los detalles de este modulo no se mostraran

en este documento.

Page 11: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

• PRUEBA 1

Entrada: escalón SetPoint: 180°

Kp=5 Ki=0 Kd=0

Se puede observar el error de posición cuando la ganancia integral es 0 y la ganancia proporcional

es pequeña.

• PRUEBA 2

Entrada: escalón SetPoint: 180°

Kp=10 Ki=0 Kd=0

Al incrementar la ganancia proporcional, solo logramos acercarnos un poco más a la posición

deseada, y aumentar la velocidad del motor, pero aun insiste el error de posición.

Page 12: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

• PRUEBA 3

Entrada: escalón SetPoint: 180°

Kp=5 Ki=3 Kd=0

Al encender la parte integral, el controlador corrige el error de posición, sin embargo se genera un

pequeño porcentaje de overshoot, la baja ganancia proporcional hace que el motor se demore en

alcanzar la posición deseada.

• PRUEBA 4

Entrada: escalón SetPoint: 180°

Kp=10 Ki=3 Kd=0

Al incrementar la ganancia proporcional e integral, obtenemos una respuesta más rápida y

cercana a la establecida por el setpoint

Page 13: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

• PRUEBA 2

Entrada: escalón SetPoint: 180°

Kp=10 Ki=17 Kd=0

Incrementar demasiado la ganancia integral, puede llevar a oscilaciones antes de llegar al régimen

permanente.

Page 14: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc
Page 15: Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc

REFERENCIAS BIBLIOGRAFICAS

[1] Allen Houng. Interfacing a DC Motor with an FPGA. Terasic Technologies. Aug 10 , 2011

http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&CategoryNo=49&No=577

[2] https://sites.google.com/site/semilleroadt/home

[3] Jean P. Nicolle Quadrature Decoder. Febrero 13 2008.

http://www.fpga4fun.com/QuadratureDecoder.html

[4] Antonio Visioli. Practical PID control. Springer-Verlag London Limited 2006