Software de control: Diagrama de bloques del sistema Para controlar todos los parámetros de funcionamiento de la pila de combustible, se ha creado un software específico, este funciona como se muestra en el diagrama siguiente. En un primer lugar se configura el chip del MCC03 (PIC 16F874A), para que funcione como se muestra en el esquema, de tal manera que se dispone de 5 sensores de presión, 3 termómetros, 3 interruptores de control y salidas de control útiles para la activación de las electro válvulas. Además dispone de una medida de tensión de salida, un led de control de funcionamiento y un puerto de comunicaciones RS232. Nota: El esquema de la placa va interconectado con la placa de interface de potencia y la placa interface PC. Tras configurar el chip y definir las variables del sistema, se muestra en pantalla, (la pantalla de la consola del PC), el menú del gráfico. Menú principal software de control Desde este momento se puede pulsar P1 para arrancar el software y por tanto la pila, P2 si en caso de que esté funcionando se quiere parar el sistema y P3 si se desea enviar la lectura de todos los sensores a pantalla. Circuito MCC03 procesador del sistema Una vez puesto en marcha el sistema, éste se puede parar por 4 motivos, por que se pulse el botón de paro, por que el software tras analizar los datos considere que tiene que parar, por que se active cualquier elemento de la cadena de seguridad o por que se haga una parada manual desde la cadena de seguridad. El software mostrado a continuación no incluye los parámetros de lógica de control del sistema ya que para ello se ha de experimentar con un sistema de pila de combustible real, los sensores se han de calibrar a tal efecto. Una vez montado el sistema, es posible incluir los parámetros de control dentro de la subrutina "analisislecturas:", en el software presentado se han incluido algunos parámetros de control a modo de ejemplo. Nota: El software de control incluye líneas de programa inhabilitadas útiles para la experimentación y el control del sistema. '**************************************************************** ' Name : Menu.BAS ' Author : Ignacio Lucas Alos ' Notice : ' ' Date : 31/08/2011 ' Version : 1.0 ' Notes : ' '**************************************************************** inicio: clear Define ONINT_USED 1 include "modedefs.bas" 'Configuración inicial de puertos trisa=%00000000 'Puerto A configurado como salida trisb = %11111111 'Puerto B configurado como entrada trisc=%00000000 'Puerto C configurado como salida portb=0 'Puerto B todos los pines a 0 trisd=%00000000 'Puerto D configurado como salida portd=0 'Puserto D todos los pines a 0 option_reg.7=0 'Habilita resistencias PullUp del puerto B '====================================================================== 'Definicion de variables globales: Define ONINT_USED 1 '====================================================================== ' Definicion de los parametros del registro ADCIN Define ADC_BITS 8 ' Configura el numero de bits en el resultado '(Para 10 bits ha de ser un 10 en lugar de un 8) Define ADC_CLOCK 3 ' Seleccion de fuente de reoj (3=rc interno) Define ADC_SAMPLEUS 50 ' Configuracion del tiempo de lectura 50 uS 'Definicion de variables lectura analogica 'adval0 var word ' Guarda el resultado de la medida en una variable '(para 10 bits) puertoanalogico var byte adval0 var byte ' Guarda el resultado de la medida en una variable '(para 8 bits) anal0 var word 'Definicion de variable para la lectura del puerto analogico 0 anal1 var word 'Definicion de variable para la lectura del puerto analogico 1 anal2 var word 'Definicion de variable para la lectura del puerto analogico 2 anal3 var word anal4 var word anal5 var word anal6 var word anal7 var word 'Definicion de variable para la lectura del puerto analogico 3 'Definicion de variable para la lectura del puerto analogico 4 'Definicion de variable para la lectura del puerto analogico 5 'Definicion de variable para la lectura del puerto analogico 6 'Definicion de variable para la lectura del puerto analogico 7 RST var PORTC.0 ' pin de reset DQ var PORTC.1 ' pin de datos CLK var PORTC.5 ' pin de reloj temp var word ' Variable donde se guarda la temperatura temp1 var word ' Variable lectrua de temperatura final entera tempt var word ' Variable lectura temeratura final decimal temperaturatermometro1 var word temperaturatermometro2 var word temperaturatermometro3 var word alarmageneral var bit 'Variable alarma general alarmah2_1 var bit 'Variable sensor de hidrogeno1 alarmah2_2 var bit 'Variable sensor de hidrogeno2 'CONFIGURACION INICIAL DE VARIABLES: 'Espacio reservado para insertar los limites de presion y temperatura '====================================================================== Menu: serout PORTC.6,2,[13," ",13] serout PORTC.6,2,[13,"www.coopservi.es",13] serout PORTC.6,2,[13,"Control de pila de combustible V1.0",13] serout PORTC.6,2,[13,"P1 Arranca",13] serout PORTC.6,2,[13,"P2 Paro",13] serout PORTC.6,2,[13,"P3 Lectura",13] trisc.6=1 portc.6=0 PORTA.4=1 pause 300 Botones: If PORTB.0=0 THEN gosub arranca If PORTB.1=0 THEN Gosub paro If PORTB.2=0 THEN GOTO lectura 'Apaga led TEST 'P1 'P2 'P3 GOTO BOTONES '===================================================================== arranca: PORTA.4=0 'Enciende led TEST serout PORTC.6,2,[13,"Arranca",13] portd=0 Gosub funcionamiento '====================================================================== paro: serout PORTC.6,2,[13,"Paro",13] goto menu '====================================================================== analisislecturas: 'analiza las lecturas, pero esto hay que pulirlo, ha de haber subrutinas 'para cada accion. 'serout PORTC.6,2,[13,"Analisis",13] if temp1>90 and temp1< 100 then serout PORTC.6,2,[13,"Temperatura superior a 90 grados",13] if temp1>90 and temp1<100 then portd.0=1 if temp1>100 then serout PORTC.6,2,[13,"Temperatura superior a 100 grados",13] if temp1>100 then portd.1=1 if temp1>115 then serout PORTC.6,2,[13,"Temperatura superior a 115 grados",13] if temp1>115 then serout PORTC.6,2,[13,"Apagando el sistema",13] if temp1>115 then portd.2=1 if temp1>115 then goto menu return '====================================================================== funcionamiento: 'Control de cada una de las lecturas, esto se tiene que hacer asi porque 'dependiendo de cual va a ser la lectura, se ha de aplicar una operacion 'u otra. PORTA.4=0 'Enciende led TEST lecturaanalogica0: puertoanalogico=0 'Configuracion delectura de puerto gosub leopuertoanalogico 'Salto a rutina de lectura swap adval0, anal0 'Intercambio de datos entre variables anal0=(((anal0*10)-130)/23)+15 'Conversion de datos lecturaanalogica1: puertoanalogico=1 'Configuracion delectura de puerto gosub leopuertoanalogico 'Salto a rutina de lectura swap adval0, anal1 'Intercambio de datos entre variables anal1=(((anal1*10)-130)/23)+15 'Conversion de datos lecturaanalogica2: puertoanalogico=2 'Configuracion delectura de puerto gosub leopuertoanalogico 'Salto a rutina de lectura swap adval0, anal2 'Intercambio de datos entre variables anal2=(((anal2*10)-130)/23)+15 'Conversion de datos lecturaanalogica3: puertoanalogico=3 'Configuracion delectura de puerto gosub leopuertoanalogico 'Salto a rutina de lectura swap adval0, anal3 'Intercambio de datos entre variables anal3=(((anal3*10)-130)/23)+15 'Conversion de datos lecturaanalogica4: puertoanalogico=4 'Configuracion delectura de puerto gosub leopuertoanalogico 'Salto a rutina de lectura swap adval0, anal4 'Intercambio de datos entre variables anal4=(((anal4*100)-1500)/94)+2 'Conversion de datos lecturaanalogica5: puertoanalogico=5 'Configuracion delectura de puerto gosub leopuertoanalogico 'Salto a rutina de lectura swap adval0, anal5 'Intercambio de datos entre variables anal5=(anal5*60)/253 'Conversion de datos lecturaanalogica6: puertoanalogico=6 'Configuracion delectura de puerto gosub leopuertoanalogico 'Salto a rutina de lectura swap adval0, anal6 'Intercambio de datos entre variables lecturaanalogica7: puertoanalogico=7 'Configuracion delectura de puerto gosub leopuertoanalogico 'Salto a rutina de lectura swap adval0, anal7 'Intercambio de datos entre variables 'gosub temperatura goto temperatura 'Fin de control de cada una de las lecturas. leopuertoanalogico: porta=0 TRISA = %11101111 ' Configura el puerto A como entrada ' ADCON1 = %10000000 ' Configura la lectura de Byte con justificacion a 'la derecha (para 10 bits) ADCON1 = %00000000 ' Configura la lectura de Byte con justificacion a 'la izquierda 'Pause 500 ' Espera 0.5 Segundos a que se realice la lectura ADCIN puertoanalogico, adval0 ' Lectura del canal de entrada segun toque ' serout PORTC.6,2,[13,"Lectura puerto ",#puertoanalogico," ",#adval0," , Escalado 0=0 5=255",13] ' if puertoanalogico=7 then goto lecturatermometros 'Permite continuar a la rutina de temperatura 'Pause 100 ' Espera 0.1 Segundos return '====================================================================== temperatura: lecturatermometros: PORTA.4=0 'Enciende led TEST termometro1: ' lectura sensor de temperatura Low RST ' Reinicio del chip RST = 1 ' Habilita chip Shiftout DQ, CLK, LSBFIRST, [$ee] ' Comienza la conversion RST = 0 Pause 50 ' Espera 50ms hasta que se ha hecho la conversion RST = 1 Shiftout portc.1, CLK, LSBFIRST, [$aa] ' Envioo de comando de lectura Shiftin portc.1, CLK, LSBPRE, [temp\9] ' Lectura de los 9 bit de temperatura RST = 0 'Muestra la temperatura en formato decimal temp1=temp >>1 tempt=temp1.0*5 swap temp1, temperaturatermometro1 'serout PORTC.6,2,[13,"Temperatura1: ",#temperaturatermometro1," grados C",13] termometro2: ' lectura sensor de temperatura Low RST ' Reinicio del chip RST = 1 ' Habilita chip Shiftout DQ, CLK, LSBFIRST, [$ee] ' Comienza la conversion RST = 0 Pause 50 ' Espera 50ms hasta que se ha hecho la conversion RST = 1 Shiftout portc.2, CLK, LSBFIRST, [$aa] ' Envioo de comando de lectura Shiftin portc.2, CLK, LSBPRE, [temp\9] ' Lectura de los 9 bit de temperatura RST = 0 'Muestra la temperatura en formato decimal temp1=temp >>1 tempt=temp1.0*5 swap temp1, temperaturatermometro2 'serout PORTC.6,2,[13,"Temperatura2: ",#temperaturatermometro2," grados C",13] termometro3: ' lectura sensor de temperatura Low RST ' Reinicio del chip RST = 1 ' Habilita chip Shiftout DQ, CLK, LSBFIRST, [$ee] ' Comienza la conversion RST = 0 Pause 50 ' Espera 50ms hasta que se ha hecho la conversion RST = 1 Shiftout portc.3, CLK, LSBFIRST, [$aa] ' Envioo de comando de lectura Shiftin portc.3, CLK, LSBPRE, [temp\9] ' Lectura de los 9 bit de temperatura RST = 0 'Muestra la temperatura en formato decimal temp1=temp >>1 tempt=temp1.0*5 swap temp1, temperaturatermometro3 'serout PORTC.6,2,[13,"Temperatura3: ",#temperaturatermometro3," grados C",13] pause 50 PORTA.4=1 'Apaga led TEST 'pause 50 gosub analisislecturas '====================================================================== 'Puertos digitales 1/0 alarmageneral = portb.3 alarmah2_1 = portb.4 alarmah2_2 = portb.5 '====================================================================== 'Lectura de menus If PORTB.0=0 THEN gosub arranca If PORTB.1=0 THEN Gosub paro If PORTB.2=0 THEN GOTO lectura 'P1 'P2 'P3 '====================================================================== lectura: ' serout PORTC.6,2,[13,"Lectura",13] 'Espacio reservado para introducir rutinas de lectura de datos. 'serout PORTC.6,2,[12,"Lectura",13] 'serout PORTC.6,2,[13,"Temperatura1: ",#temperaturatermometro1," grados C",13] 'serout PORTC.6,2,[13,"Temperatura2: ",#temperaturatermometro2," grados C",13] 'serout PORTC.6,2,[13,"Temperatura3: ",#temperaturatermometro3," grados C",13] 'serout PORTC.6,2,[13,"Lectura0 ",#anal0,13] 'Muestra datos 'serout PORTC.6,2,[13,"Lectura1 ",#anal1,13] 'Muestra datos 'serout PORTC.6,2,[13,"Lectura2 ",#anal2,13] 'Muestra datos 'serout PORTC.6,2,[13,"Lectura3 ",#anal3,13] 'Muestra datos 'serout PORTC.6,2,[13,"Lectura4 ",#anal4,13] 'Muestra datos 'serout PORTC.6,2,[13,"Lectura5 ",#anal5,13] 'Muestra datos 'serout PORTC.6,2,[13,"Lectura6 ",#anal6,13] 'Muestra datos 'serout PORTC.6,2,[13,"Lectura7 ",#anal7,13] 'Muestra datos 'serout PORTC.6,2,[13,"P1 Alarma general: ",#alarmageneral,13] 'Muestra datos digital 'serout PORTC.6,2,[13,"P1 Sensor H2-1: ",#alarmah2_1,13] 'Muestra datos digital 'serout PORTC.6,2,[13,"P1 Sensor H2-2: ",#alarmah2_2,13] 'Muestra datos digital 'Informacion de envio de datos para conformar grafica serout PORTC.6,2, ["*",#TEMPERATURATERMOMETRO1,",",#TEMPERATURATERMOMETRO2,","_ ,#TEMPERATURATERMOMETRO3,",",#anal0,",",#anal1,",",#anal2,",",#anal3,","_ ,#anal4,",",#anal5,",",#anal6,",",#anal7,",",#alarmageneral,","_ ,#alarmah2_1,",",#alarmah2_2,"/",13] 'Fin de informacion para grafica pause 250 goto funcionamiento