C:\Users\Administrador\Desktop\PROYECTO\CONTROL PILA DE COMBUSTIBLE.asm ;* Programa de Interfaz Electronica MICROCONTROLADOR* LIST P=PIC16F877 #INCLUDE "P16F877.INC" ;* Variables * TENSION_PILA ERROR1 TENSION_CONVERTIDOR ERROR_CONVERTIDOR CONSIGNA_PILA CONSIGNA_CONVERTIDOR DC_PWM TIEMPO VALVULA CAUDAL_MAXIMO CONSIGNA_DC CONSIGNA_VALVULA CAUDAL_MINIMO VAR EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU 0X70 0X71 0X72 0X73 0X74 0X75 0X76 0X77 0X78 0X79 0X7A 0X7D 0X7E 0X7F ;* Inicio * ORG GOTO ORG 0X00 INICIO 0X05 INICIO CLRF CLRF CLRF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF MOVLW MOVWF PORTD; PORTC; VALVULA; .31 CONSIGNA_PILA .180 CAUDAL_MAXIMO .60 CAUDAL_MINIMO .140 CONSIGNA_VALVULA .48 CONSIGNA_CONVERTIDOR .35 CONSIGNA_DC BSF BCF MOVLW MOVWF MOVLW MOVWF CLRF CLRF MOVLW MOVWF MOVLW MOVWF BCF CLRF CLRF MOVLW MOVWF MOVF MOVWF BSF STATUS,RP0 STATUS,RP1 H'00' ADCON1 H'FF' TRISA TRISD TRISC B'11000111' OPTION_REG .50 PR2 STATUS,RP0 TMR2 T2CON H'0F' CCP1CON CONSIGNA_DC,W CCPR1L ADCON0,ADON ;31 V (315) ;48 V (201) ;35 DC=0.71 (31 V => 48 V) ;BANCO 1 ;PORTA entradas analogicas y resultados ;justificados a la izquierda ;PORTA entradas ;PORTD salidas ;PORTC salidas (PWM) ;Se configura el TMR0 (Predivisor=256) ;Periodo del PWM (50 KHz) ;20us = 4x0,1us x 1 x PR2 => PR2=49 ;BANCO 0 ;Preescaler TMR2=1, T2=OFF ;Modulo CCP1 en modo PWM ;DC del PWM ;Se enciende el módulo A/D ;* Temporizador 3 segundos MOVLW MOVWF ESP1 MOVLW MOVWF BCF ESP2 .60 TIEMPO ;60 X 25ms = 1,5seg .11 TMR0 INTCON,T0IF ;11=255-244 (T=4xTOSCxTMR0xN) ;TMR0 = 25ms ;Se repone el flag del TMR0 1 C:\Users\Administrador\Desktop\PROYECTO\CONTROL PILA DE COMBUSTIBLE.asm BTFSS GOTO DECFSZ GOTO INTCON,T0IF ESP2 TIEMPO,1 ESP1 ;Se espera el paso de los 25ms ;¿Se ha hecho el bucle 120 veces? ;(120 x 25ms = 3seg) ;*************************************************************************** BSF MOVLW MOVWF BCF BSF MOVLW MOVWF ESP3 MOVLW STATUS,RP0 B'11000011' OPTION_REG STATUS,RP0 T2CON,TMR2ON .10 TIEMPO ;BANCO 1 .233 MOVWF BCF ESP4 BTFSS GOTO TMR0 INTCON,T0IF ;223=255-32 ;(T=4xTOSCxTMR0xN=4x0.1usx16x32=200us) ;TMR0 = 200 us ;Se repone el flag del TMR0 INTCON,T0IF ESP4 ;Se configura el TMR0 (Predivisor=16) ;BANCO 0 ;Se enciende el TMR2 (PWM ON) ;Temporizador control valvula ;200us x 10 = 2ms ;Se espera al paso de los 200us ;* Control Convertidor DC/DC* ;GOTO VALV MOVLW B'10100001' MOVWF VAR CALL CAPTURA MOVF ADRESH,W MOVWF TENSION_CONVERTIDOR MOVF CONSIGNA_CONVERTIDOR,W SUBWF TENSION_CONVERTIDOR,W BTFSC STATUS,C GOTO NEG4 XORLW H'FF' ADDLW .1 ADDWF CONSIGNA_DC,W MOVWF DC_PWM MOVLW .36 SUBWF DC_PWM,W BTFSC STATUS,C GOTO NEG5 MOVF DC_PWM,W MOVWF CCPR1L GOTO VALV NEG5 MOVLW .36 MOVWF CCPR1L GOTO VALV NEG4 SUBWF CONSIGNA_DC,W BTFSS STATUS,C GOTO NEG6 MOVWF DC_PWM MOVLW .28 SUBWF DC_PWM,W BTFSS STATUS,C GOTO NEG6 MOVF DC_PWM,W MOVWF CCPR1L GOTO VALV NEG6 MOVLW .28 MOVWF CCPR1L ;Captura de la tension del convertidor ;Se guarda el resultado ;Se compara la salida con consigna ;(W = TENSION - CONSIGNA) ;Salta si CONSIGNA < TENSION ;Se normaliza el resultado negativo ;Se suma el error a la consigna ;Se comprueba si se ha pasado el rango de DC ;W = DC_PWM - CONSIGNA (40) ;Si DC > CONSIGNA -> DC = CONSIGNA ;Se escribe nuevo ciclo de trabajo en memoria ;Se escribe nuevo ciclo de trabajo en memoria ;Se resta el error al ciclo de trabajo ;(W = CONSIGNA_DC - ERROR) ;Se mira si se ha sobrepasado el DC minimo ;Si lo sobrepasa salta a NEG6 ;Si no lo sobrepasa escribe el valor ;calculado ;Escribe el valor minimo DC ;* Control Valvula* VALV DECFSZ GOTO MOVLW MOVWF CALL MOVF MOVWF TIEMPO,F ESP3 B'10000001' VAR CAPTURA ADRESH,W TENSION_PILA ;¿Tiempo=0? ;(10 x 200us = 2ms) ;Captura tension pila combustible ;Se guarda el resultado de conversion 2 C:\Users\Administrador\Desktop\PROYECTO\CONTROL PILA DE COMBUSTIBLE.asm MOVF CONSIGNA_PILA,W SUBWF TENSION_PILA,W BTFSC STATUS,C GOTO NEG1 XORLW H'FF' ADDLW .1 MOVWF ERROR1 BCF STATUS,C RLF ERROR1,W ADDWF CONSIGNA_VALVULA,W MOVWF VALVULA MOVF CAUDAL_MAXIMO,W SUBWF VALVULA,W BTFSS STATUS,C GOTO NEG2 MOVF VALVULA,W MOVWF PORTD GOTO CONTROL NEG2 MOVF CAUDAL_MAXIMO,W MOVWF PORTD GOTO CONTROL NEG1 MOVWF ERROR1 BCF STATUS,C RLF ERROR1,W SUBWF CONSIGNA_VALVULA,W BTFSS STATUS,C GOTO NEG3 MOVWF VALVULA MOVF CAUDAL_MINIMO,W SUBWF VALVULA,W BTFSS STATUS,C GOTO NEG3 MOVF VALVULA,W MOVWF PORTD GOTO CONTROL NEG3 MOVF CAUDAL_MINIMO,W MOVWF PORTD CONTROL MOVLW .250 MOVWF TIEMPO MOVLW .231 GOTO ESP3 ;Se compara la salida con consigna ;W=TENSION - CONSIGNA ;Salta a NEG1 si TENSION > CONSIGNA ;Se normaliza el resultado negativo ;Se ;Se ;Se ;Se guarda el error en memoria limpie el carry para hacer RLF le da la ganancia al error suma el error a la consigna ;Se comprueba si se ha pasado el rango ;de apertura de la valvula ;Si no se ha pasado se escribe el valor ;Si se ha pasado el rango salta a NEG2 ;Se escribe le valor maximo de ;abertura de la valvula ;Se guarda el error en memoria ;Se limpia el carry ;Se le da ganacia al error ;Se resta el error a la consigna ;Salta si ERROR < CONSIGNA ;Se mira si se ha sobrepasado la ;minima abertura de la valvula ;Si se ha sobrepasado salta a NEG3 ;Abre la valvula al caudal calculado ;Abre la valvula al minimo ;Temporizador valvula ;1ms x 250 = 250ms ;231=255-24 ;(T=4xTOSCxTMR0xN=4x0.1usx16x24=150us) ;* Fuciones* CAPTURA MOVF MOVWF CALL BSF ESP20 BTFSS GOTO CALL RETFIE TIEMPO20U MOVLW MOVWF BCF ESP21 BTFSS GOTO RETFIE VAR,W ADCON0 TIEMPO20U ADCON0,GO PIR1,ADIF ESP20 TIEMPO20U .250 TMR0 INTCON,T0IF INTCON,T0IF ESP21 ;Funcion para hacer una conversion A/D ;Se configura el convertidor A/D con el puerto ;que se encuentra en la variable VAR. ;Se espera el tiempo de adquisicion ;Inicio de la conversion ;Espera final de la conversion ;Antes de poder realizar otra adquisicion ;hay que poner otro tiempo de espera. ;Temporizador de 20us ;252=255-3 (T=4xTOSCxTMR0xN=4x0.1usx16x24=20us) ;TMR0 = 20us ;Se repone el flag del TMR0 ;Se espera el paso de los 20us END 3