Guion
Guion
Guion
————————————————————————————
Práctica de control de un motor de c. continua
Juan Jiménez
11 de octubre de 2022
El contenido de estos apuntes está bajo licencia Creative Commons Atribution-ShareAlike 4.0
©
http://creativecommons.org/licenses/by-sa/4.0/
Juan Jiménez
1
Índice general
2
Índice de figuras
3.1. Esquema de Simulink para manejo del motor en lazo abierto. Vista general . . . . . . . . . . . . 17
3.2. Estructura del bloque motor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3. Estructura del bloque Lector Encoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4. Señales producidas por un encoder en cuadratura al girar el motor . . . . . . . . . . . . . . . . . 19
3.5. Circuito equivalente para un motor de continua . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.6. Respuesta de un motor de cc a un voltaje de entrada escalón . . . . . . . . . . . . . . . . . . . . 22
3
Índice de Tablas
3.1. Tabla de lectura para los encoders. El signo indica el sentido en que ha girado el motor, Dec es
el núnero decimal representado por los 4 bits del registro . . . . . . . . . . . . . . . . . . . . . . . 20
4
Resumen
Estas notas describen el desarrollo completo de un sistema de control para la posición y la velocidad de un
motor de continua.
El motor empleado trabaja con un voltaje nominal de 12V. El motor lleva acoplado un encoder en cuadratura,
que permite conocer la posición angular relativa de su eje. Además del encoder, el eje del motor lleva también
acoplada una reductora que disminuye el número de revoluciones del eje del motor.
La alimentación del motor se regula mediante el uso de transistores de potencia que configuran un puente
en H. La tensión de suministrada por los transistores se controla mediante una señal de PWM.
Para controlar el motor se emplea una placa de desarrollo directamente programable desde Simulink ©
Este guión incluye la información necesaria para montar el sistema completo desde cero y poder llevar a
cabo una serie de prácticas relacionadas con la identificación, modelado y control del sistema. Cada una de estas
dos partes ocupa una sección diferente y ambas pueden leerse de modo independiente.
Capı́tulo 1
Motor: Se trata de un motor de corriente continua, alimentado mediante escobillas. Las caracterı́sticas fun-
damentales se describen en la tabla 1.1. El motor está pensado para trabajar a un voltaje nominal de 12 V. En
la práctica tomaremos dicho voltaje como el valor máximo admisible. Para alimentar el motor emplearemos una
controladora que permite variar el voltaje nominal recibido por el motor en el rango 0 − 12V y cuya descripción
general se dará más adelante. La figura 1.2 muestra una vista general del motor.
Reductora El eje exterior del motor no coincide con el eje de su rotor. Ambos están conectados entre sı́ por
un juego de ruedas dentadas que permiten desmultiplicar o reducir el número de vueltas. La relación de vueltas
entre el eje del rotor y el eje exterior es de 30 : 1, es decir el rotor da 30 vueltas por cada vuelta que observamos
en el eje exterior. La reducción en velocidad que supone esta transformación lleva inmediatamente asociado un
aumento del par mecánico. Es fácil comprobar este efecto sin más que tratar de girar el eje exterior del motor
con la mano y observar la resistencia que ofrece. La figura 1.3 muestra una vista parcial del mecanismo de la
reductora.
Encoder Este elemento, situado en la culata del motor, nos permite conocer el ángulo recorrido por el eje
del motor. Se trata de un encoder en cuadratura de efecto Hall. En general, un encoder es un dispositivo que
permite conocer la posición de un mecanismo, mediante la lectura de pulsos. En nuestro caso, los pulsos los
produce un juego de imanes permanentes, situados en el eje del motor, al excitar un par de sensores de efecto
Hall. La figura 1.4 Muestra una vista del encoder situado en la culata del EMG30. El disco central unido al eje
contiene los encoders y, por traterse de un encoder en cuadratura, tiene dos sensores de efecto Hall situados a
90o el uno del otro.
Si nos fijamos en el funcionamiento de uno de los sensores de efecto Hall, cada vez que uno de los imanes del
disco del eje, pasa por delante del sensor, este se excita produciendo un nivel de tensión alto, cuando el imán deja
de excitar al sensor, éste dará un valor de tensión bajo (equivalente a cero). Si el motor esta girando, la señal
2
Figura 1.1: Esquema del motor eléctrico EMG30
3
Figura 1.4: Vista del encoder situado en la culata del motor EMG30
Encoder A
0.8
0.6
pulsos
0.4
0.2
0
1 1.05 1.1 1.15 1.2 1.25 1.3 1.35 1.4 1.45 1.5
Time (seconds)
Figura 1.5: Señal producida en uno de los encoders (sensor de efecto Hall)al girar el motor
emitida por el sensor será una onda cuadrada, correspondiente a los niveles altos y bajos de voltaje descritos.
La figura 1.5 muestra un ejemplo de la onda generada. Como los imanes fijos están distribuidos uniformemente
entorno al eje del motor, es suficiente con conocer su número para conocer cuánto ha girado el motor. Ası́, por
ejemplo si tenemos tres imanes cada uno cubrirá un rango de 120o por tanto si contamos los flancos de subida
de la señal producida y multiplicamos por 120o , podemos calcular las vueltas que ha dado el motor. Podemos
refinar nuestras medidas un poco más si contamos tantos los flancos de subida como los de bajada. En el ejemplo
anterior de los tres imanes, la distancia entre dos flancos consecutivos (subida-bajada), (bajada-subida) será de
60o , con lo que si contamos todos los flancos duplicamos la sensibilidad de nuestro encoder.
Si usamos un solo sensor, como hemos descrito hasta ahora, nos encontramos con el problema de que no
sabemos el sentido de giro del motor, ni podemos tampoco detectar los cambios de sentido de giro. La solución
a este problema se consigue con el segundo sensor de efecto Hall, que está situado de modo que sus flancos
caen justo a mitad de los pulsos del primer encoder. El resultado de las señales de ambos sensores se muestra
superpuesto en la figura 1.6.
Si tomamos como referencia el sensor marcado como encoder A (rojo en la figura), si el motor gira en un
sentido, sus flancos de subida irán siempre seguidos por flancos de subida del encoder B, pero si gira en sentido
contrario entonces un flanco de subida de A irá seguido por un flanco de bajada de B. Además, cuando se de
un cambio de sentido de giro observaremos dos flancos seguidos del mismo sensor. Dos sensores ası́ dispuestos
constituyen lo que se conoce con el nombre de encoder en cuadratura. Adicionalmente, hemos duplicado el
4
Encoders A y B (Cuadratura)
0.8
Pulsos
0.6
0.4
0.2
0
1.02 1.04 1.06 1.08 1.1 1.12 1.14
Tiempo (s)
Figura 1.7: Esquema de la posición relativa de los sensores de efecto Hall (H1 y H2) y los imanes permanentes
para el encoder del motor EMG30. En la posición que se muestra, H2 estarı́a en un flanco e subida o bajada
–según la dirección de giro del motor– y H1 Estarı́a en en centro de un pulso
número de flancos, por lo que ahora, la distancia entre flancos es la mitad que para el caso de un solo sensor.
Si nos fijamos en las especificaciones de la tabla 1.1, se indica que el encoder cuenta 360 pulsos por revolución
del eje exterior del motor, cada pulso representa un cambio, es decir un flanco de subida o bajada en la señal.
La distancia entre dos pulsos serı́a por tanto de un grado. Esa es la máxima resolución que permite el encoder.
Podemos intentar a partir de este dato, deducir la configuración del encoder. Sabemos que la relación de la
reductora es 30:1, por tanto el eje del motor da 30 vueltas por cada una de las del eje exterior. Si dividimos
el número de pulsos entre el de vueltas del eje principal obtenemos 360/30 = 12 Es decir el encoder cuenta
12 pulsos por cada vuelta del eje del motor. Como tenemos dos sensores, cada uno de ellos deberá contar seis
pulsos, Tres de ellos corresponderán a flancos de subida (s) y tres a flancos de bajada (b) s-b-s-b-s-b. Por tanto
podemos deducir que, por cada vuelta del eje, cada sensor se ha excitado tres veces, lo que corresponde a tres
imanes equiespaciados en el disco giratorio situado en torno al eje. Cada imán excita al sensor cubriendo un
ángulo de 60o , entre los imanes hay una zona muerta que cubre también un ángulo de 60o . La disposición de los
sensores, situados a 90o , Explica su funcionamiento en cuadratura: Cuando un imán está centrado en un sensor,
el siguiente imán esta empezando a excitar al siguiente sensor, o acaba de excitar al anterior, dependiendo del
sentido de giro. La figura 1.7 muestra esquemáticamente este resultado.
5
V+
G1 G2
M
G3 G4
Variación del sentido de giro: Puente en H. Para controlar el sentido de giro del motor es habitual
emplear un circuito conocido como puente en H. La figura 1.8 muestra el esquema de un puente en H, construido
a partir de transistores. La configuración del circuito, –con el motor situado en el centro de una H formado por
los cuatro transistores– es la que da origen a su nombre.
El funcionamiento es sencillo de entender: los transistores actúan como interruptores de modo que si sumi-
nistramos una tensión de referencia a las puertas G1 y G4 manteniendo a tierra G2 y G3, circulará corriente
entre V + y tierra, cruzando el motor desde el terminal izquierdo al derecho, haciendo girar al motor en un
sentido. Si, por el contrario, damos tensión a G2 y G3, manteniendo G1 y G2 a tierra, la corriente atravesará
el motor desde el terminal derecho al izquierdo, haciendo girar el motor en sentido contrario. Los diodos tiene
por objeto proteger el motor durante la conmutación de una situación a otra1 .
Variación de la velocidad: Señal de PWM. Como se ha indicado antes, la velocidad a la que gira un motor
de continua varı́a directamente con el voltaje suministrado. Es más, en un cierto rango de voltaje, y dependiendo
del tipo de carga a que esté sometido, se puede considerar que velocidad y voltaje son proporcionales. Podemos
por tanto variar la velocidad del motor si somos capaces de variar el voltaje suministrado.
Un método frecuente de hacerlo es emplear una señal de PWM. Las siglas PWM provienen del Inglés Pulse
Width Modulation (Modulación por Ancho de Pulso). La figura 1.9 Muestra un ejemplo de una señal PWM. La
señal tiene tres parámetros caracterı́sticos importantes. El valor máximo de la señal en el ejemplo de la figura
serı́a Vmax = 10V . El periodo T define el tiempo transcurrido entre dos flancos de subida. Habitualmente, el
periodo suele definirse en función del tiempo de respuesta del sistema y se procura que sea significativamente
bajo respecto a éste. En el caso del ejemplo mostrado en la figura 1.9 T = 1ms. El Ciclo activo Duty Cicle ∆T
corresponde al periodo durante el cual la señal de PWM, está activa y alcanza su valor máximo. En el ejemplo
de la figura 1.9 ∆T ≈ 0,2ms.
Supongamos que hacemos llegar una señal de PWM a las Puertas G1 y G4 del puente en H de la figura 1.6.
Los transistores abrirán el puente durante el duty cicle de modo que el motor recibirá corriente solo durante
dichos periodos de tiempo. Sin embargo el tiempo de respuesta de un motor es, por lo general superior al periodo
T de la señal, por lo que no podrá arrancar y parar al ritmo de ésta. El resultado es que es motor filtrará la
señal quedándose con su valor medio. Si lo calculamos para un ciclo,
!
1 T
Z Z ∆T Z T
1 ∆T
VP W M dt = Vmax dt + 0dt ) = Vmax (1.1)
T 0 T 0 ∆T T
El motor estarı́a viendo una tensión que equivaldrá al valor la tensión de la fuente V + multiplicada por la
relación entre el duty cicle y el periodo de la señal de PWM. Si modificamos el el duty cicle entre 0 y T , El
voltaje variará entre 0 y V +.
1 El funcionamiento real y el papel de los diodos es un poco más complejo. Aquı́ solo se han expuesto las ideas más básicas.
6
Figura 1.9: Señal de PWM
El controlador X NUCLEO IHM15A1 Para controlar el motor emplearemos una placa con un microcon-
trolador junto con la placa de expansión X NUCLEO IHM15A1 fabricada por la compañı́a ST [6]. Dicha placa
emplea el circuito integrado STSPIN840 [5] que contiene dos puentes en H y todos los dispositivos necesarios
para la manipulación y protección de los mismos. A su vez, la placa viene preparada para su conexión directa
con las Placas STM32 Nucleo que, como se verá más adelante emplearemos tanto para generar las señales de
PWM como para registrar las lecturas de los encoders y controlar el comportamiento del motor. La figura 1.10,
muestra una imagen de la placa.
Entre las caracterı́stica principales de la placa, resalta que admite voltajes de entrada entre 7V y 45V , para
corrientes de hasta 1,5A por fase. Como se ha indicado anteriormente, el circuito contiene dos puentes en H,
marcados como puente A y puente B. En principio en la placa se puede configura cada puente por separado, o
los dos puentes juntos. De este modo, se podrı́a suministra corriente a dos motores, con posibilidad de invertir
su sentido de giro, o a un solo motor también con la posibilidad de invertir su sentido de giro. En nuestro caso,
emplearemos una configuración en la que alimentaremos un solo motor empleando los dos puentes a la vez, de
este modo podemos suministrar una corriente al motor de hasta 3A.
Pero antes de seguir adelante, examinemos la figura 1.8. En la parte superior de la imagen —tal como se
ha representado– encontramos una foto de la placa con un conector verde con seis tomas. De abajo arriba, la
primera es una entrada, marcada como GN D que debe conectarse al terminal negativo de la fuente. Corresponde
a la tierra o referencia de voltaje 0. La segunda toma Vs es la entrada de voltaje, debe conectarse al terminal
positivo de la fuente que se empleará para alimentar el motor. Para el caso de nuestro motor deberı́a conectarse
al terminal positivo de una fuente de 12V como máximo, puesto que ésta es la tensión nominal del motor (ver
sección 1.1.1). Representarı́a la entrada correspondiente al voltaje V + del puente en H (fig.1.8). Las tomas
tercera y cuarta son salidas que suministran voltaje a través de uno de los puentes en H que contiene la placa.
En concreto, se trata del puente A. Están marcadas con los sı́mbolos A1 y A2. Por último las tomas quinta y
sexta son las salidas de voltaje correspondiente al segundo puente de la placa –el puente B– están Marcadas
B2, B1.
Como se ha indicado anteriormente, en nuestro caso, vamos a usar ambos puentes a la vez para alimentar al
mismo motor. Para ello, (figura 1.10) es preciso colocar el jumper de modo paralelo Parallel mode jumper en la
posición PAR .Esto permite controlar a la vez los dos puentes con una sola señal para el sentido de giro y una
sola señal de PWM.
Nuestro motor deberá ir conectado a la placa de modo de la salidas V 1 tanto del puente A como del B estén
conectadas al cable rojo (V +) del motor y las salidas V 2 estén conectadas al cable negro (V −) del motor.
Por último debemos hablar de los pines de la placa desde los que controlaremos la dirección y la velocidad
del motor. Se trata de las entradas lógicas de la tarjeta. En el esquema de la figura 1.10, se han marcado cuatro
pines. Los dos en rojo ENA y ENB, Habilitan el puente en H A y el puente en H B, respectivamente. Ambos
deberán recibir un 1 lógico desde las correspondientes salidas de la placa del microcontrolador (ver sección 1.1.3).
El pin marcado en azul PWMA representa la entrada de la señal de PWM necesaria para controlar el puente
A. Dado que hemos colocado el jumper en la posición paralelo, esta señal activará a la vez tanto al puente A
como al puente B. Esta señal será tambien enviada desde la placa del microcontrolador. Por último, la entrada
marcada en verde como PHA, permite cambiar el par de puertas G1-G4 ó G2-G3 por las que se introduce la
7
Figura 1.10: Placa de expansión, X-NUCLEO-IHM04A1
8
Figura 1.11: Placa de desarrollo NUCLEO-F411RE
señal de PWM, cambiando de este modo el sentido de giro del motor. Para hacerlo girar en un sentido, debemos
enviar desde la salida correspondiente de la placa del microcontrolador un 0 lógico, para invertir el sentido de
giro, deberemos enviar un 1.
Los pines marcados en azul, EN-A y EN-B activan cada uno de los dos puentes, para ello, es preciso
alimentarlos con un 1 lógico.
La placa de expansión presenta más opciones de configuración que no emplearemos en estas prácticas. Los
interesados en saber más, pueden recurrir a las hojas de caracterı́sticas incluidas en la bibliográfia
1.1.3. El microprocesador
El siguiente paso es generar las señales de control necesarias para alimentar los pines lógicos de la placa
que acabamos de describir. Para ello emplearemos la placa de desarrollo Nucleo-411re STM32 fabricada por la
compañı́a STMicroelectronics. El corazón de la placa es el microcontrolador STM32F411RE, un ARM cortex
M-4. La figura 1.11 muestra una imagen de la misma. En dicha imagen, se pueden observar como la placa está
dividida en dos partes. La parte de la derecha, antes de llegar a los botones azul y negro, es un programador,
conocido como (ST-LINK), que permite introducir programas en la memoria del STM32F411RE, desarrollados
en un ordenador normal y compilados mediante el uso de un compilador C/C++ cruzado. El programador
se conecta al ordenador mediante el uso de un cable USB estándar. En el extremo de la placa se emplea un
conector miniUSB. Además de permitir descargar código en el microcontrolador, el programador permite emular
un puerto serie estándar, de modo que se puede emplear para enviar y recibir datos desde la placa al ordenador
en tiempo de ejecución. También permite depurar código, aunque esta opción no la emplearemos en las prácticas.
La parte de la izquierda de la placa, contiene el microcontrolador, un par de botones programables, un par de
leds y el resto de la circuiterı́a necesaria para hacer funcionar el microcontrolador. Además presenta dos juegos
de pines (pin-outs) distintos. El primero de ellos emula el pin-out de la famosa placa de desarrollo de Arduino.
De este modo, hace posible conectar a la placa del microcontrolador cualquier placa de expansión compatible
con la del Arduino. Se trata de los pines hembra que aparecen en la imagen de la figura 1.11. El segundo juego
de pines conocido como MORFO ofrece 64 pines macho.
En nuestro caso, emplearemos el pin-out compatible con Arduino. Una de las razones para ello es que la
placa de expansión que contiene los puentes en H para alimentar el motor, se inserta sobre la placa de desarrollo,
empleando dicho pin-out. De este modo, podemos identificar rápidamente los pines empleados por la placa de
expansión. Por su parte, la placa de expansión vuelve a replicar el pin-out de Arduino, con lo que los pines no
empleados por la placa de expansión quedan disponibles para otras aplicaciones.
La figura 1.12 muestra el esquema de conexiones del pin-out de arduino, ası́ como su nomenclatura. Si nos
fijamos, los pines están agrupados por conectores: CN5 con 10 pines, CN9 con 8 pines, CN6 con 8 pines y CN8
9
Figura 1.12: NUCLEO-F411RE. Pin-out compatible con Arduino, la nomenclatura es la de las etiquetas mar-
cadas en verde
.
10
Pin-out: Arduino
Conector CN5 Conector CN6 Conector CN8 Conector CN9
Pin Uso Pin Uso Pin Uso Pin Uso
D15 REFA +5V Vcc Encoders D7 PHB
D14 REFB GND Tierra Encoders D5 PWMA
A1 EncoderA D3 PHA
A0 EncoderB D4 PWMB
D11 ENB D2 ENA
Tabla 1.2: Pines empleados para controlar el motor. Los que aparecen en negro, están reservados pero no se
usarán
con 6 pines. La placa de desarrollo empleada es bastante potente y versátil, una descripción completa de la
misma excede el propósito de estas páginas. Los interesados en obtener más imformación pueden consultar el
manual de usuario de la placa [3].
V+ V+
Rpu
O
O
Rpd
Figura 1.13: Esquema de la conexión de una resistencia de pull-up (izquierda) y de la de una resistencia de
pull-down (derecha)
Un último detalle para terminar con la descripción del Hardware. La señal de PWM con la que se activan los
puentes en H, desde la placa de desarrollo, debe tener un valor de 0 bien definido. De no ser ası́, podrı́a suceder
que, al parar el motor, éste siguiera moviéndose por encontrar un valor de entrada distinto de 0 e interpretarlo
como un 1 lógico. Para asentar bien el valor de cero, se conectará el pin D5 a una resistencia de pull-down.
El esquema de dicha conexión se ha representado en la figura 1.13 (derecha). Su funcionamiento es análogo al
descrito antes para la resistencia de pull-up. Simplemente que ahora el objetivo es asegurar un valor 0 (tierra)
cuando el transistor correspondiente esté en corte.
La figura 1.14 muestra una imagen del montaje completo incluyendo el motor, el sistema de control y una
placa de inserción.
11
Figura 1.14: vista del montaje completo
12
Capı́tulo 2
13
Figura 2.1: Ventana de Matlab con el botón Add-ons señalado en rojo
14
El modelo desarrollado se ejecuta en modo PIL (Procesor In the Loop). En este modo, parte del código
se ejecuta en Simulink y parte en la placa, intercambiando ambos sistemas información a través de la
conexión USB.
Instalación del driver ST-Link/V2 USB Como se ha indicado antes, para intercambiar datos entre Si-
mulink y la placa de desarrollo se emplea la conexión USB, sobre la que se emula un puerto serie. Para que
funcione correctamente es preciso instalar un driver especı́fico suministrado por STMicroelectronics. El driver
puede descargarse de la página web: https://www.st.com/en/development-tools/stsw-link009.html.
Ejemplo de configuración Una vez que todo está instalado correctamente, vamos a ver mediante un ejem-
plo sencillo como crear y configurar un modelo de Simulink. Una primera cuestion MUY IMPORTANTE : la
programación de la placa de control emplea un fichero MAKEFILE para compilar-enlazar-descargar el software.
Dicho fichero da problemas si la ruta del archivo de simulink de nuestro modelo tiene nombres con caracteres
especiales o con espacio. Para asegurar que el proceso de compilación funcione correctamente lo mejoe es crear-
se un fichero de trabajo directamente en C:/ y darle un nonbre sencillo: C:/practica. (no acentos, no espacios
C:/Mis prácticas) La figura 2.3 muestra los pasos a seguir. En nuestro caso, vamos a crear un modelo que
permite mediante un botón deslizable encender y apagar un led de la placa. Para ello hemos seleccionado y
conectado los siguientes bloques; (ver figura 2.3a):
Simulink/Sources: Un bloque con una entrada constante.
Simulink/Dashboard: Un bloque Slider Switch
Simulink Coder Support Package for STmicroelectronics Nucleo Boards/Common: Un bloque Digital Write
El interruptor deslizable está conectado al bloque de entrada constante de modo que cambia su valor entre cero
y uno. El valor del bloque es enviado al pin que configuremos en el bloque Digital Write. Si consultamos el mapa
de pines de la placa (figura 1.12) comprobamos que el led1 está conectado al pin D13. Por tanto configuramos la
dirección del bloque Digital Write a dicha dirección (basta hacer doble clik en el bloque y escribir la dirección).
Una vez completado el modelo, necesitamos configurarlo para que Simulink genere el código y lo descargue en
la placa.
En primer lugar conectamos la placa a un puerto USB del ordenador. A continuación en la ventana de Simu-
link donde hemos construido el modelo, seleccionamos, en la parte superior la ventana la pestaña MODELLING,
Esto modifica las opciones de la ventana de configuración de parámetros que, abrimos a continuación pulsando
el botón settings. En el menú desplegable que aparece pulsamos la opción Model Properties (figura 2.3b).
Se abre una nueva ventana que nos permite configurar los parámetros del modelos. Seleccionamos la opción
Hardware implementation y elegimos de entre las opciones disponibles la que corresponde a nuestra placa: ST32
Nucleo F411RE (figura 2.3c).
Una vez selecionada, y dentro todavı́a de la opción Hardware implementation, desplegamos la pestaña Target
Hardware Resources y seleccionamos la opción External mode (figura 2.3d). Nos aparecerá una ventana en la
que se nos indica que la conexión entre ordenador y placa se realizará a través de un puerto serie (emulado
sobre el puesto USB). Debemos escribir la dirección de dicho puerto en la entrada marcada como Serial port.
En la figura 2.3e se ha introducido el puerto COM4.
Hay que comprobar en cada caso qué puerto serie ha asignado el ordenador a la placa cuando se conectó al
ordenador. Para hacerlo hay que ir a los parámetros de configuración del ordenador y buscar en Configuración
de dispositivos e impresoras el driver de la placa: STM32 STLink (figura 2.3g). Dentro de la propiedades del
driver, en la pestaña Hardware, encontramos el puerto COM asignado al driver (figura 2.3h).
Una vez acabado este proceso, y tras salvar los cambios, Volvemos a la ventana del modelo. Si se han
realizado los pasos anteriores correctamente, se habrá creado en la ventana del modelo una nueva pestaña con
la etiqueta HARDWARE. Esta es la pestaña en la que trabajaremos siempre que usemos la placa (figura 2.3f).
Compilación, descarga y ejecución del modelo Una vez configurado el modelo, siguiendo los pasos del
párrafo anterior, si pulsamos el botón Monitor & Tune del modelo, Simulink generará el código en C/C++
necesario, lo compilará, lo descargará en la placa y ejecutará el modelo durante el tiempo para el que se haya
ajustado la duración del experimento.
El proceso de generación/compilación/descarga de código lleva un rato, por lo que hay que tener paciencia
hasta que termine. Una vez terminado, Simulink genera una ventana de diagnóstico y lanza la ejecución. Si
durante este tiempo cambiamos la posición del botón deslizante, veremos cómo encendemos y apagamos el led
verde de la placa.
15
(a) Modelo (b) Acceso a la ventana de configuración
Figura 2.3: Ejemplo de modelo en Simulink para trabajar con la placa ST Nucleo
16
Capı́tulo 3
En esta primera práctica nos vamos a limitar a construir un modelo de Simulink que nos permita suministrar
al motor un valor fijo de voltaje, y leer su posición y velocidad a través de los encoders.
El bloque Motor si hacemos doble click sobre el bloque Motor del modelo, accederemos a la estructura del
subsistema que lo forma. La figura 3.2 muestra el contenido del bloque motor. Está compuesto por los siguientes
bloques de Simulink:
bloque PHA. Se trata de un bloque Digital Write de la librerı́a Simulink Code support Package for
STMicroelectronic Nucleo Boards. Recibe directamente el valor del bloque constante del modelo descrito
anteriormente. Dicho valor se envı́a directamente al pin D3, dicho pin corresponde a la entrada de PHA
Figura 3.1: Esquema de Simulink para manejo del motor en lazo abierto. Vista general
17
Figura 3.2: Estructura del bloque motor
del la placa de expansión que controla el motor y que se encarga de cambiar el sentido de giro del motor
(ver tabla 1.2 y figura 1.10). Nos permite por tanto controlar manualmente el sentido de giro del motor.
Bloque ENA. Idéntico al anterior. Se ha puesto a un valor fijo 1 y se ha configurado como pin D3. Se
encarga de habilitar el puente en H A de la placa de expansión.
Bloque ENB. De nuevo se trata de un bloque de escritura digital en este caso se ha configurado como pin
D11, por lo que habilita el puente en H B de la placa de expansión.
Bloque PWDA. Este bloque, pertenece también a la librerı́a Simulink Code support Package for STMi-
croelectronic Nucleo Boards. Se trata de un bloque que genera una señal de PWM y la envı́a a un pin
de la placa. Tiene dos parámetros de configuración: El pin al que se envı́a la señal, en nuestro caso se
ha configurado como pin D5, por lo que enviará la señal de PWM a la entrada PWDA de la placa de
expansión, suministrando por tanto el voltaje de entrada al motor. El segundo parámetro es la frecuencia
de la señal. Un valor de prueba adecuado para nuestro sistema serı́a 5000 Hz. La entrada del bloque
permite controlar o modificar el Duty cicle de la señal de PWM. El valor se da como un porcentaje del
periodo de la señal, es decir, debe tomar un valor entre 0 y 100. La señal enviada a la placa de expansión
a través del pin D5 es una señal lógica cuya amplitud vale 0 ó 1. Para el valor 0 no se suministrará tensión
al motor, para el valor 1 suministrará el valor de tensión de la fuente de alimentación, en nuestro caso 12
V. Ası́ un Duty Cicle de 100, supone alimentar el motor a un voltaje constante de 12 V, mientras que un
Duty Cicle de 50 supone alimentarlo a una tensión de 6V (ver seccion 1.1.2). Hay un tercer parámetro de
configuración que establece el valor del Duty Cycle inicial en nuestro caso puede dejarse a 0.
Bloque Encoder A. Se trata de un bloque Digital Read perteneciente a la misma librerı́a que los anteriores.
Esta vez, el bloque permite leer un valor digital en el pin para el que está configurado. En nuestro caso
se trata del pin A1, por lo que obtendremos el valor lógico (1 ó 0) de la tensión en dicho pin. En nuestro
caso, se trata del Encoder A del motor. El bloque necesita que se le fije como parámetro el periodo de
muestreo, es decir, cada cuanto tiempo se realiza una nueva medida del valor del pin. En nuestro caso lo
podemos fijar en 0.1 ms.
Bloque Encoder B. Análogo al anterior, con la salvedad de de utilizar el pin A0, pero en este caso nos va
a permitir la lectura del Encoder B.
Bloque Lector Encoder. Se trata de un bloque construido para leer la posición y la velocidad del motor a
partir de los valores obtenidos de los encoders. Describiremos su contenido en el siguiente párrafo.
Lector de las señales de los encoders El bloque Lector Encoder permite transformar las lecturas de
los Encoders en distancias angulares (grados) y en velocidades angulares (grado/s). La figura 3.3 muestra
los bloques con los que está construido. Para entender mejor su funcionamiento vamos a describir primero el
algoritmo empleado. Como se explicó en la sección 1.1.1 al describir el motor, éste emplea un par de encoders
en cuadratura, configurados de tal modo que, cada vez que se cruza un flaco de subida o bajada de uno de los
encoders, el eje de la reductora ha avanzado un grado.
18
Figura 3.3: Estructura del bloque Lector Encoder
Encoders A y B (Cuadratura)
0.8
Pulsos
0.6
0.4
0.2
0
1.02 1.04 1.06 1.08 1.1 1.12 1.14
Tiempo (s)
Supongamos que fijamos un tiempo de muestreo y vamos midiendo regularmente los valores de los enconders.
Comparando la lectura de los encoders en dos instantes de muestreo consecutivos podemos deducir si el motor a
avanzado un pulso de encoder y en qué dirección. Si nos fijamos en la figura 3.4 en que se representan de nuevo
las señales de los encoders, es fácil entender lo que se quiere decir: cada vez que un encoder cruza un flanco,
cambia la lectura del encoder correspondiente, y podemos considerar que el motor a avanzado un grado. Ası́ por
ejemplo, en el instante t = 0 de la figura la lectura de los dos encoders es encoderA(0) = 0, encoderB(0) = 0 y
seguirá ası́ hasta el instante t ≈ 1,02 en que la las lecturas cambiarán a encoderA(1,02) = 1, encoderB(1,02) = 0.
Podemos construir, a partir de las lecturas en dos instantes de muestreo sucesivos, un registro de cuatro dı́gitos
en el que, a medida que vamos obteniendo nuevas lecturas, actualizamos el valor de los registros, de modo que
guardamos la última lectura realizada por los encoders y la realizada en el instante de muestreo anterior. Ası́ en
el caso de la figura 3.4 y suponiendo un periodo de muestreo de los valores de los encoder de 0.01s, obtendrı́amos
una secuencia de valores:
encoderA(0,00) = 0, encoderA(0,01) = 0, encoderB(0,00) = 0, encoderB(0,01) = 0
encoderA(0,01) = 0, encoderA(0,02) = 0, encoderB(0,01) = 0, encoderB(0,02) = 0
encoderA(0,02) = 0, encoderA(0,03) = 0, encoderB(0,02) = 0, encoderB(0,03) = 0
···
encoderA(1,01) = 0, encoderA(1,02) = 1, encoderB(1,01) = 0, encoderB(1,02) = 0
encoderA(1,02) = 1, encoderA(1,03) = 1, encoderB(1,02) = 0, encoderB(1,03) = 0
···
Esta información se podrı́a codificar como un registro de 4 bits, correspondientes a los valores 1/0 de la
señal de los encoders. Su estructura y los valores posibles se muestran en la tabla 3.1. Los valores positivos
corresponden a un avance de un pulso (1 grado) entre los dos últimos instantes de muestreo. Los negativos
indican que el motor ha retrocedido un grado, los ceros indican que el motor no se ha movido. Por último, los
valores marcados con ’NA’ (No Aplicable) indican situaciones imposibles, nunca se dará dicho cambio en la
lecturas de los encoders, siempre y cuando el periodo de muestreo elegido se menor que la mitad del tiempo de
paso por dos flancos consecutivos de los encoders.
19
Encoder A Encoder B Pulso Dec.
T =i−1 T =i T =i−1 T =i
0 0 0 0 0 0
0 0 0 1 -1 1
0 0 1 0 +1 2
0 0 1 1 0 3
0 1 0 0 +1 4
0 1 0 1 NA 5
0 1 1 0 NA 6
0 1 1 1 -1 7
1 0 0 0 -1 8
1 0 0 1 NA 9
1 0 1 0 NA 10
1 0 1 1 +1 11
1 1 0 0 0 12
1 1 0 1 +1 13
1 1 1 0 -1 14
1 1 1 1 0 15
Tabla 3.1: Tabla de lectura para los encoders. El signo indica el sentido en que ha girado el motor, Dec es el
núnero decimal representado por los 4 bits del registro
En la última columna de la tabla se ha indicado el valor en decimal que corresponderı́a al registro de cuatro
bits que forman los valores de los encoders:
Dec = 23 · EncoderA(i − 1) + 22 · EncoderA(i) + 21 · EncoderB(i − 1) + 20 · EncoderB(i) (3.1)
Pasar el número a decimal nos permite codificar los valores en una tabla de modo bastante sencillo en
Simulink
Volvamos ahora a la figura 3.3 y examinemos los bloque de Simulink empleados.
En primer lugar las entradas 1 y 2 alimentan a un bloque unit delay de la librerı́a Simulink/discrete. Este
bloque representa un retardo puro, es decir, devuelve el valor del encoder A en el instante de muestreo anterior
al actual. Además, las salidas están conectadas a ganancias de valores 8, 4 , 2 y 1, y las salidas de las ganancias
están conectadas a un bloque sumador. Es fácil darse cuenta que el resultado de dicha operación arrojará el
valor decimal correspondiente al registro de los valores de los encoders, que acabamos de describir (eq 3.1).
La salida del sumador alimenta un bloque Direc look-at table de la librerı́a Simulink/look-at table. Se trata
de un bloque muy sencillo. El parámetro de configuración es, en nuestro caso, un simple array con los valores
correspondientes a la columna pulso de la tabla 3.1, escritos por orden:
[0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0]
Donde hemos sustituido por 0 los valores NA. El bloque espera en su entrada un número de ı́ndice para el array,
contrariamente a lo que es habitual en Matlab, los ı́ndices empiezan en 0 y no en 1. La tabla devuelve a la
salida el valor del array correspondiente al valor de la entrada. Ası́, para una entrada 0 devolverı́a un 0 para
una entrada 1 devolveria un -1, etc.
Como la entrada a este bloque debe ser un ı́ndice, es preciso fijar el tipo de variable para la salida del
bloque anterior (sumador). Para ello, basta hacer doble ’click’ en el bloque sumador, seleccionar la pestaña
signal attributes y en menu desplagable output data type seleccionar la opción ’double’.
La salida de la tabla está conectada a un bloque Unit delay Realimentado, Cada vez que se obtiene un nuevo
valor en la tabla, se suma a los valores anteriores, de modo que el lazo actúa como un acumulador de pulsos, la
salida será directamente la posición en grados del eje de la reductora del motor.
Por último, la salida del bloque Unit delay está también conectada a un bloque Zero-Order Hold (retenedor
de orden 0) de la librerı́a Simulink/discrete. Este bloque lleva su propio periodo de muestreo que, en nuestro
caso hemos fijado en 0.01. El bloque toma una lectura de la entrada —en este caso la posición calculada a partir
de los encoders— y retiene su valor durante el periodo de muestreo. El bloque alimenta a su vez a un bloque
discrete time derivative de la librerı́a Simulink/discrete que estima la derivada de la posición y por tanto la
velocidad. Se trata en realidad de una aproximación un tanto imprecisa que necesitarı́a de un posterior filtrado.
Pero para una primera aproximación nos puede valer.
Practica 1
1. Identificar todos los componentes de la planta. Placa de desarrollo, Placa de expansión, Motor, Fuente de
alimentación, etc.
20
2. Comprobar que todo el Hardware está configurado de acuerdo a la descripción de estas notas.
3. Montar el modelo de Simulink para el manejo del motor en lazo abierto. Configurarlo y comprobar que
funciona correctamente, haciendo que el motor se mueva.
4. Recoger datos de velocidad y posición para diversos valores del voltaje de entrada. Observar también las
señales de los encoders y discutir su validez.
R0 i(t) R
KA e(t)
M θ(t)
Modelo del motor El circuito de la figura 3.5 representa un motor de corriente continua y su sistema de
alimentación. Podemos considerar el sistema compuesto de dos partes:
Una parte eléctrica formada por un variador (Puente en H más señal de PWM) que recibe un voltaje de
entrada e(t) y devuelve un voltaje amplificado KA e(t). Además el amplificador tiene una resistencia interna R0 .
La parte eléctrica del motor (bobinado) viene representada por una autoinductancia L y una resistencia R.
Por último, podemos considerar que la caı́da de tensión (fuerza contra electromotriz) debida al giro del motor
es proporcional a la velocidad angular θ̇ con la que gira el rotor. La constante de proporcionalidad a depende
de las caracterı́sticas del motor. Si sumamos todas las caı́das de tensión en el circuito:
di(t) dθ(t)
L + (R + R0 )i(t) + a = KA e(t) (3.2)
dt dt
Una parte mecánica que podemos asociar al momento de inercia J del rotor y a la resistencia al giro
ofrecida por el rozamiento –que consideraremos proporcional a la velocidad angular a través de un coeficiente
de rozamiento viscoso µ.
El par ejercido por el motor, es proporcional a la intensidad que circula por el bobinado. La constante de
proporcionalidad vuelve a ser la constante del motor a. Por último, podemos suponer que la carga que mueve
el motor ejerce un par TL :
d2 θ(t) dθ(t)
J +µ = ai(t) − TL (t) (3.3)
dt2 dt
Sin embargo, la dinámica debida a la autoinducción L es mucho más rápida que la dinámica propia de la
mecánica del motor. Esto nos permite simplificar el modelo eliminando la variación de la intensidad –es tán
rápida que el resto del sistema siempre la ve en su estado estacionario–.
di(t) dθ(t)
L = 0 ⇒ (R + R0 )i(t) + a = KA e(t) (3.4)
dt dt
Si despejamos la intensidad de la ecuación 3.4 y sustituimos en 3.3, obtenemos:
d2 θ(t) a2
dθ(t) aKA
J 2
+ µ + = e(t) − TL (t) (3.5)
dt R + R0 dt (R + R0 )
La ecuación anterior la podrı́amos reescribir como un modelo en representación en variables de estados con
dos estados θ y ω = θ̇
21
1.4
1.2
0.8
0.6
y(t)
0.4
0.2
0
y =ke t/p-k e/p 2+ke e -pt/p 2
-0.2 y = ke t/p - k e/p 2
-0.4
0 0.5 1 1.5 2 2.5 3
t
En la mayorı́a de los casos desconocemos los valores de las parámetros del motor. Sin embargo, los agrupamos
en tres simples constantes, que podemos estimar experimentalmente:
a2
1 aKA 1 1
ke = , p= µ+ , km = (3.10)
J R + R0 R + R0 J J
Si, además consideramos un par de carga nulo TL (t) = 0, ∀t, los modelos se simplifican pasando a ser modelos
SISO:
θ̇ 0 1 θ 0
= · + e(t) (3.11)
ω̇ 0 −p ω ke
θ
y= 1 0 · (3.12)
ω
ke
θ(s) = e(s) (3.13)
s(s + p)
Identificación del motor Si calculamos la respuesta de nuestro sistema a una entrada escalón de valor
e(t) = V ,
ke −pt ke ke
θ(t) = V e +V t−V 2 (3.14)
p2 p p
La respuesta angular en estado estacionario es una lı́nea recta, que indica que el motor, tras pasar la fase
transitoria, gira con velocidad constante. La figura 3.6 muestra un ejemplo de la respuesta de un motor como
el que estamos modelando. Si obtenemos la pendiente de la recta correspondiente a la solución estacionaria y
su corte con el eje y, podemos estimar los parámetros Ke y p de nuestro motor. Este proceso puede hacerse a
partir de datos experimentales del motor, en cuyo caso recibe el nombre de proceso de identificación del motor.
22
Práctica 2
1. Obtener a partir de cálculo simbólico la expresión correspondiente a la posición angular de un motor de
continua (ecuación 3.14). Obtenerla a partir del modelo en variables de estado y a partir de la función de
transferencia. Calcular también la expresión correspondiente a la velocidad angular.
2. Construir un modelo del motor de cc en Simulink. Se puede hacer a partir de las ecuaciones de estado
o de funciones de transferencia, pero de modo que se pueda obtener tanto la posición como la velocidad
angular. El modelo deberá obtener los parámetros ke y p del workspace de Matlab. Emplear el modelo de
Simulink para el control del motor, construido en la práctica anterior, en lazo abierto para identificar el
motor real. Es decir para obtener sus parámetros ke y p. Para ello:
Obtener la respuesta del motor para distintos voltajes (por ejemplo incrementando el valor de la
entrada de dos voltios en dos voltios desde 0 a 12V) y un tiempo de simulación en todos los casos de
3s.
Calcular por regresión lineal la pendiente y el término independiente de la respuesta en estado
estacionario.
Estimar los valores de Ke y p para cada valor del voltaje de entrada ¿Qué se puede concluir?
3. Introducir los valores obtenidos de Ke y p en el modelo de motor desarrollado en Simulink (obtener unos
valores promedio razonables) Comparar los resultados del modelo con el sistema real.
23
Capı́tulo 4
En esta sección vamos a construir un regulador completo para controlar la posición del motor. Empezare-
mos construyendo un modelo realista completo del sistema, a partir de los datos obtenidos en el proceso de
identificación del capı́tulo anterior.
La figura 4.1 muestra tres versiones del modelo sencillo descrito en la sección anterior para un motor ideal
de corriente continua. Las dos primeras son versiones en variables de estados y la tercera una versión empleando
la función de trasferencia. Los tres modelos son equivalentes y cualquiera de ellos se puede emplear como núcleo
de un modelo más realista del motor que estamos empleando. El modelo basado en la función de transferencia
emplea en realidad dos en cascada. La razón es tener acceso no solo a la posición –que es la salida del sistema–
sino también a la velocidad que corresponde a la salida de la primera función de transferencia. Para ajustar
nuestro modelo al motor real empleado en la práctica, deberemos ajustar los valores de Ke y p a los valores
24
Figura 4.2: Esquema de Simulink del bloque construido para generar una señal de PWM
obtenidos en el proceso de identificación del motor, descrito en el apartado anterior. Se ha añadido una ganancia
a la salida del modelo que podrı́a ajustarse para modelar la reductora. Se trata tan solo de una constante y dado
que hemos identificado el motor empleando la posición del eje de la reductora, podemos asignarle directamente
valor 1.
Modelo del sistema de alimentación Para aproximar nuestro modelo al motor de la práctica, el siguiente
paso es construir un modelo de su sistema de alimentación. Sabemos que el motor recibe un nivel de tensión
variable mediante el empleo de una señal de PWM. Para emular dicho sistema, creamos un nuevo modelo de
Simulink como el que se muestra en la figura 4.2. El modelo se construye a partir de un bloque que reproduce una
señal en diente de sierra, construido a partir de un bloque Repeating Sequence de la librerı́a Simulink/Sources.
Este bloque espera como parámetros un vector de instantes de tiempo (Time values) comprendidos entre 0
y un tiempo final T , y un vector de valores de salida (Output values) de la misma longitud que el vector de
tiempos. El módulo, durante su ejecución, da como salida la secuencia introducida repetida periódicamente cada
T segundos. En nuestro caso empleamos los siguientes vectores como parámetros:
25
(a) Bloque desarrollado y ventana de parámetros
Figura 4.4: Modelo del alimentador de tensión al motor incluyendo el cambio de signo de voltaje.
26
Figura 4.5: Esquema del modelo incluyendo el motor y su sistema de alimentación
Una vez construido el sistema de alimentación del motor, podemos crear un modelo que incluya tanto la
alimentación como el modelo de motor ideal, empleando cualquiera de los esquemas de Simulink de la figura
4.1. La figura 4.5 muestra un ejemplo. En este caso, se ha optado por emplear el primero de los modelos en
variables de estado de la figura 4.1. El modelo del motor se ha enmascarado definiendo como parámetros del
modelo las constantes p y Ke. Se han conservado como variables de salida la posición y velocidad (angulares)
del eje del motor. Aunque dichas variables se han etiquetado como p(rad) y v (rad/s) las unidades dependen en
realidad del valor que se asigne a las constantes del modelo. Se ha añadido a la entrada del modelo un bloque
dead zone de la librerı́a Simulink/discontinuities. Este bloque sirve para simular la zona muerta del motor; es
decir, el voltaje mı́nimo por debajo del cual el motor no se moverá. Estrictamente deberı́a ir en el bloque que
simula el motor, pero esto complica el modelo. En realidad, la señal de PWM siempre da al motor el voltaje
máximo, lo que realmente limita es la corta duración del duty cycle cuando el voltaje de referencia es muy bajo.
Modelarlo exactamente ralentiza enormemente el tiempo de integración y genera errores de precisión. La forma
en que se ha modelado dará valores razonables, siempre que el periodo de la señal de PWM sea razonablemente
corto.
Modelado de los encoders Una vez modelados el motor y su sistema de alimentación, debemos modelar
también el comportamiento de los encoders. Como se ha descrito en las secciones anteriores, el motor real
dispone de dos encoders en cuadratura que suninistran un pulso –flanco de subida y bajada– por cada grado
que avanza el eje del motor. Podemos diseñar un modelo para ellos que utilice como entrada la salida del modelo
ideal del motor. Como los encoders están situados en cuadratura, la distancia recorrida por el motor entre un
flanco de subida y bajada de un encoder es de 2 grados. Además las lectura están entrelazadas. Entre flancos,
cada encoder deberá dar un valor constante – 1 ó 0 – dependiendo de la posición del eje del motor. La figura
4.6 ofrece un posible modelo para los encoders.
El modelo toma como entrada la salida del modelo del motor ideal, correspondiente a la posición angular
del eje. La ganancia etiquetada como paso a grados solo se emplea si la salida del motor se mide en radianes, si
se mide en grados tomará valor 1. Se han introducido dos bloque no empleados anteriormente, pertenecientes a
la librerı́a Simulink/math operations. Se trata del bloque floor que redondea un numero hacia cero y el bloque
rem que calcula el resto de la división entera de la entrada superior entre la entrada inferior.
Para analizar su funcionamiento, consideremos el motor parado al inicio de una simulación, El valor de la
posición p input del eje del motor es 0. El camino que lleva a la salida enc1 corresponder al encoder A. El modelo
suma un 1 constante a dicho valor y divide el resultado por dos. Tras el redondeo hacia cero, y el cálculo del
27
(a) Modelo del motor incluyendo el bloque del modelo de los encoders
(b) Modelo del motor incluyendo el bloque del modelo de los encoders
resto de la división entre dos, el valor de la salida será 0. La salida enc2, correspondiente al encoder B, también
tomará valor cero. Supongamos que avanza un grado la posición del eje del motor, la lectura del encoder A
cambiará a 1, mientras que la del encoder B seguirá siendo cero. Si el motor avanza un grado más, la lectura de
A se mantiene en su valor 1, y la de B pasará a valer 1. Es fácil observar que, en el periodo comprendido entre
incrementos de un grado, ambos encoders mantendrán constante su valor de salida y que la secuencia temporal
de ambas señales reproduce la que cabrı́a esperar para dos encoders en cuadratura. Para probarlo, podemos
encapsular nuestro modelo en un bloque, conectar su entrada a la salida del modelo del motor y simular el
modelo completo. Las figuras 4.7a y 4.7b muestran el modelo completo y las señales de salida obtenidas para
los encoders.
Con todos los elementos anteriores hemos construido un modelo completo del motor. Podemos alimentarlo
con un voltaje de referencia y obtener los valores que nos darı́an las lecturas de sus encoders. Por último
podrı́amos emplear el mismo bloque lector encoders descrito en la figura 3.3 para leer los pulsos del bloque
encoder y obtener los valores de la posición angular y la velocidad del eje de la reductora del motor. Podemos
además comparar dichas salidas con las que suministra el bloque motor que hemos construido y ver el efecto de
la cuantización y el muestreo sobre las salidas del motor. La figura 4.8 muestra un ejemplo en que se comparan
dichas salidas. Se ha buscado un caso en el que se notan especialmente estos efectos. Ası́, los escalones en la
lectura de la posición realizada con los encoder son claramente visible en la parte superior de la figura. Además
se ha elegido un tiempo ∆t = 1s en que se observa claramente el efecto del retenedor de orden cero sobre la
medida de la velocidad. El algoritmo empleado para estimar la medida de la velocidad es sencillo, pero no es
nada robusto. El motor alcanza su velocidad estacionaria en menos de 1s pero el lector no es capaz de detectarlo.
Una vez alcanzada dicha velocidad, el lector oscila por encima y por debajo del valor real. Si disminuimos el
valor de δT , esta oscilación se hará aún más acusada. Si lo aumentamos, acumularemos aún un retardo mayor
en la detección de los cambios de velocidad. No podemos por tanto emplear esta medida directamente para
controlar el motor.
Práctica 3
1. Construir un modelo completo del motor, a partir del modelo de motor ideal construido en la Práctica 2.
Añadir el mismo bloque de lectura de encoders construido para leer los encoders del motor real.
28
Figura 4.8: Comparación entre las variables de salida posición y velocidad obtenidas por el modelo del motor y
el valor de dichas variables obtenidas a partir de la lectura de los encoders
2. Simular el comportamiento del modelo para distintos valores del voltaje de entrada Vref.
Comparar la salida directa (posición y velocidad) del motor con la que se obtiene a partir de la
lectura de los encoders
Comparar los valores de las lecturas de velocidad y posición obtenidas a través de los encoders para
el motor real y para el modelo.
El sistema tiene un polo real negativo y un polo en el origen. Lo que corresponde al comportamiento fı́sico
observable. Si suministramos una entrada escalón (Vref = cte) el motor se mueve indefinidamente con velocidad
constante.
Realimentación de estados. Podemos empezar por diseñar un controlador por realimentación de estados,
para mover los polos del sistema. Podemos emplear para calcular las ganancias de la realimentación cualquiera
de las funciones definidas en Matlab para este propósito: acker o place. Aunque teóricamente los polos pueden
situarse en cualquier lugar del semiplano negativo complejo, hay que tener en cuenta que cuanto más a la
izquierda los situemos más grande será el valor de la variable (Vref) demandada por el motor durante el
transitorio. Por otro lado, si elegimos polos cercanos al eje imaginario, la respuesta del sistema puede ser
muy lenta y demandar tensiones tan bajas que el motor real entre en su zona muerta y no alcance el estado
estacionario. Un posible ajuste inicial, puede ser, situar ambos polos relativamente cerca del valor p obtenido
para el polo p del motor durante la identificación realizada en las prácticas anteriores. Por ejemplo podemos
calcular cuáles serı́an las ganancias k = [k1 , k2 ] de la realimentación de estados si situamos los polos en p1 = 0,5p
y p2 = 0,5p1 . Podemos además obtener la evolución de los estados si partimos del modelo de motor ideal que
diseñamos en la práctica anterior.
La figura 4.9b muestra los resultados de un ejemplo de dicho sistema. Se ha considerado la posición inicial del
motor x1 = 2o y la velocidad inicial x2 = 1o /s. Los valores Ke = 100 y p = 50 se han tomado arbitrariamente
y no tienen por qué corresponder con los del motor estimado. La entrada con el bloque escalón se ha puesto
1 Si colocamos ambos polos en la misma posición será preciso emplear acker para obtener las ganancias
29
(a) Modelo del sistema realimentado
0
-5
-10
Posicion (deg)
-15
velocidad (deg/s)
-5
-10
u
a cero. La señal u representarı́a en este modelo el voltaje Vref. suministrado al motor. La realimentación de
estados diseñada es capaz de llevar el motor a su posición cero, como era de esperar. Dado que hemos fijado
la entrada a cero, la realimentación de estados está respondiendo exclusivamente a los valores iniciales de los
estados del sistema.
Diseño de un estimador Como ya hemos descrito más arriba, de las dos variables de estado que definen
nuestro sistema, la velocidad resulta difı́cil de precisar, sobre todo cuando el motor acelera o frena. Se hace por
tanto necesario diseñar un sistema que emplee realimentación de estados estimados. Para diseñarlo, gracias al
principio de separación, podemos calcular la ganancia L del estimador, empleando de nuevo acker o place y
conservar las ganancias K obtenidas para la realimentación de estados. Podemos colocar los polos del estimador
a la izquierda del polo p del motor, por ejemplo pe1 = 1,2p y pe2 = 1,2p. Podemos ahora repetir la simulación,
empleando la realimentación de los estados estimados en lugar de los estados reales. Para ello, añadimos al
modelo de Simulink de la figura 4.9a un estimador de estados, empleando de nuevo los datos obtenidos para
el motor real en la práctica de identificación. El modelo completo resultante se muestra en la figura 4.10a.
La estructura del estimador, corresponde al modelo completo en variables de estado. Las matrices A, B, C
corresponden a las matrices del sistema (motor ideal), K = [K1 , K2 ], corresponden al vector de ganancias de
la realimentación de estados, obtenidas anteriormente, y L = [L1 , L2 ]T es el vector de ganancias del estimador.
Es importante hacer notar que los bloques de ganancias del modelo de Simulink hay que configurarlos para que
calculen productos matriciales. El modelo está construido de modo que toma todos los parámetros del sistema
del work space de Matlab. Al modelo se le ha añadido una ganancia de entrada a la que se ha dado valor 1.
Corresponde al valor de la ganancia F de acción directa. El valor asignado es arbitrario por lo que no cabe
esperar que el motor alcance la posición de consigna indicada por la entrada escalón.
La figura 4.10b muestra la evolución de los estados del sistema ası́ como la de los estados estimados, para
una entrada escalón de valor 5. Puede observarse como el motor alcanza una posición final, y como los estados
estimados convergen a los reales antes de alcanzar el estado final. La convergencia es lo suficiente rápida para
que el sistema siga una trayectoria muy parecida a la del caso anterior, 4.9b en que se empleaba realimentación
de estados reales. Lógicamente, se podrı́a acelerar dicha convergencia, desplazando los polos del estimador más
a la izquierda. Se observa también que el sistema no alcanza el valor de la entrada. Esto era de esperar puesto
que no hemos ajustado el valor de la ganancia F , para que esto ocurra. De hecho, no vamos a calcular dicho
30
(a) Modelo del sistema con el estimador de estados
Posición estimada
-5 Posicion (deg)
velocidad (deg/s)
velocidad estimada
-10
0 0.1 0.2 0.3 0.4 0.5 0.6
4 u
-2
-4
-6
0.1 0.2 0.3 0.4 0.5 0.6
Time (seconds)
Figura 4.10: Realimentación de estados estimados para el motor ideal. La entrada es un escalón de valor 5
Acción integral Si añadimos acción integral al sistema de control, conseguimos que el motor siga a la entrada
de referencia. Debemos para ello calcular la ganancia ki correspondiente a la acción integral. Tenemos dos modos
de hacerlo. Podemos colocar de nuevo los tres polos en posiciones pre-establecidas y emplear acker o place para
obtener las ganancias K = [K1 , K2 , Ki ]. Esto nos da la oportunidad de mantener los polos de la realimentación
de estados en la misma posición que estaban cuando no se empleaba acción integral. Tenemos también la
alternativa de conservar las ganancias calculadas previamente para la realimentación de estados y emplear la
técnica del lugar de las raı́ces para obtener la ganancia ki . Con esto tendrı́amos nuestro motor ideal controlado
en posición. La figura 4.11a muestra el controlador completo. Se ha recuadrado en rojo la parte que corresponde
a la acción integral y en azul la parte que corresponde al estimador de estados.
Para este ejemplo, se ha cambiado la posición de los polos. Ası́ los polos del motor se han situado en
p1 = −15, p2 = −15, el correspondiente al estado de la acción integral en pi = −20 y los polos del observador
en pe,1 = −30, pe,2 = −30. El modelo del motor sigue empleando Ke = 100 y p = 50. La entrada escalón sigue
teniendo un valor final 5.
La figura 4.11b muestra, en la gráfica superior, la evolución de los estados del sistema ası́ como la de los esta-
dos estimados. Puede observarse como, ahora el motor si consigue alcanzar la posición angular 5 correspondiente
al valor de referencia consignado por la entrada escalón.
En la gráfica inferior se ha representado el estado de la acción integral z junto con el valor de la entrada
u. Es interesante notar, como el estado z alcanza un valor estacionario distinto de cero, cuando el motor ha
alcanzado su valor estacionario.
Hemos prestado poca atención a u, el valor obtenido para la señal de entrada. Es importante recordar que
dicho valor corresponde al voltaje Vref con que debemos alimentar el motor. Conviene recordar que dicho valor
no puede superar el valor Vmax = 12V en el sistema real. Ahora que tenemos un modelo completo, podemos
estudiar el efecto de la posición de los polos —y, por tanto, de las ganancias K y L— tanto en la respuesta del
sistema como en los valores que alcanzará la señal de entrada u.
31
(a) Modelo del sistema con el estimador de estados
15
Posicion estimada
Posicion (deg)
10 Velocidad (deg/s)
Velocidad estimada
5
6 z
u
Ası́ mismo podemos observar también el efecto que tiene el error en posición del motor, es decir, la diferencia
entre la posición angular de su eje y el valor de referencia o valor final que debe alcanzar θr − θ(t).
Si el sistema de control demanda valores mayores que Vmax , esto no tiene efecto alguno en el sistema
ideal, pero llevará a una saturación en la entrada del sistema real. En principio esto no deberı́a tener mayores
consecuencias en el motor real, que simplemente girarı́a a velocidad máxima hasta acercarse lo suficiente al
valor de referencia de la posición como para que la acción de control deje de saturar la entrada, a partir de ahı́,
disminuirı́a el voltaje de entrada hasta alcanzar su posición final2 .
Práctica 4
1. Construir un modelo en Simulink, que incluya el motor ideal y un sistema de control por realimentación
de estados estimados y acción integral.
2. Comprobar el efecto de la posición de los polos del sistema y el estimador sobre la velocidad de respuesta
del sistema y el valor de la señal de control u. (incrementarlos o disminuirlos en potencias de 10)
3. Comprobar el efecto de la ganancia de la alimentación directa F .
4. Observar el efecto del error de posición inicial sobre la señal de entrada u.
32
u(t) T u(nT ) ZOH h(t) G(s) y(t) T y(nT )
G(Z)
(a) Esquema de una planta continua y su discretización mediante el uso de un retenedor de orden cero (ZOH) y mues-
treadores
(b) Comparación entre una señal continua u(t), su versión muestreada u(nT ) y su aspecto h(t) tras cruzar un ZOH
retenedor de orden cero (ZOH) y un muestreador. La figura, 4.12a muestra un modelo de entrada y salida de una
planta continua empleando retenedores. La señal de entrada u(t) es muestreada con un periodo de muestreo T .
Las muestras, que corresponden a los valores de la señal en periodos de tiempo regulares múltiplos del periodo
u(nT ), son introducidas en el retenedor que, mantendrá el valor recibido hasta el siguiente instante de muestreo
(n + 1)T . La salida del retenedor es una señal continua a escalones. Un ejemplo de estas tres señales se muestra
en la figura 4.12b.
Si construimos en Simulink, un control en variables de estado, y lo añadimos al sistema desarrollado para
manejar el motor real a traves de la placa ST Núcleo, tenemos que tener presente por tanto, que ésta no ve al
motor como un sistema continuo sino como un sistema discreto con una entrada u(nT ) y una salida y(nT ), que
equivaldrı́a a los bloques ZOH, G(s) y el muestreador, recuadrados en la figura 4.12a.
Deberı́amos, por tanto obtener un modelo de la versión discreta del motor, tal y como la ve la placa. En
general, un modelo en variables de estado discreto, se define como,
33
Para el sistema continuo sabemos que podemos expresar sus estados y su respuesta a un estado inicial x0 y
una entrada u(t) como,
Z t
x(t) = eA(t−t0 ) x0 + eA(t−τ ) Bu(τ )dτ (4.4)
t0
y(t) = Cx(t) + Du(t) (4.5)
La versión discreta solo considerará los valores correspondiente a los instantes de muestreo nT . Supongamos
que calculamos la evolución de los estados del sistema precisamente entre dos instantes de muestreo sucesivos,
t = (n + 1)T , t0 = nT ,
Z (n+1)T
x((n + 1)T ) = e AT
x(nT ) + eA((n+1)T −τ ) Bh(τ )dτ (4.6)
nT
y(nT ) = Cx(n) + Du(n) (4.7)
Donde sustituimos la señal de entrada u(t) por su valor tras atravesar el retenedor h(τ ). Por otro lado, dados
los lı́mites de la integral, el retenedor estará dando como salida constante durante todo el periodo el valor de la
variable u al comienzo del mismo: h(τ ) = u(nT ). Como se trata de un valor constante, podemos sacarlo fuera
de la integral. El resultado serı́a
"Z #
(n+1)T
x((n + 1)T ) = eAT x(nT ) + eA((n+1)T −τ ) Bdτ u(nT ) (4.8)
nT
Sin pérdida de generalidad podemos sustituir en las definiciones de las variables nT por n, puesto que el
periodo de muestreo solo nos indica la relación de las muestras con el instante en que se tomaron. Además
es fácil ver que la integral de la ecuación 4.8 es precisamente la convolución sobre un periodo de la matriz de
transición de estados con un escalón unitario. Por otro lado, esto no tiene nada de sorprendente puesto que el
retenedor convierte la señal de entrada en escalones de duración T . Podemos, por tanto, calcular la integral
para un periodo,
Z (n+1)T Z T
eA((n+1)T −τ ) Bdτ = i eA(T −τ ) Bdτ = eAT A−1 I − e−AT
(4.10)
nT 0
Podemos ahora relacionar los resultados obtenidos con los valores de las matrices F , G, C y D del sistema
en variables de estado discreto (ecuaciones 4.2 y 4.3),
Para controlar el motor real empleando realimentación de estados estimados, debemos sustituir el estimador
continuo por su versión discreta, calculando los valores de las matrices F y G a partir de los valores de las matrices
A y B y del periodo de muestreo T . Matlab suministra el comando c2d que obtiene la versión muestreada de un
sistema continuo definido en variables de estado mediante el comando ss. Ası́ si el sistema continuo es: sys =
ss(A,B,C,D) el discreto correspondiente para un periodo de muestreo T se obtiene como : sysd = c2d(sys,T).
Discretización de los polos Debemos recalcular los valores de las ganancias K y L para emplearlos con el
estimador discreto. Para ello, podemos trasladar los polos de continuo a discreto. Supongamos que queremos
para el sistema continuo un polo de valor λi . Sabemos que la respuesta asociada a este polo está relacionada
con una función exponencial, si muestreamos dicha respuesta:
n
y(t) ≈ eλi t → y(nT ) ≈ eλi nT → y(n) ≈ eλi T (4.15)
λi → Λi = eλi T (4.16)
Por tanto, podemos obtener los polos del sistema discreto (muestreado) Λi a partir de los polos del sistema
continuo λi y el tiempo de muestreo T . Es interesante notar cómo el carácter estable o inestable del sistema no
34
cambia al discretizarlo, si λi ≤ 0 entonces Λi < 1 que corresponde con la condición de estabilidad de un sistema
discreto Λi le1 ⇒ lı́mn→∞ Λni = 0.
Las ganancias K y L para el sistema discreto pueden obtenerse, igual que el caso continuo empleando acker
o place: Se diseñan la posición de los polos para la planta λpi y el observador λoi , se discretizan empleando la
ecuación 4.16 y se introducen en acker junto con las matrices del sistema discretizado:
K = acker(F, G, [Λp1 ...Λpn ])
T
L = acker(F T , C T , [Λo1 ...Λon ])
Discretización de la acción integral. Debemos también discretizar la acción integral para incluirla en el
controlador del motor. Si partimos de la ecuación de estado para la acción integral y la discretizamos,
z(n + 1) − z(n)
ż(t) = Cx(t) − xr → = Cx(n) − xr → z(n + 1) = z(n) + T Cx(n) + T xr
T
Podemos emplear esta última ecuación directamente para construir el sistema ampliado,
x(n + 1) F 0 x(n) G 0
= · + u(n) + x (4.17)
z(n + 1) TC 1 z(n) 0 −T r
Podemos directamente emplear el sistema ampliado con la acción integral discreta para recalcular los valores
de las ganancias [K, ki ] empleando el mismo método descrito en el párrafo anterior.
Acción Directa Una última nota para el cálculo de la acción directa para el sistema muestreado. Hemos
omitido su cálculo hasta ahora ya que si empleamos acción integral podemos asignarle un valor arbitrario
(aunque razonable). Vamos de todos modos a recordar la expresión de la acción directa para un sistema continuo
y como adaptarla para una versión discretizada dicho sistema. Si llamamos f a al valor de la ganancia de la
acción directa necesaria para que la planta alcance el estado estacionario tendremos que,
xssD = (F − GK)xss + Gf xr (4.18)
[I − (F − GK)] xss = Gf xr (4.19)
−1
xssD = [I − (F − GK)] Gf xr (4.20)
yssD = Cxss = xr , (D = 0) (4.21)
−1
xr = C [I − (F − GK)] Gf xr (4.22)
−1
C [I − (F − GK)] Gf = I (4.23)
h i−1
−1
f = C [I − (F − GK)] G (4.24)
Es interesante observar que el resultado no coincide con el cálculo de la ganancia Fc para el caso continuo.
De hecho, ambos sistemas continuo y discretizado, alcanzarán el mismo valor de consigna pero por caminos
distintos.
Si se emplea acción integral, es posible elegir libremente tanto Fc como ff . Se puede entonces ajustar el valor
de f para que las trayectorias de ambos sistemas coincidan. Ası́ para valores dados de Fc y f , sabemos que,
−1
yss = −C [A − BK] BFc xr (4.25)
−1
yssD = C [I − (F − GK)] Gf xr (4.26)
Buscamos asegurar que ambos valores (continuo y dicretizado) en estacionario sean iguales Yss = YssD Si
igualamos la expresiones de los estados estacionarios y despejamos f
−1 −1
−C [A − BK] BFc xr = C [I − (F − GK)] Gf xr (4.27)
h i−1
−1 −1
f = − C [I − (F − GK)] G C [A − BK] BFc (4.28)
(4.29)
Obtenemos una relación entre f y Fc
Práctica 5
1. Diseñar un sistema de control basado en realimentación de estados para el motor, empleando los paráme-
tros Ke y p identificados en la práctica 2.
2. Estudiar el efecto de la posición de los polos y los valores de f en la respuesta obtenida para entradas
escalón. Examinar el efecto sobre la entrada del sistema u.
35
(a) Modelo de motor completo con control discretizado
Figura 4.13: Modelo completo del motor con control discretizado por realimentación de estados estimados,
acción integral y acción directa
36
4.3. Controlador discreto para el modelo completo del motor y el
motor real
Finalmente, podemos construir un modelo de Simulink que incluya el modelo del motor desarrollado en la
sección 4.1 y el controlador discretizado que acabamos de describir en la sección anterior.
La figura 4.13a muestra el modelo completo.
El bloque marcado como modelo motor real contiene el modelo del motor completo (ver figura 4.7a) a la
entrada y salida del bloque, se han añadido un par de bloques ZOH para modelar el muestreado del sistema de
adquisición y control propio de la placa ST Nucleo. Recuadrado en rojo aparecen los bloques correspondientes al
modelo de motor discretizado, con el que se ha construido el estimador. El bloque marcado en azul corresponde
a la acción integral discretizada.
La figure 4.13b muestra la respuesta del sistema con los siguiente parámetros:
Los parámetros del motor se han fijado como Ke = 100 y p = 50
Los polos del sistema continuo se han seleccionado como:
1. P = [−15 − 15 − 20]. Polos para realimentación de estados, el ultimo corresponde a la acción integral
2. P L = [−30 − 30]. Polos para la realimentación del error de la salida para el estimador estimador
F calculada para asegurar que el sistema alcanza el valor de referencia.
Tiempo de muestreo T = 0,0001s
xr = 10o
Todos los parámetros correspondientes al sistema discretizado se han obtenido a partir de las ecuaciones
descritas en la sección anterior f se ha calculado a partir de F empleando la ecuación 4.29.
Si observamos la salida del sistema (fig. 4.13b) vemos que el motor alcanza la posición final tras realizar
un par de oscilaciones amplias. Lo que no corresponde con el resultado que obtendrı́amos si empleáramos un
modelo ideal del motor. La razón la podemos obtener comparando el gráfico en que se representa la variable
vref , —que corresponde al valor de voltaje de entrada calculado por el sistema de control— con el gráfico en
que se representa la variable puenteH : 1 que nos da el voltaje real suministrado por el puente en H del modelo.
El puente solo puede suministrar un voltaje máximo de 12V , sin embargo, el controlador demanda un voltaje
inicial mucho más alto. El resultado es que el motor recibe un voltaje constante de 12 V durante los primeros
1.5s. Además la posición supera con mucho el voltaje de consigna. La razón de esta sobreoscilación tan grande,
se debe a la acción integral: su contribución al error crece durante mucho más tiempo del que serı́a deseable,
ya que el motor, alimentado con 12 voltios, avanza mucho más despacio de lo previsto, y el error integral sigue
creciendo mientras el error no es cero. Cuando se alcanza el valor de referencia, la acción integral sigue obligando
al motor a avanzar en la misma dirección hasta que cambia el signo de la integral. Es fácil ver que el efecto
resultante —conocido como wind-up de la acción integral, genera una oscilización innecesaria en el sistema que,
para ciertos valores de los parámetros (posiciones de los polos y valor de f ) podrı́a llegar a desestabilizarlo.
Para paliar en parte este efecto, una primera solución es eliminar la acción directa f = 0. La figura 4.13c
muestra los resultados obtenidos, para el mismo caso anterior pero eliminando la acción directa. Es claro como
ahora el sistema se estabiliza antes y se reducen las oscilaciones.
Anti wind-up Una solución más robusta a los problemas de Wind-up, consiste en desconectar o atenuar
la acción integral mientras el actuador esta saturado, es decir mientras el valor de la entrada demandado por
el controlador supera el valor que éste puede dar. La figura 4.14a muestra una posible construcción de dicho
mecanismo, remarcado en color rosa. En este caso, no se desconecta la acción integral, sino que se altera la
entrada del error de posición al integrador añadiendo un nuevo término proporcional a la diferencia entre la
entrada u calculada por el controlador y valor máximo de la salida. El valor de la constante de proporcionalidad
—kamp en la figura— se ajusta habitualmente en función de las caracterı́sticas que se quieran dar a la salida.
Práctica6
1. Construir los bloques de Simulink del estimador acción directa y acción integral discreta y añadirlos al
modelo de motor completo desarrollado en la práctica 3.
2. Estudiar la respuesta del sistema para los sistemas de control diseñados en la práctica 5. Comprobar el
efecto de eliminar la acción integral Ki z = 0 o la acción directa f = 0
3. Añadir al modelo un bloque anti wind-up, analizar la salida para distintos valores de la constante kamp.
37
(a) Modelo de motor completo con control discretizadoy anti wind-up
Figura 4.14: Modelo completo del motor con control discretizado por realimentación de estados estimados,
acción integral, acción directa y Anti wind-up.
38
4. Trasladar los bloques del sistema de control desarrollado al esquema de Simulink empleado para manejar
el motor real. Comprobar que es capaz de mover el motor desde una posición inicial theta0 = 0 hasta una
posición final de referencia θr
39
Bibliografı́a
[1] Devantech. RB-DEV-40 Devantech 12V, 30:1 Gear Motor w/ Encoder. https://www.robotshop.com/
media/files/pdf/datasheet-emg30_1.pdf, 1200.
[2] The Matworks. Simulink Coder Support Package for STMicroelectronics Nucleo Boards. https://es.
mathworks.com/help/supportpkg/nucleo/index.html.
[3] STMicroelectronics. UM1724 User manual. STM32 Nucleo-64 boards (MB1136). https://www.st.com/en/
evaluation-tools/nucleo-f411re.html#, April 2019.
[4] STMicroelectronics. UM1727. User manual. Getting started with STM32 Nucleo board software development
tools, January, 2016.
[5] STMicroelectronics. STSPIN840. Compact dual brushed DC motor driver. https://www.st.com/en/
motor-drivers/stspin840.html, May, 2018.
[6] STMicroelectronics. UM2393. User Manual. Getting started with the X-NUCLEO-IHM15A1 dual brush DC
motor driverexpansion based on STSPIN840 for STM32Nucleo. https://www.st.com/en/motor-drivers/
stspin840.html#tools-software, May, 2018.
40