Control de Velocidad de Dc
-
Upload
api-3731297 -
Category
Documents
-
view
5.130 -
download
2
description
Transcript of Control de Velocidad de Dc
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
-
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 :
Fecha: 14/06/06 Revisión: /
MOTOR K
H
REF
INSTITUTO UNIVERSITARIO AERONAUTICO
CONTROL DE VELOCIDAD Página:5
Si buscamos la función de transferencia del sistema se obtiene lo siguiente:
(1)
y transformando al dominio del tiempo se obtiene:
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:
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.
PWMTx
Rx
RPM
Puerto A y BRb0
.
2.3Hardware
Fecha: 14/06/06 Revisión: /
Micro controlador
Comunicación con la PC
Modulo de Realimentación
o encode
Motor
Potencia
Visualizació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
Conversor A/D de 10 Bits
Puerto serie síncrono
USART
Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO
CONTROL DE VELOCIDAD Página:7
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
U1
A B C D E F G
CK
Q1
BC327
VCC
5V
RB
RB1
RB2
RB3
RB4
RB5
RB6
RB7
AL_PUERTO_B
Ln1
Ln2
Ln3
Ln4
Ln5
Ln6
Ln7
Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO
CONTROL DE VELOCIDAD Página:9
Rc se calcula a de la siguiente manera
donde Vec= 0.3v es el voltaje de saturación del transistor y VOL=0.5v es el voltaje en estado
bajo del puerto B del PIC .
Rb se calcula de la siguiente manera
donde IBsat es la corriente de base para saturar el transistor
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
Ahora si llamamos a m=1/X obtenemos:
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.
R1Q1
TIP31A
S1MOTOR
M D11N4148
VCC
pwm
La resistencia R1 se calcula de la siguiente manera.
En donde : Vpwmmax = 5 vol
IC=600mA
Vce=0.6 V
=100
quedando:
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.
2.3.5 MotorFecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO
CONTROL DE VELOCIDAD Página:14
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
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
LED1X1
R10
1K_LINKey = Space
50%
VDD
5V
R111.0k
U1A
LM324AD
3
2
11
4
1
R2
10k
R3
10k
R15.1k
VDD
5V
Disco
RB0
Para simplificar el análisis del circuito lo dividiremos en dos partes:1. Circuito de toma de señal2. 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:
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:
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:
Haciendo el cociente entre ambas obtenemos:
Ahora trabajando con la formula de V2 se obtiene:
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
1K_LINKey = Space
50%
VDD
5V
1.0kU1A
LM324AD
3
2
11
4
1
10k 10k
5.1k
VDD
5V
Disco
U2
16f873
1234567891011121314 15
16171819202122232425262728
750TIP31A
MOTOR
M D11N4148
VCC
5V
U3
MAX232E
C1+C1-C2+C2-
T1I NT2I N
R1OUTR2OUT
GND
R2I NR1I N
T2OUTT1OUT
V+
V-VCC
U4
A B C D E F G
CK
U5
A B C D E F G
CK
U6
A B C D E F G
CK
U7
A B C D E F G
CK
330
330
330
330
330
330
330
Q2
BC327
Q3
BC327
Q4
BC327
Q5
BC327470
470
470
470
VDD
5V
VDD
5V
HC-49/U_3MHz
20pF
20pF
1uF-POL
1uF-POL1uF-POL
1uF-POL
J1
HDR1X3
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 .
La secuencia de pasos a seguir para implementar una transmisión Asíncrona es la siguiente:
Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO
CONTROL DE VELOCIDAD Página:19
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.
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 :
2. Asignar la anchura del pulso cargando el registro CCPR1L y recordando que la formala
que manera el ancho del pulso es:
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: /
Inicializaciónrc7 entradarc6 salida
Configuración USART
USAR en escucha
bucle
LEER DATO
RETRANSMITIR DATO
VOLVER
INSTITUTO UNIVERSITARIO AERONAUTICO
CONTROL DE VELOCIDAD Página:21
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.
No No
Si Si
Si
no
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: /
InicializaciónRc1salidaPredivisor TMR0Velocidad=0
Activar motor
Incrementar velocidad hasta máxima
Parar motor
InicializaciónRb salidaRb0 entradaRa SalidaConfiguración del TMR0Activación de interrupciones
bucle
interrupción
¿Interna? ¿externa?
1 Seg?Para la cuenta
Guardar la cuenta en aux
Mostrar en display
Incremento aux
Restablecer interrupciones
volver
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.
NO NO
Fecha: 14/06/06 Revisión: /
Inicialización de variablesPuerto b Salida Rb0 entradaPuerto a SalidaRc1 Salida para PWMRc6 Salida para Tx SerieRc7 Entrada para Rx SerieConfiguración del PWMConfiguro USARHabilito interrupcionesCarga al tmr0Velocidad de giro =0
BUCLE
INTERRUPCION
Por TMR0? Por Rb0 Recepción serie
INSTITUTO UNIVERSITARIO AERONAUTICO
CONTROL DE VELOCIDAD Página:23
SI Si
Si
Si
No
Mayor menor
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: /
1 Seg?
Visualización
Realizo la cuenta de RPM
Comparo con la referencia
Incremento el ancho de pulso
Decremento el ancho de pulso
Trasmito a la PC
Seteo de Banderas y variables
Incremento Cuenta
Seteo de Banderas
Cuenta=0
Cargo el nuevo valor de referencia
Seteo de Banderas
Salir de interrupció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.
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:
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
Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO
CONTROL DE VELOCIDAD Página:40
printf("%d",resultado); //el dato en pantalla
//
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: /