Вы находитесь на странице: 1из 103

Software para la simulacin del comportamiento del

conjunto Motor DC - Encoder









TITULACI: Enginyeria en Automtica i Electrnica Industrial.




AUTOR: Jacob Pi Vallv.
DIRECTOR: Esteban del Castillo Prez.


DATA: Juny / 2012
Proyecto final de carrera Pgina 2
ndice

1 Memoria Descriptiva ........................................................................................... 4
1.1 Introduccin ................................................................................................. 5
1.2 Objetivo ....................................................................................................... 5
1.3 Descripcin de la Planta .............................................................................. 6
1.4 Modelado de la Planta ................................................................................ 16
1.4.1 Modelo del Motor de corriente continua ................................................ 16
1.4.2 Anlisis del modelo obtenido del Motor de corriente continua ............. 20
1.4.3 Excitacin PWM y sus efectos ............................................................... 23
1.4.4 Conjunto Excitacin PWM + motor DC ................................................ 29
1.4.5 El control PID......................................................................................... 32
1.4.6 Lazo de Control ...................................................................................... 35
1.4.7 Sintonizacin Controlador PID .............................................................. 36
1.4.8 Errores del sistema ................................................................................. 39
1.5 Emulador de la Planta ................................................................................ 42
1.6 Software de simulacin de la Planta .......................................................... 47
1.6.1 Descripcin del Software ....................................................................... 48
1.6.2 Librera Q5.h .......................................................................................... 49
1.6.3 Librera k1.h ........................................................................................... 54
1.7 Modo de Uso .............................................................................................. 60
2 Anexo A ............................................................................................................ 65
2.1 El motor de corriente continua ................................................................... 66
3 Anexo B............................................................................................................. 72
3.1 Cdigo Librera Q5.h ................................................................................. 73
3.2 Cdigo Librera K1.h ................................................................................. 74









Proyecto final de carrera Pgina 3
4 Anexo C............................................................................................................. 78
4.1 Librera 8259.h ........................................................................................... 79
4.2 Librera Ini_IRQ.h ..................................................................................... 80
4.3 Librera PID.h ............................................................................................ 81
4.4 Librera Printer.h ........................................................................................ 82
4.5 Librera PWM.h ......................................................................................... 84
4.6 Librera Timer.h ......................................................................................... 84
4.7 Librera Main.c .......................................................................................... 86
4.8 Librera Ini_IRQ.c ..................................................................................... 90
4.9 Librera PID.c ............................................................................................ 94
4.10 Librera PWM.c ......................................................................................... 96
4.11 Librera Timer.c ......................................................................................... 98
5 Anexo D: Referencias ..................................................................................... 103






















Proyecto final de carrera Pgina 4
1 Memoria Descriptiva




























Memoria descriptiva
Proyecto final de carrera Pgina 5

1 Memoria Descriptiva

1.1 Introduccin

Dentro del marco de asignaturas que se imparten en el plan de estudios de primer
ciclo de la Ingeniera Tcnica Industrial en Electrnica Industrial se encuentra la asignatura
Informtica Industrial II.
En esta asignatura se forma al alumnado para que obtenga los conocimientos de
hardware y software necesarios para la elaboracin de software de control en un PC.
Dentro de los crditos de la asignatura, se realizan unas prcticas en los laboratorios
habilitados, donde se ejercitan los conocimientos adquiridos. Estas prcticas consisten en
implementar un control de velocidad y de posicin del eje de un motor de corriente
continua, a travs del interfaz del puerto paralelo de un PC bajo el sistema operativo MS-
DOS, utilizando como lenguaje de programacin el lenguaje C.
Para el desarrollo de las prcticas se dispone de una planta, la cual est formada
por un motor de corriente continua, un encoder relativo y un circuito electrnico que
realiza la funcin de interface entre el puerto paralelo del PC y el conjunto motor-encoder.
Desafortunadamente, esta planta slo est disponible en los laboratorios habilitados para la
asignatura. Para facilitar el desarrollo de las prcticas, el profesor titular de la asignatura
realizo un circuito electrnico que emulaba la planta en cuestin, de esta manera el
alumnado poda avanzar en el desarrollo de las practicas fuera de la universidad.
Desgraciadamente, a causa de la tendencia en los ltimos aos en la utilizacin de
ordenadores porttiles para el desarrollo individual de las prcticas por parte del alumnado,
surge el problema de que estos nuevos equipos raramente tengan accesible externamente el
puerto paralelo, aunque este est implementado la placa base como PC compatible, con lo
que comporte que el emulador pierda su funcionalidad.
Para desarrollar la parte terica de este proyecto se ha utilizado como referencia
bibliogrfica el libro escrito por el sr Esteban del Castillo Control de Procesos, donde
describe la implementacin de una plataforma hardware/software aplicada al conjunto
motor dc-encoder.

1.2 Objetivo

El objetivo del presente proyecto es implementar un simulador software a base de
libreras basadas en lenguaje de programacin C que simule el comportamiento de la
planta disponible en los laboratorios de la asignatura.




Memoria descriptiva
Proyecto final de carrera Pgina 6

1.3 Descripcin de la Planta

La planta utilizada en los laboratorios de la asignatura est formada por 3 piezas
bien diferenciadas:
- Motor de corriente continua
- Encoder relativo
- Placa electrnica interface puerto paralelo PC


Figura 1. Planta utilizada en los Laboratorios

1.3.1.1 Motor de corriente continua

La mquina motriz utilizada es un motor de corriente continua de imanes
permanentes del fabricante Maxon, de la serie F2140, concretamente el modelo 2140.937-
58.236-050. Obtener el modelo concreto del motor es interesante para poder realizar un
estudio de la planta, obteniendo dados particulares de su comportamiento de su hoja de
caractersticas.
Cabe destacar el tipo de motor utilizado es un motor de corriente continua de
imanes permanentes. Este tipo de motores estn clasificados como mquinas especiales
Memoria descriptiva
Proyecto final de carrera Pgina 7
dentro del campo de las mquinas elctricas, este hecho nos dificultara su estudio, ya que
gran parte de simuladores de circuitos elctricos no contempla este tipo de motores, slo
los motores de excitacin independiente.
En la figura n 2 mostramos las principales especificaciones del motor, donde
podremos observar los datos necesarios para su posterior modelado, pudiendo de esta
manera comprobar que el modelo realizado se aproxima a la realidad.


Figura 2. Caractersticas principales motor dc

De la hoja de caractersticas podemos obtener los datos para el modelado del motor
los cuales son los siguientes:

Resistencia hmica en bornes armadura (Ra)
Inductancia en bornes armadura (La)
Constante de tiempo mecnica (m)
Inercia del rotor (J)
Constante de velocidad
Constante mecnica (km)
Velocidad en vaco

A modo de informacin para el alumnado, hemos descrito las principales
caractersticas de los motores de corriente continua en el anexo A, para as comprender el
significado de estos.
Ms adelante realizaremos un estudio para obtener un modelo aproximado del
motor para poder realizar una simulacin de la planta.
Memoria descriptiva
Proyecto final de carrera Pgina 8

1.3.1.2 Encoder relativo

Para un control de velocidad o posicin del motor se necesita posicionar el eje de
este a travs de algn elemento que nos proporcione la informacin necesaria para
determinarlo. Una forma sencilla de obtener esta posicin o velocidad es conectando el eje
del motor a un encoder.
En el mercado existen muchos tipos de encoders con caractersticas factibles para
realizar esta operacin.
En este caso, la planta disponible en el laboratorio est equipada con un encoder
relativo bidireccional de dos canales de salida A y B, el cual permite detectar el sentido de
rotacin del eje. Este es de la marca Hohner, de la serie 21, modelo 21-122-200 de 200
pulsos por vuelta.
En la figura 3 mostramos el interior de un encoder relativo para podernos hacer una
idea de cmo estn construidos.










Figura 3. Interior terico Encoder incremental

Es de gran importancia comprender el funcionamiento del encoder y las seales que
nos proporcionar, para poder realizar las prcticas del laboratorio de la asignatura
Informtica Industrial II, tanto las rutinas que tendremos que implementar nosotros en el
presente proyecto para simular el comportamiento de este.
En la figura n 4 mostramos las seales A y B con el paso del tiempo. Como
podemos observar, stas estn desfasadas entre ellas 90 . A travs de esta caracterstica
podremos observar el sentido de giro del motor. Por ejemplo, si la lectura actual de las
seales A y B es 01 y la anterior era 11, el sentido de giro ser hacia la derecha, en cambio,
si la lectura anterior era 00, el sentido de giro ser hacia la izquierda.


Memoria descriptiva
Proyecto final de carrera Pgina 9









Figura 4. Seales A y B del encoder

1.3.1.3 Placa electrnica interface puerto paralelo PC

Para poder utilizar el motor y el encoder a travs de nuestro PC tenemos que tener un
interface que comunique ambas partes.
La placa electrnica montada en el conjunto motor-encoder est formada por dos
partes bien diferenciadas. La primera tiene la funcin de atender las salidas de nuestro PC a
travs del puerto paralelo y adecuar estas seales con la suficiente potencia para atacar al
motor de corriente continua. La segunda, adapta las seales generadas por el encoder para
que esa informacin pueda ser utilizada y leda por puerto paralelo.
Cabe puntualizar que el motor de corriente continua es un actuador que modifica la
velocidad de salida segn el valor medio de la tensin de excitacin. A razn de esto,
nuestra etapa de potencia tiene que ser capaz de realizar pequeas variaciones del valor
medio de la tensin de salida. Generalmente cuando se debe realizar esta operacin en las
aplicaciones de control se utiliza la tcnica de la modulacin de anchura de pulsos, o ms
bien conocido por PWM.
En la figura n 11 mostramos el esquema de este interface. Si analizamos el esquema
de potencia, podemos observar que el circuito de excitacin de motor est formado por un
puente en H de transistores. Estos transistores se han escogido con especial cuidado, ya que
deben que tener unas caractersticas especiales.
Si recordamos como est formado constructivamente el interior de un motor de
corriente continua, veremos que est compuesto por unas bobinas. stas, durante el
perodo I
on
se cargan de energa, el problema surge en el perodo de I
o]]
. Cuando llega el
perodo I
o]]
el transistor no conduce, pero por la inductancia sigue circulando una I
L
,
encontrndose la necesidad de dar continuidad a la corriente magnetizante. Para evitar la
rotura del transistor, estos tienen que llevar incorporado un diodo volante para poder
realizar la descarga de la corriente de la bobina en los periodos de desconexin.
Otro punto a tener en cuenta es el aislamiento galvnico de la placa electrnica. Las
corrientes inducidas por las bobinas del motor provocan ruidos en las tensiones de
alimentacin, al igual que la conmutacin de los devanados del inducido sobre su colector
Memoria descriptiva
Proyecto final de carrera Pgina 10
de delgas, que se podran propagar a las seales del puerto paralelo del PC, pudiendo dar a
errores de lectura o escritura en la salida del puerto. [1]

Sin dejar de analizar la parte de potencia, podemos ver que se ha implementado una
proteccin elctrica en el circuito de control del puente de transistores para evitar la
conexin simultnea de los dos ramales de alimentacin.

Pin DB2 Pin DB3
Seal
Derecha
Seal
Izquierda
0 0 1 1
0 1 1 0
1 0 0 1
1 1 1 1
Figura 5. Tabla Verdad Pins DB2 y DB3

Para poder activar cada ramal individualmente, el diodo del optoacoplador debe
entrar en modo de conduccin. Este slo entrar en este modo si la seal proporcionada por
el bloque lgico es cero, tal y como mostramos en la tabla de la verdad descrita
anteriormente, de lo contrario restar abierto.

Por otra parte, como hemos dicho con anterioridad, el encoder que tenernos instalado
en nuestra planta entrega dos seales en cuadratura, a partir de la cuales podremos detectar
el sentido de giro del motor.
Para poder detectar un cambio de sentido se deber realizar un seguimiento de la
secuencia proporcionada por el encoder de las seales A y B, tal y como mostramos en la
figura n 6.
Figura 6. Seales de salida circuito acondicionador encoder

Proyecto final de carrera

Como podemos ver, cada vez que alguna de las seales A y B cambia de estado,
travs de un flanco de subida o bajada,
encoder detecta el cambio y genera la
Los valores que se observan justo en el flanco en que se provoca la interrupcin son los
valores de las seales A y B, de esta manera podremos observar el sentido de giro del eje
del motor.

Donde la secuencia a seguir seria:


Para poder seguir la secuencia generada por el encoder, el interface motor
incorporado un bloque lgico que genera una seal adecuada para interrumpir la CPU del
PC justo cuando acontecen los flancos de subida y bajada de las seales A
Para poder detectar los flancos originados por el encoder se ha utilizado un circuito
lgico basado en un diferenciador.

Como se observa en la figura 7 el circuito diferenciador
ascendentes y descendentes. Esta ser la base para crear el bloque lgico.
Para poder calcular la red RC tenemos que tener en cuenta la frecuencia mxima en
que el encoder nos entregara las seales. A razn de una velocidad mxima de nuestro
motor de 3980 rpm y que el encoder utilizado provoca 800 flancos por revolucin,
tendremos:


Memoria descriptiva

Como podemos ver, cada vez que alguna de las seales A y B cambia de estado,
travs de un flanco de subida o bajada, el bloque lgico del interface del conjunto motor
encoder detecta el cambio y genera la correspondiente interrupcin en el puerto par
Los valores que se observan justo en el flanco en que se provoca la interrupcin son los
valores de las seales A y B, de esta manera podremos observar el sentido de giro del eje
Donde la secuencia a seguir seria:
Figura 7. Sentido de giro
Para poder seguir la secuencia generada por el encoder, el interface motor
incorporado un bloque lgico que genera una seal adecuada para interrumpir la CPU del
PC justo cuando acontecen los flancos de subida y bajada de las seales A
Para poder detectar los flancos originados por el encoder se ha utilizado un circuito
lgico basado en un diferenciador.

Figura 7. Circuito diferenciador

Como se observa en la figura 7 el circuito diferenciador detecta los flancos
endentes y descendentes. Esta ser la base para crear el bloque lgico.
Para poder calcular la red RC tenemos que tener en cuenta la frecuencia mxima en
que el encoder nos entregara las seales. A razn de una velocidad mxima de nuestro
y que el encoder utilizado provoca 800 flancos por revolucin,

Memoria descriptiva
Pgina 11
Como podemos ver, cada vez que alguna de las seales A y B cambia de estado, a
el bloque lgico del interface del conjunto motor-
correspondiente interrupcin en el puerto paralelo.
Los valores que se observan justo en el flanco en que se provoca la interrupcin son los
valores de las seales A y B, de esta manera podremos observar el sentido de giro del eje

Para poder seguir la secuencia generada por el encoder, el interface motor PC lleva
incorporado un bloque lgico que genera una seal adecuada para interrumpir la CPU del
PC justo cuando acontecen los flancos de subida y bajada de las seales A y B del encoder.
Para poder detectar los flancos originados por el encoder se ha utilizado un circuito
detecta los flancos
endentes y descendentes. Esta ser la base para crear el bloque lgico.
Para poder calcular la red RC tenemos que tener en cuenta la frecuencia mxima en
que el encoder nos entregara las seales. A razn de una velocidad mxima de nuestro
y que el encoder utilizado provoca 800 flancos por revolucin,
Proyecto final de carrera

Por lo cual tendremos un flanco cada
encoder no estn todas alineadas, nos podra llegar un flanco en un intervalo
solventar deficiencias mecnicas podemos reducir este tiempo a
seguridad.
Por otra parte, cabe puntualizar que para preservar los estados de la seal en su
trnsito por los cables, debemos acotar la anchura del pulso
de es adecuado.

En la siguiente figura mostramos el bloque lgico detector de
responde a la siguiente ecuacin:


donde
cada igual a 1.8 V, entonces
viable es una y
Figura

Memoria descriptiva

Por lo cual tendremos un flanco cada . Si suponemos que las ventanas del
encoder no estn todas alineadas, nos podra llegar un flanco en un intervalo
solventar deficiencias mecnicas podemos reducir este tiempo a como coeficiente de
Por otra parte, cabe puntualizar que para preservar los estados de la seal en su
trnsito por los cables, debemos acotar la anchura del pulso de bajada. Un valor del orden
En la siguiente figura mostramos el bloque lgico detector de
responde a la siguiente ecuacin:

Figura 8. Bloque lgico
donde siendo el umbral del inversor en
cada igual a 1.8 V, entonces para implicara una , donde una solucin
y . [1]
Figura 9. Detector de flancos ascendentes y descendentes
Memoria descriptiva
Pgina 12
. Si suponemos que las ventanas del
encoder no estn todas alineadas, nos podra llegar un flanco en un intervalo menor. Para
como coeficiente de
Por otra parte, cabe puntualizar que para preservar los estados de la seal en su
de bajada. Un valor del orden
En la siguiente figura mostramos el bloque lgico detector de flancos, el cual

el umbral del inversor en
, donde una solucin

Detector de flancos ascendentes y descendentes
Memoria descriptiva
Proyecto final de carrera Pgina 13
En la figura n 9 mostramos el bloque lgico correspondiente a la seal A del
encoder para poder detectar tanto los flancos ascendentes y descendentes de la seal en
cuadratura.
La resistencia R
1
y R
4
limitan la corriente derivada por el diodo interno de la puerta
inversora a valores inferiores a 1 mA si el valor de la resistencia es de 5,6 k. [1]
En la siguiente figura podemos observar las seales generadas por el bloque detector
de flancos, donde la seal azul corresponde a la seal en cuadratura del encoder llamada A,
y en cada flanco la correspondiente deteccin por parte de cada bloque detector, detectando
tanto el flanco ascendente como el descendente. Ntese la amplitud del pulso generado por
el bloque, siendo de 4 ps para suplir las deficiencias de los conductores de transporte de la
seal.

Figura 10. Seales resultantes del bloque de detencin de flancos.

El bloque lgico implementado tiene que ser lo suficientemente rpido para poder
generar la solicitud a las interrupciones adecuadamente. Es importante que el tiempo en
nivel cero de la seal generada sea el menor posible, de esta manera el tiempo de esta en
nivel 1 ser el ms grande posible. De esta manera si tenemos una velocidad elevada del
motor el bloque lgico tendr tiempo de generar los dos pulsos de interrupcin entre las
ventanas de cuadratura del encoder, ya que la seal de solicitud tendr un pulso por paso
por cero muy pequeo.

En la figura n 11 mostramos todo el montaje del interface para utilizar el conjunto
motor-encoder, compuesto por las partes de potencia que alimenta al motor y lgica de
control, que adapta las seales del encoder al puerto paralelo del PC.



Proyecto final de carrera

Figura

En la tabla n 1 mostramos la asociacin de seales y pins del puerto paralelo.
Podemos observar la direccin de la informacin de cada pin.
En la Tabla n 2 mostramos los registros propios del puerto paralelo y la asociacin
con el conector de la Tabla n 1.
de las direcciones 0x378, 0x278 o 0x3BC.
Los pines utilizados por el interface motor

Pins 2 y 3 del Registro Base + 0 (ataque puente transistores)
Pins 12 y 13 del Registro
Pin 10 del Registro Base + 2 (activacin de la IRQ del Puerto)
Memoria descriptiva

Figura 11. Esquema placa Interface con el PC
tabla n 1 mostramos la asociacin de seales y pins del puerto paralelo.
Podemos observar la direccin de la informacin de cada pin.
En la Tabla n 2 mostramos los registros propios del puerto paralelo y la asociacin
con el conector de la Tabla n 1. El registro base de un puerto paralelo est ubicado en
las direcciones 0x378, 0x278 o 0x3BC.
Los pines utilizados por el interface motor PC son los siguientes
Pins 2 y 3 del Registro Base + 0 (ataque puente transistores)
Pins 12 y 13 del Registro Base + 1 (informacin del encoder)
Pin 10 del Registro Base + 2 (activacin de la IRQ del Puerto)
Memoria descriptiva
Pgina 14
tabla n 1 mostramos la asociacin de seales y pins del puerto paralelo.
En la Tabla n 2 mostramos los registros propios del puerto paralelo y la asociacin
l registro base de un puerto paralelo est ubicado en una
los siguientes:
Pins 2 y 3 del Registro Base + 0 (ataque puente transistores)
Base + 1 (informacin del encoder)
Pin 10 del Registro Base + 2 (activacin de la IRQ del Puerto)
Memoria descriptiva
Proyecto final de carrera Pgina 15

Seal Pin Direccin
/Strobe 1 OUT
Data 0 2 OUT
Data 1 3 OUT
Data 2 4 OUT
Data 3 OUT
Data 4 ! OUT
Data " OUT
Data ! # OUT
Data " $ OUT
/%c&no'led(e 10 I)
Bu*+ 11 I)
Pa,er -nd 12 I)
Select 13 I)
/%uto .eed 14 OUT
/-rror 1 I)
/Inicialize Printer 1! OUT
/Select In,ut 1" OUT
/round 1#02 0

Tabla 1. Puerto DB25 PC

Base + 0: Registro de lectura/escritura
Bit " Bit ! Bit Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Pin $ Pin # Pin " Pin ! Pin Pin 4 Pin 3 Pin 2

Base + 1: Registro de solo lectura
Bit " Bit ! Bit Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
/Pin 11 Pin 10 Pin 12 Pin 13 Pin 1 0 0 0

Base + 2: Registro de lectura/escritura
Bit " Bit ! Bit Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
0 0 0 I12 /Pin 1" Pin 1! /Pin 14 /Pin 1

Tabla 2. Registros del puerto paralelo

Proyecto final de carrera
1.4 Modelado de la Planta

Durante el transcurso de la carrera se han realizado asignaturas donde se imparte
teora para modelar plantas
controladores para su control
Encontramos interesante realizar un estudio del modelado de una planta real donde
podremos simular elementos concretos, estudiar sus respuestas y comprobar las
aproximaciones realizadas
encontrndonos con problemas reales del modelado y la correcta identificacin de los
parmetros suministrados por los fabricantes
En la referencia bibliogrfica n 2 podemos encontrar
identificacin de los parmetros y modelado de un pequeo motor de corriente continua.

1.4.1 Modelo del Motor de corriente conti

En la figura n 12 mostramos el esquema
de corriente continua de imanes permanentes
representndolo en el programa de simulacin Matlab.


Partimos de las siguientes expresiones en el dominio de Laplace, las cuales
representan el comportamiento elctrico del motor:



Combinando las ecuaciones 1 y 2 obtendremos la corriente de armadura


Memoria descriptiva

Modelado de la Planta
Durante el transcurso de la carrera se han realizado asignaturas donde se imparte
teora para modelar plantas en el espacio del control continuo y la implementacin de
ontroladores para su control.
Encontramos interesante realizar un estudio del modelado de una planta real donde
podremos simular elementos concretos, estudiar sus respuestas y comprobar las
durante el modelado respecto al elemento real
ndonos con problemas reales del modelado y la correcta identificacin de los
parmetros suministrados por los fabricantes de los elementos (motor dc, encoder )
En la referencia bibliogrfica n 2 podemos encontrar en un pequeo resumen de la
cin de los parmetros y modelado de un pequeo motor de corriente continua.
delo del Motor de corriente continua
mostramos el esquema del cual partiremos para modelar el motor
de imanes permanentes, obteniendo su modelo matemtico y
en el programa de simulacin Matlab.
Figura 12. Motor DC imanes permanentes
Partimos de las siguientes expresiones en el dominio de Laplace, las cuales
representan el comportamiento elctrico del motor:
Combinando las ecuaciones 1 y 2 obtendremos la corriente de armadura
Memoria descriptiva
Pgina 16
Durante el transcurso de la carrera se han realizado asignaturas donde se imparte
en el espacio del control continuo y la implementacin de
Encontramos interesante realizar un estudio del modelado de una planta real donde
podremos simular elementos concretos, estudiar sus respuestas y comprobar las
durante el modelado respecto al elemento real. De esta manera
ndonos con problemas reales del modelado y la correcta identificacin de los
de los elementos (motor dc, encoder ).
en un pequeo resumen de la
cin de los parmetros y modelado de un pequeo motor de corriente continua.
para modelar el motor
su modelo matemtico y

Partimos de las siguientes expresiones en el dominio de Laplace, las cuales


Combinando las ecuaciones 1 y 2 obtendremos la corriente de armadura

Memoria descriptiva
Proyecto final de carrera Pgina 17


I
u
(s) =
I
u
(s) -I
b
(s)
(R
u
+I
u
s)
(4)

Por otra parte, el par generado por el motor es el siguiente:

I
m
(s) = k
1
I
u
(s) = k
m
I
u
(s) = I
L
(s) +I
d
(s) (S)

El par mecnico neto en el eje del motor I
L
(s) ser el resultante de:

I
L
(s) = I
m
(s) -I
d
(s) = k
m
I
u
(s) -I
d
(s) (6)

Combinando las ecuaciones 4 y 6 obtenemos la relacin entre el torque neto I
L
(s)
con la corriente de armadura.

I
L
(s) = k
m

I
u
(s) -k
c
w(s)
(R
u
+I
u
s)
-I
d
(s) (7)

En la siguiente figura, mostramos el esquema de bloques el modelo matemtico del
motor de corriente continua con excitacin permanente a travs de los imanes de su estator.


Figura 13. Modelo matemtico Motor DC




Memoria descriptiva
Proyecto final de carrera Pgina 18


Por otro lado, utilizando la segunda ley de Newton, obtenemos que el par neto I
L
(s)
del motor es:

I
L
(s) = [ s w(s) + w(s) (8)


donde [ corresponde al momento de inercia del eje del motor y su carga y la
friccin de estos.

Si consideramos que el par perturbador I
d
(s) es nulo e igualamos las ecuaciones 7 y
8 obtendremos:

([ s + ) w(s) = k
m

I
u
(s) -k
c
w(s)
(R
u
+I
u
s)
(9)

operando la ecuacin 9:

([ s + ) (R
u
+I
u
s) w(s) = k
m
I
u
(s) -k
m
k
c
w(s) (1u)

|([ s + ) (R
u
+I
u
s) +k
m
k
c
] w(s) = k
m
I
u
(s) (11)

obteniendo la funcin de transferencia del motor a partir de la ecuacin n 11

w(s)
I
u
(s)
=
k
m
|([ s + ) (R
u
+I
u
s) +k
m
k
c
]
(12)

identificando los trminos:

w(s)
I
u
(s)
=
k
m
[ I
u
s
2
+|([ R
u
+ I
u
)] s + R
u
+k
m
k
c
(1S)

donde tendramos que tener una funcin normalizada de la forma:

0(s) =

n
2
s
2
+2
n
+
n
2

Memoria descriptiva
Proyecto final de carrera Pgina 19


Esta funcin de transferencia es la que describe la figura de bloques n 8, siendo un
sistema de segundo orden. Generalmente llegados a este punto, se suele simplificar la
ecuacin de transferencia despreciando I
u
frente de R
u
y la
u
frente la
m
obteniendo as
una funcin de transferencia de primer orden.

Quedando la funcin de transferencia descrita en la ecuacin n 13 de la siguiente
manera:

w(s)
I
u
(s)
=
k
m
[ R
u
s + R
u
+k
m
k
c
(14)

Al igual que en el sistema de segundo orden, deberamos buscar la funcin de
transferencia equivalente normalizada.

0(s) =
0
0

m
s +1


entonces:

w(s)
I
u
(s)
=
k
m
[ R
u
s + R
u
+k
m
k
c
=
k
m
R
u
+k
m
k
c
[ R
u
R
u
+k
m
k
c
s +1
(1S)

de forma que:

0
0
=
k
m
R
u
+k
m
k
c
(16)

m
=
[ R
u
R
u
+k
m
k
c
(17)





Memoria descriptiva
Proyecto final de carrera Pgina 20

1.4.2 Anlisis del modelo obtenido del Motor de corriente continua

Una vez realizado el modelado del comportamiento fsico del motor podemos pasar a
simular los resultados obtenidos en los sistemas de primer y segundo y contrastarlos con
las caractersticas proporcionadas por el fabricante.
De esta manera podremos comprobar la diferencia entre modelos, si la hubiera, y los
diferentes resultados segn la inclusin u omisin de ciertos parmetros.

1.4.2.1 Simulacin sistema segundo orden

El sistema a simular en este apartado est representado en la figura n 13. Este es un
modelo de segundo orden sin realizar ninguna apreciacin o simplificacin, excepto la de
considerar el torque perturbador I
d
(s) nulo.
La simulacin de este se realizar en lazo abierto para observar la respuesta de este a
un escaln unitario.

Los parmetros subministrados por el fabricante los podemos encontrar en la figura
n 2 de la memoria descriptiva de este proyecto. Estos parmetros son los siguientes:

- R
u
= 41,S 0
- I
u
= S,u2 mE
- k
m
= k
c
= SS,2 mNmA
- [ = 22,1 gcm`
- b = .
- I
cc
= 24 I

Podemos observar que el fabricante, en los datos proporcionados, no habla en ningn
momento del coeficiente de friccin que tiene el rotor. Considerando que es un motor muy
pequeo, podemos estimar que este coeficiente debe ser nulo. Entonces realizaremos una
primera aproximacin de este modelo y efectuaremos la simulacin del sistema sin este
parmetro.

En la figura n 14 podemos observar el resultado obtenido de la simulacin del
sistema. Podemos apreciar que este no se ajusta del todo a la realidad segn los parmetros
entregados por el fabricante.


Memoria descriptiva
Proyecto final de carrera Pgina 21

Figura 14. Simulacin modelo 2 orden sin coeficiente de friccin.

Segn los datos de la figura n 2 la velocidad del motor en vaco es de 3980 rpm, en
la simulacin del modelo obtenemos una velocidad en vaco de 4151,5 rpm, lo que supone
una diferencia entre el modelo y los datos reales del 4,3 %.
Esta diferencia entre los datos del fabricante y los obtenidos en la simulacin puede
venir causada por la aproximacin realizada en la omisin del coeficiente de friccin del
modelo.
Para obtener el valor del coeficiente de friccin del rotor tenemos una aproximacin
matemtica:

b =
[

m
(18)

que nos relaciona la inercia del rotor y la constante mecnica del sistema para
obtener el coeficiente de friccin. Aplicando la formula, obtenemos:

b =
[

m
=
22.1 1u
-7
Su 1u
-3
= 7.S6 1u
-5


Con este trmino, deberan coincidir los resultados de una nueva simulacin con el
modelo completo del motor, pero debemos ajustar este valor hasta S,17 1u
-6
para que los
resultados obtenidos sean iguales al del fabricante.

Memoria descriptiva
Proyecto final de carrera Pgina 22
1.4.2.2 Simulacin sistema primer orden

La ecuacin n 15 de la memoria descriptiva representa la simplificacin del modelo
del motor a un sistema de primer orden. La ecuacin de transferencia normalizada de un
sistema de primer orden, como hemos descrito anteriormente, es:

0(s) =
0
0

m
s +1


Si paramos atencin a la ecuacin, podremos identificar los trminos que la definen
en los datos proporcionados por el fabricante. Siendo ms sencillo realizar la simulacin
del sistema con estos datos que no a travs de la ecuacin encontrada mediante el
modelado.
Donde 0
0
es la ganancia del sistema en t - que podemos identificar con el
parmetro denominado como constante de velocidad (definido en el Anexo A) con un
valor de 173 rpm/V. Por otra parte, la del sistema la podemos identificar con la
m
del
motor, con un valor de Su 1u
-3
segundos.
Con estos datos podemos proceder a realizar la simulacin del sistema de primer
orden, obteniendo estos resultados mostrados en la figura n 15.
Estos resultados son muy semejantes a los resultados obtenidos en la primera
simulacin del modelo de segundo orden, mostrados en la figura n 14, donde no se tena
en cuenta el coeficiente de friccin del rotor.
Si leemos con detenimiento la definicin del parmetro de la constante de velocidad
podremos ver que el valor suministrado por el fabricante no tiene en cuenta las prdidas
por friccin, de ah la semejanza de resultados.
Figura 15. Simulacin modelo 1 orden.
Memoria descriptiva
Proyecto final de carrera Pgina 23


Teniendo en cuenta la definicin de esta constante y realizando un pequeo ajuste de
esta en el modelo, obtendremos los siguientes resultados:


Figura 16. Simulacin modelo 1 orden con parmetros ajustados.


Con la constante de velocidad ajustada a 165,83 rpm/V, obtenemos un modelo
aceptable del motor de corriente continua de imanes permanentes. A partir de este punto
utilizaremos este modelo para la realizacin del resto de simulaciones.

1.4.3 Excitacin PWM y sus efectos

Como ya hemos descrito con anterioridad, el motor de corriente continua est
alimentado a travs de un puente en H de transistores con diodo volante y controlados por
una excitacin PWM.
Este tipo de excitacin provoca unos efectos sobre el motor dependiendo del tiempo
de I
0N
y I
0PP
en que nos encontremos, los cuales se traducen en una alimentacin
pulsante con periodos de I
CC
y 0V respectivamente. Durante el periodo de I
0N
el transistor
est en modo de conduccin y por las bobinas del motor circula I
u
, pero en I
0PP
el
transistor corta la alimentacin del motor y anula la corriente I
u
a su travs. En
consecuencia, se abre camino a travs del diodo volante del transistor.
Proyecto final de carrera
Este tipo de excitacin
hasta ahora [1]. Para comprobar este efecto
simulacin PSIM y Pspice para
Inicialmete hemos simulado la midad del puente en
transitores sin diodo volante, para
conectado una red RL de caracteristicas similares al modelo de primer orden.

En la siguiente figura se pueden observar la ev
intensidad en la carga en
volantes).
Figura
Memoria descriptiva

e tipo de excitacin modifica el comportamiento del modelo del motor estudiado
. Para comprobar este efecto, hemos simulado el motor en el programa de
y Pspice para observado su comportamiento.
simulado la midad del puente en H con el programa Pspice con
transitores sin diodo volante, para verificar la hipotesis inicial. Como carga hemos
conectado una red RL de caracteristicas similares al modelo de primer orden.
Figura 17. Ramal derecho puente H.
En la siguiente figura se pueden observar la evolucin temporal de la tensin y de la
la simulacin del ramal derecho del puente en H (sin diodos

Figura 18. Resultado simulacin Ramal derecho puente H.
Memoria descriptiva
Pgina 24
modifica el comportamiento del modelo del motor estudiado
el motor en el programa de
con el programa Pspice con
Como carga hemos
conectado una red RL de caracteristicas similares al modelo de primer orden.

de la tensin y de la
del ramal derecho del puente en H (sin diodos

Resultado simulacin Ramal derecho puente H.
Memoria descriptiva
Proyecto final de carrera Pgina 25


Podemos observar que justo en el flanco de bajada donde se produce la desconexin
por parte del transistor darlingthon se genera un pico negativo de tensin, que corresponde
a la corriente magnetizante de la carga intentando abrise camino por las uniones de los
transistores. En el caso de no incorporar diodo volante, estos transistores podran daarse.
La simulacin realizada es a titulo informativo y no es comparable en magnitud al
estudio realizado del modelo del motor y su excitacin, y a que la carga simulada no se
ajusta totalmente al modelo anterior.

Siguiendo con el estudio, realizaremos una comparacin para encontrar la diferencia
entre ambas excitaciones, Pero cabe nombrar que el programa de simulacin PSIM no
incluye la librera para simular el motor de DC de imanes permanentes, sol el motor DC
de excitacin independiente, el cual hemos tenido que adaptar para conseguir las mismas
caractersticas que el motor de nuestro modelo. Seguidamente especificamos los
parmetros empleados.














Figura 19. Parmetros modelo motor DC para PSIM .


En la figura n 20.1 mostramos el esquema de la excitacin PWM sin diodo volante y
en la figura n 20.2 el esquema con el diodo incorporado.




Memoria descriptiva
Proyecto final de carrera Pgina 26


Figura 20. Circuito simulacin comportamiento PWM sobre motor dc.

En la figura n 21 podemos observar el resultado de la simulacin sin diodo volante
en los transistores de alimentacin al motor. Se puede ver el pico de tensin negativa justo
en la desconexin por parte de los transistores.

Figura 21. Tensin transistor de la excitacin PWM sin diodo volante.

En la figura n 22 se muestra la tensin del transistor con diodo volante incorporado.
Se observa que el pico negativo justo en la desconexin del transistor se ha reducido
considerablemente, concretamente a 1.4V que corresponde a la suma de la tensin en cada
diodo en modo de conduccin.
Cabe puntualizar que las magnitudes de los valores mostrados en las graficas 21 y 22
son magnitudes aproximadas ya que ha utilizado una carga de 1 orden similar al modelo
del motor.
Memoria descriptiva
Proyecto final de carrera Pgina 27


Figura 22. Comparacin entre modelos de la corriente armadura motor dc.

Visto que la alimentacin del motor es de tipo pulsante y no de forma continua a
causa del tipo de excitacin, modificaremos el modelo para incluir esta variacin del
comportamiento.
Si reemprendemos el estudio del modelo de primer orden encontrado en la ecuacin
n 15 e incluimos este efecto, tendremos el siguiente modelo [1]:








Figura 23. Esquema modelo + excitacin.

Donde la funcin de transferencia es:

0(s) =
k
m
R
u
+k
m
k
c
[ R
u
R
u
+k
m
k
c
s +1
(18)



Memoria descriptiva
Proyecto final de carrera Pgina 28
Despreciando los trminos resultantes del producto de k
m
k
c
frente al producto de
R
u
tendremos la ecuacin:

0(s) =
k
m
R
u
[

s +1
(19)

Donde sustituiremos las variables A y B para poder trabajar con ms claridad en el
modelo, quedando:

A =
k
m
R
u
y B =
[

(2u)

Si resolvemos el lazo de control del circuito anterior, obtendremos:

w(s)
I
u
(s)
=
A
B s +1
1 +
A
B s +1
k
c
=
A
B s +1 +A k
c
=
A
A k
c
+1
B
A k
c
+1
s +1
(21)

Substituyendo con los datos obtenidos en los anlisis anteriores tendremos como
resultado final:

[ = 22,1 1u
-7
km` , = 4 1u
-6
, R
u
= 41,S 0 , k
c
= SS,2 mNmA


w(s)
I
u
(s)
=
19S9,7S
u.SS s +1
(22)

Volviendo al tema que nos ocupaba al inicio del captulo, la excitacin PWM debe
convertir una seal analgica con valor de I
cc
a una seal digital de periodo y amplitud
constantes, obteniendo como resultado una seal con valor medio proporcional a la seal
de entrada. Esta proporcin se alcanza variando el tiempo de t
on
y ajustando el tiempo de
t
o]]
conservando de esta manera el tiempo T constante sin variar el periodo de la seal.

La funcin de transferencia del sistema ser:

I
o
m
= I
cc
t
on
I
(2S)
Memoria descriptiva
Proyecto final de carrera Pgina 29

y su modelo en Simulink:







Figura 24. Esquema modelo PWM.

1.4.4 Conjunto Excitacin PWM + motor DC

Como ya habremos podido intuir con los resultados vistos en el apartado anterior, la
velocidad instantnea de nuestro motor se ve influida directamente por la frecuencia de la
excitacin PWM. Si observamos la figura n 25 vemos unas fluctuaciones de velocidad que
vienen causadas por los periodos de t
on
y t
o]]
del PWM.
Si alimentamos la entrada (m) del modulador PWM con una rampa unitaria
observaremos en la respuesta del conjunto una amplia zona con fluctuaciones de velocidad
[1]. En la figura n 25 se muestra la grfica de la velocidad de salida del sistema frente al
ciclo de trabajo del la excitacin PWM en forma de rampa con pendiente unitaria
(multiplicando el eje X por un factor de 100 para observar mejor el efecto) donde se hacen
presentes estas fluctuaciones.












Figura 25. Respuesta del sistema.

Memoria descriptiva
Proyecto final de carrera Pgina 30
Las fluctuaciones de velocidad que se observan son a consecuencia de una
frecuencia relativamente baja de la excitacin PWM. Conociendo que la constante
mecnica del motor es de 30 ms y que el periodo del PWM es de 20 ms, surge este efecto a
causa de la proximidad de ambos tiempos. Este efecto puede ser reducido aumentando la
frecuencia de conmutacin de la excitacin.[1]

En la figura n 24 se expone la evolucin de la velocidad del motor y la seal del
PWM de forma idealizada.







Figura 26. Evolucin de la velocidad del motor

La evolucin de la velocidad entre ambos tramos viene dada por la siguiente
ecuacin:

w = w
]n
-( w
]n
-w
n
) c
-t
:
m
,
(24)


donde w
]n
es la velocidad final a que llegara el motor para t
on
= T y v
cc
= 1u I,
siendo w
]n
= 164u rpm y zero en t
oII
= T y v
cc
= u I, w
n
es la velocidad inicial de
partida y
m
es la constante de tiempo mecnica del motor.
Si consideramos que la constante de tiempo mecnica del motor es la misma para
cuando el motor aumenta su velocidad que cuando disminuye, se deducen las siguientes
ecuaciones:

w
s
= w
]n
-( w
]n
-w
1
) c
-t
:
m
,
poro u t t
on
(2S)

w
b
= w
2
c
-t
:
m
,
poro t
on
t T (26)

Considerando que para t = t
on
, w
s
= w
2
y que para t = T, w
b
= w
1
nos queda:

w
1
= w
]n

1 -A
1 -A B
(27)
Memoria descriptiva
Proyecto final de carrera Pgina 31

w
2
= B w
1
(28)

donde:
A = c
(dc
1
:
m
)
(29)

B = c
((1-dc)
1
:
m
)
(Su)


En la figura n 27 mostramos el resultado de la simulacin de las anteriores
ecuaciones, obteniendo la relacin existente del rizado de la velocidad (w
2
-w
1
) frente al
ciclo de trabajo (dc).
Se puede observar claramente que cuanto mayor es la frecuencia de la excitacin del
PWM, menor es el rizado del motor, con lo que comporta que la frecuencia de
conmutacin no puede ser escogida a la ligera. A priori podramos pensar que cuanto ms
elevada sea esta mejor, ya que tendramos un rizado muy pequeo, pero se tienen que tener
en cuenta otros factores, como por ejemplo, la resolucin temporal de nuestro sistema
En este caso, debemos tener en cuenta que el tic del sistema se utiliza para generar la onda
de la excitacin PWM, siempre que la frecuencia del PWM sea del orden de magnitud de
10 veces mayor que la resolucin del sistema no se intuyen problemas en la generacin de
la onda de excitacin del PWM. Por ejemplo un tic de Sus y una frecuencia PWM de
u.Sms.













Figura 27. Rizado de velocidad en funcin del ciclo de trabajo

Memoria descriptiva
Proyecto final de carrera Pgina 32

1.4.5 El control PID

Las siglas del controlador responden a la identificacin de las partes activas de este,
definido por las letras PID (Proporcional Integral Derivativo). [2]
Donde:
- P es la accin de control proporcional y da una salida del controlador que es
proporcional al error actual, respondiendo a la siguiente funcin de
transferencia:


y(t) = k
p
c(t) (S1)

donde k
p
es la constante proporcional ajustable.

- I es la accin de control integral y da una salida del controlador que es
proporcional al error acumulado, respondiendo a la siguiente funcin de
transferencia:

y(t) =
1
I

_ c(t) o
t
0
(t) (S2)


El bloque integral tiene como propsito disminuir y eliminar el error en estado
estacionario provocado por el modo proporcional. El control integral
acta cuando hay una desviacin entre la variable y el punto de consigna,
integrando esta desviacin en el tiempo y sumndola a la accin proporcional.

- D es la accin de control derivativo, la cual tiene un carcter de previsin al
error con lo que hace ms rpida la accin del controlador, aunque tiene la
desventaja de amplificar las seales de ruido y provocar la saturacin en el
actuador. Esta responde a la siguiente funcin de transferencia:

y(t) = I
d

o c(t)
o (t)
(SS)







Memoria descriptiva
Proyecto final de carrera Pgina 33

La suma de estas tres acciones responde a la funcin de transferencia:

y(t) = k
p
_c(t) +
1
I

_ c(t) o
t
0
(t) +I
d

o c(t)
o (t)
_ (S4)

Este algoritmo ser implementado por el alumnado dentro de las practicas de la
asignatura, y formar parte del software que se elabore, no siendo una parte fsica de
nuestra planta.
El algoritmo del controlador PID se tendr que discretizar ya que ser ejecutado en
un sistema de procesado digital. De esta manera, la ecuacin del controlador quedar de la
siguiente manera:

Ay(kI) = y(kI) -y((k -1) I) (SS)

Ay(kI) = k
1
c(kI) +k
2
c((k -1)I) +k
3
c((k -2)I) (S6)

k
1
= k
p
_1 +
I
I

+
I
d
I
] , k
2
= -k
p
_1 +2
I
d
I
] y k
3
= k
p

I
d
I
(S7)

La ecuacin n 36 proporcionar al alumno el incremento que debe aplicar a la salida
actual para corregir la respuesta del sistema. Si observamos la ecuacin podremos ver que
el controlador utiliza muestras anteriores del error para determinar el nuevo incremento en
la salida, de esta forma sigue su evolucin.
Para poder utilizar la funcin discretizada en Simulink debemos emplear la
transformada zeta. Simulink ya dispone de bloques preestablecidos para la discretizacin
de ecuaciones, veamos el esquema de bloques.




Figura 28. Unidad de retardo transformada zeta

A travs de este bloque podremos realizar el retardo de una muestra, consiguiendo
por ejemplo c(k -1).
Memoria descriptiva
Proyecto final de carrera Pgina 34
En la siguiente figura mostramos la suma de todos los bloques del controlador, ya
discretizados y en formato Simulink. Hemos enmarcado los bloques por funcionalidad para
una mejor identificacin.

Figura 29. Controlador PID discretizado

De la ecuacin n 36 podemos desgranar directamente este esquema, donde el bloque
integrador multiplica el error actual por la constante II

, el bloque proporcional resta al


valor actual del error el error anterior, resultando el incremento de error desde (k -1) a k,
y la parte diferencial tiene en cuenta la evolucin de los incrementos en (k -1) y (k -2)
y lo multiplica por la constante I
d
I.
Para un sistema de control con un amplio rango de condiciones de operacin, puede
suceder que la variable de control alcance los lmites prefijados del actuador. Cuando esto
pasa, el bucle realimentado permanece en su lmite independientemente de la salida del
proceso. Si se usa un controlador con accin integral, el error continuar siendo integrado,
incrementando an ms su valor. Esto significa que el trmino integral puede volverse muy
grande. Para evitar esta situacin se inserta el bloque de saturacin, el cual implementa el
concepto de la saturacin integral del controlador. ste est ubicado al final del controlador
para evitar entregar a la etapa siguiente cualquier valor superior al mximo de operacin,
pero por otro lado, este bloque tambin permite una operatividad permanente del
controlador, al evitar la saturacin de la variable controlada.
Por otra parte, el bloque de retardo colocado en el bloque integrador tiene la funcin de
implementar la integral, ya que tenemos que recordar que este algoritmo entrega a su salida
en incrementos.
Las constantes K
p
, I

, I
d
y I juegan un papel importante en el comportamiento del
controlador, pudiendo llevar el sistema a un error prximo a zero o por lo contrario llevarlo
a la inestabilidad. La sintonizacin de estas variables no es una tarea fcil, por suerte hay
herramientas para averiguar sus valores. Por ejemplo la tcnica Ziegler-Nichols.
Memoria descriptiva
Proyecto final de carrera Pgina 35

1.4.6 Lazo de Control

La suma de todos los bloques anteriores forman el modelo completo de la planta y su
realimentacin para el lazo de control.


Figura 30. Modelo simulink lazo de control

Si procedemos a la simulacin del conjunto global a una consigna concreta de 500
rpm observamos los siguientes resultados:

Figura 31. Salida modelo completo con control PI con PWM 50 Hz

Memoria descriptiva
Proyecto final de carrera Pgina 36


Este resultado se ha obtenido mediante un control proporcional e integral. Se puede
observar que el resultado obtenido es muy prximo a la consigna al sistema. Existe un
pequeo rizado que puede venir provocado por la frecuencia de la excitacin PWM como
ya se explico en su momento en el apartado n 1.4.4, que en este caso es de 50 Hz
Si en cambio aumentamos la frecuencia de conmutacin de la excitacin a 100 Hz
veremos que el rizado se reduce sensiblemente, y sin haber cambiado las constantes del
controlador.

Figura 32. Salida modelo completo con control PI con PWM 100 Hz


1.4.7 Sintonizacin Controlador PID

Para sintonizar el controlador de la planta podemos utilizar el mtodo diferentes
mtodos. [2]

Mtodo basado en la respuesta temporal a un escaln en lazo abierto (Ziegler-
Nichols).

Es un mtodo grafico. Consiste en encontrar la respuesta del sistema en lazo
abierto a un escaln. Seguidamente tendremos que observar el resultado y
extraer los siguientes parmetros

Memoria descriptiva
Proyecto final de carrera Pgina 37


A travs de la siguiente tabla podremos encontrar las diferentes constantes
del controlador.

3ontrolador 4, Ti Td
P 1/a
PI 05$/a 367
PID 152/a 267 7/2


Mtodo de la respuesta en lazo cerrado

Este mtodo consiste en conocer la ubicacin de los polos del sistema
utilizando el criterio de Nyquist, e ubicar estos justo encima del eje
imaginario, encontrando entonces los parmetros K
u
(ultima ganancia) y I
u

(timo periodo)

Para encontrar estos parmetros podemos proceder de la siguiente manera:

1. Eliminar las acciones integral y derivativa.

2. Aumentar k lentamente hasta que la planta empiece a oscilar.
En el momento que se produzca la oscilacin obtendremos
los parmetros K
u
y I
u


A travs de la siguiente tabla podremos encontrar los parmetros del
controlador:

3ontrolador 4, Ti Td
P 086K
u

PI 0846K
u
08#6 I
u

PID 08!6K
u
086 I
u
08126 I
u




Memoria descriptiva
Proyecto final de carrera Pgina 38


Mtodo Emprico

Procederemos de la siguiente manera:

1. Eliminar del controlador las acciones integral y derivativa (Td=0,
Ti=inf)
2. Aumentar K hasta que encontremos una respuesta de la planta
satisfactoria, sin tener en cuenta el error estacionario.
3. Aumentar K y con la accin derivativa intentar recuperar la
respuesta obtenida en el apartado anterior..
4. Repetir el anterior apartado hasta que k sea lo ms grande
posible.
5. Agregar la accin integral para eliminar el error en estado
estacionario.






















Memoria descriptiva
Proyecto final de carrera Pgina 39
1.4.8 Errores del sistema

1.4.8.1 PWM

Para poder obtener el menor rizado de velocidad en el eje del motor deberemos tener
una excitacin PWM con una regulacin muy precisa. Este tipo de regulacin implicar
tener unos incrementos de t
on
y t
o]]
muy pequeos, en consecuencia necesitaremos un tic
del sistema adecuado para poder generar estos tiempos [1].

Figura 33. Onda PWM

En la figura anterior se puede observar el efecto que provocara el incremento de un
tic en la velocidad del motor. Claramente, si el tiempo t
on
es ms grande el motor
alcanzara una mayor velocidad, y su media se ver modificada.
Para examinar mejor este efecto, volveremos al estudio realizado en el apartado
1.4.4. donde extrajimos las siguientes formulas:

w
1
= w
]n

1 -A
1 -A B
(27)

w
2
= B w
1
(28)

donde:
A = c
(dc
1
:
m
)
(29)

B = c
((1-dc)
1
:
m
)
(Su)


Memoria descriptiva
Proyecto final de carrera Pgina 40

Las cuales nos ayudaran a travs de una simulacin de Matlab a ver la influencia de
un tic en el tiempo de t
on
.

dc=[0:0.01:1];
Taus=30e-3;
Taub=500e-3;

T=10e-3;
A=exp(dc*(T/Taus));
B=exp((1-dc)*(T/Taub));
Wfin=1640;

for n=1:101,
W1(n)=Wfin*((1-A(n))/(1-A(n)*B(n)));
W2(n)=B(n)*W1(n);
end

T=10e-3;
tic=0.5e-3;
x=(dc+(tic/T));
for m=1:101,
if x(m)>1
x(m)=1;
end
end

A=exp(x*(T/Taus));
B=exp((1-x)*(T/Taub));
Wfin=1640;

for n=1:101,
W3(n)=Wfin*((1-A(n))/(1-A(n)*B(n)));
W4(n)=B(n)*W3(n);
end


figure(1)
hold on;

plot(dc,(W4-W2));

xlabel('Ciclo de Trabajo')
ylabel('incremento (rpm)')
hold off;

Cdigo 1. Simulacin incremento velocidad respecto dc


En la siguiente figura podemos observar la influencia que tiene un incremento del
ciclo de trabajo de dc de un solo tic frente a la velocidad del motor, pasando a ser un ciclo
de trabajo de dc a Jc _ticI.


Memoria descriptiva
Proyecto final de carrera Pgina 41














Figura 34. Incremento de velocidad respecto el punto de trabajo y el tic

Dependiendo de la base de tiempo del sistema un solo incremento de t
on
en una
magnitud de tic, para un ciclo de trabajo pequeo causa un incremento de velocidad muy
grande. Este efecto provoca una mala regulacin de la velocidad y la posicin del eje del
motor. El objetivo deseado es la mayor resolucin de la excitacin PWM posible, para
poder evitar estos saltos de velocidad en un solo incremento. Cuanto ms pequeo sea el
tic ms resolucin obtenemos y en consecuencia tenemos una mejor regulacin.

Figura 34.1. Incremento de velocidad a causa del incremento de un tic

La frecuencia de la excitacin PWM viene dada por:
1
I
=
1
n tic


la cual es la inversa de n veces la base de tiempos tic de nuestro sistema. Si
disminuimos el valor de tic, aumentaremos el valor de n, consiguiendo una mejor
resolucin al tener un tiempo base tic ms pequeo.
Memoria descriptiva
Proyecto final de carrera Pgina 42
En cuanto al error producido por un incremento de tic en el tiempo de t
on
, cuanto
ms pequeo sea ste, menor desviacin tendremos en el punto de trabajo dc de la
excitacin PWM.
Por ejemplo, con una frecuencia de excitacin del PWM de 50 Hz y un ciclo de
trabajo de 0,05 el error causado por un tic de Sus es de:

Jc +
Atic
I
= u,uS +
Sus
2ums
= u,uS2S - E

=
|u,uS -u,uS2S|
u,uS
= S%

En cambio, para un tic de 1us, el error causado por el incremento del tic es de:

Jc +
Atic
I
= u,uS +
1us
2ums
= u,uSuS - E

=
|u,uS -u,uSuS|
u,uS
= 1%


1.5 Emulador de la Planta

A causa del coste de los equipos del conjunto Motor-Encoder se dispone de unas
unidades limitadas. Con el fin de facilitar al alumno la realizacin de las prcticas en los
laboratorios o bien en horas no lectivas se decidi crear un emulador para substituir el
equipo principal.
Este emulador es una placa electrnica de medidas reducidas que puede conectarse al
puerto paralelo del PC, de forma que es substituible un equipo por otro sin realizar ningn
cambio.
Este nuevo equipo debe generar las seales Ay B del encoder segn la tensin media
que aplique la excitacin PWM, y la seal de peticin de interrupcin al puerto paralelo.
Para facilitar el diseo se utiliz el modelo de primer orden de respuesta lineal, sin
contemplar el efecto del PWM y el diodo volante del puente de alimentacin [1].
En la siguiente figura mostramos la base del diseo para la creacin de este
emulador. En la fase inicial se decidi que el emulador no diferenciara entre el giro de
derechas e izquierdas. De aqu que los pines 2 y 3 de salida del PWM desde el PC se les
aplica la funcin OR.







Memoria descriptiva
Proyecto final de carrera Pgina 43



Figura 35. Conversin seal PWM a frecuencia a travs C.I 555

La siguiente etapa se instalo para realizar una separacin entre el integrador y las
seales de entrada.
Para dotar al emulador de unas caractersticas similares a las del motor se ha
insertado un integrador con la misma constante de tiempo que tena el sistema original,
dotando de esta manera una dinmica parecida al conjunto del motor-encoder.
La tensin media del integrador responder a la siguiente ecuacin:

I
o
=
1
I
_I

Jt = I
mux

t
on
I
(S1)

y su evolucin temporal seguira a una forma de onda parecida a la siguiente figura.
(Orden y magnitud no comparables, slo como ejemplo)

Figura 36. Seal de salida integrador
Memoria descriptiva
Proyecto final de carrera Pgina 44
Si fijamos que la funcin de transferencia del sistema de primer orden del motor es:

0(s) =
11S
u.uSs +1
(S2)

y la funcin de transferencia del integrador:

0

(s) =
1
RCs +1
=
1

m
s +1
=
1
u.uSSs +1
(SS)

Donde las dos funciones de transferencia anteriores deberan de ser parecidas para
poder tener una dinmica comparable.
La etapa de la fuente de corriente proporcionara la ganancia necesaria para equiparar
las dos funciones de transferencia, donde esta suministrara una corriente de colector con
valor:

I
c

I
B
-I
BL
R
L

I
o
-u.7
SSuu
(S4)

El espejo de corriente se encargara de cargar el condensador de 33 nF con la misma
intensidad que el colector de la fuente de corriente. Entonces la corriente de este depender
de la tensin de salida del integrador, siendo:

I
c
=
1
C
_i
c
Jt =
1
C
I
c
t (SS)

Si consideramos que la corriente del condensador sigue una evolucin con pendiente
constante, tendremos que la tensin entre bornes ser:


Figura 37. Tensin en bornes del condensador
Memoria descriptiva
Proyecto final de carrera Pgina 45

Donde nombraremos la amplitud de la seal entre 1/3 y 2/3 de Vcc con el nombre de
A, que corresponder a:


A =
I
c
C
I
d
(S6)

donde despejaremos:

I
d
= A
C
I
c
(S7)

y en consecuencia la frecuencia de la seal:

d
=
I
c
A C
(S8)

donde substituiremos el valor de I
c
:

d
=
1
A C

I
o
-I
BL
R
L
=
1
A C

I
mux

t
on
I
-I
BL
R
L
(S9)

En este punto, si configuramos el oscilador C.I. 555 en formato de multivibrador
estable obtendremos una seal de salida de este con una frecuencia de
d
= 2S.7 kEz,
siendo C = SS nF,R
L
= S,S k0, I
BL
= u.7 I y I
cc
= I
mux
= S I
Realizando este circuito hemos creado un oscilador controlado por tensin, que en
consecuencia relaciona el ciclo de trabajo del PWM con la frecuencia de salida del
oscilador.
El motor real considerado para la realizacin del emulador tiene una velocidad
mxima de 1725 rpm, el cual tiene unido el encoder relativo con una resolucin de 200
pulsos/revolucin. Esta unin de elementos, a su mxima velocidad de funcionamiento
segn una tensin de alimentacin de 15 V, nos supondra una frecuencia de = 2uu
1750
60
= S7Su Ez.
Esta frecuencia es del orden de 4 veces menor que la frecuencia del oscilador
C.I.555, por lo que tendremos que dividir esa frecuencia para conseguir una frecuencia
parecida al conjunto del motor-encoder.


Memoria descriptiva
Proyecto final de carrera Pgina 46

Para dividir esta frecuencia se han instalado unos biestables tipo D en cascada, los
cuales dividirn la seal por 4 y generaran la seal en cuadratura parecida a la del encoder.
Tambin se tiene que incluir la detencin de flancos para provocar la seal de la solicitud
de interrupcin IRQ-7, donde utilizaremos los circuitos estudiados en la figura n 9.


Figura 38. Circuito Emulador

En la siguiente figura podemos observar la evolucin de las seales que genera el
emulador. Vemos la seal producida por el oscilador C.I.555 y cmo el biestable A1
reduce su frecuencia a la mitad, luego los biestable A2 y A3 generan la seal en
cuadratura, y los detectores de flanco generan la seal para la peticin de la interrupcin
IRQ-7.


Memoria descriptiva
Proyecto final de carrera Pgina 47

Figura 39. Relacin de la evolucin de las seales Emulador

1.6 Software de simulacin de la Planta

La premisa del software realizado en el presente proyecto es la de simular el
comportamiento de la planta descrita en el anterior apartado, facilitando la tarea de
desarrollo de las practicas de la asignatura en horas no lectivas.

Figura 40. Concepto Simulador
Memoria descriptiva
Proyecto final de carrera Pgina 48

No es objeto del proyecto realizar una simulacin del modelo matemtico del
conjunto motor dc + encoder, sino el crear unas libreras que simulen el comportamiento
de la velocidad del motor respecto la alimentacin recibida por la etapa de la excitacin
PWM, obteniendo como resultado las correspondientes seales del encoder.
El camino fijado para la realizacin del presente simulador ha sido el componer un
cdigo que interacte el mnimo posible con el alumno que realiza las prcticas de la
asignatura, de modo que ste no desve su atencin en la utilizacin/comprensin del
cdigo del simulador.
De esta manera, el xito del simulador ser proporcional a su sencillez de utilizacin,
pretendiendo confundir lo mnimo posible al alumno. Desafortunadamente, para el flujo de
informacin entre el cdigo creado del emulador y el cdigo del alumno habr una serie de
restricciones, las cuales sern descritas ms adelante.

1.6.1 Descripcin del Software

Siguiendo por el camino de la sencillez, el cdigo del simulador se ha implementado
en ficheros de cabecera *.h para facilitar su uso. Estas libreras estn formadas por un
cdigo fuente en forma de macros, siguiendo al estilo de las libreras facilitadas en la
asignatura para la realizacin de las prcticas. Este hecho ha condicionado el desarrollo del
simulador.
Tambin se ha tenido en cuenta los diferentes modos de programacin que se pueden
utilizar en el entorno de Turbo C. Si el alumno ha realizado todo el cdigo fuente
directamente en el archivo main ( ), o por lo contrario, si el alumno ha escogido realizar un
proyecto, separando en archivos el cdigo fuente.
Para facilitar la realizacin del cdigo del simulador se han atacado los diferentes
problemas en dos libreras diferentes, desglosando en cada archivo las macros pertinentes.
Formando 2 libreras nombradas Q5.h y k1.h donde en ellas reside tanto el cdigo del
simulador, como las funciones que debe utilizar el alumno para emplearlo.


Figura 41. Concepto Simulador
Memoria descriptiva
Proyecto final de carrera Pgina 49

El archivo nombrado Q5.h aborda el problema del modo de programacin utilizado
por el alumno (archivo main ( ) o proyecto) y el modo de funcionamiento del simulador
(ON OFF)
Por otra parte el archivo k1.h aborta al completo el cdigo fuente para la simulacin
del comportamiento de la planta, incluyendo las macros de comunicacin con el puerto
paralelo virtualizado.
Debemos recordar que la razn de este proyecto reside en el problema de la
accesibilidad del puerto paralelo. Por este motivo hemos virtualizado los registros del
puerto paralelo ubicados en Base+0, Base+1 y Base+2 a un array de las mismas
dimensiones, un array de 8+8+8 bits, como mostramos en la figura n 42.


Figura 42. Virtualizacin del Puerto Paralelo


1.6.2 Librera Q5.h

La librera Q5.h tiene principalmente dos propsitos, solucionar:

- Modo de programacin

- Modo de operacin

Dependiendo de la opcin escogida por el alumno en la realizacin del cdigo fuente
de las prcticas, tenemos que amoldar nuestro cdigo para que l pueda compilar el cdigo
sin ningn error. En el entorno de Turbo C tenemos las siguientes opciones para realizar un
archivo ejecutable:

- Realizar todo el cdigo fuente en un archivo con extensin *.c el cual
contendr la funcin main ( ).

- Realizar un proyecto con diferentes archivos con extensin *.c y otro
archivo con extensin *.c que contenga la funcin main ( )

Memoria descriptiva
Proyecto final de carrera Pgina 50
Para poder escoger entre las diferentes opciones de programacin sin que fuera de
difcil aplicacin para el alumno, se cre la definicin project. Mediante la insercin de
esta definicin, el alumno escoge de una manera simple y fcil el modo que utilizar.
La nica diferencia entre las dos opciones es la declaracin de las variables a utilizar
por nuestro emulador. En el caso que el alumno slo programara en un nico archivo, este
problema no existira, pero si el alumno realizaba un proyecto, podra llegar el caso que
durante la compilacin del cdigo surgiera un error por no tener las variables del emulador
declaradas en diferentes archivos de cdigo fuente.

















Figura 43. Modo de Programacin

#ifndef project
hard_motor virtual_motor;
//Declaraci variable simulador
void interrupt (*old_handler_prn2)();
/* mantiene el manejador original */
#else
extern hard_motor virtual_motor;
#endif
Cdigo 1. Parte cdigo librera Q5.h

Mediante el cdigo descrito anteriormente solucionamos el problema de la
compilacin. En el caso de haber utilizado un proyecto, se inserta la declaracin #define
Project, de esta manera, automticamente se declara el puntero de la estructura de datos de
forma externa en los diferentes archivos del proyecto realizado.


Inicio
Project
defined?
Archivo Principal
Definir Variable
como local
Archivo Secundario
Definir Variable
como externa


Fin
NO SI
Memoria descriptiva
Proyecto final de carrera Pgina 51
En el anexo B se detalla las operaciones a realizar en cada caso, para facilitar el uso
al alumno.
El otro problema abordado en esta librera es la funcionalidad del emulador. La
premisa ms importante de este proyecto era la de crear un simulador de la planta, donde
fuese extremadamente sencillo cambiar de modo real a modo simulacin.
Al inicio de las prcticas de la asignatura se hace entrega del tutorial de prcticas. En
este tutorial se incluye una librera llamada printer.h, donde residen las macros
necesarias para comunicarse con el puerto paralelo del PC, y as poder leer y escribir en el
puerto. El problema surge cuando estamos utilizando un ordenador porttil, ya que
normalmente no tienen accesible el puerto paralelo. De esta manera, nuestro simulador
tendra que tener total compatibilidad con las macros existentes, de tal forma que a la hora
de compilar no se produjeran errores.
Mediante la definicin de una etiqueta pudimos reparar en la solucin al problema.
En el caso de que el alumno defina la etiqueta #define simula, nuestro cdigo substituir la
librera printer.h por la nuestra llamada k1.h, equipada con las mismas declaraciones
de macros para no provocar errores en la compilacin. En caso contrario, si esta etiqueta
no se ha definido, nuestro cdigo incluir la librera printer.h y sustituir las
declaraciones de las funciones utilizadas por el simulador por macros vacas, de esta forma
no se tendr que borrar la lnea de dentro del cdigo del alumno cada vez que pase de
modo simulacin a modo real.
















Figura 44. ON-OFF simulador





Inicio
Simula
defined?
Simulador RUN
Adjuntamos librera
simulacin
Simulador OFF
Adjuntamos Liberia
printer.h


Fin
SI NO
Memoria descriptiva
Proyecto final de carrera Pgina 52

#ifdef simula
#include "k1.h"
#else
#include "printer.h"
#define ini_datos_sim() { }
#define sim_motor() { }
#define restaura() { }
#endif
Cdigo 2. Parte cdigo librera Q5.h

Por otra parte, en esta librera se define la estructura de datos hard_motor donde se
declaran las variables necesarias para realizar la simulacin.

typedef struct
{
long count; //interval abans d'executar la
funci associada (micro seg)
long recarga; //valor de recarrega
double tic; //interval entre
interrupcions(microseg)
int direction; //direccion motor;izquierda-
derecha-0
int vel_max_motor; //velocidad maxima nominal
motor
int puntos_encoder; //n ventanas del encorder
por vuelta
int index; //n de ventana en que se
encuentra el encoder (0-3)
unsigned int registroPRN[3]; //variable port
virtualitzat
}hard_motor;
Cdigo 3. Parte cdigo librera Q5.h

Donde la variable count ser el valor resultante del clculo definido por las variables
de programa del ciclo de trabajo y la velocidad mxima del motor, interviniendo tambin
la base de tiempos del sistema (tic)..
La variable recarga es el valor de recarga de la variable count una vez consumida.
La variable tic har referencia al tic que seleccione el alumno durante la ejecucin de su
programa, siendo la base de tiempo mnima para poder realizar los correspondientes
timers.
La variable direction nos indicar el sentido del motor, a izquierdas o a derechas. La
variable vel_max_motor tal y como indica su nombre, es el valor de velocidad mxima
segn la tensin de alimentacin de nuestra fuente.
La variable index nos indica en qu ventana del encoder se encuentra el sistema en
un momento dado. Se ha definido el orden de las ventanas en la siguiente figura:
Proyecto final de carrera


La variable registroPRN
la informacin que dirigamos antes a los registros del puerto paralelo.

registroPRN + 0:
Bit " Bit !
Pin $ Pin #

registroPRN + 1:
Bit " Bit !
/Pin 11 Pin 10 Pin 12

registroPRN + 2:
Bit " Bit !
0 0


Habiendo sustituido los tres registros del puerto paralelo mapeados en memoria por
esta variable con igual tamao.





Memoria descriptiva

Figura 45. Orden ventanas encoder
registroPRN es un array de 3 posiciones de 8 bits donde almacenaremos
que dirigamos antes a los registros del puerto paralelo.
Bit Bit 4 Bit 3 Bit 2 Bit 1
Pin " Pin ! Pin Pin 4 Pin 3
Bit Bit 4 Bit 3 Bit 2 Bit 1
Pin 12 Pin 13 Pin 1 0 0
Bit Bit 4 Bit 3 Bit 2 Bit 1
0 I12 /Pin 1" Pin 1! /Pin 14
Tabla 3. Registros del puerto paralelo
Habiendo sustituido los tres registros del puerto paralelo mapeados en memoria por
esta variable con igual tamao.
Memoria descriptiva
Pgina 53
es un array de 3 posiciones de 8 bits donde almacenaremos
Bit 0
Pin 2
Bit 0
0
Bit 0
/Pin 1
Habiendo sustituido los tres registros del puerto paralelo mapeados en memoria por
Memoria descriptiva
Proyecto final de carrera Pgina 54

1.6.3 Librera k1.h

En esta librera residen todas las funciones necesarias para poder simular el
comportamiento de la planta estudiada, emulando la velocidad respecto la tensin de
alimentacin versus el ciclo de trabajo del PWM y las seales ocasionadas al respecto por
el encoder.
En la cabecera de la librera se declaran unas etiquetas que nos ayudaran a
simplificar las operaciones de escritura del cdigo.
Seguidamente tenemos la macro llamada ini_datos_sim( ), que tal y como da a
entender su nombre inicializa las variables de la estructura que contiene los datos
necesarios para el funcionamiento del sistema.
Como puntos ms importantes a destacar de la macro es la puesta a cero de la
variable donde almacenaremos los datos que iban antes a los registros del puerto paralelo y
la sustitucin del puntero a la funcin asociada a la interrupcin software del puerto
paralelo, pudiendo provocar de esta manera interrupciones de este a nuestra voluntad.
Consiguiendo de esta manera cerrar el lazo entre la informacin del encoder y el control
de la velocidad del motor.

#define ini_datos_sim() {
*(virtual_motor.registroPRN+0)=0x00;
*(virtual_motor.registroPRN+1)=0x00;
*(virtual_motor.registroPRN+2)=0x00;
virtual_motor.index=0;
old_handler_prn2=_dos_getvect(0x17);
_dos_setvect(0x17,cuadrat);
virtual_motor.vel_max_motor=25;
virtual_motor.puntos_encoder=800;
virtual_motor.count=0;
virtual_motor.recarga=0;
virtual_motor.direction=d_derecha;
}
Cdigo 4. Macro ini_datos_sim. Parte cdigo librera k1.h

La base de tiempos utilizada a travs de un temporizador del chip 8253 la cual se ha
denominado como tic, que utiliza el alumno para realizar otros timers, no es una base de
tiempo fijada.
Cada alumno puede escoger una base de tiempos tic de forma sensata y dentro de
unos rangos. Este hecho condiciona totalmente nuestra forma de operar. A causa de no
tener fijada una base de tiempo concreta, nuestro sistema tiene que ser flexible al cambio
sta.




Memoria descriptiva
Proyecto final de carrera Pgina 55
En relacin a este hecho, tenemos la macro llamada cal_time_irq7( ).

#define cal_time_irq7() {
float x;
x=virtual_motor.vel_max_motor*inf_pwm.dc;
if (x<0)
{
x=x*(-1);
virtual_motor.direction=d_izquierda;
}
else
{virtual_motor.direction=d_derecha; }
if (x==0) x=1;
x=x*virtual_motor.puntos_encoder;
x=(1/x)*1000000;
x=x/h_timer.tic;
virtual_motor.count=x+0.5;
virtual_motor.recarga=virtual_motor.count;
}
Cdigo 5. Macro cal_time_irq7. Parte cdigo librera k1.h

Esta macro calcula el tiempo que asociaremos al timer count de la estructura de datos
del tipo hard_motor. Este tiempo se determina a travs de la velocidad mxima del motor
(segn su alimentacin), el ciclo de trabajo determinado por el controlador PID, la
resolucin del encoder y finalmente por el tic escogido por el usuario.

count =
1
n Jc intcrrupccioncs RN
tic
(S8)


n Jc intcrrupccioncs RN = Ic
mx moto
Jc puntoscncoJcr (S9)

El timer count nos determinar el tiempo entre interrupciones asociadas a la funcin
de interrupcin software del IRQ 7.
Dependiendo de la velocidad que tenga el motor, este tiempo ser mayor o menor. Es
importante tener un tic pequeo para conseguir una buena resolucin, ya que si por lo
contrario tenemos un tic grande, como cabe esperar el rizado de velocidad ser elevado.

n Jc int. RN = S98u
rc
min

1 min
6u s
8uu pu. cncoJcr = SSu66
ir
scg
(4u)
count =
1
SSu66
SS 1u
-6
= u.SS = nimo 1 count =
1
SS 1u
-6
= 28S71
ir
scg
(41)

Proyecto final de carrera
Como se observa en las formulas anteriores, para la mxima velocidad del motor,
con un tic de 35s obtendramos un error muy grande en la velocidad final de
de tener un tic inapropiado para tener la resolucin necesaria para esa velocidad.















La base principal del emulador es la macro llamada sim_motor( ). Esta origina las
seales A y B que generara el encoder, segn el nmero de ventana ya especificado ms
arriba, provocando posteriormente la in
manera el lazo de control. En la
La llamada a esta macro debe insertarse al final de la rutina de atencin a la
interrupcin IRQ0 realizada por el alumno, un lugar sencillo y que no entorpecer la
ejecucin de su cdigo.
Si observamos el diagrama de bloques de la pgina anterior, la variable clave es
variable count, la cual determina en qu
07. Una vez transcurrido el tiempo, la macro recalcula el tiempo por si se ha variado el
ciclo de trabajo. Dependiendo de la direccin establecida y de la ventana
encoder), se generarn las seales A y B correctamente al igual como hara el encoder, y se
provocar una llamada a la interrupcin software asociada a IRQ
De esta forma, cerramos el lazo de control sin modificar considerablemente el c
realizado por el alumno. La clave reside en cambiar el vector que apunta a la interrupcin
hardware del puerto paralelo por el vector que apunta a la interrupcin software de este.
En modo de utilizacin normal con el hardware activo, el alumno coloca el puntero
de la funcin a asociada a la interrupcin el puerto paralelo en el vector 0x0F de la tabla de
vectores de interrupciones. El cambio
funcin asociada a la interrupcin IRQ
interrupcin, que corresponde a la interrupcin software del puerto paralelo.

Memoria descriptiva

Como se observa en las formulas anteriores, para la mxima velocidad del motor,
con un tic de 35s obtendramos un error muy grande en la velocidad final de
inapropiado para tener la resolucin necesaria para esa velocidad.
Figura 46. Tiempo entre interrupciones IRQ07
La base principal del emulador es la macro llamada sim_motor( ). Esta origina las
que generara el encoder, segn el nmero de ventana ya especificado ms
arriba, provocando posteriormente la interrupcin del puerto paralelo,
En la figura 47 mostramos el diagrama de ejecucin
sta macro debe insertarse al final de la rutina de atencin a la
interrupcin IRQ0 realizada por el alumno, un lugar sencillo y que no entorpecer la
Si observamos el diagrama de bloques de la pgina anterior, la variable clave es
, la cual determina en qu instante debe provocarse una interrupcin en IRQ
07. Una vez transcurrido el tiempo, la macro recalcula el tiempo por si se ha variado el
ciclo de trabajo. Dependiendo de la direccin establecida y de la ventana
n las seales A y B correctamente al igual como hara el encoder, y se
una llamada a la interrupcin software asociada a IRQ-07.
De esta forma, cerramos el lazo de control sin modificar considerablemente el c
realizado por el alumno. La clave reside en cambiar el vector que apunta a la interrupcin
hardware del puerto paralelo por el vector que apunta a la interrupcin software de este.
En modo de utilizacin normal con el hardware activo, el alumno coloca el puntero
de la funcin a asociada a la interrupcin el puerto paralelo en el vector 0x0F de la tabla de
vectores de interrupciones. El cambio el software de simulacin coloca el punte
funcin asociada a la interrupcin IRQ-7 en el vector 0x17 de la tabla de vectores de
interrupcin, que corresponde a la interrupcin software del puerto paralelo.
Memoria descriptiva
Pgina 56
Como se observa en las formulas anteriores, para la mxima velocidad del motor,
con un tic de 35s obtendramos un error muy grande en la velocidad final de ste, a causa
inapropiado para tener la resolucin necesaria para esa velocidad.
La base principal del emulador es la macro llamada sim_motor( ). Esta origina las
que generara el encoder, segn el nmero de ventana ya especificado ms
terrupcin del puerto paralelo, cerrando de esta
mostramos el diagrama de ejecucin.
sta macro debe insertarse al final de la rutina de atencin a la
interrupcin IRQ0 realizada por el alumno, un lugar sencillo y que no entorpecer la
Si observamos el diagrama de bloques de la pgina anterior, la variable clave es la
instante debe provocarse una interrupcin en IRQ-
07. Una vez transcurrido el tiempo, la macro recalcula el tiempo por si se ha variado el
ciclo de trabajo. Dependiendo de la direccin establecida y de la ventana actual (seales
n las seales A y B correctamente al igual como hara el encoder, y se
De esta forma, cerramos el lazo de control sin modificar considerablemente el cdigo
realizado por el alumno. La clave reside en cambiar el vector que apunta a la interrupcin
hardware del puerto paralelo por el vector que apunta a la interrupcin software de este.
En modo de utilizacin normal con el hardware activo, el alumno coloca el puntero
de la funcin a asociada a la interrupcin el puerto paralelo en el vector 0x0F de la tabla de
el software de simulacin coloca el puntero de la
7 en el vector 0x17 de la tabla de vectores de
interrupcin, que corresponde a la interrupcin software del puerto paralelo.
Memoria descriptiva
Proyecto final de carrera Pgina 57







































Figura 47. Diagrama ejecucin IRQ 0

Llamada Rutina
Sim_motor ( )


Count=0 ?

Count --

Calcula tiempo
Tiner segn dc
PWM


Direccin ?

Genera seales
A y B

Provoca soft
interrupt puerto
paralelo

Fin rutina
atencin IRQ-0

Genera seales
A y B

Provoca soft
interrupt puerto
paralelo
{}
NO
SI
DERECHA IZQUIERDA
Rutina atencin IRQ0
Memoria descriptiva
Proyecto final de carrera Pgina 58
El cdigo fuente de la macro es el siguiente:

#define sim_motor() {
if (!virtual_motor.count)
{
cal_time_irq7();
virtual_motor.count=virtual_motor.recarga;
if (virtual_motor.direction==d_derecha) {
switch(virtual_motor.index){
case 0:
*(virtual_motor.registroPRN+1)=0x20;
geninterrupt(0x17);
virtual_motor.index++;
break;
case 1:
*(virtual_motor.registroPRN+1)=0x30;
geninterrupt(0x17);
virtual_motor.index++;
break;
case 2:
*(virtual_motor.registroPRN+1)=0x10;
geninterrupt(0x17);
virtual_motor.index++;
break;
case 3:
*(virtual_motor.registroPRN+1)=0x00;
geninterrupt(0x17);
virtual_motor.index=0;
break;}
}
if (virtual_motor.direction==d_izquierda) {
switch(virtual_motor.index){
case 0:
*(virtual_motor.registroPRN+1)=0x10;
geninterrupt(0x17);
virtual_motor.index++;
break;

case 1:
*(virtual_motor.registroPRN+1)=0x30;
geninterrupt(0x17);
virtual_motor.index++;
break;
case 2:
*(virtual_motor.registroPRN+1)=0x20;
geninterrupt(0x17);
virtual_motor.index++;
break;
case 3:
*(virtual_motor.registroPRN+1)=0x00;
geninterrupt(0x17);
virtual_motor.index=0;
break;}
} }
else
{ virtual_motor.count--;}
}
Cdigo 6. Macro sim_motor. Parte cdigo librera k1.h

Memoria descriptiva
Proyecto final de carrera Pgina 59
A partir de este punto, tenemos que cambiar las macros que trabajaban con los
registros del puerto paralelo (datos de partida en las practicas de la asignatura) por macros
con igual identidad, pero cambiando su interior para operar con nuestra variable llamada
registroPRN de la estructura de datos virtual_motor.

Por ejemplo la macro llamada pulse_on_a( ) la cual tena por funcin alimentar la
parte derecha del puente de transistores. La metodologa de la operacin a realizar es la
misma que la original, pero sobre la variable registroPRN en vez del registro del puerto
paralelo.

#define pulse_on_a()
{
*(PRN_BASE)=((*(PRN_BASE)&PULSEOFF_B)|PULSEON_A);
virtual_motor.direction=d_derecha;
}

Cdigo 7. Macro pulse_on_a. Parte cdigo librera k1.h

Por otra parte, al contrario que la operacin anterior, se anula la alimentacin a la
parte derecha del puente de transistores.

#define pulse_off_a()
{
*(PRN_BASE)=(*(PRN_BASE))&PULSEOFF_A;
virtual_motor.direction=d_stop;
}

Cdigo 8. Macro pulse_off_a. Parte cdigo librera k1.h



Es importante transformar todas las macros existentes en el archivo printer.h
suministrado al principio de las practicas, porque durante el cambio de modo entre sistema
real y sistema en emulador no surjan errores de compilacin por no tener declaradas las
macros.
El resto de macros sern comentadas en el anexo B, donde estar especificado todo
el cdigo del emulador.











Memoria descriptiva
Proyecto final de carrera Pgina 60
1.7 Modo de Uso

Para poder utilizar este simulador y sus libreras existen unas restricciones de uso.
A causa del flujo necesario de informacin entre el cdigo que realice el alumno y las
libreras del simulador, es necesario definir las variables nombradas de la siguiente forma:

















Figura 48. Restricciones de Uso

De no ser as, el programa de compilacin retornar diferentes errores por variables
no declaradas y no se generar el fichero ejecutable.













- El puntero a la estructura HARD_TIMER debe llamarse h_timer

- El puntero a la estructura SOFT_TIMER debe llamarse s_timer

- El puntero a la estructura PWM debe llamarse inf_pwm

- El puntero a la estructura PID debe llamarse inf_pid
Memoria descriptiva
Proyecto final de carrera Pgina 61
En el caso que el alumno haya decidido realizar la programacin de las prcticas en
un solo archivo con extensin *.c, donde residan todas sus funciones y macros, deber
realizar estos ajustes en su cdigo de programa para poder utilizar el simulador.


















Figura 49. Cambios en el cdigo


Estos ajustes slo se debern realizar la primera vez que utilice el simulador. Las
macros insertadas son inertes en caso que el simulador est en modo de no operacin.









- Insertar definicin: # define simula

- Incluir librera: #include q5.h , NO incluir la librera Printer.h

- Insertar llamada a funcin de inicializacin simulador: ini_datos_sim ( )
(Esta debe ubicarse despus de las pertinentes inicializaciones de todas
las variables del programa realizado por el alumno)

- Insertar llamada a funcin de restauracin: Restaura_sistema ( )
(Debe ubicarse al final del programa)

- Insertar llamada a funcin para ejecutar el simulador: sim_motor ( )
(Esta debe ubicarse al final de la rutina de atencin IRQ 0 realizada por el
alumno)
Memoria descriptiva
Proyecto final de carrera Pgina 62
En el caso que el alumno haya decidido realizar la programacin con la modalidad
de proyecto, teniendo un archivo base *.c con la correspondiente funcin main() ms
archivos complementarios con extensin *.c donde residan funciones varias deber seguir
esta gua de ejemplo para realizar los cambios necesarios en el cdigo para utilizar el
simulador.































Ejemplo de proyecto formado por: Archivo Main.c + Archivo Timer.c +
Archivo Ini_IRQ.c + Archivo PID.c + Archivo PWM.c
Cambios a realizar en archivo Main.c:

- Insertar definicin: # define simula
- Incluir librera: #include q5.h
- Insertar llamada a funcin de inicializacin simulador: ini_datos_sim ( )
(Esta debe ubicarse despus de las pertinentes inicializaciones de todas las variables del
programa realizado por el alumno)
- Insertar llamada a funcin de restauracin: Restaura_sistema ( )
(Debe ubicarse al final del programa)
Cambios a realizar en archivo Timer.c:
(Este archivo contiene la rutina de atencin a la interrupcin IRQ 0)
- Insertar definicin: # define simula
- Insertar definicin: # define Project
- Incluir librera: #include q5.h
- Insertar llamada a funcin para ejecutar el simulador: sim_motor ( )
(Esta debe ubicarse al final de la rutina de atencin IRQ 0 realizada por el alumno)
Cambios a realizar en archivo Ini_IRQ.c:
- Insertar definicin: # define simula
- Insertar definicin: # define Project
- Incluir librera: #include q5.h
Cambios a realizar en archivo PID.c:
- Insertar definicin: # define simula
- Insertar definicin: # define Project
- Incluir librera: #include q5.h
Cambios a realizar en archivo PWM.c:
- Insertar definicin: # define simula
- Insertar definicin: # define Project
- Incluir librera: #include q5.h
Memoria descriptiva
Proyecto final de carrera Pgina 63

Estos ajustes slo se debern realizar la primera vez que utilice el simulador. Las
macros insertadas son inertes en caso que el simulador este en modo OFF.

Una vez realizados los cambios, para poder utilizar el simulador se debe operar de la
siguiente manera:














Figura 51. ON/OFF simulador


















- Simulador OFF -> // #define simula
(Comentar definicin para no ser compilada)

- Simulador ON -> #define simula
(La definicin debe ser compilada)



Memoria descriptiva
Proyecto final de carrera Pgina 64

En el anexo C del presente proyecto adjuntamos todo el cdigo de la prctica n 4 de
la asignatura Informtica Industrial II para utilizar este simulador.


Proyecto final de carrera Pgina 65

2 Anexo A































Anexo B
Proyecto final de carrera Pgina 66

2.1 El motor de corriente continua

En el siguiente anexo describiremos brevemente el motor de corriente continua y
sus principales caractersticas de manera que el alumnado pueda comprender ms
fcilmente los parmetros que identifican a este tipo de motores. [2]
El motor de corriente continua de imanes permanentes se compone principalmente
de dos partes, una parte exterior llamada estator, la cual da soporte mecnico al aparato, y
un ncleo llamado rotor, el cual es la parte mvil del motor.
El estator est formado por unos imanes permanentes de altas prestaciones de polos
opuestos, enfrentado entre ellos, los cuales provocan unas lneas de fuerza entre N-S de los
respectivos imanes.
En cambio el rotor est formado por un ncleo de hierro devanado con unas espiras
de conductor elctrico, generalmente cobre, que son alimentadas a travs de dos escobillas.
El movimiento del rotor viene ocasionado por la accin derivada de la repulsin y
atraccin entre polos magnticos. Creando campos constantes convenientemente
orientados en estator y rotor, se origina un par de fuerzas que obliga a que el rotor gire
buscando la posicin de equilibrio.

Figura 52. Motor de corriente continua.

A la hora de interpretar una hoja de caractersticas de un motor de corriente
continua es conveniente conocer el significado de cada parmetro, para ello, describiremos
los ms significativos.

Potencia nominal asignada:

Esta cifra representa la mxima potencia de salida cuando se opera dentro del rango
de trabajo recomendado.
Unidad de medida internacional expresada en watios (w)

Tensin nominal:
Anexo B
Proyecto final de carrera Pgina 67

Es el voltaje al cual se han medido los datos nominales (velocidad en vaco, par de
arranque, corriente de arranque, mx. potencia de salida, mx. rendimiento).
Se ha escogido este dato para no exceder la mxima velocidad recomendada en
vaco. Por supuesto, el uso del motor no est limitado a este voltaje. Para alcanzar
la potencia nominal asignada se permiten voltajes de trabajo ms elevados.
La velocidad en vaco, par de arranque y corriente de arranque dependen
directamente del voltaje aplicado.
Unidad de medida internacional expresada en voltios (V)


Velocidad en vaco:

Es la velocidad a la que gira el motor cuando no tiene carga y se le aplica la tensin
nominal. En la prctica, esta velocidad es proporcional al voltaje aplicado
(constante de velocidad).
Unidad de medida internacional expresada en rpm.


Par de arranque:

Es el par terico a la tensin nominal y con el rotor bloqueado. El par de arranque
aumenta proporcionalmente con el voltaje aplicado. El valor dado corresponde a
una temperatura del rotor de 25C. El par de arranque est relacionado con la
corriente de arranque. Su conexin es la constante de par k
m

Simbolizado con las siglas M
h
y la unidad de medida internacional esta expresada
en Nm (newton metro)


Relacin velocidad/par:

La relacin velocidad/par da informacin de las prestaciones del motor y se
representa por la lnea (o curva) velocidad-par. Cuanto ms pequeo es este valor,
ms potente es el motor, y consecuentemente menor es la variacin de la velocidad
del motor con los cambios en la carga.
La constante velocidad/par depende de las prestaciones del circuito magntico
(ej: imn permanente), de las dimensiones del bobinado (longitud, dimetro,
nmero de espiras) y de la resistencia del bobinado. En la prctica, la constante
velocidad/par se puede obtener dividiendo la velocidad en vaco entre el par de
arranque.
Simbolizado con las siglas n/M y la unidad de medida internacional esta expresada
en rpm/Nm




Corriente en vaco:

Anexo B
Proyecto final de carrera Pgina 68
Esta es la corriente que consume el motor sin carga, alimentado a su tensin
nominal.
Simbolizado con las siglas I
o
y la unidad de medida internacional esta expresada en
Amperios (A)


Corriente de arranque:

Es el cociente entre el voltaje nominal U y la resistencia en bornes R
a
. Esta
corriente es proporcional al par de arranque. Ambas magnitudes estn
relacionadas mediante la constante de par k
m
.
Simbolizado con las siglas I
A
y la unidad de medida internacional esta expresada
en Amperios (A)


Resistencia en bornes:

Es la resistencia en los terminales a 25C y determina la corriente de arranque a un
voltaje dado. La resistencia entre bornes es un valor compuesto por la resistencia
del bobinado, la resistencia de la escobilla y la resistencia de contacto entre la
escobilla y el colector.
Simbolizado con las siglas Ra y la unidad de medida internacional esta expresada
en Ohmios ()


Velocidad mxima permitida:

Esta velocidad representa el lmite superior del rango recomendado de
funcionamiento y no debera ser excedida durante el funcionamiento normal del
motor. La velocidad est limitada principalmente por la conmutacin. Si el
motor gira a velocidades superiores pueden aparecer problemas de
conmutacin, que a su vez pueden llevar a reducir la vida til del motor.
Esto es debido a los siguientes factores:
1.- Aumento del desgaste mecnico debido a que la distancia recorrida por el
colector es mayor.
2.-Aumento del desgaste por electro-erosin debido a la vibracin de las escobillas
y la formacin de chispas.
Simbolizado con las siglas n
max
y la unidad de medida internacional esta expresada
en rpm







Mxima corriente en servicio continuo:
Anexo B
Proyecto final de carrera Pgina 69

Si el motor funciona continuamente con esta corriente y a 25C de
temperatura ambiente, se calentar hasta alcanzar la mxima temperatura del
bobinado. Se asume que el motor no tiene refrigeracin adicional, sin otras
piezas que hagan de radiador de calor y aumenten este valor sustancialmente. Un
aumento de la temperatura ambiente reduce la corriente mxima en continuo. Los
bobinados con baja resistencia hmica admiten corrientes ms altas que los
bobinados con alta resistencia. En motores con bobinados de resistencia baja, la
mxima corriente en continuo puede estar limitada por las escobillas y no por el
bobinado. La mxima corriente en continuo es equivalente al mx. par permanente.
Estn relacionados por la constante de par k
m
.
Simbolizado con las siglas Imax y la unidad de medida internacional esta expresada
en Amperios (A)


Mxima par en servicio continuo:

Es el par que se puede entregar continuamente, o de media, alcanzando en el
bobinado la mxima temperatura admisible, basado en una temperatura ambiente de
25C. A temperatura ambiente ms alta, este valor se reduce. El par mximo limita
el rango recomendado de funcionamiento.
Simbolizado con las siglas Mcont y la unidad de medida internacional esta
expresada en Nm (newton metro)


Mxima potencia de salida:

Es la mxima potencia terica a 25C de temperatura del rotor. La mxima potencia
se alcanza en la mitad del par de arranque y la mitad de la velocidad en vaco. Los
lmites permitidos (mx. corriente en continuo y mx. velocidad permitida)
frecuentemente estn por debajo de este nivel.
Simbolizado con las siglas Pmax y la unidad de medida internacional esta
expresada en watios (w)


Constante de par:

Representa la relacin del par generado y la corriente aplicada. La constante de par
transforma valores de par en valores de corriente y viceversa.
En la prctica, k
m
se determina por el par de arranque MH y la corriente de
arranque I
a
. En el clculo terico, han de tomarse en consideracin las
dimensiones del bobinado (longitud l, dimetro 2r, nmero de espiras w), as como
la fuerza del campo magntico.
La constante de par est relacionada con la constante de velocidad k
n
ya que ambas
estn determinadas por los mismos parmetros.
Simbolizado con las siglas k
m
y la unidad de medida internacional esta expresada
en Nm/A (Newton metro por Amperio)


Anexo B
Proyecto final de carrera Pgina 70
Constante de velocidad:

Muestra la velocidad especfica por voltio del voltaje aplicado sin contar las
prdidas por friccin.
En la prctica, k
n
se determina por el voltaje nominal U y la velocidad en vaco n
0
.
En el clculo terico, deben tenerse en cuenta las dimensiones del bobinado
(longitud, dimetro, nmero de espiras, w), as como la fuerza del campo
magntico B0. La constante de velocidad est relacionada con la constante de par
k
m
porque stas se determinan por los mismos parmetros.
Simbolizado con las siglas kn y la unidad de medida internacional esta expresada
en rpm/V (revoluciones por minuto por Voltio)


Inercia del motor:

Es el momento de inercia del rotor, basado en el eje de giro. Determina la constante
de tiempo mecnica del motor.
Simbolizado con las siglas J
R
y la unidad de medida internacional esta expresada
en km (kilos por metro cuadrado)


Constante de tiempo mecnica:

Es el tiempo que tarda el rotor en acelerar desde parado hasta el 63% de la
velocidad en vaco. Este valor se calcula desestimando las fricciones, carga e
inercia de la carga.
Transcurridas 4 veces este valor () el rotor habr alcanzado ms del 99% de la
velocidad en vaco.
La constante mecnica de tiempo se puede calcular con la inercia del rotor y el
gradiente velocidad-par
Simbolizado con las siglas
m
y la unidad de medida internacional esta expresada
en milisegundos (ms)


Inductancia entre bornes:

Es la inductancia del bobinado estacionario y medida con una onda senoidal de 1
kHz.
Simbolizado con las siglas La y la unidad de medida internacional esta expresada
en Henrios (H)




Constante elctrica:

Anexo B
Proyecto final de carrera Pgina 71
La inductancia entre bornes y la resistencia entre bornes determina la constante
elctrica de tiempo del motor. Este parmetro se refiere al tiempo requerido
por la corriente para aumentar o disminuir.
Tpicamente, la constante elctrica de tiempo es de 100 a 1.000 veces ms pequea
que la constante mecnica de tiempo. Los cambios de corriente ocurren
instantneamente comparados con los cambios en velocidad.
Un fenmeno a destacar cuando la corriente puede reaccionar de manera tan rpida,
es el caso de los motores que son alimentados mediante PWM. En algunas
ocasiones se puede producir un rizo de corriente no deseado que sobrecalienta al
motor. En estos casos, puede que sea necesario aumentar la frecuencia del
PWM o conectar una inductancia adicional.
Simbolizado con las siglas k
e

























Proyecto final de carrera Pgina 72


3 Anexo B




























Anexo B
Proyecto final de carrera Pgina 73

3.1 Cdigo Librera Q5.h

#ifdef simula //Mode de funcionament simulador ON-
#include "k1.h" //ON-OFF segons si es declara la
#else //definicio
#include "printer.h"
#define ini_datos_sim() { }
#define sim_motor() { }
#endif

typedef struct //Estructura de dades necesaries pel
{ //funcionament del simular soft
long count; //Interval de Temps abans d'executar
//la funci associada (micro seg)
long recarga; //Valor de recarrega
double tic; //Interval entre
//interrupcions(microseg)
int direction; //Direccio motor;Izquierda-Derecha-0
int vel_max_motor; //Velocidad maxima nominal motor
int puntos_encoder; //num. Finestres del encorder per
//volta
int index; //n de finestra en que es troba en
//un instant el encoder (0-3)
unsigned int registroPRN[3]; //Variable port parallel
//virtualitzat
}hard_motor;



#ifndef project //En cas de projecte declara la
//variable con a interna o externa
//del arxiu en questi
hard_motor virtual_motor;
void interrupt
(*old_handler_prn2)(); //Mante el punter original
#else
extern hard_motor virtual_motor;
#endif











Anexo B
Proyecto final de carrera Pgina 74

3.2 Cdigo Librera K1.h


#define PRN_IRQ_MASK 0x10 //Mascara interrupcions pin 10
//DB-25
#define PULSEON_A 0x01 //ON de pin 2 DB25
#define PULSEOFF_A ~PULSEON_A //Pulsos de control en pin 2
//DB-25
#define PULSEON_B 0x02 //On de pin 3 DB25
#define PULSEOFF_B ~PULSEON_B //Pulsos de control en pin 3
//DB-25
#define INI_PRN 0xFF //11111111 Inicializacio del
//port_base+ 1 de prn
#define VCC_ON 0xFC //Pines 2 y 3 a zero i pins
//4...9 a DB25
#define VCC_OFF 0x00 //Pines 2...9 a zero DB25
#define MASK 0x80 //Mascara per confirmacio de
//int
#define CUADRAT_MASK 0x30 //Mascara bits 4 y 5 de
//cuadratura (pins 12 y 13)

#define d_derecha 1 //Direccio motor a dreta
#define d_izquierda 2 //Direcci motor Esquerra
#define d_stop 0 //Motor Parat

#define PRN_BASE virtual_motor.registroPRN
//Etiqueta a la direccio del
//registre soft virtual PRN
#define PRN_VERIFI (virtual_motor.registroPRN+1)
//Etiqueta a la direccio del
//registre soft virtual PRN+1
#define PRN_IRQ (virtual_motor.registroPRN+2)
//Etiqueta a direcci del
//registre soft virtual PRN+2


//----------------------------------------------------------------------
// ini_datos_sim:
// Inicialitza datos principals del similador
//----------------------------------------------------------------------
#define ini_datos_sim() { \
*(virtual_motor.registroPRN+1)=0x00; \
virtual_motor.index=0; \
old_handler_prn2=_dos_getvect(0x17); \
_dos_setvect(0x17,cuadrat); \
virtual_motor.vel_max_motor=25; \
virtual_motor.puntos_encoder=800; \
virtual_motor.count=0; \
virtual_motor.recarga=0; \
virtual_motor.direction=d_derecha; \
}







Anexo B
Proyecto final de carrera Pgina 75
//-----------------------------------------------------------------------
//cal_time_irq7:
// Funcio que determina el temps entre les interrupcions
// irq7 realitzades pel encoder virtual en funcio del
// dc del pwm, tic hardware timer i vel. max. del motor cc
//-----------------------------------------------------------------------
#define cal_time_irq7() { \
float x; \
x=virtual_motor.vel_max_motor*inf_pwm.dc; \
if (x<0) \
{ \
x=x*(-1); \
virtual_motor.direction=d_izquierda; \
} \
else \
{virtual_motor.direction=d_derecha; } \
if (x==0) x=1; \
x=x*virtual_motor.puntos_encoder; \
x=(1/x)*1000000; \
x=x/h_timer.tic; \
virtual_motor.count=x+0.5; \
virtual_motor.recarga=virtual_motor.count;\
}

//-----------------------------------------------------------------------
//sim_motor:
// Funcio que simula les senyales A i B del encorder en el port
// PRN virtual i genera la interrupcio irq7
//-----------------------------------------------------------------------
#define sim_motor() { \
\
if (!virtual_motor.count) \
{ \
cal_time_irq7(); \
virtual_motor.count=virtual_motor.recarga; \
if (virtual_motor.direction==d_derecha) \
{ \
kk1++; \
switch(virtual_motor.index) \
{ \
case 0: \
*(virtual_motor.registroPRN+1)=0x20; \
geninterrupt(0x17); \
virtual_motor.index++; \
break; \
case 1: \
*(virtual_motor.registroPRN+1)=0x30; \
geninterrupt(0x17); \
virtual_motor.index++; \
break; \
case 2: \
*(virtual_motor.registroPRN+1)=0x10; \
geninterrupt(0x17); \
virtual_motor.index++; \
break; \
case 3: \
*(virtual_motor.registroPRN+1)=0x00; \
geninterrupt(0x17); \
virtual_motor.index=0; \
break; \
} \
Anexo B
Proyecto final de carrera Pgina 76
} \
if (virtual_motor.direction==d_izquierda) \
{ \
switch(virtual_motor.index) \
{ \
case 0: \
*(virtual_motor.registroPRN+1)=0x10; \
geninterrupt(0x17); \
virtual_motor.index++; \
break; \
case 1: \
*(virtual_motor.registroPRN+1)=0x30; \
geninterrupt(0x17); \
virtual_motor.index++; \
break; \
case 2: \
*(virtual_motor.registroPRN+1)=0x20; \
geninterrupt(0x17); \
virtual_motor.index++; \
break; \
case 3: \
*(virtual_motor.registroPRN+1)=0x00; \
geninterrupt(0x17); \
virtual_motor.index=0; \
break; \
} \
} \
} \
else \
{ \
virtual_motor.count--; \
} \
}


//-------------------------------------------------------------------
//pulse_on_a() pin 2 DB-25 a '1' i pin 3 DB-25 a 'O'
//-------------------------------------------------------------------
#define pulse_on_a() \
{ \
*(PRN_BASE)=((*(PRN_BASE)&PULSEOFF_B)|PULSEON_A); \
virtual_motor.direction=d_derecha; \
}

/*--------------------------------------------------
pulse_off_a() pin 2 DB-25 a 'O'
----------------------------------------------------*/
#define pulse_off_a() { \
*(PRN_BASE)=(*(PRN_BASE))&PULSEOFF_A; \
virtual_motor.direction=d_stop; \
}
/*---------------------------------------------------
pulse_on_b() pin 3 DB-25 a '1' i pin 2 DB-25 a 'O'
---------------------------------------------------*/
#define pulse_on_b() { \
*(PRN_BASE)=(((*(PRN_BASE))&PULSEOFF_A)|PULSEON_B); \
virtual_motor.direction=d_izquierda; \
}



Anexo B
Proyecto final de carrera Pgina 77
/*---------------------------------------------------
pulse_off_b() pin 3 DB-25 a 'O'
----------------------------------------------------*/
#define pulse_off_b() { \
*(PRN_BASE)=((*(PRN_BASE))&PULSEOFF_B); \
virtual_motor.direction=d_stop; \
}
/*---------------------------------------------------
ini_prn() pins 2 i 3 a zero (PWM), pins 4 i 5 a (cuadrat), pins 6 a 9 a
(VCC=ON)
-----------------------------------------------------*/

#define ini_prn() { \
*(PRN_BASE+1)=INI_PRN; \
}
/*-----------------------------------------------------
verifi() pin 11 -BUSY -DB-25. Utilitzat com a comfirmaci de int
------------------------------------------------------*/
//#define verifi() (inportb(PRN_VERIFI)&MASK)
#define verifi() {}
/*-----------------------------------------------------
cuadrat_leer() pin 12 Data_5 i pin 13 Data_4,info de cuadratura
-------------------------------------------------------*/
#define cuadrat_leer() ((((*(PRN_BASE+1))&CUADRAT_MASK)>>4))

/*--------------------------------------------------------
vcc_on() pins 2 i 3 a zero i pins 4...9 a DB 25
---------------------------------------------------------*/
//# #define vcc_on() { \
*(PRN_BASE)=VCC_ON; \
}
/*--------------------------------------------------------
vcc_off() pines 2...9 a zero DB 25
---------------------------------------------------------*/
#define vcc_off() { \
*(PRN_BASE)=VCC_OFF; \
}

/*--------------------------------------------------------
en_i_prn(): Es valida la interrupcio de prn pin 10 DB-25
---------------------------------------------------------*/
#define en_i_prn() { \
*(PRN_IRQ)=((*(PRN_BASE))|PRN_IRQ_MASK); \
}
/*--------------------------------------------------------
dis_i_prn(): Inibeix interrupcions des de prn
---------------------------------------------------------*/
#define dis_i_prn() { \
*(PRN_IRQ)=((*(PRN_BASE))&~PRN_IRQ_MASK); \
}







Proyecto final de carrera Pgina 78

4 Anexo C































Anexo C
Proyecto final de carrera Pgina 79

4.1 Librera 8259.h
/*---------------------------------------------------------------------
FILE: 8259.h -declaraciones y macros para el chip 8259

MACROS:
mask_prn_off() - desactiva m scara IRQ7
mask_prn_on() - activa m scara IRQ7
mask_prn() - devuelve el estado de la m scara IRQ7
eoi_ns() - fin de interrupcin no especfica
eoi_prn() - fin de interrupcin especfica IRQ7
eoi_timer() - fin de interrupcin especficaIRQO
-----------------------------------------------------------------------*/
#define BASE_8259 0x20 /* direccin base */
#define PORT_EOI (BASE_8259+0) /* puerto para EOI */
#define PORT_MASK (BASE_8295+1) /* puerto para mascaras */

#define VECT_BASE 8 /* vector base */
#define VECT_TIMER (VECT_BASE+O) /* vector del timer 8253 */
#define VECT_PRN (VECT_BASE+7) /* vector de impresora */

#define MASK_TIMER 0x0l /* M scara para timer */
#define MASK_PRN 0x80 /* M scara para impresora */

#define EOI_TIMER 0x60 /* Fn de interrup. para timer */
#define EOI_PRN 0x67 /* Fn de interrup. para
inpresora */
#define EOI_NS 0x20 /* Fn deinterrup. no especfica
/*--------------------------------------------------------
mask_prn_off() desactiva la m scara permitiendo las interrupciones.
---------------------------------------------------------*/
#define mask_prn_off()
(outportb(BASE_8259+1,(inportb(BASE_8259+1)&~MASK_PRN)))

/*---------------------------------------------------------
mask_prn_on() activa la m scara bloqueando las interrupciones.
----------------------------------------------------------*/
#define mask_prn_on()
(outportb(BASE_8259+1,(inportb(BASE_8259+1)|MASK_PRN))

/*----------------------------------------------------------
mask_prn() devuelve 1 si m scara activa y O en caso contrario
-------------------------------------------------------------*/
#define mask_prn() (((inportb(BASE_8259+1>>7)&0x0l)

/*------------------------------------------------------------
eoi_ns() fin de interrupcin no especfica
-------------------------------------------------------------*/
#define eoi_ns() (outportb(BASE_8259,EOI_NS))

/*------------------------------------------------------------
eoi_prn() fin de interrupcin especfica para port paralelo (IRQ7)
--------------------------------------------------------------*/
#define eoi_prn() (outportb(BASE_8259,EOI_PRN))

/*-------------------------------------------------------------
eoi_timer() fin de interrupcin especfica el timer (IRQO)
----------------------------------------------------------------*/
#define eoi_timer() (outportb(BASE_8259,EOI_TIMER))
Anexo C
Proyecto final de carrera Pgina 80

4.2 Librera Ini_IRQ.h

#define CR 0x0D /* cdigo ASCII de tecla retorno
de carro */

#define PULSOS_ENCODER 200 /*pulsos por revolucin*/

#define ESTADO_00 0x00 /* estados de cuadratura*/
#define ESTADO_01 0x01
#define ESTADO_10 0x02
#define ESTADO_11 0x03

#define DIRECTA 1 /* valores de los flags de
direccin */
#define INVERSA 0


/* declaracin de tipos derivados
--------------------------------*/
typedef unsigned char u_char;
typedef unsigned int u_int;
typedef unsigned long u_long;

/* prototipos de funciones
---------------------------------*/
double
get_posicion(void); /* retorna la posicin */

void inc_p(void), /* incrementa la cuenta de pulsos
dec_p(void), /* decrementa de cuenta de pulsos
reset_prn(void), /* restaura condiciones iniciales
/*de prn */
ini_cuadrat(void); /* inicilizacin */
void interrupt cuadrat(_CPPARGS);
























Anexo C
Proyecto final de carrera Pgina 81


4.3 Librera PID.h

/*-----------------------------------------------------------------------
FILE: pid.h -declaracions per al pid.c
-----------------------------------------------------------------------*/

typedef struct
{
double kp,
Ti,
Td,
consigna,
error_1,
error_2,
t_sample;
}struct_PID;



//-----------------------------------------------------------------------
// capalera
//-----------------------------------------------------------------------

double obtenir_voltes(void);
int variables_pid(void);

int control(void);
int funcio_velocitat(void);





























Anexo C
Proyecto final de carrera Pgina 82

4.4 Librera Printer.h


/*--------------------------------------------------------
FILE: printer.h

NOTAS:
Se definen las macros para el acceso al port paralelo

Las macros de ataque al puente excluyen la posibilidad
de que ambas ramas puedan activarse simultaneamente

MACROS:
pulse_on_a() activa la rama 'a' del puente
pulse_off_a() desactiva la rama 'a' del puente
pulse_on_b() activa la rama 'b' del puente
pulse_off_b() desactiva la rama 'b' del puente
ini_prn() inicializa el port prn
verifi() verifica que la interrupcin no es ruido
cuadrat_leer() lee estado de cuadratura para posicion
en_i_prn() habilita las interrupciones (IRQ7)
dis_i_prn() deshabilita las interrupciones (IRQ7)
vcc_on() entrega tensin al exterior a travs del port
vcc_off() anula tensin exterior

FUNCIONES:
printer() devuelve la direccin base asociada al port
---------------------------------------------------------------------*/



#include <dos.h>
#define PRN_BASE 0X378
#define PRN_VERIFI PRN_BASE+1
#define PRN_IRQ PRN_BASE+2
#define PRN_IRQ_MASK 0x10 /* mascara interrupciones pin 10
DB-25 */
#define PULSEON_A 0x01 /* puesta a uno de pin 2 DB25 */
#define PULSEOFF_A ~PULSEON_A /* pulsos de control en pin 2 DB-
25 */
#define PULSEON_B 0x02 /* puesta a uno de pin 3 DB25 */
#define PULSEOFF_B ~PULSEON_B /* pulsos de control en pin 3 DB-
25 */
#define INI_PRN 0xFF /* 11111111 inicializacin del
port_base+ 1 de prn */
#define VCC_ON 0xFC /* pines 2 y 3 a cero y pines
4...9 a uno DB25 */
#define VCC_OFF 0x00 /* pines 2...9 a cero DB25 */
#define MASK 0x80 /* m scara para confirmacin de
int */
#define CUADRAT_MASK 0x30 /* m scara para bits 4 y 5 de
cuadratura (pines 12 y 13)*/
#define N_PRN 0x00410 /* direccin de n de ports de
impresora */
#define D_PRN 0x00408 /* indireccin para direccin
base de PRN */


Anexo C
Proyecto final de carrera Pgina 83
/*-------------------------------------------------
pulse_on_a() pin 2 DB-25 a '1' y pin 3 DB-25 a 'O'
-------------------------------------------------*/
#define pulse_on_a()
(outportb(PRN_BASE,((inportb(PRN_BASE)&PULSEOFF_B)|PULSEON_A)))
/*--------------------------------------------------
pulse_off_a() pin 2 DB-25 a 'O'
----------------------------------------------------*/
#define pulse_off_a() (outportb(PRN_BASE,(inportb(PRN_BASE)&PULSEOFF_A)))
/*---------------------------------------------------
pulse_on_b() pin 3 DB-25 a '1' y pin 2 DB-25 a 'O'
---------------------------------------------------*/
#define pulse_on_b()
(outportb(PRN_BASE,((inportb(PRN_BASE)&PULSEOFF_A)|PULSEON_B)))
/*---------------------------------------------------
pulse_off_b() pin 3 DB-25 a 'O'
----------------------------------------------------*/
#define pulse_off_b() (outportb(PRN_BASE,(inportb(PRN_BASE)&PULSEOFF_B)))
/*---------------------------------------------------
ini_prn() pines 2 y 3 a cero (PWM), pines 4 y 5 a uno (cuadrat), pines 6
a 9 a uno (VCC=ON)
-----------------------------------------------------*/
#define ini_prn() (outport(PRN_BASE+l,INI_PRN))
/*-----------------------------------------------------
verifi() pin 11 -BUSY -DB-25. Usado como confirmacin de int
NOTA: el valor ledo es el inverso del real
------------------------------------------------------*/
#define verifi() (inportb(PRN_VERIFI)&MASK)
/*-----------------------------------------------------
cuadrat_leer() pin 12 Data_5 y pin 13 Data_4,info de cuadratura
-------------------------------------------------------*/
#define cuadrat_leer() ((inportb(PRN_BASE+1)&CUADRAT_MASK)>>4)
/*--------------------------------------------------------
vcc_on() pines 2 y 3 a cero y pines 4...9 a uno DB 25
---------------------------------------------------------*/
#define vcc_on() (outportb(PRN_BASE,VCC_ON))
/*--------------------------------------------------------
vcc_off() pines 2...9 a cero DB 25
---------------------------------------------------------*/
#define vcc_off() (outportb(PRN_BASE,VCC_OFF))
/*--------------------------------------------------------
en_i_prn() se valida la interrupcin de prn pin 10 DB-25
---------------------------------------------------------*/
#define en_i_prn() (outport(PRN_IRQ,(inportb(PRN_IRQ)|PRN_IRQ_MASK)))
/*--------------------------------------------------------
dis_i_prn() inhibe interrupciones desde prn
---------------------------------------------------------*/
#define dis_i_prn() (outportb(PRN_IRQ,(inportb(PRN_IRQ)&~PRN_IRQ_MASK)))
/*-------------------------------------------------------
printer() -devuel ve la direccin base asociada al port pasado
-------------------------------------------------------------*/
int printer(int);









Anexo C
Proyecto final de carrera Pgina 84

4.5 Librera PWM.h

typedef struct // referida a excitacio PWM
{
double dc; // cicle de treball
long T, // periode (us)
ton, // temps de on (us)
toff, // temps de off (us)
gir, // dreta/esquerra
abans; // ve de on o de off
}struct_PWM;

#define dreta 1
#define esquerra 0
#define ON 1
#define OFF 0

//---------------------------------------------------------------
//Capaleres de pwm.c
//---------------------------------------------------------------
int frequency(double freq);
int duty_cycle(double dc);
int pwm(void);



4.6 Librera Timer.h

/*---------------------------------------------------------------
FILE:
TIMER.h -declaracions per al TIMER.c
----------------------------------------------------------------*/

#ifdef _cplusplus /* consideracions sobre el tipus de compilador
*/
#define _CPPARGS...
#else
#define _CPPARGS
#endif


/* declaraci de tipus derivats
--------------------------------*/
typedef struct
{
int port, //@ del port base
timer; //un de tres
double clock, //frecuencia del cristall d'exitaci
tic; //interval entre
//interrupcions(microseg)
}hard_timer;






Anexo C
Proyecto final de carrera Pgina 85
typedef struct
{
long count, //interval abans d'executar la funci
//associada (micro seg)
recarga; //valor de recarrega
int incremental; //incremental/decremental
int (*fun)(void); //funcio associada a count
}soft_timer;


#define base_8253 0x40 //@ base del timer 8253
#define tmr0 0 //timer 0 del 8253
#define clock_timer 1193180 //freqencia d'oscillacio del
//cristall
#define vector_irq_timer 0x08 //posicio del vector a la taula
//vectoritzada
#define base_8259 0x20
#define EOI_NS 0x20 //final d'irq no especifica

/*--------------------------------------
Capaleres de les funcions de timer.c
----------------------------------------*/

int captura_valors(double *valors); //adquireix dades del teclat
int captura_tecla_teclat(char taula[30]);

int set_timer(int timer,double interval);//estableix el contingut d'un
//soft_timer concret
int ini_timers(double *valors); //inicia tots els soft_timers
void ini_struct_hard_timer(int interval);//estableix el contingut de
//l'estructura del hard_timer
void canvi_vector_irq(void); //posa el nou vector a la taula
//vectoritzada
int trans_interval_tic(void); //transforma microseg a tics
int ini_8253(void); //inicialitza el timer 8253
void restaura_sistema(void); //restaura tot el sistema
double get_timer(int timer); //captura el contingut d'un
//soft_timer

void interrupt irq_timer(void); //rutina d'atencio a la
//interrupcio




















Anexo C
Proyecto final de carrera Pgina 86

4.7 Librera Main.c
/*----------------------------------------------------------------
FILE: inf4.c ALGORISME DE CONTROL

NOTES: FORMAT D'ENTRADA: Nom del programa + espai + base de temps del
8253
en microsegons
-----------------------------------------------------------------*/

//PFC
#define simula
#include "q5.h"
//PFC

#include "timer.h"
#include "pwm.h"
#include "ini_irq.h"
#include "pid.h"

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#include <math.h>

int analisi_arguments(int argc,char **argv); //Comprova els arguments
//d'entrada
int inicialitzacio(int tmp,double *valors); //inicialitza tot el
//sistema
int control_tecla(int tecla);
void presentacio (void);

//PFC
extern hard_timer h_timer;
extern double k1,k2,k3;
extern double error_0;
//PFC
extern soft_timer s_timer[3]; //variable declarada a
timer.c
extern struct_PWM inf_pwm;

long int irq_8253=0; //compta les irq's
provocades pel 8253
extern int error_irq;


extern long cuenta_p;
extern long irq_prn;
extern double velocitat;
extern struct_PID inf_pid;








Anexo C
Proyecto final de carrera Pgina 87
//-------------------------------------------------

main(int argc,char **argv)
{
int tmp;
double valors[3];
char tecla;


tmp=analisi_arguments(argc,argv); //comprova els arguments d'entrada
clrscr();
if (inicialitzacio(tmp,valors)) return (1);

//PFC
ini_datos_sim();
//PFC

while(tecla!=27)
{
if(error_irq) return(1);
presentacio();
tecla=getch();
}

restaura_sistema(); //restaura l'antic apuntador de la t.vectoritzada,
//el port paralel i para el motor
return(0); // retorn sense error
}


//-------------------------------------------------------------
//analisi_arguments: Analitza els arguments introduits
// per teclat, realitza l'arrodoniment
//
//-------------------------------------------------------------
int analisi_arguments(int argc,char **argv)
{
float tmp;
char *missatge="\nError en la cadena d'entrada al programa. \n\nFORMAT:
Nom del programa + espai + base de temps\nen micro segons";

tmp=0.0;
if ((argc==1)|(argc>2)) //Si l'argument de crida al programa
no es 2
{ //donarem error d'entrada dades
printf("%s\n",missatge);
abort();
}
if(argc==2)
{
tmp=atof(argv[1]); //tractem argument introduit
tmp=tmp+0.5; //arodonim
}
if ((tmp<5.0)|(tmp>200.0)) //si base temps no adecuada
{ //abortem programa
printf("\n\nBase de temps no adecuada\n\n");
abort();
}
return (tmp);
}

Anexo C
Proyecto final de carrera Pgina 88

int inicialitzacio(int tmp,double *valors)
{
ini_struct_hard_timer(tmp);
if(captura_valors(valors)) //adquireix dades del teclat
{
printf("\n\nError al entrar les dades");
return(1);
}

if (ini_timers(valors)) //inicia els soft_timers, si es
//retorna 1 hi ha
{ //error i finalitzal'execucio
printf("\n\nError en les dades dels timers");
return(1);
}

pulse_off_b();
pulse_off_a();

if (frequency((1/valors[1])*1e3))
{
printf("Error de dades en Frequencia PWM");
return(1);
}

inf_pid.t_sample=valors[0]; //POSAR DINS LA FUNCIO variables_pid
if(variables_pid()) return(1);
inf_pid.error_1=0.0;
inf_pid.error_2=0.0;

ini_cuadrat();
canvi_vector_irq(); //posa el nou apuntador a la nostra
//rutina de servei dins la taula
//vectoritzada

if (ini_8253()) //programa el 8253 per a que comenci
//a comptar
{
printf("\n\nError en la inicialitzaci del hard timer");
return(1);
}
return (0);
}


void presentacio (void)
{
double graus;
int voltes;

clrscr();
while (!kbhit())
{
graus=get_posicion(); //posici absoluta de l'eix
voltes=(int)(graus/360.0); // voltes donades
gotoxy(7,2);
printf("---------------------- Control de potencia -------------");
gotoxy(7,3);
printf("| |");
gotoxy(7,4);
Anexo C
Proyecto final de carrera Pgina 89
printf("--------------------------------------------------------");
gotoxy(15,5);
printf("DC:%3.0lf % ",(inf_pwm.dc)*100);
gotoxy(15,6);
printf("Ton: %ld microsegons ",inf_pwm.ton);
gotoxy(15,7);
printf("Toff: %ld microsegons ",inf_pwm.toff);
gotoxy(15,8);
if(inf_pwm.gir==1)
printf("Sentit de gir: DRETA ");
else
printf("Sentit de gir: ESQUERRA ");
gotoxy(15,9);
printf("Velocitat real motor: %4.2lf rpm ",velocitat);
gotoxy(15,10);
printf("Pulsos del encoder: %ld polsos ",cuenta_p);
gotoxy(15,11);
printf("errors encoder: %d ",error);
gotoxy(15,12);
printf("posici absoluta de l'eix: %8.2fC ", graus);
gotoxy(15,13);
printf("posici relativa de l'eix: %8.2fC ", graus-voltes*360.0);
gotoxy(15,14);
printf("n de voltes:%5d ", voltes);

//PFC
gotoxy(7,15);
printf("------------------------- Proves -----------------------");
gotoxy(7,16);
printf("| |");
gotoxy(7,17);
printf("--------------------------------------------------------");

gotoxy(7,18);
printf("k1 PID:%5f ", k1);
gotoxy(7,19);
printf("k2 PID:%5f ", k2);
gotoxy(7,20);
printf("N Tics:%5d ", virtual_motor.recarga);
gotoxy(7,21);
printf("Direcci:%5d ", virtual_motor.direction);
gotoxy(7,22);
printf("Index finestra:%5d ", virtual_motor.index);
gotoxy(30,18);
printf("Consigna velocitat:%5f ",inf_pid.consigna);
gotoxy(30,19);
printf("Velocitat Real:%5f ",velocitat);
gotoxy(30,20);
printf("PWM:%5f ",inf_pwm.dc);
gotoxy(30,21);
printf("Error 0:%5f ",error_0);
gotoxy(30,22);
printf("Error 1:%5f ",inf_pid.error_1);
gotoxy(30,23);
printf("increment PWM:%4f",k1*error_0+k2*inf_pid.error_1);
//PFC
}
}


Anexo C
Proyecto final de carrera Pgina 90

4.8 Librera Ini_IRQ.c

/*-------------------------------------------------------------------
FILE: ini_irq.c -medida de posicin del eje de un motor partiendo
de dos seales en cuadratura propocionadas
por un encoder relativo
autor: Jacob Pie
NOTAS:
La posicin se determina contando el nmero de pulsos que
se detectan en una misma direccin.

La direccin se determina a partir de la secuencia
de pulsos desfasados 90 grados que proporciona el encoder
relativo.
--------------------------------------------------------------------*/
//PFC
#define simula
#define project
#include "q5.h"
//PFC

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#include "ini_irq.h"
//#include "printer.h"
#include "8259.h"

/*-------------
datos privados
-------------*/
long cuenta_p; //conta el n de interrupcions
//del encoder
static int
direccion, //sentido de giro del motor
estado_old, //estado previo de la entrada
//de cuadratura
flag_inver, //flag de direccin inversa
prn_base; //direccin base del puerto
//paralelo
int error=0;

void interrupt (*old_handler_prn)(); //mantiene el manejador
//original

double grados; //posicin absoluta del eje del
//motor en grados sexagesimales
int vueltas; //vueltas dadas

long irq_prn=0;







Anexo C
Proyecto final de carrera Pgina 91
/*--------------------------------------------------------------------
cuadrat() -Rutina de servicio a la interrupcion de cuadratura

NOTA:
Esta funcion es llamada a cada flanco (ascendente
y descendente) de cada una de las dos seales
en cuadratura.

El sentido de giro es funcion de la secuencia
de unos y ceros provinientes de las dos seales
desfasadas 90 dadas por el encoder. Asi, la
accion a tomar depender del estado actual y
del anterior.
---------------------------------------------------------------------*/
void interrupt cuadrat(_CPPARGS)
{
int estado_curso; //estado actual de cuadratura

estado_curso=cuadrat_leer(); //lectura de info de cuadratura
if(estado_old!=estado_curso)
{
switch(estado_old) //analisis de secuencia de pulsos
//del encoder
{
case ESTADO_00:
if( estado_curso==ESTADO_01)
dec_p(); /* retroceso */
else if(estado_curso==ESTADO_10)
inc_p(); /* avance */
else
error++; /* error */
break;
case ESTADO_01:
if(estado_curso==ESTADO_11)
dec_p();
else if(estado_curso==ESTADO_00)
inc_p();
else
error++;
break;
case ESTADO_11:
if(estado_curso==ESTADO_10)
dec_p();
else if(estado_curso==ESTADO_01)
inc_p();
else
error++;
break;
case ESTADO_10:
if(estado_curso==ESTADO_00)
dec_p();
else if(estado_curso==ESTADO_11)
inc_p();
else
error++;
break;
}




Anexo C
Proyecto final de carrera Pgina 92
estado_old=estado_curso; //el estado actual pasa a ser
//el anterior ahora
}
irq_prn++;
eoi_ns(); //fin de interrupcin no
//especfica
}


/*---------------------------------------------------------------------
inc_p() -incrementar cuenta_p
incrementa el n de inten-upciones acumuladas
----------------------------------------------------------------------*/
static void inc_p(void)
{
++cuenta_p; //incrementamos la cuenta de
//pulsos
if(direccion==INVERSA) //si la direccin anterior era
//inversa==>cambio de direccin
{
direccion=DIRECTA; //direccin actual
flag_inver=1; //indicacin de cambio en
//direccin
}
}

/*--------------------------------------------------------------------
dec_p -decrementar cuenta_p
decrementa el n de interrupciones acumuladas
---------------------------------------------------------------------*/
static void dec_p(void)
{
--cuenta_p; //decrementamos la cuenta de
//pulsos
if( direccion==DIRECTA) //si la direccin anterior era
//directa==>cambio de direccin
{
direccion=INVERSA; //direccin actual
flag_inver=1; //indicacin de cambio de
//direccin
}
}

/*---------------------------------------------------------------------
ini_cuadrat -inicializacin
----------------------------------------------------------------------*/
void ini_cuadrat(void)
{
cuenta_p=0; //puesta a cero
error=0;
flag_inver=0;

direccion=DIRECTA; //arbitrariamente elegida
estado_old=cuadrat_leer(); //estado actual

old_handler_prn=getvect(VECT_PRN); //guadamos vector original
setvect(VECT_PRN,cuadrat); //establecemos nueva rutina de
//atencin



Anexo C
Proyecto final de carrera Pgina 93
en_i_prn(); //activamos interrup. IRQ7 (prn)
mask_prn_off(); //permitimos int de prn en 8259
}


/*-----------------------------------------------------------------------
reset_prn()
Restaura el vector original y desactiva interrup.
----------------------------------------------------------------------*/
void reset_prn(void)
{
dis_i_prn(); //inhibe interrupciones de pin
//10
setvect(VECT_PRN,old_handler_prn); //restaura vector original
pulse_off_a(); //pin 2 DB-25 a cero
pulse_off_b(); //pin 3 DB-25 a cero
}


/*----------------------------------------------------------------------
cuadrat_getp()
retorna de la posicin en grados sexagesimales
-----------------------------------------------------------------------*/
double get_posicion(void)
{
long cuenta; //copia de cuenta_p
disable(); //comienzo regin crtica
cuenta=cuenta_p; //info de posicin en pulsos
enable(); //fin de regin crtica
return(cuenta*360.0/(PULSOS_ENCODER*4.0)); //conversin a grados
//centgrados
}





























Anexo C
Proyecto final de carrera Pgina 94

4.9 Librera PID.c

//-----------------------------------------------------------------------
FILE: pid.c
Implementacio de les funcions relatives al control PID
//----------------------------------------------------------------------

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#include <math.h>

#include "timer.h"
#include "pwm.h"
#include "ini_irq.h"
#include "pid.h"

double velocitat=0.0;
extern long cuenta_p;
double k1,k2,k3;
struct_PID inf_pid;
extern struct_PWM inf_pwm;
extern soft_timer s_timer[3]; //taula que conte els 3 soft timers

double error_0;

//---------------------------------------------------------------------
//funcio_velocitat:
//---------------------------------------------------------------------

int funcio_velocitat(void)
{
double espai,temps;

espai=obtenir_voltes(); //nde voltes en un interval de t
temps=get_timer(2)/1000.0; //temps esta en segons
s_timer[2].count=0;
velocitat=(espai/temps)*60.0; //velocitat es mesura en rpm
return(0);
}

//---------------------------------------------------------------------
//obtenir_voltes()
// retorna de les voltes
//---------------------------------------------------------------------

double obtenir_voltes(void)
{
long cuenta;
double voltes;
static long cuenta_ant=0;

disable(); //comienzo regin crtica
cuenta=cuenta_p; //info de posicin en pulsos
enable(); //fin de regin crtica
voltes=((cuenta-cuenta_ant)/(PULSOS_ENCODER*4.0));
cuenta_ant=cuenta;
Anexo C
Proyecto final de carrera Pgina 95
return(voltes);
}

//----------------------------------------------------------------------
//Variables_pid:demana per teclat les variables
// del controlador pid
//----------------------------------------------------------------------
int variables_pid(void)
{
char temp[10];

printf("Introdueix la variable Kp pel controlador PID: ");
if (captura_tecla_teclat(temp)) return(1);
else inf_pid.kp=atof(temp); //valor de kp

printf("Introdueix el temps Td(ms) pel controlador PID: ");
if (captura_tecla_teclat(temp)) return(1);
else inf_pid.Td=atof(temp); //valor de td

printf("Introdueix el temps Ti(ms) pel controlador PID: ");
if (captura_tecla_teclat(temp)) return(1);
else inf_pid.Ti=atof(temp); //valor de ti

printf("Introdueix la consigna de velocitat pel controlador PID: ");
if (captura_tecla_teclat(temp)) return(1);
else inf_pid.consigna=atof(temp); //valor de consigna

//inf_pid.consigna=+180; //consigna posicio


k1=inf_pid.kp*(1+(inf_pid.t_sample/inf_pid.Ti)+(inf_pid.Td/inf_pid.
t_sample));
k2=-(1+2*(inf_pid.Td/inf_pid.t_sample))*(inf_pid.kp);
k3=inf_pid.kp*(inf_pid.Td/inf_pid.t_sample);

return(0);
}
//-----------------------------------------------------------------------
//control: Funcio associada al control PID
//----------------------------------------------------------------------

int control(void)
{

if (funcio_velocitat()) return(1);
error_0=inf_pid.consigna-velocitat; //calcul de l'error de
//velocitat

//error_0=inf_pid.consigna-get_posicion(); //calcul de l'error de
//posicio

inf_pwm.dc+=k1*error_0+k2*inf_pid.error_1;

if(inf_pwm.dc>1.0) inf_pwm.dc=1.0; //evita la saturacio integral del PID
if(inf_pwm.dc<-1.0) inf_pwm.dc=-1.0;
if(duty_cycle(inf_pwm.dc)) return(1); //actualitza Ton i Toff

inf_pid.error_2=inf_pid.error_1;
inf_pid.error_1=error_0;
return(0);
}
Anexo C
Proyecto final de carrera Pgina 96

4.10 Librera PWM.c

//------------------------------------------------------------------
// FILE pwm.c
//------------------------------------------------------------------

//PFC
#define simula
#define project
#include "q5.h"
//PFC

#include "pwm.h"
//#include "printer.h"
#include "timer.h"

extern hard_timer h_timer;
struct_PWM inf_pwm;


//------------------------------------------------------------------
// frequency():
//------------------------------------------------------------------
int frequency(double freq)
{ //TOTS ELS VALORS ESTAN EN us
if(freq>0.0)
{
inf_pwm.dc=0.0;
inf_pwm.T=(1/freq)*1e6;
inf_pwm.ton=inf_pwm.T*inf_pwm.dc;
inf_pwm.toff=inf_pwm.T-inf_pwm.ton;
inf_pwm.gir=dreta;
inf_pwm.abans=OFF;
return(0);
}
return(1); //retorn amb error
}

//-----------------------------------------------------------------
// duty_cycle:
//-----------------------------------------------------------------

int duty_cycle(double dc)
{
double tmp;
inf_pwm.gir=inf_pwm.dc>0.0?dreta:esquerra;

if ((dc>=-1.0)&&(dc<=1.0)) //comprova si tmp>0, si ho es Ton=tmp
{ //sino Ton=-tmp
tmp=inf_pwm.T*dc;
inf_pwm.ton=tmp>0.0?tmp:-tmp; //actualitza valor de Ton
inf_pwm.toff=inf_pwm.T-inf_pwm.ton; //actualitza valor de Toff
return(0);
}
return(1); //retorna amb error
}


Anexo C
Proyecto final de carrera Pgina 97
//----------------------------------------------------------------
// pwm():
//-----------------------------------------------------------------

int pwm(void)
{
//prove de gir a dretes
//if (inf_pwm.gir==dreta) //aixi pel motor casa PFC
if (inf_pwm.gir==esquerra)
{
if (inf_pwm.abans==ON) //prove de TON
{
if (set_timer(1,inf_pwm.toff)) return(1);
pulse_off_b();
inf_pwm.abans=OFF;
}
else //prove de TOFF
{
if (set_timer(1,inf_pwm.ton)) return(1);
pulse_on_b();
inf_pwm.abans=ON;
}
}
else //prove de gir a esquerres
{
if (inf_pwm.abans==ON) //prove de TON
{
if (set_timer(1,inf_pwm.toff)) return(1);
pulse_off_a();
inf_pwm.abans=OFF;
}
else //prove de TOFF
{
if (set_timer(1,inf_pwm.ton)) return(1);
pulse_on_a();
inf_pwm.abans=ON;
}
}

return(0);
}




















Anexo C
Proyecto final de carrera Pgina 98

4.11 Librera Timer.c

/*--------------------------------------------------------------------
FILE: timer.c
Implementacio de les funcions relatives als temporitzadors
---------------------------------------------------------------------*/
//PFC
#define simula
#define project
#include "q5.h"
//PFC

#include "pid.h"
#include "timer.h"
#include "pwm.h" //necessari per l'assignacio del apuntador a
//ini_timers
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#include <math.h>



void interrupt (*old_handler_timer)(); //mante el manejador
//original


extern struct_PWM inf_pwm;

soft_timer s_timer[3]; //taula que conte els 3 soft timers
hard_timer h_timer;
extern long int irq_8253;
long int PID=0;
int error_irq=0; //dtecta si alguna de les funcions associades h
//a generat error


//--------------------------------------------------------------------
//captura_valors: comprova els valors de temps introduits
// des de teclat
//--------------------------------------------------------------------

int captura_valors(double *valors)
{
char temps[10];

printf("\n\nEls valors de TEMPS han d'estar en ms\n\n");
printf("Periode de mostreig PID: ");
if (captura_tecla_teclat(temps)) return(1);
else valors[0]=atof(temps);

printf("Periode de PWM: ");
if (captura_tecla_teclat(temps)) return(1);
else valors[1]=atof(temps);

return(0);
}
Anexo C
Proyecto final de carrera Pgina 99

//-----------------------------------------------------------------------
// captura_tecla_teclat: captura una cadena de numeros i realitza
control
// d'error.
// retorna una cadena de caracters
//-----------------------------------------------------------------------
int captura_tecla_teclat(char taula[30])
{
char caracter;
int ind=0;

caracter=getchar();
while(caracter!='\n')
{
if ((caracter>='0')&&(caracter<='9')||(caracter=='.'))
taula[ind]=caracter;
ind++;
caracter=getchar();
}
if(caracter=='\n')
{
taula[ind]='\0';
return(0);
}
return(1); //retorn amb error

}

//-----------------------------------------------------------------------
//set_timer: Inicialitza els camps de la estructura
// s_timer d'un soft timer concret
//-----------------------------------------------------------------------

int set_timer(int timer,double interval)
{ //interval esta en us
switch(timer)
{
case 0: //timer soft decremental
{
s_timer[0].count=(interval/h_timer.tic)+0.5;
//trunca interval
s_timer[0].recarga=(interval/h_timer.tic)+0.5;
break;
}
case 1: //timer soft decremental
{
s_timer[1].count=(interval/h_timer.tic)+0.5;
//trunca interval
s_timer[1].recarga=(interval/h_timer.tic)+0.5;
break;
}
case 2: //timer soft incremental
{
s_timer[2].count=0;
s_timer[2].recarga=0;
break;
}
default: //sino es cap dels 3 retorna
return(1); //un error
}
Anexo C
Proyecto final de carrera Pgina 100
return(0); //retorn sense error
}

//-------------------------------------------------------------------
//ini_timers: Inicialitza tots els soft timers.
// Demana a l'usuari els valors de temps per als
// diferents timers
//
//NOTA: Els valors introduits per l'usuari seran en ms
//-------------------------------------------------------------------

int ini_timers(double *valors)
{ //valors es una taula on hi ha el temps de cada timer

s_timer[0].incremental=0; //timer decremental
s_timer[0].fun=control; //funcio associada al timer 0
if (set_timer(0,valors[0]*1000)) return(1); //inicialitza soft_timer 0
//valor en us
s_timer[1].incremental=0; //timer decremental
s_timer[1].fun=pwm; //funcio associada al timer 1
if (set_timer(1,valors[1]*1000)) return(1); //inicialitza soft_timer 1

s_timer[2].incremental=1; //timer incremental
s_timer[2].fun=funcio_velocitat; //funcio associada al timer 2
if (set_timer(2,valors[2]*1000)) return(1); //inicialitza soft_timer 2

return(0); //retorn sense error
}

//-------------------------------------------------------------------
//ini_struct_hard_timer: Inicialitza la estructura h_timer
// collocant informaci del timer hard
// que usem per realitzar la practica
//-------------------------------------------------------------------

void ini_struct_hard_timer(int interval)
{
h_timer.port=base_8253; //adrea base del 8253
h_timer.timer=tmr0; //selecciona el comptador 0 del 8253
h_timer.clock=clock_timer; //freqencia a la que oscilla el
//timer
h_timer.tic=interval; //interval entre interrupcions

}

//---------------------------------------------------------------------
// canvi_vector_irq: guarda l'antic apuntador de la posicio 8 de la
// taula vectoritzada i hi colloca el nou
//
//---------------------------------------------------------------------
void canvi_vector_irq(void)
{
old_handler_timer=getvect(vector_irq_timer);
setvect(vector_irq_timer,irq_timer);
}






Anexo C
Proyecto final de carrera Pgina 101
//------------------------------------------------------------------
// trans_interval_tic: Transforma els microseg al valor
// per carregar el 8253, arrodoneix i trunca
// el valor a carregar
//------------------------------------------------------------------
int trans_interval_tic(void)
{
return(((h_timer.tic)*(h_timer.clock)*1e-6)+0.5);
}

//------------------------------------------------------------------
//ini_8253: Inicialitza el timer 0 de la placa base del Pc
// en mode rate generator. Introdum el valor de
// la base de temps al registre count #0
//------------------------------------------------------------------
int ini_8253(void)
{
int valor=0;

valor=trans_interval_tic(); //transforma microseg. a tics
if ((valor<2)||(valor>0xFFFF)) return(1);
outportb(base_8253+3,0x3C); //timer0, mode rate generator
outportb(base_8253,(unsigned char)(valor&0x00FF));
//carrega byte_L del 8253
outportb(base_8253,(unsigned char)(valor>>8));
//carrega byte_H del 8253

return(0);
}

//----------------------------------------------------------------------
// restaura_ sistema: restaura l'antic vector de la taula vectoritzada
// i restaura el valor origina del timer 8253
//----------------------------------------------------------------------
void restaura_sistema(void)
{
disable();
setvect(vector_irq_timer,old_handler_timer); //restaura vector
outportb(base_8253+3,0x3C); //timer0, mode rate generator
outportb(base_8253,(unsigned char)(0xFF));
//recarrega 8253 amb valor original
outportb(base_8253,(unsigned char)(0xFF));
enable();

pulse_off_a(); //para el motor
pulse_off_b();
reset_prn(); //restaura port paralel
printf("\n\nSortida del Programa");

}

//----------------------------------------------------------------
// irq_timer: Rutina de servei al timer 8253
//----------------------------------------------------------------
void interrupt irq_timer(void)
{
int ind;

for(ind=0;ind<3;ind++) //Comprova els 3 soft_timers
{
if(!(s_timer[ind].incremental)) //timer decremental
Anexo C
Proyecto final de carrera Pgina 102
{
if(s_timer[ind].count) //si no es 0 es decrementa
s_timer[ind].count--;
//comprova per nivell si s_timer es
//0, si es 0 continua cridant la funcio
if(!s_timer[ind].count) //temps exhaurit
{ //es crida la funcio associada
error_irq=(*s_timer[ind].fun)();
s_timer[ind].count=s_timer[ind].recarga; // recarrega el s_timer
}

}
else //timer incremental
{
if((s_timer[ind].count)<2e31)

s_timer[ind].count++;
else //error
error_irq=1;
}

}
sim_motor();
irq_8253++;
outportb(base_8259,EOI_NS); // envia final irq no especific
}

//-----------------------------------------------------------------------
--
// funcio get_timer: retorna el valor actual d'un soft_timer especific
//-----------------------------------------------------------------------
--
double get_timer(int timer)
{ //transforma el valor a ms
return(((s_timer[timer].count)*h_timer.tic)/1000);
}

























Proyecto final de carrera Pgina 103

5 Anexo D: Referencias

[1] Libro: Esteban del Castillo, Control de Procesos, Publicacions URV, Ao 2008.
[2] Libro: Felipe Espinosa Zapata, Anlisis Diseo y Realizacin de Sistemas Electrnicos de Control
Contnuo, Universidad de Alcal de Henares, Ao 2006.
[3] Libro: Manuel Mazo Quintas, Control de Motores Paso-Paso, dc con escobillas y brushless,
Universidad de Alcal de Henares, Ao 1997

Вам также может понравиться