INSTITUTO UNIVERSITARIO AERONAUTICO

TRABAJO FINAL DE LABORATORIO: “CONTROL DE VELOCIDAD DE UN MOTOR DC MEDIANTE MODULACIÓN POR ANCHO DE PULSO”

Informe Técnico: Proyecto: / Fecha: 14/06/06

Revisión: /

Autor: Serrudo Mario Sebastián

Revisó: Ing. Luis Murgio

Vo.Bo. :

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD Página:1

INDICE Página. RESUMEN 1. INTRODUCCION 2. DESARROLLO 2.1 Diagrama en bloque del circuito 2.2 Hardware del circuito 2.3 Software 3. CONCLUSIÓN 2 3 4 4 7 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:

REF

+ -

K

MOTOR

RPM

H

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 :
Motor = FT = RPM A = Voltios ( s + B)

K = FT =

Voltios = Cte Pulsos

H = FT =

Pulsos = 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:
Sistema = RPM CteA = REF ( S + B + Cte 2CteA)

(1)

y transformando al dominio del tiempo se obtiene:

RPM (t ) =

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

−t

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:
CteA * REF (1 − e 10 ( B +Cte 2CteA) ) B + Cte 2CteA
−t

RPM (t ) =

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 con la PC Tx Rx Potencia

Micro controlador

Motor RPM

Visualización

Puerto A y B Rb0

Modulo de 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 RS232) 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 Revisión: /

Fecha: 14/06/06

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 Ln2 Ln3 Ln4 Ln5

RB2 RB3 RB4 RB5 RB6

AL_PUERTO_B

Ln6

Ln7

RB7

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD Rc se calcula a de la siguiente manera Página:9

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 .

Rc =

Vcc −Vec −Vd −VOL 5v −0.3v −0.7v −0.5v = = 350Ω ≈ 330Ω Ia 10mA

Rb se calcula de la siguiente manera

Vcc − Veb − VOL = I Bsat RB I Bsat ≥ Ic β min

donde IBsat es la corriente de base para saturar el transistor

RB ≤

Vcc −Veb −VOL 5v − 0.7v − 0.5v β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

Vdc =

1 T

T/x

∫Vccdt =
0

VccT Vcc = 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 El circuito utilizado para esta tarea es el siguiente. Página:13

VCC

S1 MOTOR

D1 1N4148

pwm

R1 TIP31A

La resistencia R1 se calcula de la siguiente manera.

Vpwm max −

IC

β

R1 −Vce = 0

R1 =

β
IC

(Vpwm max −Vce)

En donde : Vpwmmax = 5 vol IC=600mA Vce=0.6 V β=100 quedando:
R1 = 100 (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: /

M

Q1

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD 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 = S +B S + 0.8034

Página:14

Ft =

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 10k VDD
RB0

R3 10k R11 1.0k

5V R10 1K _LIN 50% Key = Space

5V
4 1 2 11

U1A
3

Disco
X1 R1 5.1k

LM324AD

LED1

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:
V1 = 5 R1( R 2 + R3) 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:
V2 = 5 R1R 2 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:

V1 =

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

V2 =

5 R1R 2 =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:
V2 = 5 5 = 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 470 470 470 470
A B C D E F G

Q3

Q4

Q5

M

BC327
CK

BC327
CK

BC327
CK

BC327 MOTOR
CK

D1 1N4148

U4
A B C D E F G

U5
A B C D E F G

U6
A B C D E F G

U7

750 330 330 330 330 330 330 U2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 28 27 26 25 24 23 22 21 20 19 18 17 16 15

TIP31A

330

VDD 5V 10k VDD 5V
4 1 2 11

VDD 5V 10k 1.0k 1K _LIN 50% Key = Space

20pF

1uF-POL

1uF-POL U3
C1+ VCC C1C2+ C2VV+ T1OUT T2OUT R1I N R2I N

J1

U1A
3

HC-49/U_3MHz

16f873 20pF

1uF-POL

T1I N T2I N R1OUT R2OUT GND

HDR1X3

Disco
5.1k

LM324AD

1uF-POL

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 rc7 entrada rc6 salida LEER DATO

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 Rb salida Rb0 entrada Ra Salida Configuración del TMR0 Activación de interrupciones interrupción

¿Interna?

No

¿externa?

No

bucle

Si Si
Para cuenta la 1 Seg?

Si
Incremento aux

no
Guardar la cuenta en aux Mostrar en display

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 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

Página:22

BUCLE

INTERRUPCION

NO
Por TMR0? Por Rb0

NO
Recepción serie

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD SI
1 Seg?

Página:23

Si Si Si
Realizo la cuenta de RPM Incremento Cuenta Cargo el nuevo valor de referencia

No
Comparo con la referencia

Mayor
Incremento el ancho de pulso

menor
Decremento el ancho de pulso

Trasmito a la PC

Visualización

Cuenta=0

Seteo de Banderas y variables

Seteo de Banderas

Seteo de Banderas

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.

RPM =

Cuenta * 60 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:

RPM =

Cuenta * 60 Cuenta * 3 = 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 GUARDO_S DISPLAY1 DISPLAY2 DISPLAY3 DISPLAY4 CONTADOR AUXILIAR MILISEGUNDO OPCION CONTROLAR REBOTE CONTADOR1 EQU EQU EQU EQU EQU EQU EQU 0X20
;EN ESTA DIRECCION SE GUARDA EL REGISTRO W CUALDO SE INGRESA A LA RUTINA DE INTERRUPCION INGRESA A LA RUTINA DE INTERRUPCION

0X21;EN ESTA DIRECCION SE GUARDA EL REGISTRO STATUS CUALDO SE EQU

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

0X23;EN ESTA DIRECCION SE ENCUENTRA EL VALOR EN DECIMAL DE LO MOSTRADO EN EL DISPLAY2 0X24;EN ESTA DIRECCION SE ENCUENTRA EL VALOR EN DECIMAL DE LO MOSTRADO EN EL DISPLAY3 0X25;EN ESTA DIRECCION SE ENCUENTRA EL VALOR EN DECIMAL DE LO MOSTRADO EN EL DISPLAY4 0X26;ES EL ENCARGADO DE INDICAR QUE DISPLAY SE DEBE ENCENDER 0X27;ES EL ENCARGADO DE QUE EL CONTADOR ESTE ENTRE 0 Y 4 0X28;ES UNA VARIABLE QUE SE INCREMENTA CADA 50ms 0X81;ES EL REGISTRO OPTION 0X29;VARIABLE QUE CONTROLO SI SE DETIENE LA CUENTA O SE RESETEA 0X2A 0X2B 0X00 ;INDICO DONDE COMIENZA EL PROGRAMA

EQU EQU EQU EQU EQU ORG GOTO ORG GOTO ORG

PRINCIPAL 0X04 ;CARGO EL VECTOR DE INTERRUPCION

INTERUP 0X05

;PROGAMA PRINCIPAL ;SEREOS PRINCIPAL CLRF CONTADOR

MOVLW 0X02 MOVWF CONTROLAR; INCF
1 ES PARA COMENZAR PARADO EL RELOJ NCREMENTO EL CONTADOR DEBIDO A QUE NECESITO QUE COMIENCE EN

CONTADOR,F;I STATUS,RP0

BSF

MOVLW 0X10 MOVWF TRISA MOVLW 0X01

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
MOVWF TRISB; MOVLW 0X06 MOVWF OPCION BCF CLRF CALL
;CARGO EL PREDIVISOR EN 128,LO ASIGNO A TMR,EL CUAL ES EXITADO POR FUENTE INTERNA

Página:32

COLOCO AL PUERTO A Y B COMO SALIDA Y EL RB0 COMO ENTRADA

STATUS,RP0 PORTA SETEO
CARGO AL TMR CON 217 DE MANERA QUE LA ECUACION QUEDE TIEMPO=(256-217)*128*1us=4.99mS cada este tiempo se producira una interrupcion HABILITA INTERRUPCION GIE,TOIE,INTE

MOVLW 0XD9; MOVWF TMR0; MOVLW 0XB0; MOVWF INTCON CLRF CLRF REBOTE

CONTADOR1

BUCLE GOTO BUCLE;BUCLE PRINCIPAL

;RUTINA DE INTERRUPCION INTERUP MOVWF GUARDO_W; SWAPF STATUS,W MOVWF GUARDO_S; BTFSS GOTO INTCON,T0IF SIGUI GUARDO STATUS DEL PROGRMA PRINCIPAL
;VERIFICA SI LA INTERRUPCION ES CAUSADA POR EL DESBORDAMIENTO DE TMR0

GUARDO W DEL PROGRAMA PRINCIPAL

;SI NO ES CAUSADA POR EL DESBORDAMIENTO DE TMR0 ENTONCES COMPRUEBO SI POR CAUSA EXTERNA SI LA INTERRUPCION ES CAUSADA POR TMRO ENTONCES CARGO NUEVAMENTE AL TMR CON 217 Y CONTINUO EL PROGRAMA VERIFICO QUE PASEN 8*5=40ms ANTES DE PODER INGRESAR OTRA INTERRUPCION EXTERNA

MOVLW 0XD9; MOVWF TMR0; MOVF BTFSS INCF BTFSS GOTO CLRF CLRF GOTO

REBOTE,F; STATUS,Z CONTADOR1,F CONTADOR1,3 NUMERO CONTADOR1 REBOTE NUMERO

SIGUI

BTFSC GOTO

INTCON,INTF; FIJATE ;

VERIFICA SI LA INTERRUCPCION ES A CAUSA DE UNA INTERRUPCION EXTERNA SI ES CAUSADA SALTO A FIJATE

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
GOTO FIJATE INCF TERMINA ; REBOTE,F ;

Página:33

INTERRUPCION NO VALIDA NO PROSIGUE Y SALTO PARA TERMINAR LA INTERRUPCION CONTROLO QUE LA INTERRUPCION EXTERNA NO SEA PROVOCADA POR REBOTES

MOVLW 0X01 XORWF REBOTE,W BTFSS GOTO INCF STATUS,Z TERMINA
;SI ES PROVOCADA POR REBOTES ENTONCES NO PROSIGUE Y TERMINO CON LA RUTINA DE INTERRUPCION

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

NUMERO MOVF

CONTROLAR,W SI ES LA TERCERA LA PULSACION SIGNIFICA QUE DESEO EMPEZAR

XORLW 0X03; BTFSC CLRF BTFSC GOTO BTFSC CALL STATUS,Z CONTROLAR CONTROLAR,0; PARAR CONTROLAR,1; SETEO

ME FIJO SI SE PULSO UNA VEZ EL BOTON ESTO SIGNIFICA QUE DEBO PARAR LA CUENTA

SI PULSO UNA SEGUNDA VEZ EL PULSADOR SIGNIFICA QUE DESEO RESETEAR LA CUENTA

INCF MOVF

MILISEGUNDO,F MILISEGUNDO,W;
INCREMENTEO MILISEGUNDO CADA 5mS Luego de que milisegundo se incrementea 2 veces osea se llega a 1 centesima de segundo entonces incrementamos el display 1 que es el que maneja el digito menor de centesima de

XORLW 0X02 BTFSS
segundo

STATUS,Z; SAL1 MILISEGUNDO DISPLAY1,F DISPLAY1,W;

GOTO CLRF INCF SAL1 MOVF

cuando el display1 llega a 10, entonces se incrementa el segundo display2 el cual maneja la desima de segundo

XORLW 0X0A BTFSS GOTO CLRF INCF SAL2 MOVF STATUS,Z SAL2 DISPLAY1 DISPLAY2,F DISPLAY2,W;
cuando el display2 llega a 10, entonces se incrementa el display el cual maneja el digito de los segundos

XORLW 0X0A BTFSS GOTO STATUS,Z SAL3

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
CLRF INCF SAL3 MOVF DISPLAY2 DISPLAY3,F DISPLAY3,W;
cuando el display3 llega a 10, entonces se incrementa el displaye el cual maneja el digito de decenas segundos

Página:34

XORLW 0X0A BTFSS GOTO CLRF INCF STATUS,Z SAL4 DISPLAY3 DISPLAY4,F

SAL4

MOVF

DISPLAY4,W;

cuando el display4 llega a 6, entonces se RESETEAN LOS DISPLAY

XORLW 0X06 BTFSC CLRF PARAR CALL STATUS,Z DISPLAY4 DISPLAY GUARDO_S,W
RECUPERO LAS VARIABLES W Y STATUS DEL PROGRAMA PRINCIPAL

TERMINA SWAPF

MOVWF STATUS; SWAPF GUARDO_W,F SWAPF GUARDO_W,W MOVLW 0XB0 MOVWF INTCON; RETFIE ;SUBRUTINA DEL DISPLAY

REACTIVA LAS INTERRUPCION TOIE,TMR0

;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 GOTO PORTA,3;VERIFICO QUE EL PUERTO A SE ENCUENTRE DENTRO DE LOS LIMITES(OSEA QUE NO PASE DE 11110111) 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 GOTO STATUS,Z ;ME FIJO SI TENGO QUE PRENDE EL DISPLAY 1 SALE1

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
MOVF CONTADOR,W

Página:35

XORLW 0X02 BTFSC GOTO MOVF STATUS,Z ;ME FIJO SI TENGO QUE PRENDE EL DISPLAY 2 SALE2 CONTADOR,W

XORLW 0X03 BTFSC GOTO GOTO SALE1 MOVF CALL GOTO SALE2 MOVF CALL GOTO SALE3 MOVF CALL GOTO SALE4 MOVF CALL STATUS,Z;ME FIJO SI TENGO QUE PRENDE EL DISPLAY 4 SALE3 SALE4;ME FIJO SI TENGO QUE PRENDE EL DISPLAY 3 DISPLAY1,W ;BUSCO EL CODIGO DEL DISPLAY 1 TABLA SALIR DISPLAY2,W;BUSCO EL CODIGO DEL DISPLAY 2 TABLA SALIR DISPLAY3,W;BUSCO EL CODIGO DEL DISPLAY 3 TABLA SALIR DISPLAY4,W;BUSCO EL CODIGO DEL DISPLAY 4 TABLA ;(OSEA QUE BUSCO LA SECUENCIA DE ENCENDIDO PARA EL DISPLAY DE MANERA MUESTRE EL NUMERO EN DECIMAL DE LA VARIABLE)

SALIR

MOVWF PORTB MOVF

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

CONTADOR,W

MOVWF AUXILIAR BSF STATUS,C

DECFSZ AUXILIAR,F;ENCIENDO EL DISPLAY CORRESPONDIENTE RLF MOVF PORTA,F CONTADOR,W

XORLW 0X04 BTFSC CLRF INCF STATUS,Z;LLEGUE AL ULTIMO DISPLAY CONTADOR;SI ENTONCES EMPIEZO LA PROXIMA POR EL PRIMERO 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
TABLA ADDWF PCL,F

Página:36

RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW ;SETEOS SETEO

0X80 0XEC 0X42 0X48 0X2C 0X18 0X10 0XCC 0X00 0X08

;"0" 10000000 ;"1" 11101100 ;"2" 01000010 ;"3" 01001000 ;"4" 00101100 ;"5" 00011000 ;"6" 00010000 ;"7" 11001100 ;"8" 00000000 ;"9" 00001000

5 6| |4 7 3| |1 2 .8

CLRF CLRF CLRF CLRF CLRF RETURN END

DISPLAY1 DISPLAY2 DISPLAY3 DISPLAY4 MILISEGUNDO

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD 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 GOTO ORG GOTO INICIO CLRF CLRF BSF BCF 0x00 INICIO 0X04 INTE PORTB PORTC STATUS,RP0 STATUS,RP1 ;Me voy al banco 1 ;RC7 ENTRADA Y RC6 SALIDA ; Limpia salidas

Página:37

MOVLW 0XBF MOVWF TRISC MOVLW 0X24 MOVWF TXSTA MOVLW 0X19 MOVWF SPBRG BSF BCF PIE,RCIE

;CONFIGURACION DE LA USART

;TRANSMICION DE 9600 BAUDIOS

;HABILITA INTERRUPCION DE RECEPCIÓN

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 INTE BTFSS GOTO BCF MOVF CALL VOLVER RETFIE BCF PIR,TXF;RESTAURO BANDERA DEL TRANSMISOR BUCLE PIR,RCIF ;recivi dato? VOLVER ;NO ENTONCES SALGO PIR1,RCIF;SI REPONER BANDERA RCREG,W;LEO EL DATO TX_DATO;TRANSMITO EL DATO

TX_DATO

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
MOVWF TXREG;MUEVO EL BYTE AL TRANSMISOR BSF BCF TX BTFSS GOTO BCF RETURN STATUS,RP0 STATUS,RP1;VOY AL BANCO 1 TXSTA,TRMT ;BYTE TRANSMITIDO? TX;NO ENTONCES ESPERO STATUS,RP0;SI VUELVO AL BANCO 0

Página:38

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 #define 0x0c //vector de interrupción puerto serial //puerto serial

BASE 0x3f8

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

//librerías necesarias para ejecutar el programa

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(); setvect(INTVECT,portint); //desabilitacion de interrupciones para poder //asignar la función de interrupción al //vector de interrupción enable(); intmask=inp(0x21); intmask=intmask&0xef; outp(0x21,intmask); outp(BASE+3,128); outp(BASE+0,0x0C); outp(BASE+1,0x00); outp(BASE+3,0x03); outp(BASE+4,0x0b); intmask=inp(BASE); intmask=inp(BASE+5); outp(BASE+1,0x01); //habilitación de interrupciones //asignación de la mascara de interrupción // // //programación del puerto serial //divisor en 12 para 9600 baudios // //activa DTR RST // //asignación de la mascara de interrupción // //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
// k=0; //demora para poder apreciar el dato //espero una nueva interrupcion } if (kbhit()) { scanf("%d",&teclas); outp(0x3f8,teclas); } // //En caso de haber pulsado una tecla

Página:40

} outp(BASE+1,0x00); gotoxy(10,10); printf("Programa FINALIZADO\n"); delay(2000); fclose(P); } void interrupt portint(...) //subrutina de interrupcion serial { disable(); //desabilito las interupciones para //recibir el dato de entrada en el puerto 0x3F8 //desactiva la recepcion serial // // //

resultado=inp(BASE); k=1;

//aviso al programa principal que ha llegado un dato outp(0x20,0x20); enable(); } //actualizo las banderas //y habilito las inerrupciones

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD ANEXO 3 Programa de prueba que permite comprobar el bloque modulador pwm
#include<P16F873.INC> ORG GOTO ORG INICIO BSF BCF MOVLW MOVWF MOVLW MOVWF BCF BUCLE MOVLW MOVWF MOVLW PASO MOVWF CLRF MOVLW MOVWF PAS CALL INCF DECFSZ GOTO GOTO 0X0C CCP2CON 0XFF 0X20 ;MÁXIMA VELOCIDAD DESEADA ;CONFIGURO AL CCP2 STATUS,RP0 ;VOY AL BANCO 1 STATUS,RP1 0XFD TRISC 0XFF ;CARGO EL PERIODO DEL PULSO PR2 STATUS,RP0 ;VOY AL BANCO 0 ;CONFIGURO EL PUERTO C PARA SALIDA DE PWM2 0X00 INICIO 0X05

Página:41

CCPR2L ;Velocidad inicial nula 0X06 T2CON ;configural al tmr2 con predivisor por 16

DELAY ;Produzco un retardo CCPR2L,F ;incremento la velocidad del motor 0X20,F ;Llegue la maximo? PAS ;No

PASO;Si,entonces empiezo de nuevo

DELAY

MOVLW MOVWF

0X4E 0X21 0X21,F BU

BU

DECFSZ GOTO RETURN

END

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD ANEXO 4 Programa de prueba que permite comprobar el funcionamiento del circuito de realimentación
#include<P16F873A.inc> RELOJ CONTADOR UNIDAD DECENA CENTENA MILLAR CONTADOR1 CONTBAJO ALT0 AUX_BAJO AUX_0X29 ELEGIR AUX AUX2 EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU 0X20 0X22 0X23 0X24 0X25 0X26 0X27 0X28 0X29 0X2A 0X2B 0X2C 0X2D 0X2E

Página:42

GOTO ORG GOTO ORG ;configuracion del pic INICIO BSF BCF

INICIO 0X04 INTERRUP 0X05

STATUS,RP0 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 CLRF TRISA ;RELOJ INTERNO ON,DIVISOR AL RELOJ INTERNO,DIVISOR A 128 ;COLOCO AL PUERTO A COMO SALIDA

MOVLW 0X01 MOVWF TRISB ENTRAN LOS PULSOS MOVLW 0X90 MOVWF INTCON MOVLW 0X06 ;00000110;CONFIGURO AL PUERTO A COMO SALIDA DIGITAL ;COLOCO AL PUERTO B COMO SALIDA MENOS EL RB0 QUE ES POR DONDE ;10100000;CONFIGURO LA INTERRUPCION PARA INTERNA

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
MOVWF ADCON1 BCF BCF STATUS,RP0 STATUS,RP1 ;VUELVO AL BANCO 0

Página:43

MOVLW 0XFF MOVWF PORTA CLRF CLRF CLRF CLRF CLRF CLRF CLRF ADCON0 PORTB ELEGIR CONTBAJO RELOJ CONTADOR1 0X29 ;COLOCO PARA NO ENCENDER DISPLAY ;ME ASEGURO QUE NO FUNCIONE EL CONVERSOR AD ;SETEOS DE VARIABLES

MOVLW 0Xd9 MOVWF TMR0 BSF INTCON,T0IE

BUCLE

CLRWDT GOTO BUCLE ;COMO TENGO VARIAS PROCEDENCIA DE INTERRUPCION DEBO

INTERRUP ;SABER CUAL ES LA QUE CAUSO LA INTERRUPCION BTFSC GOTO BTFSC GOTO RETFIE INTERNA INCF RELOJ,F INTCON,T0IF INTERNA INTCON,INTF EXTERNA

;INTERRUPCION INTERNA

;INTERRUPCION EXTERNA

MOVLW 0XC8 XORWF RELOJ,W BTFSS GOTO CLRF CALL BCF STATUS,Z FIN RELOJ CUENTA INTCON,INTF ;NO LLEGUE AL SEGUNDO ENTONCES S0LTO ;SI LLEGUE AL SEGUNDO ENTONCES HAGO LA CUENTA DE LAS RPM ;ME FIJO SI LLEGUE A 1SEGUNDO

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
FIN CALL DISPLAY ;CARGO CON 217 AL TMR0 PARA QUE EL TIEMPO DE

Página:44

MOVLW 0Xd9 INTERRUPCION=1us*128*(256-217)=5ms MOVWF TMR0 BCF RETFIE CUENTA INTCON,T0IF

;BORRO LA BANDERA DE INTERRUPCION INTERNA

CLRF CENTENA Y MILLAR CLRF CLRF CLRF MOVF BTFSS GOTO MOVF BTFSC RETURN ARRIBA

UNIDAD DECENA CENTENA MILLAR CONTBAJO,F STATUS,Z ARRIBA 0X29,F STATUS,Z

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

MOVLW 0X01 ADDWF AUX_BAJO,F BTFSC INCF STATUS,C AUX_0X29,F

INCF CLRWDT

UNIDAD,F

MOVLW 0X0A XORWF UNIDAD,W BTFSS GOTO CLRF INCF DEC STATUS,Z DEC UNIDAD DECENA,F

MOVLW 0X0A XORWF DECENA,W BTFSS GOTO STATUS,Z CEN

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
CLRF INCF CEN DECENA CENTENA,F

Página:45

MOVLW 0X0A XORWF CENTENA,W BTFSS GOTO CLRF INCF STATUS,Z MIL CENTENA MILLAR,F

MIL

MOVLW 0X0A XORWF MILLAR,W BTFSS GOTO CLRF STATUS,Z SAL MILLAR AUX_0X29,W

SAL

MOVF

XORWF 0X29,W BTFSS GOTO MOVF STATUS,Z ARRIBA AUX_BAJO,W

XORWF CONTBAJO,W BTFSS GOTO CLRF CLRF RETURN STATUS,Z ARRIBA CONTBAJO 0X29

DISPLAY SEGMENTOS MOVF CALL ELEGIR,W PUERTOA

;ESTA SUBSUTINA ES LA ENCARGADA DE MANEJAR LOS DISPLAY 7

MOVWF PORTA MOVLW UNIDAD ADDWF ELEGIR,W MOVWF FSR MOVF CALL INDF,W PUERTOB

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
MOVWF PORTB INCF ELEGIR,F

Página:46

MOVLW 0X04 XORWF ELEGIR,W BTFSC CLRF RETURN PUERTOA ADDWF PCL,F RETLW RETLW RETLW RETLW 0XFE 0XFD 0XFB 0XF7 ;RA0 ;RA1 ;RA2 ;RA3 STATUS,Z ELEGIR

PUERTOB RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW

ADDWF PCL,F 0X80 0XEC 0X42 0X48 0X2C 0X18 0X10 0XCC 0X00 0X08 ;"0" 10000000 ;"1" 11101100 5 -

;"2" 01000010 6| |4 ;"3" 01001000 7 ;"4" 00101100 3| |1 ;"5" 00011000 ;"6" 00010000 ;"7" 11001100 ;"8" 00000000 ;"9" 00001000 2 .8

EXTERNA MOVLW 0X01 ADDWF CONTBAJO,F BTFSC INCF BCF RETFIE END STATUS,C 0X29,F INTCON,INTF ;BORRO BANDERA DE INTERUPCION

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD ANEXO 5 Programa Final Programa del PIC
#include<p16f873.inc> RELOJ BANDERASS CONTADOR UNIDAD DECENA CENTENA MILLAR CONTADOR1 CONTBAJO ALT0 AUX_BAJO AUX_0X29 ELEGIR AUX AUX2 REFB EQU REFH EQU BANDAS EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU 0X2F 0X30 0X31 0X20 0X21 0X22 0X23 0X24 0X25 0X26 0X27 0X28 0X29 0X2A 0X2B 0X2C 0X2D 0X2E ;DECLARACIÓN DE VARIABLES

Página:47

ORG GOTO ORG GOTO ORG ;configuracion del pic INICIO BSF BCF INICIO

0X00

0X04 INTERRUP 0X05

STATUS,RP0 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 CLRF TRISA ;RELOJ INTERNO ON,DIVISOR AL RELOJ INTERNO,DIVISOR A 128 ;COLOCO AL PUERTO A COMO SALIDA

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
MOVLW 0X01 MOVWF TRISB ENTRAN LOS PULSOS MOVLW 0XF0 MOVWF INTCON MOVLW 0XBD SALIDA RS232 MOVWF TRISC MOVLW 0X06 MOVWF ADCON1 MOVLW 0XFF MOVWF PR2 PULSO=(PR2+1)*4*Tosc*Predivisor TMR2= 4.096 ms MOVLW 0X24 BITS MOVWF TXSTA MOVLW 0X19 MOVWF SPBRG BSF BSF BCF BCF ;CONFIGURO A 9615 BAUDIOS ;CARGO EL VALOR DEL PERIORDO DEL ;00000110;CONFIGURO AL PUERTO A COMO SALIDA DIGITAL ;COLOCO AL PUERTO C PARA EL MODULADOR DE ANCHO DE PULSO Y ENTRADA Y ;COLOCO AL PUERTO B COMO SALIDA MENOS EL RB0 QUE ES POR DONDE ;11110000;CONFIGURO LA INTERRUPCION PARA INTERNA

Página:48

;00100100 Configuro LA USAR COMO TRANSMICION ASINCRONA DE ALTA VELOCIDAD DE 8

PIE1,RCIE ;HABILITO LA INTERRUPCION PARA LA RECEPCION TXSTA,TXEN STATUS,RP0 STATUS,RP1 ;VUELVO AL BANCO 0

MOVLW 0X90 MOVWF RCSTA BSF

;10010000 Configuro PARA RECEPCION CONTINUA A LA USAR

RCSTA,SPEN

MOVLW 0X0C MOVWF CCP2CON MOVLW 0X07 MOVWF T2CON MOVLW 0XFF MOVWF PORTA CLRF CLRF CLRF CLRF CLRF CLRF ADCON0 PORTB ELEGIR CONTBAJO RELOJ CONTADOR1 ;COLOCO PARA NO ENCENDER DISPLAY ;ME ASEGURO QUE NO FUNCIONE EL CONVERSOR AD ;SETEOS DE VARIABLES ; habilitacion del tmr2 con un predivisor de 16 ;Configuro como modulador por ancho de pulso al ccp2

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
CLRF CLRF CLRF BANDERASS BANDAS 0X29

Página:49

MOVLW 0X07 MOVWF REFH MOVLW 0XD0 MOVWF REFB MOVLW .37 MOVWF CCPR2L MOVLW 0Xd9 iNTERRUPCION=1us*128*(256-217)=5ms MOVWF TMR0 BSF BCF BSF BCF BCF STATUS,RP0 STATUS,RP1 TXSTA,TXEN STATUS,RP0 STATUS,RP1 ; Transmisión habilitada ; Banco 0 ; Velocidad de giro inicial DEL MOTOR nula ;CARGO CON 217 AL TMR0 PARA QUE EL TIEMPO DE

BUCLE

CLRWDT GOTO BUCLE

INTERRUP ;COMO TENGO VARIAS PROCEDENCIA DE INTERRUPCION DEBO SABER CUAL ES LA QUE CAUSO LA INTERRUPCION BTFSC GOTO BTFSC GOTO BTFSC GOTO 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 BTFSC GOTO REFERENCIA MOVWF REFH RCREG,W BANDERASS,0 SALTITO ;LA PRIMERA PARTE LA GUARDO EN LA PARTE ALTA DE LA INTCON,T0IF INTERNA INTCON,INTF EXTERNA PIR1,RCIF RECEPCION ;POR QUE INGRESO UN DATO EXTERNO PÒR RS232 ;INTERRUPCION EXTERNA ;INTERRUPCION INTERNA

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
INCF RETFIE SALTITO MOVWF REFB CLRF RETFIE INTERNA INCF RELOJ,F BANDERASS ;LA SEGUNDA PARTE LA GUARDO EN LA PARTE BAJA DE LA REFERENCIA BANDERASS,F

Página:50

MOVLW 0XC8 XORWF RELOJ,W BTFSS GOTO CLRF CALL BCF STATUS,Z FIN RELOJ CUENTA INTCON,INTF ;NO LLEGUE AL SEGUNDO ENTONCES SALTO ;SI LLEGUE AL SEGUNDO ENTONCES HAGO LA CUENTA DE LAS RPM ;ME FIJO SI LLEGUE A 1SEGUNDO

FIN

CALL

DISPLAY ;CARGO CON 217 AL TMR0 PARA QUE EL TIEMPO DE

MOVLW 0Xd9 INTERRUPCION=1us*128*(256-217)=5ms MOVWF TMR0 BCF RETFIE CUENTA CLRF CLRF CLRF MOVF CONTADOR1 AUX_BAJO AUX_0X29 CONTBAJO,W INTCON,T0IF

;BORRO LA BANDERA DE INTERRUPCION INTERNA

;MULTIPLICO POR 3

MOVWF AUX MOVF 0X29,W

MOVWF AUX2 BU MOVF AUX,W

ADDWF CONTBAJO,F BTFSC INCF MOVF STATUS,C 0X29,F AUX2,W

ADDWF 0X29,F

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
INCF CONTADOR1,F

Página:51

MOVLW 0X02 XORWF CONTADOR1,W BTFSS GOTO BCF RRF RRF STATUS,Z BU STATUS,C 0X29,F CONTBAJO,F ;DIVIDI POR 2 DE ESTA MANERA YA TENGO EL VALOR DE RPM

CALL CALL CLRF CENTENA Y MILLAR CLRF CLRF CLRF MOVF BTFSS GOTO MOVF BTFSC RETURN ARRIBA

MODULADOR TRANSMITIR UNIDAD DECENA CENTENA MILLAR CONTBAJO,F STATUS,Z ARRIBA 0X29,F STATUS,Z

;HAGO LAS CUENTAS PARA EL MODULADOR POR ANCHO DE PULSO ;TRANSMITO LOS DATOS A LA PC ;DIVIDO AL NUMERO PARA QUE QUEDE EN UNIDAD, DECENA,

MOVLW 0X01 CLRWDT ADDWF AUX_BAJO,F BTFSC INCF INCF STATUS,C AUX_0X29,F UNIDAD,F ;DIVIDE EN UNIDAD

MOVLW 0X0A XORWF UNIDAD,W BTFSS GOTO CLRF INCF DEC STATUS,Z DEC UNIDAD DECENA,F

MOVLW 0X0A

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
XORWF DECENA,W BTFSS GOTO CLRF INCF CEN STATUS,Z CEN DECENA CENTENA,F ;DIVIDE EN DECENA

Página:52

MOVLW 0X0A XORWF CENTENA,W BTFSS GOTO CLRF INCF STATUS,Z MIL CENTENA MILLAR,F ;DIVIDE EN CENTENA

MIL

MOVLW 0X0A XORWF MILLAR,W BTFSS GOTO CLRF STATUS,Z SAL MILLAR AUX_0X29,W ;DIVIDE EN MILLAR

SAL

MOVF

XORWF 0X29,W BTFSS GOTO MOVF STATUS,Z ARRIBA AUX_BAJO,W

XORWF CONTBAJO,W BTFSS GOTO CLRF CLRF RETURN STATUS,Z ARRIBA CONTBAJO 0X29 ;HAGO LAS CUENTAS PARA EL MODULADOR POR ANCHO DE PULSO

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

XORWF REFH,W BTFSC GOTO STATUS,Z 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
SUBWF 0X29,W BTFSS GOTO STATUS,C NO_MAYOR

Página:53

MOVLW 0X02 SUBWF CCPR2L,F BTFSC RETURN MOVLW .37 MOVWF CCPR2L RETURN NO_MAYOR MOVLW 0X02 ADDWF CCPR2L,F BTFSS RETURN MOVLW 0XFF MOVWF CCPR2L RETURN ; Si LLEGO AL LIMITE SUPERIOR LO PONDO EN 255 DECIMAL AL MODULADOR ;DE ESTA MANERA ESTAMOS EN LA MÁXIMA SATURACION STATUS,C ;Si LLEGO AL LIMITE INFERIOR LO PONDO EN 37 DECIMAL AL MODULADOR ;DE ESTA MANERA ESTAMOS EN EL CORTE JUSTO EN EL TRANSISTOR STATUS,C

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

SUBWF REFB,W BTFSC GOTO STATUS,C RESTA

MOVLW 0X01 SUBWF CCPR2L,F BTFSC RETURN MOVLW .37 MOVWF CCPR2L RETURN RESTA MOVLW 0X01 ADDWF CCPR2L,F BTFSS RETURN STATUS,C ;Si LLEGO AL LIMITE INFERIOR LO PONDO EN 37 DECIMAL AL MODULADOR ;DE ESTA MANERA ESTAMOS EN EL CORTE JUSTO EN EL TRANSISTOR STATUS,C

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
MOVLW 0XFF MOVWF CCPR2L RETURN

Página:54

TRANSMITIR LOS DATOS MOVF 0X29,W

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

MOVWF TXREG BSF BCF NO BTFSS GOTO BCF BCF MOVF STATUS,RP0 STATUS,RP1 TXSTA,TRMT NO STATUS,RP0 STATUS,RP1 CONTBAJO,W

;PRIMERO TRANSMITO LA PARTE ALTA DEL CONTADOR ; VOY AL BANCO 1

;Se puede transmitir?

;VOY AL BANCO 0

;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 CALL ELEGIR,W PUERTOA

MOVWF PORTA MOVLW UNIDAD ADDWF ELEGIR,W MOVWF FSR MOVF CALL INDF,W PUERTOB

MOVWF PORTB INCF ELEGIR,F

MOVLW 0X04 XORWF ELEGIR,W BTFSC CLRF RETURN PUERTOA ADDWF PCL,F RETLW 0XFE ;RA0 STATUS,Z ELEGIR

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
RETLW RETLW RETLW 0XFD 0XFB 0XF7 ;RA1 ;RA2 ;RA3

Página:55

PUERTOB RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW

ADDWF PCL,F 0X80 0XEC 0X42 0X48 0X2C 0X18 0X10 0XCC 0X00 0X08 ;"0" 10000000 ;"1" 11101100 5 -

;"2" 01000010 6| |4 ;"3" 01001000 7 ;"4" 00101100 3| |1 ;"5" 00011000 ;"6" 00010000 ;"7" 11001100 ;"8" 00000000 ;"9" 00001000 2 .8

EXTERNA MOVLW 0X01

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

ADDWF CONTBAJO,F BTFSC INCF BCF RETFIE END STATUS,C 0X29,F INTCON,INTF ;BORRO BANDERA DE INTERUPCION

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD Página:56

Programa de la PC
#define INTVECT #define BASE 0x3f8 #include <dos.h> #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(); setvect(INTVECT,portint); //desabilitacion de interrupciones para poder //asignar la funcion de interrupcion al //vector de interrupcion enable(); intmask=inp(0x21); intmask=intmask&0xef; outp(0x21,intmask); outp(BASE+3,128); outp(BASE+0,0x0C); outp(BASE+1,0x00); outp(BASE+3,0x03); outp(BASE+4,0x0b); intmask=inp(BASE); intmask=inp(BASE+5); outp(BASE+1,0x01); grafica1(); //habilitacion de interrupciones //asigancion de la mascara de interrupcion // // //programacion del puerto serial //divisor en 12 para 9600 baudios // //activa DTR RST // //asignacion de la mascara de interrupcion // //activa la recepcion serial //pantalla de presentacion //Apertura del Archivo datos.txt 0x0c //vector de interrupcion puerto serial

//puerto serial //librerias necesarias para ejecutar el programa

if((P=fopen("datos.txt","w"))==NULL) printf("no puedo abrir el archivo"); fprintf(P,"%s while (tecla!=1) { %s

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

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
if(k==1) { gotoxy(60,2); printf("RPM actuales: gotoxy(74,2); printf("%d",resultado); // k=0; //demora para poder apreciar el dato //espero una nueva interrupcion } if (kbhit()) { 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 } outp(BASE+1,0x00); gotoxy(10,10); printf("Programa FINALIZADO\n"); delay(2000); fclose(P); } void interrupt portint(...) //subrutina de interrupcion serial { disable(); in=inp(BASE); //desabilito las interupciones para //recibir el dato de entrada en el puerto 0x3F8 //desactiva la recepcion serial // // // %d // %d\n",aux++,tecla,resultado); "); // //En caso de haber pulsado una tecla "); //el dato en pantalla //en caso de que alla ocurrido //una interrupcion k=1; se imprime

Página:57

Fecha: 14/06/06

Revisión: /

INSTITUTO UNIVERSITARIO AERONAUTICO CONTROL DE VELOCIDAD
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); enable(); } 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("º º"); } //actualizo las banderas //y habilito las inerrupciones

Página:58

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

Fecha: 14/06/06

Revisión: /

Sign up to vote on this title
UsefulNot useful