Está en la página 1de 60

INSTITUTO UNIVERSITARIO AERONAUTICO

TRABAJO FINAL DE LABORATORIO:


“CONTROL DE VELOCIDAD DE UN MOTOR DC MEDIANTE
MODULACIÓN POR ANCHO DE PULSO”

Informe Técnico: Revisión: /

Proyecto: /

Fecha: 14/06/06

Autor:
Serrudo Mario Sebastián

Revisó:
Ing. Luis Murgio

Vo.Bo. :
INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:1

INDICE

Página.

RESUMEN 2

1. INTRODUCCION 3

2. DESARROLLO
2.1 Diagrama en bloque del circuito 4
2.2 Hardware del circuito 4
2.3 Software 7
3. CONCLUSIÓN 10

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:2

“CONTROL DE VELOCIDAD DE UN MOTOR DC MEDIANTE


MODULACIÓN POR ANCHO DE PULSO”

por:
Serrudo Mario Sebastián.

Resumen

El propósito de este trabajo consiste en la realización de un mecanismo para controlar la


velocidad (RPM) de un motor de corriente continua.

El sistema que se emplea en este trabajo se basa en un microcontrolador que esta monitoreando
la velocidad del motor a través de un optoacoplador. La finalidad del controlador es mantener la
velocidad constante del motor a cambios bruscos de carga , desplegar la velocidad de manera
digital y de igual manera poder programar la velocidad deseada externamente mediante la
utilización de una PC.

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:3

1.INTRODUCCIÓN

El control de velocidad del motor DC serie, es un sistema de control electrónico de lazo cerrado
muy utilizado en la actualidad debido que dichos motores tienen características de velocidad y
torque muy interesantes, las cuales pueden ser aprovechadas de manera muy sencilla mediante un
sistema de control.

Típicamente el control de la velocidad de los motores DC se realiza de manera continua


mediante la utilización de un reóstato, operacionales, etc. Este método resulta en ocasiones
deficientes en particular cuando se desea un control centralizado de bajo mantenimiento alta
precisión y facilidad de monitoreo por lo que se recurre al control digital.

En este trabajo se describirá el diseño y la construcción de un Sistema de Control Digital de


Velocidad de un motor de corriente continua tipo serie, mediante un microcontrolador basado en el
PIC16F873. Se analizan las funciones de transferencia del Sistema y la implementación de la
estrategia de control por medio del microcontrolador. Asimismo se presentan las consideraciones
del diseño del hardware y software y los resultados experimentales obtenidos. Este Sistema tiene
numerosas aplicaciones donde se tiene disponible tensión continua como en vehículos eléctricos,
grúas, carros mineros de arrastre, servos de corriente continua, etc

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:4

2.DESARROLLO

A continuación se realiza un breve desarrollo teórico sobre el sistema de control a utilizar.

2.1.Teoría.

El sistema de control a utilizar en este trabajo se denomina “Delta”, y es de muy fácil


implementación en sistemas digitales pero de una deducción teórica muy compleja, por lo que
se procederá a hacer una aproximación mediante un control clásico continuo con el que se
consigue muy buenos resultados.

El diagrama de un sistema de control de lazo cerrado clásico es como el que se muestra a


continuación:

+ RPM
REF K MOTOR

En donde:
• La referencia es suministrada por la PC
• El bloque sumador y proporcional(K) se encuentran en el PIC
• El Bloque H es el optó acoplador con su conformador de onda.

La función de transferencia de cada bloque es la siguiente :

RPM A
Motor = FT = =
Voltios ( s + B)

Voltios
K = FT = = Cte
Pulsos

Pulsos
H = FT = = Cte 2
RPM

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:5

Si buscamos la función de transferencia del sistema se obtiene lo siguiente:

RPM CteA
Sistema = = (1)
REF ( S + B + Cte 2CteA)

y transformando al dominio del tiempo se obtiene:

−t
CteA * REF
RPM (t ) = (1 − e B +Cte 2CteA )
B + Cte 2CteA

Como se puede observar el sistema se ha hecho mas lento pero mas estable y con un error
menor por lo que es mas sencillo de controlar.

Debido a que trabajamos con modulación “Delta” consideraremos que el sistema es 10 veces
mas lento aun, por lo que la formula final queda:

−t
CteA * REF
RPM (t ) = (1 − e 10 ( B +Cte 2CteA) )
B + Cte 2CteA

De esta manera se concluye el estudio teórico del comportamiento del sistema de control.

2.2Diagrama en bloques:

A continuación se realizara un diagrama en bloque del sistema de control de velocidad.

PWM
Comunicación Tx Potencia
con la PC
Rx
Micro Motor
controlador

RPM

Visualización Puerto A y B Modulo de


Rb0 Realimentación
o encode

2.3Hardware
Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:6

El montaje de este sistema se realizó en Protoboard y básicamente consiste de los subsistemas


descriptos en el diagrama en bloque de la sección anterior.

2.3.1Microcontrolador

Se comienza el diseño del Hardware por el bloque principal el cual se basa en un


microcontrolador que se encarga de las operaciones de control (Mediante un modulador PWM y un
optoacoplador) y visualización (mediante display 7 segmentos) de las RPM del motor.

Además este microcontrolador debe permitir mantener una comunicación serie (bajo norma RS-
232) con la PC para poder transmitir las RPM actuales y recibir la señal de referencia o RPM
deseadas necesaria para el proceso de control.

En función de los requisitos anteriormente enunciados se procedió a la elección de un


microcontrolador PIC16F873 debido a que posee las siguientes características :

• Procesador de arquitectura RISC avanzada.


• Juego de 35 instrucciones con 14 bits de longitud. Todas ellas se ejecutan en un ciclo de
instrucción, menos las de salto que tardan dos.
• Frecuencia máxima de 20 MHz.
• Hasta 8 K palabras de 14 bits para la Memoria de Código, tipo FLASH.
• Hasta 368 bytes de Memoria de Datos RAM.
• Hasta 256 bytes de Memoria de Datos EEPROM
• Hasta 14 fuentes de interrupción internas y externas.
• Pila con 8 niveles.
• Modos de direccionamiento directo, indirecto y relativo.
• Perro Guardián (WDT).
• Código de protección programable.
• Modo SLEEP de bajo consume.
• Voltaje de alimentación comprendido entre 2y 5,5 V.
• Bajo consumo (menos de 2 mA a 5 V y 5 MHz).
• 3 TIMER
• 2 Módulos de Captura-Comparación-PWM

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:7

• Conversor A/D de 10 Bits


• Puerto serie síncrono
• USART
• Interrupción externa

Como se puede observar este microcontrolador cumple con los requisitos necesarios para este
sistema.
2.3.2 Visualización

El circuito visualizador de las RPM se basa en 4 display 7 segmentos conectados al PIC los
cuales hay que determinar si van a ser activos por cero o por uno en otras palabras si van a ser
ánodo común o cátodo común.

Para ello se realiza un estimación de la potencia consumida o disipada por el


microcontrolador si se decide que los diodos sean activos por alto o bajo. Para ello se observa las
curvas de características eléctricas del PIC IOH Vs VOH, corriente de salida Vs voltaje de salida en
estado alto, y IOL Vs VOL, corriente de salida Vs voltaje de salida en estado bajo y con una
corriente de 10mA por diodo, siendo activo por alto la caída interna del pic es de 1.25v
consumiendo 12.25mW por diodo. En el otro caso, activo por bajo la caída del pic es de 0.5v con
una potencia de 7.5 mW por diodo.

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:8

En conclusión se decide que los displays sean activos por bajo utilizándose entonces displays
de ánodo común. La corriente solicitada por cada display en el peor caso, (todos los segmentos
encendidos) es de 10mA x 7 =70mA para suministrarla se utiliza un transistor PNP BC327-25
polarizado en corte y saturación que provee la intensidad de corriente requerida por el display. El
circuito a diseñar para cualquier display es el siguiente

VCC
5V

Q1
RB

BC327

CK

U1

A B C D E F G

RB1
Ln1
RB2
Ln2

RB3
Ln3

RB4
Ln4
AL_PUERTO_B
RB5
Ln5

RB6
Ln6

RB7
Ln7

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:9

Rc se calcula a de la siguiente manera

Vcc − Vec − Vd − IaRc − VOL = 0

donde Vec= 0.3v es el voltaje de saturación del transistor y V OL=0.5v es el voltaje en estado
bajo del puerto B del PIC .

Vcc −Vec −Vd −VOL 5v −0.3v −0.7v −0.5v


Rc = = = 350Ω ≈ 330Ω
Ia 10mA

Rb se calcula de la siguiente manera

Vcc − Veb − VOL


= I Bsat
RB
Ic
I Bsat ≥
β min
donde IBsat es la corriente de base para saturar el transistor

Vcc −Veb −VOL 5v − 0.7v − 0.5v


RB ≤ βmin = 15 = 500Ω ≈ 470Ω
Ic 10mA

de este modo quedan las resistencias Rc y Rb por los valores mas cercanos que se encuentran
en el laboratorio.

Los pines del puerto A (RA0, RA1, RA2 y RA3) son los encargados de la activación de los
displays a través de las resistencias de base Rb.

Los pines del puerto B (RB1-RB7) manejan los 7 segmentos de los displays a través de las
resistencias Rb1, Rb2,etc.

De esta manera queda diseñada el bloque visualizador display 7 segmentos.

2.3.3 Comunicación con la PC


Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:10

La comunicación con la computadora como ya se ha mencionado se realiza mediante el


protocolo de comunicación serie RS-232. Dicho protocolo establece una serie de condiciones
necesarias para realizar una comunicación exitosa.

Básicamente este tipo de comunicación se realiza de manera asincrónica por lo que cada palabra
de información se envía independientemente de las demás. Suele constar de 8 o 9 bits y van
precedidos por un bit de START(inicio) y detrás de ellos se coloca un bit de STOP(parada), de
acuerdo con la norma del formato NRZ(nonReturn-to-Zero).Los bits se transfieren a una frecuencia
fija y normalizada. Toda esta operación es realizada en el USAR del PIC o de la PC.

Un importante hecho que establece la norma son los voltajes de operación los cuales se
establecen en –12 o 12 voltios según el nivel logico, el microcontrolador no tiene la posibilidad de
generar dichos voltajes por lo que se necesita un conversor de niveles TTL a RS-232, este
conversor viene en un circuito integrado denominado MAX232.

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:11

2.3.4 Modulo de potencia.

Como se ha mencionado anteriormente el control del motor se realiza mediante un modulador


por ancho de pulso que posee el microcontrolador. Se ha decidido utilizar este tipo de modulación
debido a que el motor no pierde sus propiedades de velocidad y par que son tan deseadas de
conservar.

Básicamente la técnica consiste en una señal cuadrada de frecuencia fija a la cual se le puede
variar el ancho del impulso positivo como se observa en la siguiente figura.

Ahora si estudiamos el nivel de continua de dicha señal obtenemos lo siguiente.

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:12

T/x
1 VccT Vcc
Vdc =
T ∫Vccdt =
0
TX
=
X

Ahora si llamamos a m=1/X obtenemos:


Vdc =mVCC

En donde:
Vcc: es el nivel de cresta de la señal
X: es la relación entre el periodo y el ancho del impulso
M: es la relación entre el ancho del impulso y el periodo

En la siguiente figura se puede observar que a medida que los pulsos se hacen mas anchos el
nivel de continua se hace superior por lo tanto se puede tomar a un modulador PWM como un
controlador proporcional K como el propuesto en la sección de teoría.

Debido a que un motor de corriente continua puede tener consumos de varios cientos de
miliamper hasta varios amperes el modulador que posee el pic no puede ser conectado
directamente debido al alto consumo, para solucionar esto se coloca un transistor NPN TIP-31 el
cual opera en corte y saturación. La misión de este transistor es proporcionar la corriente necesaria
al ritmo que el modulador por ancho de pulso lo imponga.

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:13

El circuito utilizado para esta tarea es el siguiente.

VCC

S1 D1

M
MOTOR 1N4148

Q1
R1
pwm

TIP31A

La resistencia R1 se calcula de la siguiente manera.

IC
Vpwm max − R1 −Vce = 0
β

β
R1 = (Vpwm max −Vce)
IC

En donde : Vpwmmax = 5 vol


IC=600mA
Vce=0.6 V
β=100
quedando:
100
R1 = (5 − 0.6) = 733Ω
600

Debido a que el motor es un elemento inductivo, cuando se desconecta de manera abrupta


tiende a elevar su potencial, para que esto no dañe al transistor se coloca el diodo en paralelo con
el motor de manera que cuando ocurra una desconexión abrupta el diodo cortocircuite al motor
protegiendo al transistor.

De esta manera concluye el estudio de la etapa de potencia del sistema.

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:14

2.3.5 Motor

El motor utilizado en este proyecto es de un auto de juguete, dicho motor consume


aproximadamente 500 mA máximo y puede ser alimentado desde 1.5 hasta 5 voltios.

La función de transferencia del motor fue obtenida experimentalmente como se demuestra en el


ANEXO 1

A 2834
Ft = =
S +B S + 0.8034

2.3.6 Modulo de realimentación o Encode

Este modulo es el encargado de realimentar el sistema, básicamente transforma las RPM en


pulsos digitales para que el PIC pueda determinar la RPM del motor y en función de las mismas y la
referencia efectué una corrección.

Esto se logra colocando al eje del motor una rueda dentada y un optoacoplador para determinar
el paso de una ranura tal como se muestra en la figura.

Como se puede observar el foto transistor entra en conducción cuando es iluminado y en corte
cuando no lo es, pero en la realidad este fototransistor no trabaja en corte y saturación si no que
produce una señal senoidal debido a que la iluminación se produce de manera paulatina, por lo que
a esta señal hay que acondicionarla mediante un circuito conformador de onda.

El circuito completo de realimentación es el siguiente.


Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:15

VDD

R2 R3 5V

10k 10k
R10
VDD
R11
RB0 5V 1.0k 1K _LIN
4 50%
U1A Key = Space
3 Disco
1
2 X1
LED1
11 LM324AD
R1
5.1k

Para simplificar el análisis del circuito lo dividiremos en dos partes:


1. Circuito de toma de señal
2. Circuito conformador de onda.

El circuito de toma de señal consiste de un fototransistor y de un diodo emisor junto con dos
resistencia limitadora de corriente de la cuales una de ellas(R10) permite controlar la intensidad con
que se iluminará al fototransistor.

La segunda parte del circuito es el conformador de onda cuya función es tomar la onda
senoidal proveniente de la etapa anterior y transformarla en una señal cuadrada de manera que
pueda producir interrupciones en el microcontrolador.

El calculo de las resistencia r1,r2,r3 se realiza de la siguiente manera.

Primero suponemos que a la salida del operacional hay 5 voltios de manera que la resistencia
R2 y R3 se encuentran en paralelo , por lo que la tensión en la entrada no inversora del operacional
es:
5 R1( R 2 + R3)
V1 =
R1R 2 + R1R3 + R 2 R3

por lo tanto cuando la tensión en la entrada inversora supere a V1 la salida del operacional pasara
a valer 0 voltio.

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:16

Ahora si suponemos que a la salida del operacional hay 0 voltios de manera que la resistencia R1
y R2 se encuentran en paralelo , por lo que la tensión en la entrada no inversora del operacional es:
5 R1R 2
V2 =
R1R 2 + R1R3 + R 2 R3

por lo tanto cuando el valor en para inversora disminuya de v2 la salida del operacional pasa a 5 V.

Ahora propongo una tensión de subida V1 de 2.5 Vol y y tensión de bajada de 1.2V por lo que las
formulas quedan:

5 R1( R 2 + R3)
V1 = 2.5
R1R 2 + R1R 3 + R 2 R3

5 R1R 2
V2 = =1.2
R1R 2 + R1R3 + R 2 R3

Haciendo el cociente entre ambas obtenemos:

V1 R3
−1 =
V2 R2
R3 2.5
= − 1 = 1.083
R 2 1.2

Ahora trabajando con la formula de V2 se obtiene:

5 5
V2 = =
R3 R3 R3
1+ + 1 + 1.083 +
R 2 R1 R1
R3 5
= − 1 − 1.083 = 2.083
R1 V 2

Por lo tanto si elijo R2=10K entonces: R3=10.83K y R1=5.2K.

De esta manera concluye el estudio del modulo de realimentación y se procede a unir todos los
módulos en el siguiente circuito.

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:17

VDD
5V VCC
5V

Q2 Q3 Q4 Q5

470

M
D1
BC327 BC327 BC327 BC327 1N4148
470 MOTOR
CK CK CK CK
470

470 U4 U5 U6 U7

A B C D E F G A B C D E F G A B C D E F G A B C D E F G

750
330 TIP31A

330

330

330

330

330
U2
330 VDD
1 28 VDD
2 27 5V
3 26 5V
20pF 4 25
5 24
6 23
7 22 10k 10k
8 21 J1 VDD
9 20 1uF-POL 1uF-POLU3
10 19 5V 1.0k
11 18 C1+ VCC V- 1K _LIN
50%
12 17 C1- 4 U1A Key = Space
13 16 C2+ V+
HC-49/U_3MHz 14 15 C2- 3

16f873 1uF-POL T1I N T1OUT HDR1X3 1


T2I N T2OUT
20pF
2 Disco
R1OUT R1I N
R2OUT R2I N 11 LM324AD
GND 1uF-POL
5.1k
MAX232E

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:18

2.4Software:

Para comprobar el correcto funcionamiento de cada parte de hardware se procedió a realizar


diferentes programas cuyo objetivo era testear el funcionamiento de cada bloque.

Comprobación de funcionamiento de los display


Para comprobar el correcto funcionamiento de los display se procedió a utilizar el programa
cronometro, el cual fue utilizado en el trabajo practico numero 2, cuyo código fuente se encuentra
en la sección de ANEXO.

Luego de comprobar el correcto funcionamiento de los display se procedió a verificar la correcta


operación del bloque que posibilita la comunicación con la PC

Comprobación del bloque comunicaciones de la PC

Este bloque es el encargado de realizar la comunicación entre en PIC y la PC. Para comprobar
el correcto funcionamiento se realizó un programa para el PIC y otro para la PC los cuales permiten
que la PC envié un dato al PIC y este lo reenvié a la PC todo mediante comunicación serie
asíncrona.

Transmisión Asíncrono del PIC


Cuando se desea transmitir datos de manera asíncrona utilizando la USART , lo que se debe
realizar es depositar en el registro TXREG el dato a transmitir, este registro es pasado a un
registro de desplazamiento ,que va sacando los bits secuencialmente y la frecuencia establecida.

Además, antes de los bits del dato de información incluye un bit de INICIO y después de sacar
todos los bits añade un bit de PARADA.

El corazón de este sistema es el registro de desplazamiento el cual obtiene el dato desde el


registro TXREG y luego lo va desplazando y sacando bit a bit, en serie, por la patita RC6/TX/CK. La
transferencia entre los dos registros se realiza en un ciclo y entonces el señalizador TXIF se pone
a 1, para advertir que el registro de transmisión se ha vaciado. También en este momento puede
producirse una interrupción si se ha posibilitado programando el señalizador TXIE= 1 en el registro
pie 1. Cuando se escribe otro dato sobre TXREG, el señalizador TXIF se pone a 0 .

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:19

La secuencia de pasos a seguir para implementar una transmisión Asíncrona es la siguiente:


1. Hay que configurar la líneas RC6/TX/CK como salida y RC7/RX/DT como entrada.
2. Poner SYNC=0 y SPEN=1 para activar el USART en modo asíncrono.
3. Si se desea trabajar con interrupciones, poner TXIE=1, además de habilitar las
interrupciones en general.
4. Se carga el valor X adecuado en el registro SPBR, para producir la frecuencia de trabajo
deseada. Hay que controlar el bit BRGH (para transmisión de alta o baja velocidad)
5. Activar ela transmisión con TXEN=1.El bit TXIF tendrá valor 1, ya que TXREG se
encuentra vacio
6. Carga en TXREG el dato a transmitir. Comienza la transmisión

Recepción Asíncrona del PIC


Los dates se reciben en serie, bit a bit, por la patita RC7/RX/DT y se van introduciendo
secuenciamente en el registro desplazamiento RSR, que funciona a una frecuencia 16 veces mas
rápida que la de trabajo. Cuando el dato consta de 9 bits hay que programar el bit RX9 = 1 y el
noveno bit de información se colocara en el bit RX9D del registro RCSTA. El control sobre el
noveno bit se realiza con las puertas de control y las señales que se aplican (ADDEN = 1). Cuando
CREN = 1 en el registro RCSTA<4>, se habilita la recepción.
Los pasos a seguir en el modo de recepción son los siguientes.
1. Se carga con el valor X a! Registro SPBRG para trabajar con la frecuencia deseada,
controlando además el valor de BRGH.
2. Se habilita el USART en modo asíncrono con SPEN = 1 y SYNC = 0.
3. Si se desea que se genere una interrupción con la llegada del bit PARADA,
se pone RCIE = 1, además de habilitar las interrupciones en general.
4. Se habilita la recepción poniendo CREN = 1.
5. Al completarse la recepción RCIF se pondrá a 1 y se produce una interrupción si se había
permitido
6. Se lee el registro RCSTA y se averigua si se ha producido algún error
7. Leer los 8 bits del registro RCREG para obtener el dato

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:20

A continuación se muestra un diagrama de flujo del programa implementado en el del PIC para
corroborar el correcto funcionamiento del Hardware. Si se desea obtener el código fuente dirigirse a
la sección de anexos.
Inicialización LEER DATO
rc7 entrada
rc6 salida
RETRANSMITIR DATO

Configuración USART
VOLVER

USAR en escucha

bucle

Programa de la PC.

El programa utilizado para el testeo del correcto funcionamiento de la transmisión asíncrona fue
realizado en lenguaje C, dicho programa se basa en la transmisión y recepción de datos mediante
el puerto serie (0X386) a una velocidad de 9000 baudios por segundo. Si se desea saber el código
fuente de dicho programa dirigirse a la sección de anexo.

Luego de comprobar el correcto funcionamiento de la transmisión y recepción serie se procedia


a la verificación del bloque PWM y MOTOR

Comprobación del bloque PWM y del motor


Para comprobar el correcto funcionamiento del modulo PWM con su respectiva etapa de
potencia junto con el motor, se procedió a realizar un programa el cual varia la velocidad del motor
desde 0 hasta alcanzar su velocidad máxima. Para ello se debe configurar al microcontrolador de la
siguiente manera:
1. Asignar el periodo cargando el valor oportuno en PR2 y recordando que la formula de

periodo es : Periodo = (Pr 2 + 1) * 4 * Tosc * Valor _ del _ predivisor _ TMR 2


2. Asignar la anchura del pulso cargando el registro CCPR1L y recordando que la formala

que manera el ancho del pulso es: Ancho _ pulso = CCPRL1 * tosc * Pr edivisor _ Tmr 2
3. Configurar la linea CCP1 o CCP2 como salida.
4. Asignar el valor del predivisor y activar el TMR2 escribiendo T2CON
5. Configurar el modulo CCP1 en modo PWM

El diagrama de flujo del programa se muestra a continuación:


Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:21

Inicialización
Rc1salida
Predivisor TMR0
Velocidad=0

Activar motor

Incrementar velocidad
hasta máxima

Parar motor

Si se desea el código fuente del programa dirigirse a la sección de anexos.

Luego de comprobar que este bloque funciona correctamente se procedió a verificar el


funcionamiento del modulo de realimentación.

Comprobación del bloque de realimentación

Para comprobar el correcto funcionamiento de este bloque se realizo un programa que cuenta la
cantidad de pulsos que se producen en un segundo y los visualiza en los display.
El diagrama de flujo de este programa se muestra a continuación.
Inicialización interrupción
Rb salida
Rb0 entrada
Ra Salida
Configuración del TMR0
No No
¿Interna? ¿externa?
Activación de interrupciones

Si Si
bucle
Si
Para la 1 Seg? Incremento aux
cuenta
no

Guardar la cuenta Mostrar en display


en aux

Restablecer interrupciones

volver

Para mas detalle dirigirse al Anexo en donde se encuentra en código fuente.

De esta manera queda comprobado el correcto funcionamiento de los diferentes módulos del
sistema.

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:22

A continuación se realiza la descripción del programa final.

Software final

Los programas que se explican a continuación son los encargados de realizar el control de
velocidad del motor de corriente continua, visualizar las RPM en los displays 7 segmentos y
posibilitar la transmisión y recepción de datos necesarios entre la PC y el microcontrolador .
Para simplificar la explicación se divide este software final en dos partes, la primera es la
encargada de explicar el funcionamiento del programa del PIC y en la segunda parte se detalla el
funcionamiento del programa de la PC.

Programa del PIC.


El programa a utilizar en el PIC básicamente es una combinación de los programas anteriores
con el agregado de poseer el algoritmo que permite el control de la velocidad de giro motor.

Debido a la extensión del programa se realiza un diagrama de flujo para así facilitar la
comprensión del mismo y poder dar detalles de los bloques que se crea necesario.
Inicialización de variables
Puerto b Salida
Rb0 entrada
Puerto a Salida
Rc1 Salida para PWM
Rc6 Salida para Tx Serie
Rc7 Entrada para Rx Serie
Configuración del PWM
Configuro USAR
Habilito interrupciones
Carga al tmr0
Velocidad de giro =0

BUCLE

INTERRUPCION

NO NO
Por TMR0? Por Rb0 Recepción serie

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:23

SI Si
Si
1 Seg? Si
Realizo la Incremento Cargo el nuevo valor
cuenta de RPM Cuenta de referencia

No

Comparo con la referencia

Mayor menor

Incremento el Decremento el
ancho de pulso ancho de pulso

Trasmito a la PC

Cuenta=0
Visualización

Seteo de Banderas y Seteo de Banderas Seteo de Banderas


variables

Salir de interrupción

Como se puede observar el programa comienza realizando las configuraciones necesarias para
que funcione de forma correcta: el modulador PWM, la transmisión y recepción serie, configurando
los puertos para la visualización de los display y seteando los predivisores y variables
correspondientes para un correcto funcionamiento del servicio de interrupción .

Luego se puede observar que el programa entra en un bucle sin fin en espera de alguna de las 3
causas posibles de interrupción. Las cuales pueden ser:

• Por desbordamiento del TMR0


• Por interrupción producida por un flanco ascendente en la para RB0
• Por la recepción de un dato por puerto serie

Dependiendo del origen de la interrupción el programa efectúa distintas tareas:


Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:24

Interrupción por TMR0: En esta condición el programa refresca los display para poder obtener una
correcta visualización, si a su vez a pasado 1 segundo se realiza la cuenta para obtener las RPM
con que esta girando el motor . Para obtener las RPM del motor se efectúa la siguiente cuenta.

Cuenta * 60
RPM =
cantidad _ de _ ranuras _ del _ disco

En donde:
Cuenta: es una variable que se incrementa cada vez que entra una interrupción por RB0
Cantidad de ranuras: En este caso es 40 debido a que esa es la cantidad de ranuras que
posee el disco que gira solidariamente con el eje del motor.

Por lo tanto la ecuación anterior queda de la siguiente manera:

Cuenta * 60 Cuenta * 3
RPM = =
40 2

De esta manera el error máximo que se produce es de 1,5 RPM con lo que se considera
satisfactorio.

Luego de obtener la cantidad de RPM con que esta girando el motor, se compara con la
referencia enviada por la PC via puerto serie y se incrementa o decrementa el ancho del pulso del
PWM en función del resultado de dicha comparación como se muestra a continuación.

• RPM con que esta girando el motor > Referencia entonces decremento el pulso de control
• RPM con que esta girando el motor < Referencia entonces incremento el pulso de control

Este tipo de control es el denominado control “Delta” y como se puede observar es un control no
lineal pero de muy fácil implementación.

Luego de hacer la corrección del ancho de pulso, se envía las RPM con que esta girando el
motor a la PC y esta las guardas para poder hacer a posterior un análisis del funcionamiento del
sistema de control.

Finalmente se comienza nuevamente con el proceso colocando la variable cuenta a 0


Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:25

Interrupción por RB0: Cuando se produce una interrupción por Rb0 se incrementa la variable
cuenta, la cual cada 1 segundo es puesta a 0.

Interrupción por Recepción de datos de la PC: Como se sabe en todo sistema de control se
necesita una señal de referencia, en este caso es enviada desde la PC e indica la cantidad de RPM
que se desea, de manera que el microcontrolador efectúa las correcciones necesarias para cumplir
con la referencia.

De esta manera se ha descrito el programa del microcontrolador y cuyo código fuente se encuentra
en la sección de anexo.

Programa de la PC.
El programa realizado para la Pc es relativamente sencillo, básicamente lo que realiza es la
transmisión de la referencia al sistema de control y la recepción de los datos que envía el mismo
almacenándolo en un archivo denominado datos.txt el cual luego será utilizado para estudiar el
comportamiento del sistema.

El programa basa la recepción de datos en el servicio de interrupción que posee la PC y la


transmisión de dato se realiza de manera directa como se puede observar en el código fuente en la
sección de anexo.

3 .Resultados
En esta sección se analizan los resultados obtenidos de manera teórica y practica. Para ello lo
primero que se necesita es obtener la función de transferencia del motor.

3.1Obtencion de la función del motor :

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:26

Para obtener la función de transferencia del motor se desconecto el PWM del mismo por lo que
de esta manera el sistema lo único que realiza es medir las RPM del motor y transmitirla a la PC en
donde fueron grabadas en el archivo datos.txt. Luego se lo éxito mediante una pila mediana de 1,5
Voltios obteniéndose la siguiente grafica.

En función de esta grafica obtendremos la función de transferencia del motor.


Recordemos que la función de transferencia de un motor es la siguiente.

Ahora si excitamos a este sistema con un escalón de 1.5V como es en nuestro caso la expresión
queda:

Anti-transformando la expresión al dominio del tiempo se obtiene lo siguiente:

por lo tanto si consideramos un la formula queda:

Ahora si observamos la grafica podemos apreciar que el valor de RPM luego de los 45 Seg es
aproximadamente constate y estable por lo que se puede considerar que ya han pasado todos los
transitorio o sea que de esta manera se concluye que :

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:27

Ahora si observamos el tiempo transcurrido hasta que llegue a un 50% del régimen podemos
despejar el valor de las constante A y B

De la grafica y la tabla de valores se observa que el tiempo transcurrido en llegar a 2664 rpm es
de aproximadamente 1.5 segundos. Trabajando sobre la formula se obtiene lo siguiente.

Por lo tanto A es igual a:

Por lo que la formula queda:

Si graficamos esta función y la obtenida experimentalmente se observa lo siguiente.

Como se puede observar la aproximación realizada concuerda con los resultados obtenidos de
manera practico por lo que podemos definir a la función de transferencia del motor como:

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:28

3.2 Obtención de la función de transferencia de los demás elementos

Los demás elementos que componen el sistema de control tiene funciones de transferencias las
cuales se pueden obtener de forma matemática.

Para el circuito de realimentación se pude considerad que la función de transferencia es unitaria


y para el modulador por ancho de pulso ya se ha deducido la función de transferencia:

3.3 Obtención de la función de transferencia del sistema

En la sección de teoría se ha llegado a la conclusión de que la función de transferencia del


sistema es:

por lo que reemplazando los valores se obtiene:

y en el dominio del tiempo la formula es:

”Formula sin corrección”

y teniendo en cuenta la consideración de modulación delta la formula queda:

”Formula con corrección “

3.4 Resultados del sistema de control en lazo cerrado


Para observar el funcionamiento del sistema bajo el control de lazo cerrado, se procedió a
excitar al sistema mediante una señal de referencia de 2000 Rpm y se obtuvo la siguiente grafica:

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:29

Como puede observarse la aproximación realizada funciona correctamente al igual que el


sistema de control.
Como era de esperarse el sistema es mucho mas lento que cuando se lo excito en lazo abierto
pero, esta demora puede compensarse con un aumento en la precisión y estabilidad.

4.CONCLUSIÓN

Desde el punto de vista del trabajo se ha observado que el sistema nunca termina de
estabilizarse, esto contradice con la teoría de control la cual manifiesta que un sistema de control
realimentado negativamente es mas estable que cuando se lo excita en lazo abierto.
Controlando el sistema se observo que el sistema de realimentación, (cuando el motor esta
en funcionamiento y en régimen) produce una señal cuadrada cuya frecuencia varia alrededor de
una central , esto produce un error en la determinación de las RPM del motor de aproximadamente
10 a 20 RPM, este error produce que el sistema constantemente este compensando por lo que
nunca llega a estabilizarse.
Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:30

Este error que produce el sistema de realimentación no es un problema electrónico si no


mecánico debido a que si se observa el funcionamiento del eje del motor este posee un pequeño
juego el cual es transmitido a la rueda dentada y a sus vez esta lo transmite al sistema de
realimentación. Si se soluciona este inconveniente mecánico el sistema se estabilizaría conforme a
lo predicho teóricamente.
Obviando este problema de estabilidad se observó el correcto funcionamiento del proyecto
“CONTROL DE VELOCIDAD DE UN MOTOR DC” en el cual se ha podido integrar conocimientos
de diversas materias como Informática II, Control I, y Digitales III.
Cabe destacar que este proyecto a permitido observar de manera practica los diversos
conceptos desarrollados por las distintas materias y la gran capacidad que posee la tecnología de
los microcontroladores para adaptarse a una gran variedad de proyectos con un costo muy
reducido.

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:31

ANEXO 1

Programa de prueba de los display de 7 segmentos.


;Este programa simula el funcionamiento de un cronometro digital el cual tiene una precisión de centenas de segundos.
; La visualización se realiza mediante 4 display de 7 segmentos conectados al puerto A y B.

#include<P16F873.INC>

;DECLARACIONES

GUARDO_W EQU 0X20 ;EN ESTA DIRECCION SE GUARDA EL REGISTRO W CUALDO SE INGRESA A LA RUTINA DE INTERRUPCION

GUARDO_S EQU 0X21;EN ESTA DIRECCION SE GUARDA EL REGISTRO STATUS CUALDO SE INGRESA A LA RUTINA DE INTERRUPCION

DISPLAY1 EQU 0X22;EN ESTA DIRECCION SE ENCUENTRA EL VALOR EN DECIMAL DE LO MOSTRADO EN EL DISPLAY1

DISPLAY2 EQU 0X23;EN ESTA DIRECCION SE ENCUENTRA EL VALOR EN DECIMAL DE LO MOSTRADO EN EL DISPLAY2

DISPLAY3 EQU 0X24;EN ESTA DIRECCION SE ENCUENTRA EL VALOR EN DECIMAL DE LO MOSTRADO EN EL DISPLAY3

DISPLAY4 EQU 0X25;EN ESTA DIRECCION SE ENCUENTRA EL VALOR EN DECIMAL DE LO MOSTRADO EN EL DISPLAY4

CONTADOR EQU 0X26;ES EL ENCARGADO DE INDICAR QUE DISPLAY SE DEBE ENCENDER

AUXILIAR EQU 0X27;ES EL ENCARGADO DE QUE EL CONTADOR ESTE ENTRE 0 Y 4

MILISEGUNDO EQU 0X28;ES UNA VARIABLE QUE SE INCREMENTA CADA 50ms

OPCION EQU 0X81;ES EL REGISTRO OPTION

CONTROLAR EQU 0X29;VARIABLE QUE CONTROLO SI SE DETIENE LA CUENTA O SE RESETEA

REBOTE EQU 0X2A

CONTADOR1 EQU 0X2B

ORG 0X00 ;INDICO DONDE COMIENZA EL PROGRAMA

GOTO PRINCIPAL

ORG 0X04 ;CARGO EL VECTOR DE INTERRUPCION

GOTO INTERUP

ORG 0X05

;PROGAMA PRINCIPAL

;SEREOS

PRINCIPAL CLRF CONTADOR

MOVLW 0X02

MOVWF CONTROLAR; ES PARA COMENZAR PARADO EL RELOJ

INCF CONTADOR,F;I NCREMENTO EL CONTADOR DEBIDO A QUE NECESITO QUE COMIENCE EN


1

BSF STATUS,RP0

MOVLW 0X10

MOVWF TRISA

MOVLW 0X01

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:32

MOVWF TRISB; COLOCO AL PUERTO A Y B COMO SALIDA Y EL RB0 COMO ENTRADA

MOVLW 0X06

MOVWF OPCION ;CARGO EL PREDIVISOR EN 128,LO ASIGNO A TMR,EL CUAL ES EXITADO POR FUENTE INTERNA

BCF STATUS,RP0

CLRF PORTA

CALL SETEO

MOVLW 0XD9; CARGO AL TMR CON 217 DE MANERA QUE LA ECUACION QUEDE

MOVWF TMR0; TIEMPO=(256-217)*128*1us=4.99mS cada este tiempo se producira una interrupcion

MOVLW 0XB0; HABILITA INTERRUPCION GIE,TOIE,INTE

MOVWF INTCON

CLRF REBOTE

CLRF CONTADOR1

BUCLE

GOTO BUCLE;BUCLE PRINCIPAL

;RUTINA DE INTERRUPCION

INTERUP

MOVWF GUARDO_W; GUARDO W DEL PROGRAMA PRINCIPAL

SWAPF STATUS,W

MOVWF GUARDO_S; GUARDO STATUS DEL PROGRMA PRINCIPAL

BTFSS INTCON,T0IF ;VERIFICA SI LA INTERRUPCION ES CAUSADA POR EL DESBORDAMIENTO DE TMR0

GOTO SIGUI ;SI NO ES CAUSADA POR EL DESBORDAMIENTO DE TMR0 ENTONCES COMPRUEBO SI POR CAUSA EXTERNA

MOVLW 0XD9; SI LA INTERRUPCION ES CAUSADA POR TMRO ENTONCES CARGO NUEVAMENTE AL TMR CON 217

MOVWF TMR0; Y CONTINUO EL PROGRAMA

MOVF REBOTE,F; VERIFICO QUE PASEN 8*5=40ms ANTES DE PODER INGRESAR OTRA INTERRUPCION EXTERNA

BTFSS STATUS,Z

INCF CONTADOR1,F

BTFSS CONTADOR1,3

GOTO NUMERO

CLRF CONTADOR1

CLRF REBOTE

GOTO NUMERO

SIGUI BTFSC INTCON,INTF; VERIFICA SI LA INTERRUCPCION ES A CAUSA DE UNA INTERRUPCION EXTERNA

GOTO FIJATE ; SI ES CAUSADA SALTO A FIJATE

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:33

GOTO TERMINA ; INTERRUPCION NO VALIDA NO PROSIGUE Y SALTO PARA TERMINAR LA INTERRUPCION

FIJATE INCF REBOTE,F ; CONTROLO QUE LA INTERRUPCION EXTERNA NO SEA PROVOCADA POR REBOTES

MOVLW 0X01

XORWF REBOTE,W

BTFSS STATUS,Z

GOTO TERMINA ;SI ES PROVOCADA POR REBOTES ENTONCES NO PROSIGUE Y TERMINO CON LA RUTINA DE INTERRUPCION

INCF CONTROLAR,F;DE LO CONTRARIO INCREMENTO EL CONTADOR PARA DETERMINAR LA FUNCION A REALIZAR

NUMERO MOVF CONTROLAR,W

XORLW 0X03; SI ES LA TERCERA LA PULSACION SIGNIFICA QUE DESEO EMPEZAR

BTFSC STATUS,Z

CLRF CONTROLAR

BTFSC CONTROLAR,0; ME FIJO SI SE PULSO UNA VEZ EL BOTON ESTO SIGNIFICA QUE DEBO PARAR LA CUENTA

GOTO PARAR

BTFSC CONTROLAR,1; SI PULSO UNA SEGUNDA VEZ EL PULSADOR SIGNIFICA QUE DESEO RESETEAR LA CUENTA

CALL SETEO

INCF MILISEGUNDO,F

MOVF MILISEGUNDO,W; INCREMENTEO MILISEGUNDO CADA 5mS Luego de que milisegundo

XORLW 0X02 se incrementea 2 veces osea se llega a 1 centesima de segundo

BTFSS STATUS,Z; entonces incrementamos el display 1 que es el que maneja el digito menor de centesima de
segundo

GOTO SAL1

CLRF MILISEGUNDO

INCF DISPLAY1,F

SAL1 MOVF DISPLAY1,W; cuando el display1 llega a 10, entonces se incrementa el segundo display2 el cual maneja la desima de segundo

XORLW 0X0A

BTFSS STATUS,Z

GOTO SAL2

CLRF DISPLAY1

INCF DISPLAY2,F

SAL2 MOVF DISPLAY2,W; cuando el display2 llega a 10, entonces se incrementa el display el cual maneja el digito de los segundos

XORLW 0X0A

BTFSS STATUS,Z

GOTO SAL3

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:34

CLRF DISPLAY2

INCF DISPLAY3,F

SAL3 MOVF DISPLAY3,W; cuando el display3 llega a 10, entonces se incrementa el displaye el cual maneja el digito de decenas segundos

XORLW 0X0A

BTFSS STATUS,Z

GOTO SAL4

CLRF DISPLAY3

INCF DISPLAY4,F

SAL4 MOVF DISPLAY4,W; cuando el display4 llega a 6, entonces se RESETEAN LOS DISPLAY

XORLW 0X06

BTFSC STATUS,Z

CLRF DISPLAY4

PARAR CALL DISPLAY

TERMINA SWAPF GUARDO_S,W

MOVWF STATUS; RECUPERO LAS VARIABLES W Y STATUS DEL PROGRAMA PRINCIPAL

SWAPF GUARDO_W,F

SWAPF GUARDO_W,W

MOVLW 0XB0

MOVWF INTCON; REACTIVA LAS INTERRUPCION TOIE,TMR0

RETFIE

;SUBRUTINA DEL DISPLAY

;ESTA SUBRUTINA ES LA ENCARGADA DE MOSTRAR EN LOS DISPLAY LOS NUMEROS EN LAS VARIABLES DISPLAY1 A
DISPLAY4

;ESTOS DISPLAY SE CONTROLAN MEDIANTE EL PUERTO B(EL CUAL INDICA COMO SE DEBE ENCENDER)

;Y EL PUERTO A (CONTROLA CUAL DISPLAY SE ENCIENDER)

;TODO ESTA REALIZADO CON LOGICA 0

DISPLAY BTFSC PORTA,3;VERIFICO QUE EL PUERTO A SE ENCUENTRE DENTRO DE LOS LIMITES(OSEA QUE NO PASE DE 11110111)

GOTO EMPIEZO;SI NO ESTA DENTRO DE LOS LIMITES COMIENZA A ENCENDERSE DESDE EL PRIMER DISPLAY(OSEA 11111110)

MOVLW 0XFE

MOVWF PORTA

EMPIEZO MOVF CONTADOR,W;LA VARIABLE CONTADOR DETERMINA CUAL DISPLAY DEBE ENCENDERSE

XORLW 0X01

BTFSC STATUS,Z ;ME FIJO SI TENGO QUE PRENDE EL DISPLAY 1

GOTO SALE1

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:35

MOVF CONTADOR,W

XORLW 0X02

BTFSC STATUS,Z ;ME FIJO SI TENGO QUE PRENDE EL DISPLAY 2

GOTO SALE2

MOVF CONTADOR,W

XORLW 0X03

BTFSC STATUS,Z;ME FIJO SI TENGO QUE PRENDE EL DISPLAY 4

GOTO SALE3

GOTO SALE4;ME FIJO SI TENGO QUE PRENDE EL DISPLAY 3

SALE1 MOVF DISPLAY1,W ;BUSCO EL CODIGO DEL DISPLAY 1

CALL TABLA ;(OSEA QUE BUSCO LA SECUENCIA DE ENCENDIDO PARA EL DISPLAY DE MANERA MUESTRE EL NUMERO EN DECIMAL DE LA VARIABLE)

GOTO SALIR

SALE2 MOVF DISPLAY2,W;BUSCO EL CODIGO DEL DISPLAY 2

CALL TABLA

GOTO SALIR

SALE3 MOVF DISPLAY3,W;BUSCO EL CODIGO DEL DISPLAY 3

CALL TABLA

GOTO SALIR

SALE4 MOVF DISPLAY4,W;BUSCO EL CODIGO DEL DISPLAY 4

CALL TABLA

SALIR MOVWF PORTB ;PRENDO PUERTO B EN FUNCION DEL CODIGO MANDADO POR LA TABLA

MOVF CONTADOR,W

MOVWF AUXILIAR

BSF STATUS,C

DECFSZ AUXILIAR,F;ENCIENDO EL DISPLAY CORRESPONDIENTE

RLF PORTA,F

MOVF CONTADOR,W

XORLW 0X04

BTFSC STATUS,Z;LLEGUE AL ULTIMO DISPLAY

CLRF CONTADOR;SI ENTONCES EMPIEZO LA PROXIMA POR EL PRIMERO

INCF CONTADOR,F ;DE LO CONTRARIO SIGO CON EL PROXIMO

RETURN ;DEVUELVO EL CONTROL DEL PROGRAMA

;ESTA TABLA CONVIERTE DE NUMERO DECIMAL A SU MANIFESTACION EN LOS DISPLAY

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:36

TABLA ADDWF PCL,F

RETLW 0X80 ;"0" 10000000 5

RETLW 0XEC ;"1" 11101100 -

RETLW 0X42 ;"2" 01000010 6| |4

RETLW 0X48 ;"3" 01001000 7 -

RETLW 0X2C ;"4" 00101100 3| |1

RETLW 0X18 ;"5" 00011000 - .8

RETLW 0X10 ;"6" 00010000 2

RETLW 0XCC ;"7" 11001100

RETLW 0X00 ;"8" 00000000

RETLW 0X08 ;"9" 00001000

;SETEOS

SETEO CLRF DISPLAY1

CLRF DISPLAY2

CLRF DISPLAY3

CLRF DISPLAY4

CLRF MILISEGUNDO

RETURN

END

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:37

ANEXO 2
Programa de prueba que permite comprobar el bloque comunicaciones de la PC

Programa del pic


;ESTE PROGRAMA RECIBE UN BYTE POR TRASNMICIION SERIE Y LUEGO LOS ENVIA DE REGRESO

#include <p16f873.inc>

ORG 0x00

GOTO INICIO

ORG 0X04

GOTO INTE

INICIO CLRF PORTB

CLRF PORTC ; Limpia salidas

BSF STATUS,RP0

BCF STATUS,RP1 ;Me voy al banco 1

MOVLW 0XBF ;RC7 ENTRADA Y RC6 SALIDA

MOVWF TRISC

MOVLW 0X24 ;CONFIGURACION DE LA USART

MOVWF TXSTA

MOVLW 0X19 ;TRANSMICION DE 9600 BAUDIOS

MOVWF SPBRG

BSF PIE,RCIE ;HABILITA INTERRUPCION DE RECEPCIÓN

BCF STATUS,RP0; AL BANCO 0

MOVLW 0X90

MOVWF RCSTA ;configuración de la usart para recepción continua

MOVLW 0XC0

MOVWF INTCON; Habilitación de interrupción

BUCLE

GOTO BUCLE

INTE BTFSS PIR,RCIF ;recivi dato?

GOTO VOLVER ;NO ENTONCES SALGO

BCF PIR1,RCIF;SI REPONER BANDERA

MOVF RCREG,W;LEO EL DATO

CALL TX_DATO;TRANSMITO EL DATO

VOLVER RETFIE

TX_DATO BCF PIR,TXF;RESTAURO BANDERA DEL TRANSMISOR

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:38

MOVWF TXREG;MUEVO EL BYTE AL TRANSMISOR

BSF STATUS,RP0

BCF STATUS,RP1;VOY AL BANCO 1

TX BTFSS TXSTA,TRMT ;BYTE TRANSMITIDO?

GOTO TX;NO ENTONCES ESPERO

BCF STATUS,RP0;SI VUELVO AL BANCO 0

RETURN

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:39

Programa de la PC
//ESTE PROGRAMA ENVIA UN BYTE POR TRANSMISIÓN SERIE Y CUANDO RECIBE EL REBOTE LO MUESTRA EN PANTALLA.

#define INTVECT 0x0c //vector de interrupción puerto serial

#define BASE 0x3f8 //puerto serial

#include <dos.h> //librerías necesarias para ejecutar el programa

#include <conio.h>

#include <stdio.h>

unsigned int k=0,in,resultado,teclas=10; //Variables generales

void interrupt portint(...); //función de interrupción de puerto serial

void grafica1(void);

void main()

int intmask,aux=0;

disable(); //desabilitacion de interrupciones para poder

setvect(INTVECT,portint); //asignar la función de interrupción al

//vector de interrupción

enable(); //habilitación de interrupciones

intmask=inp(0x21); //asignación de la mascara de interrupción

intmask=intmask&0xef; //

outp(0x21,intmask); //

outp(BASE+3,128); //programación del puerto serial

outp(BASE+0,0x0C); //divisor en 12 para 9600 baudios

outp(BASE+1,0x00); //

outp(BASE+3,0x03); //activa DTR RST

outp(BASE+4,0x0b); //

intmask=inp(BASE); //asignación de la mascara de interrupción

intmask=inp(BASE+5); //

outp(BASE+1,0x01); //activa la recepción serial

while (tecla!=1)

if(k==1) //en caso de que alla ocurrido

{ //una interrupcion k=1; se imprime

printf("%d",resultado); //el dato en pantalla


Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:40

//

k=0; //demora para poder apreciar el dato

//espero una nueva interrupcion

} //

if (kbhit()) //En caso de haber pulsado una tecla

scanf("%d",&teclas);

outp(0x3f8,teclas);

outp(BASE+1,0x00); //desactiva la recepcion serial

gotoxy(10,10); //

printf("Programa FINALIZADO\n"); //

delay(2000); //

fclose(P);

void interrupt portint(...) //subrutina de interrupcion serial

disable(); //desabilito las interupciones para

resultado=inp(BASE); //recibir el dato de entrada en el puerto 0x3F8

k=1;

//aviso al programa principal que ha llegado un dato

outp(0x20,0x20); //actualizo las banderas

enable(); //y habilito las inerrupciones

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:41

ANEXO 3
Programa de prueba que permite comprobar el bloque modulador pwm
#include<P16F873.INC>
ORG 0X00
GOTO INICIO
ORG 0X05
INICIO
BSF STATUS,RP0 ;VOY AL BANCO 1
BCF STATUS,RP1

MOVLW 0XFD ;CONFIGURO EL PUERTO C PARA SALIDA DE PWM2

MOVWF TRISC

MOVLW 0XFF ;CARGO EL PERIODO DEL PULSO

MOVWF PR2

BCF STATUS,RP0 ;VOY AL BANCO 0

BUCLE

MOVLW 0X0C ;CONFIGURO AL CCP2

MOVWF CCP2CON

MOVLW 0XFF

PASO MOVWF 0X20 ;MÁXIMA VELOCIDAD DESEADA

CLRF CCPR2L ;Velocidad inicial nula

MOVLW 0X06

MOVWF T2CON ;configural al tmr2 con predivisor por 16

PAS CALL DELAY ;Produzco un retardo

INCF CCPR2L,F ;incremento la velocidad del motor

DECFSZ 0X20,F ;Llegue la maximo?

GOTO PAS ;No

GOTO PASO;Si,entonces empiezo de nuevo

DELAY MOVLW 0X4E

MOVWF 0X21

BU DECFSZ 0X21,F

GOTO BU

RETURN

END

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:42

ANEXO 4
Programa de prueba que permite comprobar el funcionamiento del circuito de
realimentación
#include<P16F873A.inc>

RELOJ EQU 0X20

CONTADOR EQU 0X22

UNIDAD EQU 0X23

DECENA EQU 0X24

CENTENA EQU 0X25

MILLAR EQU 0X26

CONTADOR1 EQU 0X27

CONTBAJO EQU 0X28

ALT0 EQU 0X29

AUX_BAJO EQU 0X2A

AUX_0X29 EQU 0X2B

ELEGIR EQU 0X2C

AUX EQU 0X2D

AUX2 EQU 0X2E

GOTO INICIO

ORG 0X04

GOTO INTERRUP

ORG 0X05

;configuracion del pic

INICIO BSF STATUS,RP0

BCF STATUS,RP1 ;ME VOY A CONFIGURAR AL BANCO 1

MOVLW 0X86 ;10000110 CONFIGURO EL REGISTRO OPTION PARA PULL UP OFF,


;INTERRUPCION EXTERNA POR FLANCO DESENDENTE ON

MOVWF OPTION_REG ;RELOJ INTERNO ON,DIVISOR AL RELOJ INTERNO,DIVISOR A 128

CLRF TRISA ;COLOCO AL PUERTO A COMO SALIDA

MOVLW 0X01

MOVWF TRISB ;COLOCO AL PUERTO B COMO SALIDA MENOS EL RB0 QUE ES POR DONDE
ENTRAN LOS PULSOS

MOVLW 0X90 ;10100000;CONFIGURO LA INTERRUPCION PARA INTERNA

MOVWF INTCON

MOVLW 0X06 ;00000110;CONFIGURO AL PUERTO A COMO SALIDA DIGITAL


Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:43

MOVWF ADCON1

BCF STATUS,RP0

BCF STATUS,RP1 ;VUELVO AL BANCO 0

MOVLW 0XFF

MOVWF PORTA ;COLOCO PARA NO ENCENDER DISPLAY

CLRF ADCON0 ;ME ASEGURO QUE NO FUNCIONE EL CONVERSOR AD

CLRF PORTB ;SETEOS DE VARIABLES

CLRF ELEGIR

CLRF CONTBAJO

CLRF RELOJ

CLRF CONTADOR1

CLRF 0X29

MOVLW 0Xd9

MOVWF TMR0

BSF INTCON,T0IE

BUCLE CLRWDT

GOTO BUCLE

INTERRUP ;COMO TENGO VARIAS PROCEDENCIA DE INTERRUPCION DEBO


;SABER CUAL ES LA QUE CAUSO LA INTERRUPCION

BTFSC INTCON,T0IF ;INTERRUPCION INTERNA

GOTO INTERNA

BTFSC INTCON,INTF ;INTERRUPCION EXTERNA

GOTO EXTERNA

RETFIE

INTERNA

INCF RELOJ,F

MOVLW 0XC8

XORWF RELOJ,W ;ME FIJO SI LLEGUE A 1SEGUNDO

BTFSS STATUS,Z

GOTO FIN ;NO LLEGUE AL SEGUNDO ENTONCES S0LTO

CLRF RELOJ ;SI LLEGUE AL SEGUNDO ENTONCES HAGO LA CUENTA DE LAS RPM

CALL CUENTA

BCF INTCON,INTF

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:44

FIN CALL DISPLAY

MOVLW 0Xd9 ;CARGO CON 217 AL TMR0 PARA QUE EL TIEMPO DE


INTERRUPCION=1us*128*(256-217)=5ms

MOVWF TMR0

BCF INTCON,T0IF ;BORRO LA BANDERA DE INTERRUPCION INTERNA

RETFIE

CUENTA

CLRF UNIDAD ;DIVIDO AL NUMERO PARA QUE QUEDE EN UNIDAD, DECENA,


CENTENA Y MILLAR

CLRF DECENA

CLRF CENTENA

CLRF MILLAR

MOVF CONTBAJO,F

BTFSS STATUS,Z

GOTO ARRIBA

MOVF 0X29,F

BTFSC STATUS,Z

RETURN

ARRIBA MOVLW 0X01

ADDWF AUX_BAJO,F

BTFSC STATUS,C

INCF AUX_0X29,F

INCF UNIDAD,F

CLRWDT

MOVLW 0X0A

XORWF UNIDAD,W

BTFSS STATUS,Z

GOTO DEC

CLRF UNIDAD

INCF DECENA,F

DEC MOVLW 0X0A

XORWF DECENA,W

BTFSS STATUS,Z

GOTO CEN

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:45

CLRF DECENA

INCF CENTENA,F

CEN MOVLW 0X0A

XORWF CENTENA,W

BTFSS STATUS,Z

GOTO MIL

CLRF CENTENA

INCF MILLAR,F

MIL MOVLW 0X0A

XORWF MILLAR,W

BTFSS STATUS,Z

GOTO SAL

CLRF MILLAR

SAL MOVF AUX_0X29,W

XORWF 0X29,W

BTFSS STATUS,Z

GOTO ARRIBA

MOVF AUX_BAJO,W

XORWF CONTBAJO,W

BTFSS STATUS,Z

GOTO ARRIBA

CLRF CONTBAJO

CLRF 0X29

RETURN

DISPLAY ;ESTA SUBSUTINA ES LA ENCARGADA DE MANEJAR LOS DISPLAY 7


SEGMENTOS

MOVF ELEGIR,W

CALL PUERTOA

MOVWF PORTA

MOVLW UNIDAD

ADDWF ELEGIR,W

MOVWF FSR

MOVF INDF,W

CALL PUERTOB

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:46

MOVWF PORTB

INCF ELEGIR,F

MOVLW 0X04

XORWF ELEGIR,W

BTFSC STATUS,Z

CLRF ELEGIR

RETURN

PUERTOA ADDWF PCL,F

RETLW 0XFE ;RA0

RETLW 0XFD ;RA1

RETLW 0XFB ;RA2

RETLW 0XF7 ;RA3

PUERTOB ADDWF PCL,F

RETLW 0X80 ;"0" 10000000 5

RETLW 0XEC ;"1" 11101100 -

RETLW 0X42 ;"2" 01000010 6| |4

RETLW 0X48 ;"3" 01001000 7 -

RETLW 0X2C ;"4" 00101100 3| |1

RETLW 0X18 ;"5" 00011000 - .8

RETLW 0X10 ;"6" 00010000 2

RETLW 0XCC ;"7" 11001100

RETLW 0X00 ;"8" 00000000

RETLW 0X08 ;"9" 00001000

EXTERNA

MOVLW 0X01

ADDWF CONTBAJO,F

BTFSC STATUS,C

INCF 0X29,F

BCF INTCON,INTF ;BORRO BANDERA DE INTERUPCION

RETFIE

END

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:47

ANEXO 5

Programa Final

Programa del PIC


#include<p16f873.inc>

RELOJ EQU 0X20

BANDERASS EQU 0X21

CONTADOR EQU 0X22

UNIDAD EQU 0X23

DECENA EQU 0X24 ;DECLARACIÓN DE VARIABLES

CENTENA EQU 0X25

MILLAR EQU 0X26

CONTADOR1 EQU 0X27

CONTBAJO EQU 0X28

ALT0 EQU 0X29

AUX_BAJO EQU 0X2A

AUX_0X29 EQU 0X2B

ELEGIR EQU 0X2C

AUX EQU 0X2D

AUX2 EQU 0X2E

REFB EQU 0X2F

REFH EQU 0X30

BANDAS EQU 0X31

ORG 0X00

GOTO INICIO

ORG 0X04

GOTO INTERRUP

ORG 0X05

;configuracion del pic

INICIO BSF STATUS,RP0

BCF STATUS,RP1 ;ME VOY A CONFIGURAR AL BANCO 1

MOVLW 0X86 ;10000110 CONFIGURO EL REGISTRO OPTION PARA PULL UP OFF,


;INTERRUPCION EXTERNA POR FLANCO DESENDENTE ON

MOVWF OPTION_REG ;RELOJ INTERNO ON,DIVISOR AL RELOJ INTERNO,DIVISOR A 128

CLRF TRISA ;COLOCO AL PUERTO A COMO SALIDA


Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:48

MOVLW 0X01

MOVWF TRISB ;COLOCO AL PUERTO B COMO SALIDA MENOS EL RB0 QUE ES POR DONDE
ENTRAN LOS PULSOS

MOVLW 0XF0 ;11110000;CONFIGURO LA INTERRUPCION PARA INTERNA

MOVWF INTCON

MOVLW 0XBD ;COLOCO AL PUERTO C PARA EL MODULADOR DE ANCHO DE PULSO Y ENTRADA Y


SALIDA RS232

MOVWF TRISC

MOVLW 0X06 ;00000110;CONFIGURO AL PUERTO A COMO SALIDA DIGITAL

MOVWF ADCON1

MOVLW 0XFF

MOVWF PR2 ;CARGO EL VALOR DEL PERIORDO DEL


PULSO=(PR2+1)*4*Tosc*Predivisor TMR2= 4.096 ms

MOVLW 0X24 ;00100100 Configuro LA USAR COMO TRANSMICION ASINCRONA DE ALTA VELOCIDAD DE 8
BITS

MOVWF TXSTA

MOVLW 0X19

MOVWF SPBRG ;CONFIGURO A 9615 BAUDIOS

BSF PIE1,RCIE ;HABILITO LA INTERRUPCION PARA LA RECEPCION

BSF TXSTA,TXEN

BCF STATUS,RP0

BCF STATUS,RP1 ;VUELVO AL BANCO 0

MOVLW 0X90 ;10010000 Configuro PARA RECEPCION CONTINUA A LA USAR

MOVWF RCSTA

BSF RCSTA,SPEN

MOVLW 0X0C

MOVWF CCP2CON ;Configuro como modulador por ancho de pulso al ccp2

MOVLW 0X07

MOVWF T2CON ; habilitacion del tmr2 con un predivisor de 16

MOVLW 0XFF

MOVWF PORTA ;COLOCO PARA NO ENCENDER DISPLAY

CLRF ADCON0 ;ME ASEGURO QUE NO FUNCIONE EL CONVERSOR AD

CLRF PORTB ;SETEOS DE VARIABLES

CLRF ELEGIR

CLRF CONTBAJO

CLRF RELOJ

CLRF CONTADOR1

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:49

CLRF BANDERASS

CLRF BANDAS

CLRF 0X29

MOVLW 0X07

MOVWF REFH

MOVLW 0XD0

MOVWF REFB

MOVLW .37

MOVWF CCPR2L ; Velocidad de giro inicial DEL MOTOR nula

MOVLW 0Xd9 ;CARGO CON 217 AL TMR0 PARA QUE EL TIEMPO DE


iNTERRUPCION=1us*128*(256-217)=5ms

MOVWF TMR0

BSF STATUS,RP0

BCF STATUS,RP1

BSF TXSTA,TXEN ; Transmisión habilitada

BCF STATUS,RP0 ; Banco 0

BCF STATUS,RP1

BUCLE CLRWDT

GOTO BUCLE

INTERRUP ;COMO TENGO VARIAS PROCEDENCIA DE INTERRUPCION DEBO SABER CUAL ES LA QUE CAUSO LA
INTERRUPCION

BTFSC INTCON,T0IF ;INTERRUPCION INTERNA

GOTO INTERNA

BTFSC INTCON,INTF ;INTERRUPCION EXTERNA

GOTO EXTERNA

BTFSC PIR1,RCIF ;POR QUE INGRESO UN DATO EXTERNO PÒR RS232

GOTO RECEPCION

RETFIE

RECEPCION

BCF PIR1,RCIF ;COMO EL DATO VIENE PARTIDO EN 2 MITADES ENTONCES TENGO QUE
TENER LA PRECAUSION DE COLOCAR EL DATO DONDE CORRESPONDA

MOVF RCREG,W

BTFSC BANDERASS,0

GOTO SALTITO ;LA PRIMERA PARTE LA GUARDO EN LA PARTE ALTA DE LA


REFERENCIA

MOVWF REFH

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:50

INCF BANDERASS,F

RETFIE

SALTITO MOVWF REFB ;LA SEGUNDA PARTE LA GUARDO EN LA PARTE BAJA DE LA REFERENCIA

CLRF BANDERASS

RETFIE

INTERNA

INCF RELOJ,F

MOVLW 0XC8

XORWF RELOJ,W ;ME FIJO SI LLEGUE A 1SEGUNDO

BTFSS STATUS,Z

GOTO FIN ;NO LLEGUE AL SEGUNDO ENTONCES SALTO

CLRF RELOJ ;SI LLEGUE AL SEGUNDO ENTONCES HAGO LA CUENTA DE LAS RPM

CALL CUENTA

BCF INTCON,INTF

FIN CALL DISPLAY

MOVLW 0Xd9 ;CARGO CON 217 AL TMR0 PARA QUE EL TIEMPO DE


INTERRUPCION=1us*128*(256-217)=5ms

MOVWF TMR0

BCF INTCON,T0IF ;BORRO LA BANDERA DE INTERRUPCION INTERNA

RETFIE

CUENTA

CLRF CONTADOR1

CLRF AUX_BAJO

CLRF AUX_0X29

MOVF CONTBAJO,W ;MULTIPLICO POR 3

MOVWF AUX

MOVF 0X29,W

MOVWF AUX2

BU MOVF AUX,W

ADDWF CONTBAJO,F

BTFSC STATUS,C

INCF 0X29,F

MOVF AUX2,W

ADDWF 0X29,F

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:51

INCF CONTADOR1,F

MOVLW 0X02

XORWF CONTADOR1,W

BTFSS STATUS,Z

GOTO BU

BCF STATUS,C

RRF 0X29,F

RRF CONTBAJO,F ;DIVIDI POR 2 DE ESTA MANERA YA TENGO EL VALOR DE RPM

CALL MODULADOR ;HAGO LAS CUENTAS PARA EL MODULADOR POR ANCHO DE PULSO

CALL TRANSMITIR ;TRANSMITO LOS DATOS A LA PC

CLRF UNIDAD ;DIVIDO AL NUMERO PARA QUE QUEDE EN UNIDAD, DECENA,


CENTENA Y MILLAR

CLRF DECENA

CLRF CENTENA

CLRF MILLAR

MOVF CONTBAJO,F

BTFSS STATUS,Z

GOTO ARRIBA

MOVF 0X29,F

BTFSC STATUS,Z

RETURN

ARRIBA MOVLW 0X01

CLRWDT

ADDWF AUX_BAJO,F

BTFSC STATUS,C

INCF AUX_0X29,F

INCF UNIDAD,F ;DIVIDE EN UNIDAD

MOVLW 0X0A

XORWF UNIDAD,W

BTFSS STATUS,Z

GOTO DEC

CLRF UNIDAD

INCF DECENA,F

DEC MOVLW 0X0A

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:52

XORWF DECENA,W ;DIVIDE EN DECENA

BTFSS STATUS,Z

GOTO CEN

CLRF DECENA

INCF CENTENA,F

CEN MOVLW 0X0A

XORWF CENTENA,W ;DIVIDE EN CENTENA

BTFSS STATUS,Z

GOTO MIL

CLRF CENTENA

INCF MILLAR,F

MIL MOVLW 0X0A

XORWF MILLAR,W

BTFSS STATUS,Z ;DIVIDE EN MILLAR

GOTO SAL

CLRF MILLAR

SAL MOVF AUX_0X29,W

XORWF 0X29,W

BTFSS STATUS,Z

GOTO ARRIBA

MOVF AUX_BAJO,W

XORWF CONTBAJO,W

BTFSS STATUS,Z

GOTO ARRIBA

CLRF CONTBAJO ;HAGO LAS CUENTAS PARA EL MODULADOR POR ANCHO DE PULSO

CLRF 0X29

RETURN

MODULADOR

MOVF 0X29,W ;ES IGUAL LA PARTE ALTA DE LA REFERENCIA Y LA DE LAS ACTUALES?

XORWF REFH,W

BTFSC STATUS,Z

GOTO SI_IGUAL ;SI IGUAL

;NO IGUAL

MOVF REFH,W ;Si REFH<CONTH ENTONCES MODULADOR A 0

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:53

SUBWF 0X29,W

BTFSS STATUS,C

GOTO NO_MAYOR

MOVLW 0X02

SUBWF CCPR2L,F

BTFSC STATUS,C

RETURN

MOVLW .37 ;Si LLEGO AL LIMITE INFERIOR LO PONDO EN 37 DECIMAL AL MODULADOR

MOVWF CCPR2L ;DE ESTA MANERA ESTAMOS EN EL CORTE JUSTO EN EL TRANSISTOR

RETURN

NO_MAYOR

MOVLW 0X02

ADDWF CCPR2L,F

BTFSS STATUS,C

RETURN

MOVLW 0XFF ; Si LLEGO AL LIMITE SUPERIOR LO PONDO EN 255 DECIMAL AL MODULADOR

MOVWF CCPR2L ;DE ESTA MANERA ESTAMOS EN LA MÁXIMA SATURACION

RETURN

SI_IGUAL

MOVF CONTBAJO,W ;Si REFB<=CONTB ENTONCES MODULADOR A 0

SUBWF REFB,W

BTFSC STATUS,C

GOTO RESTA

MOVLW 0X01

SUBWF CCPR2L,F

BTFSC STATUS,C

RETURN

MOVLW .37 ;Si LLEGO AL LIMITE INFERIOR LO PONDO EN 37 DECIMAL AL MODULADOR

MOVWF CCPR2L ;DE ESTA MANERA ESTAMOS EN EL CORTE JUSTO EN EL TRANSISTOR

RETURN

RESTA MOVLW 0X01

ADDWF CCPR2L,F

BTFSS STATUS,C

RETURN

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:54

MOVLW 0XFF

MOVWF CCPR2L

RETURN

TRANSMITIR ;ESTA SUBRUTINA ES LA ENCARGADA DE REALIZAR LA TRANSMISIÓN DE


LOS DATOS

MOVF 0X29,W

MOVWF TXREG ;PRIMERO TRANSMITO LA PARTE ALTA DEL CONTADOR

BSF STATUS,RP0 ; VOY AL BANCO 1

BCF STATUS,RP1

NO BTFSS TXSTA,TRMT ;Se puede transmitir?

GOTO NO

BCF STATUS,RP0 ;VOY AL BANCO 0

BCF STATUS,RP1

MOVF CONTBAJO,W ;Transmito la parte baja

MOVWF TXREG

RETURN

DISPLAY ;Esta subrutina es la encargada de encender los display en la secuencia correcta con el numero correspondiente

MOVF ELEGIR,W

CALL PUERTOA

MOVWF PORTA

MOVLW UNIDAD

ADDWF ELEGIR,W

MOVWF FSR

MOVF INDF,W

CALL PUERTOB

MOVWF PORTB

INCF ELEGIR,F

MOVLW 0X04

XORWF ELEGIR,W

BTFSC STATUS,Z

CLRF ELEGIR

RETURN

PUERTOA ADDWF PCL,F

RETLW 0XFE ;RA0

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:55

RETLW 0XFD ;RA1

RETLW 0XFB ;RA2

RETLW 0XF7 ;RA3

PUERTOB ADDWF PCL,F

RETLW 0X80 ;"0" 10000000 5

RETLW 0XEC ;"1" 11101100 -

RETLW 0X42 ;"2" 01000010 6| |4

RETLW 0X48 ;"3" 01001000 7 -

RETLW 0X2C ;"4" 00101100 3| |1

RETLW 0X18 ;"5" 00011000 - .8

RETLW 0X10 ;"6" 00010000 2

RETLW 0XCC ;"7" 11001100

RETLW 0X00 ;"8" 00000000

RETLW 0X08 ;"9" 00001000

EXTERNA ;Si viene una interrupcion externa incremento el contbajo y si se desborda incremento la parte alta

MOVLW 0X01

ADDWF CONTBAJO,F

BTFSC STATUS,C

INCF 0X29,F

BCF INTCON,INTF ;BORRO BANDERA DE INTERUPCION

RETFIE

END

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:56

Programa de la PC
#define INTVECT 0x0c //vector de interrupcion puerto serial

#define BASE 0x3f8 //puerto serial

#include <dos.h> //librerias necesarias para ejecutar el programa

#include <conio.h>

#include <stdio.h>

unsigned int k=0,in,resultado,tecla=2000,teclas=10; //Variables generales

void interrupt portint(...); //funcion de inerrupcion de puerto serial

void grafica1(void);

void main()

int intmask,aux=0;

FILE *P;

disable(); //desabilitacion de interrupciones para poder

setvect(INTVECT,portint); //asignar la funcion de interrupcion al

//vector de interrupcion

enable(); //habilitacion de interrupciones

intmask=inp(0x21); //asigancion de la mascara de interrupcion

intmask=intmask&0xef; //

outp(0x21,intmask); //

outp(BASE+3,128); //programacion del puerto serial

outp(BASE+0,0x0C); //divisor en 12 para 9600 baudios

outp(BASE+1,0x00); //

outp(BASE+3,0x03); //activa DTR RST

outp(BASE+4,0x0b); //

intmask=inp(BASE); //asignacion de la mascara de interrupcion

intmask=inp(BASE+5); //

outp(BASE+1,0x01); //activa la recepcion serial

grafica1(); //pantalla de presentacion

if((P=fopen("datos.txt","w"))==NULL) //Apertura del Archivo datos.txt

printf("no puedo abrir el archivo");

fprintf(P,"%s %s %s\n","tiempo","valor deseado","valor obtenido");

while (tecla!=1)

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:57

if(k==1) //en caso de que alla ocurrido

{ //una interrupcion k=1; se imprime

gotoxy(60,2);

printf("RPM actuales: "); //el dato en pantalla

gotoxy(74,2);

printf("%d",resultado);

//

k=0; //demora para poder apreciar el dato

//espero una nueva interrupcion

} //

if (kbhit()) //En caso de haber pulsado una tecla

gotoxy(2,2);

printf("RPM deseadas: ");

gotoxy(15,2);

scanf("%d",&tecla);

teclas=tecla>>8;

outp(0x3f8,teclas);

delay(10);

teclas=tecla&0xFF;

outp(0x3f8,teclas);

delay(1000); //

fprintf(P,"%d %d %d\n",aux++,tecla,resultado);

outp(BASE+1,0x00); //desactiva la recepcion serial

gotoxy(10,10); //

printf("Programa FINALIZADO\n"); //

delay(2000); //

fclose(P);

void interrupt portint(...) //subrutina de interrupcion serial

disable(); //desabilito las interupciones para

in=inp(BASE); //recibir el dato de entrada en el puerto 0x3F8

Fecha: 14/06/06 Revisión: /


INSTITUTO UNIVERSITARIO AERONAUTICO

CONTROL DE VELOCIDAD Página:58

if(k==1)

resultado=resultado|in;

if(k==0)

resultado=in<<8;

k=1;

//aviso al programa principal que ha llegado un dato

outp(0x20,0x20); //actualizo las banderas

enable(); //y habilito las inerrupciones

void grafica1()

int i;

clrscr();

textcolor(WHITE);

textbackground(BLUE);

clrscr();

cprintf("ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍPROGRAMA REGULADOR DE VELOCIDAD DE MOTOR DCÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»");

for(i=0;i<=46;i++)

cprintf("º º");

cprintf("ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"); }

Fecha: 14/06/06 Revisión: /