Professional Documents
Culture Documents
Proyecto: /
Fecha: 14/06/06
Autor:
Serrudo Mario Sebastián
Revisó:
Ing. Luis Murgio
Vo.Bo. :
INSTITUTO UNIVERSITARIO AERONAUTICO
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
por:
Serrudo Mario Sebastián.
Resumen
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.
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.
2.DESARROLLO
2.1.Teoría.
+ RPM
REF K MOTOR
En donde:
• La referencia es suministrada por la PC
• El bloque sumador y proporcional(K) se encuentran en el PIC
• El Bloque H es el optó acoplador con su conformador de onda.
RPM A
Motor = FT = =
Voltios ( s + B)
Voltios
K = FT = = Cte
Pulsos
Pulsos
H = FT = = Cte 2
RPM
RPM CteA
Sistema = = (1)
REF ( S + B + Cte 2CteA)
−t
CteA * REF
RPM (t ) = (1 − e B +Cte 2CteA )
B + Cte 2CteA
Como se puede observar el sistema se ha hecho mas lento pero mas estable y con un error
menor por lo que es mas sencillo de controlar.
Debido a que trabajamos con modulación “Delta” consideraremos que el sistema es 10 veces
mas lento aun, por lo que la formula final queda:
−t
CteA * REF
RPM (t ) = (1 − e 10 ( B +Cte 2CteA) )
B + Cte 2CteA
De esta manera se concluye el estudio teórico del comportamiento del sistema de control.
2.2Diagrama en bloques:
PWM
Comunicación Tx Potencia
con la PC
Rx
Micro Motor
controlador
RPM
2.3Hardware
Fecha: 14/06/06 Revisión: /
INSTITUTO UNIVERSITARIO AERONAUTICO
2.3.1Microcontrolador
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.
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.
En conclusión se decide que los displays sean activos por bajo utilizándose entonces displays
de ánodo común. La corriente solicitada por cada display en el peor caso, (todos los segmentos
encendidos) es de 10mA x 7 =70mA para suministrarla se utiliza un transistor PNP BC327-25
polarizado en corte y saturación que provee la intensidad de corriente requerida por el display. El
circuito a diseñar para cualquier display es el siguiente
VCC
5V
Q1
RB
BC327
CK
U1
A B C D E F G
RB1
Ln1
RB2
Ln2
RB3
Ln3
RB4
Ln4
AL_PUERTO_B
RB5
Ln5
RB6
Ln6
RB7
Ln7
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 .
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.
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.
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.
T/x
1 VccT Vcc
Vdc =
T ∫Vccdt =
0
TX
=
X
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.
VCC
S1 D1
M
MOTOR 1N4148
Q1
R1
pwm
TIP31A
IC
Vpwm max − R1 −Vce = 0
β
β
R1 = (Vpwm max −Vce)
IC
2.3.5 Motor
A 2834
Ft = =
S +B S + 0.8034
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.
VDD
R2 R3 5V
10k 10k
R10
VDD
R11
RB0 5V 1.0k 1K _LIN
4 50%
U1A Key = Space
3 Disco
1
2 X1
LED1
11 LM324AD
R1
5.1k
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.
Primero suponemos que a la salida del operacional hay 5 voltios de manera que la resistencia
R2 y R3 se encuentran en paralelo , por lo que la tensión en la entrada no inversora del operacional
es:
5 R1( R 2 + R3)
V1 =
R1R 2 + R1R3 + R 2 R3
por lo tanto cuando la tensión en la entrada inversora supere a V1 la salida del operacional pasara
a valer 0 voltio.
Ahora si suponemos que a la salida del operacional hay 0 voltios de manera que la resistencia R1
y R2 se encuentran en paralelo , por lo que la tensión en la entrada no inversora del operacional es:
5 R1R 2
V2 =
R1R 2 + R1R3 + R 2 R3
por lo tanto cuando el valor en para inversora disminuya de v2 la salida del operacional pasa a 5 V.
Ahora propongo una tensión de subida V1 de 2.5 Vol y y tensión de bajada de 1.2V por lo que las
formulas quedan:
5 R1( R 2 + R3)
V1 = 2.5
R1R 2 + R1R 3 + R 2 R3
5 R1R 2
V2 = =1.2
R1R 2 + R1R3 + R 2 R3
V1 R3
−1 =
V2 R2
R3 2.5
= − 1 = 1.083
R 2 1.2
5 5
V2 = =
R3 R3 R3
1+ + 1 + 1.083 +
R 2 R1 R1
R3 5
= − 1 − 1.083 = 2.083
R1 V 2
De esta manera concluye el estudio del modulo de realimentación y se procede a unir todos los
módulos en el siguiente circuito.
VDD
5V VCC
5V
Q2 Q3 Q4 Q5
470
M
D1
BC327 BC327 BC327 BC327 1N4148
470 MOTOR
CK CK CK CK
470
470 U4 U5 U6 U7
A B C D E F G A B C D E F G A B C D E F G A B C D E F G
750
330 TIP31A
330
330
330
330
330
U2
330 VDD
1 28 VDD
2 27 5V
3 26 5V
20pF 4 25
5 24
6 23
7 22 10k 10k
8 21 J1 VDD
9 20 1uF-POL 1uF-POLU3
10 19 5V 1.0k
11 18 C1+ VCC V- 1K _LIN
50%
12 17 C1- 4 U1A Key = Space
13 16 C2+ V+
HC-49/U_3MHz 14 15 C2- 3
2.4Software:
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.
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.
A continuación se muestra un diagrama de flujo del programa implementado en el del PIC para
corroborar el correcto funcionamiento del Hardware. Si se desea obtener el código fuente dirigirse a
la sección de anexos.
Inicialización LEER DATO
rc7 entrada
rc6 salida
RETRANSMITIR DATO
Configuración USART
VOLVER
USAR en escucha
bucle
Programa de la PC.
El programa utilizado para el testeo del correcto funcionamiento de la transmisión asíncrona fue
realizado en lenguaje C, dicho programa se basa en la transmisión y recepción de datos mediante
el puerto serie (0X386) a una velocidad de 9000 baudios por segundo. Si se desea saber el código
fuente de dicho programa dirigirse a la sección de anexo.
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
Inicialización
Rc1salida
Predivisor TMR0
Velocidad=0
Activar motor
Incrementar velocidad
hasta máxima
Parar motor
Para comprobar el correcto funcionamiento de este bloque se realizo un programa que cuenta la
cantidad de pulsos que se producen en un segundo y los visualiza en los display.
El diagrama de flujo de este programa se muestra a continuación.
Inicialización interrupción
Rb salida
Rb0 entrada
Ra Salida
Configuración del TMR0
No No
¿Interna? ¿externa?
Activación de interrupciones
Si Si
bucle
Si
Para la 1 Seg? Incremento aux
cuenta
no
Restablecer interrupciones
volver
De esta manera queda comprobado el correcto funcionamiento de los diferentes módulos del
sistema.
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.
Debido a la extensión del programa se realiza un diagrama de flujo para así facilitar la
comprensión del mismo y poder dar detalles de los bloques que se crea necesario.
Inicialización de variables
Puerto b Salida
Rb0 entrada
Puerto a Salida
Rc1 Salida para PWM
Rc6 Salida para Tx Serie
Rc7 Entrada para Rx Serie
Configuración del PWM
Configuro USAR
Habilito interrupciones
Carga al tmr0
Velocidad de giro =0
BUCLE
INTERRUPCION
NO NO
Por TMR0? Por Rb0 Recepción serie
SI Si
Si
1 Seg? Si
Realizo la Incremento Cargo el nuevo valor
cuenta de RPM Cuenta de referencia
No
Mayor menor
Incremento el Decremento el
ancho de pulso ancho de pulso
Trasmito a la PC
Cuenta=0
Visualización
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:
Interrupción por TMR0: En esta condición el programa refresca los display para poder obtener una
correcta visualización, si a su vez a pasado 1 segundo se realiza la cuenta para obtener las RPM
con que esta girando el motor . Para obtener las RPM del motor se efectúa la siguiente cuenta.
Cuenta * 60
RPM =
cantidad _ de _ ranuras _ del _ disco
En donde:
Cuenta: es una variable que se incrementa cada vez que entra una interrupción por RB0
Cantidad de ranuras: En este caso es 40 debido a que esa es la cantidad de ranuras que
posee el disco que gira solidariamente con el eje del motor.
Cuenta * 60 Cuenta * 3
RPM = =
40 2
De esta manera el error máximo que se produce es de 1,5 RPM con lo que se considera
satisfactorio.
Luego de obtener la cantidad de RPM con que esta girando el motor, se compara con la
referencia enviada por la PC via puerto serie y se incrementa o decrementa el ancho del pulso del
PWM en función del resultado de dicha comparación como se muestra a continuación.
• RPM con que esta girando el motor > Referencia entonces decremento el pulso de control
• RPM con que esta girando el motor < Referencia entonces incremento el pulso de control
Este tipo de control es el denominado control “Delta” y como se puede observar es un control no
lineal pero de muy fácil implementación.
Luego de hacer la corrección del ancho de pulso, se envía las RPM con que esta girando el
motor a la PC y esta las guardas para poder hacer a posterior un análisis del funcionamiento del
sistema de control.
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.
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.
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.
Ahora si excitamos a este sistema con un escalón de 1.5V como es en nuestro caso la expresión
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 :
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.
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:
Los demás elementos que componen el sistema de control tiene funciones de transferencias las
cuales se pueden obtener de forma matemática.
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
ANEXO 1
#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
GOTO PRINCIPAL
GOTO INTERUP
ORG 0X05
;PROGAMA PRINCIPAL
;SEREOS
MOVLW 0X02
BSF STATUS,RP0
MOVLW 0X10
MOVWF TRISA
MOVLW 0X01
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 INTCON
CLRF REBOTE
CLRF CONTADOR1
BUCLE
;RUTINA DE INTERRUPCION
INTERUP
SWAPF STATUS,W
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
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
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
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
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
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
SWAPF GUARDO_W,F
SWAPF GUARDO_W,W
MOVLW 0XB0
RETFIE
;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)
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
GOTO SALE1
MOVF CONTADOR,W
XORLW 0X02
GOTO SALE2
MOVF CONTADOR,W
XORLW 0X03
GOTO SALE3
CALL TABLA ;(OSEA QUE BUSCO LA SECUENCIA DE ENCENDIDO PARA EL DISPLAY DE MANERA MUESTRE EL NUMERO EN DECIMAL DE LA VARIABLE)
GOTO SALIR
CALL TABLA
GOTO SALIR
CALL TABLA
GOTO SALIR
CALL TABLA
SALIR MOVWF PORTB ;PRENDO PUERTO B EN FUNCION DEL CODIGO MANDADO POR LA TABLA
MOVF CONTADOR,W
MOVWF AUXILIAR
BSF STATUS,C
RLF PORTA,F
MOVF CONTADOR,W
XORLW 0X04
;SETEOS
CLRF DISPLAY2
CLRF DISPLAY3
CLRF DISPLAY4
CLRF MILISEGUNDO
RETURN
END
ANEXO 2
Programa de prueba que permite comprobar el bloque comunicaciones de la PC
#include <p16f873.inc>
ORG 0x00
GOTO INICIO
ORG 0X04
GOTO INTE
BSF STATUS,RP0
MOVWF TRISC
MOVWF TXSTA
MOVWF SPBRG
MOVLW 0X90
MOVLW 0XC0
BUCLE
GOTO BUCLE
VOLVER RETFIE
BSF STATUS,RP0
RETURN
Programa de la PC
//ESTE PROGRAMA ENVIA UN BYTE POR TRANSMISIÓN SERIE Y CUANDO RECIBE EL REBOTE LO MUESTRA EN PANTALLA.
#include <conio.h>
#include <stdio.h>
void grafica1(void);
void main()
int intmask,aux=0;
//vector de interrupción
intmask=intmask&0xef; //
outp(0x21,intmask); //
outp(BASE+1,0x00); //
outp(BASE+4,0x0b); //
intmask=inp(BASE+5); //
while (tecla!=1)
//
} //
scanf("%d",&teclas);
outp(0x3f8,teclas);
gotoxy(10,10); //
printf("Programa FINALIZADO\n"); //
delay(2000); //
fclose(P);
k=1;
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
MOVWF TRISC
MOVWF PR2
BUCLE
MOVWF CCP2CON
MOVLW 0XFF
MOVLW 0X06
MOVWF 0X21
BU DECFSZ 0X21,F
GOTO BU
RETURN
END
ANEXO 4
Programa de prueba que permite comprobar el funcionamiento del circuito de
realimentación
#include<P16F873A.inc>
GOTO INICIO
ORG 0X04
GOTO INTERRUP
ORG 0X05
MOVLW 0X01
MOVWF TRISB ;COLOCO AL PUERTO B COMO SALIDA MENOS EL RB0 QUE ES POR DONDE
ENTRAN LOS PULSOS
MOVWF INTCON
MOVWF ADCON1
BCF STATUS,RP0
MOVLW 0XFF
CLRF ELEGIR
CLRF CONTBAJO
CLRF RELOJ
CLRF CONTADOR1
CLRF 0X29
MOVLW 0Xd9
MOVWF TMR0
BSF INTCON,T0IE
BUCLE CLRWDT
GOTO BUCLE
GOTO INTERNA
GOTO EXTERNA
RETFIE
INTERNA
INCF RELOJ,F
MOVLW 0XC8
BTFSS STATUS,Z
CLRF RELOJ ;SI LLEGUE AL SEGUNDO ENTONCES HAGO LA CUENTA DE LAS RPM
CALL CUENTA
BCF INTCON,INTF
MOVWF TMR0
RETFIE
CUENTA
CLRF DECENA
CLRF CENTENA
CLRF MILLAR
MOVF CONTBAJO,F
BTFSS STATUS,Z
GOTO ARRIBA
MOVF 0X29,F
BTFSC STATUS,Z
RETURN
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
XORWF DECENA,W
BTFSS STATUS,Z
GOTO CEN
CLRF DECENA
INCF CENTENA,F
XORWF CENTENA,W
BTFSS STATUS,Z
GOTO MIL
CLRF CENTENA
INCF MILLAR,F
XORWF MILLAR,W
BTFSS STATUS,Z
GOTO SAL
CLRF MILLAR
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
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
EXTERNA
MOVLW 0X01
ADDWF CONTBAJO,F
BTFSC STATUS,C
INCF 0X29,F
RETFIE
END
ANEXO 5
Programa Final
ORG 0X00
GOTO INICIO
ORG 0X04
GOTO INTERRUP
ORG 0X05
MOVLW 0X01
MOVWF TRISB ;COLOCO AL PUERTO B COMO SALIDA MENOS EL RB0 QUE ES POR DONDE
ENTRAN LOS PULSOS
MOVWF INTCON
MOVWF TRISC
MOVWF ADCON1
MOVLW 0XFF
MOVLW 0X24 ;00100100 Configuro LA USAR COMO TRANSMICION ASINCRONA DE ALTA VELOCIDAD DE 8
BITS
MOVWF TXSTA
MOVLW 0X19
BSF TXSTA,TXEN
BCF STATUS,RP0
MOVWF RCSTA
BSF RCSTA,SPEN
MOVLW 0X0C
MOVLW 0X07
MOVLW 0XFF
CLRF ELEGIR
CLRF CONTBAJO
CLRF RELOJ
CLRF CONTADOR1
CLRF BANDERASS
CLRF BANDAS
CLRF 0X29
MOVLW 0X07
MOVWF REFH
MOVLW 0XD0
MOVWF REFB
MOVLW .37
MOVWF TMR0
BSF STATUS,RP0
BCF STATUS,RP1
BCF STATUS,RP1
BUCLE CLRWDT
GOTO BUCLE
INTERRUP ;COMO TENGO VARIAS PROCEDENCIA DE INTERRUPCION DEBO SABER CUAL ES LA QUE CAUSO LA
INTERRUPCION
GOTO INTERNA
GOTO EXTERNA
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
MOVWF REFH
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
BTFSS STATUS,Z
CLRF RELOJ ;SI LLEGUE AL SEGUNDO ENTONCES HAGO LA CUENTA DE LAS RPM
CALL CUENTA
BCF INTCON,INTF
MOVWF TMR0
RETFIE
CUENTA
CLRF CONTADOR1
CLRF AUX_BAJO
CLRF AUX_0X29
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
INCF CONTADOR1,F
MOVLW 0X02
XORWF CONTADOR1,W
BTFSS STATUS,Z
GOTO BU
BCF STATUS,C
RRF 0X29,F
CALL MODULADOR ;HAGO LAS CUENTAS PARA EL MODULADOR POR ANCHO DE PULSO
CLRF DECENA
CLRF CENTENA
CLRF MILLAR
MOVF CONTBAJO,F
BTFSS STATUS,Z
GOTO ARRIBA
MOVF 0X29,F
BTFSC STATUS,Z
RETURN
CLRWDT
ADDWF AUX_BAJO,F
BTFSC STATUS,C
INCF AUX_0X29,F
MOVLW 0X0A
XORWF UNIDAD,W
BTFSS STATUS,Z
GOTO DEC
CLRF UNIDAD
INCF DECENA,F
BTFSS STATUS,Z
GOTO CEN
CLRF DECENA
INCF CENTENA,F
BTFSS STATUS,Z
GOTO MIL
CLRF CENTENA
INCF MILLAR,F
XORWF MILLAR,W
GOTO SAL
CLRF MILLAR
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
XORWF REFH,W
BTFSC STATUS,Z
;NO IGUAL
SUBWF 0X29,W
BTFSS STATUS,C
GOTO NO_MAYOR
MOVLW 0X02
SUBWF CCPR2L,F
BTFSC STATUS,C
RETURN
RETURN
NO_MAYOR
MOVLW 0X02
ADDWF CCPR2L,F
BTFSS STATUS,C
RETURN
RETURN
SI_IGUAL
SUBWF REFB,W
BTFSC STATUS,C
GOTO RESTA
MOVLW 0X01
SUBWF CCPR2L,F
BTFSC STATUS,C
RETURN
RETURN
ADDWF CCPR2L,F
BTFSS STATUS,C
RETURN
MOVLW 0XFF
MOVWF CCPR2L
RETURN
MOVF 0X29,W
BCF STATUS,RP1
GOTO NO
BCF STATUS,RP1
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
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
RETFIE
END
Programa de la PC
#define INTVECT 0x0c //vector de interrupcion puerto serial
#include <conio.h>
#include <stdio.h>
void grafica1(void);
void main()
int intmask,aux=0;
FILE *P;
//vector de interrupcion
intmask=intmask&0xef; //
outp(0x21,intmask); //
outp(BASE+1,0x00); //
outp(BASE+4,0x0b); //
intmask=inp(BASE+5); //
while (tecla!=1)
gotoxy(60,2);
gotoxy(74,2);
printf("%d",resultado);
//
} //
gotoxy(2,2);
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);
gotoxy(10,10); //
printf("Programa FINALIZADO\n"); //
delay(2000); //
fclose(P);
if(k==1)
resultado=resultado|in;
if(k==0)
resultado=in<<8;
k=1;
void grafica1()
int i;
clrscr();
textcolor(WHITE);
textbackground(BLUE);
clrscr();
for(i=0;i<=46;i++)
cprintf("º º");
cprintf("ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ"); }