Implementacion de Un Controlador Pid Con Una Fpga Para Posicionar Un Motor Dc
-
Upload
mayte-becerril -
Category
Documents
-
view
340 -
download
2
Transcript of 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
• 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
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
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
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
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.
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.
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.
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
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.
• 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.
• 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
• 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.
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