Prototipo Basico de Incubadora Neonatal
-
Upload
walter-schroeder -
Category
Documents
-
view
331 -
download
6
Transcript of Prototipo Basico de Incubadora Neonatal
INDICE
INTRODUCCION 2
MODO DE USO 3
DESARROLLO 5
SENSADO DE TEMPERATURA 5
ETAPA DE MUESTREO 7
BLOQUE DE CONTROL 10
ANEXOS
PROGRAMACION 13
BIBLIOGRAFIA 21
1
INTRODUCCION.
En el siglo XX, se volvió indispensable el uso de incubadoras para neonatos (recién nacidos) en alto riesgo o prematuros, tanto en hospitales públicos como en clínicas privadas, para lograr una reducción en la tasa de mortalidad infantil. Los problemas en los bebés prematuros están relacionados con la inmadurez de sus sistemas orgánicos, por lo cual necesitan cuidados especiales en la sala de neonatos hasta cuando sus sistemas orgánicos se hayan desarrollado lo suficiente como para mantenerlos con vida sin necesidad de brindarles apoyo especializado. Estos cuidados pueden durar semanas o meses dependiendo que tan prematuro sea el bebé.
En la actualidad existe una gran variedad de dichos equipos en el mercado, algunos más o menos complejos que otros, pero todos trabajan para el mismo fin y controlan las mismas variables principales, o sea la temperatura y la circulación de aire en el habitáculo. Algunos equipos tienen la opción de controlar otros parámetros como la saturación de oxigeno en la sangre, la humedad dentro del habitáculo, entre otras.
El objetivo de este proyecto es realizar un prototipo de control de incubadora, siguiendo las normas vigentes al caso, que nos sirva de base para empezar a diseñar seriamente un control con el fin de poder comercializarlo en el futuro. En este proyecto, nos basamos en la norma IRAM 4220-2-19 de APARATOS ELECTROMEDICOS – INCUBADORAS DE BEBES, asi como también en los manuales de la marca MEDIX de los modelos TR-306(Incubadora de transporte – Manual de servicio Técnico) y PC-305(Incubadora de terapia intensiva – Manual de usuario). Como se dijo, esto es sólo un prototipo.
2
MODO DE USO .
Este sistema cuenta con un indicador de temperatura en display, control microprocesado de temperatura, alarma acústica, alarmas visuales de temperatura y de falla en ventilador de recirculación de aire.
El control trabaja en un rango de temperatura fijo que va de 20º a 37ºC con opción de ser extendida a 39ºC.
La lectura de temperatura en el recinto se visualiza en display en un rango que va de 20º a 45ºC, con una precisión de 0.1ºC (un decimal).
Al encenderse el sistema, aparece en display la temperatura que se mide en el habitáculo. Por defecto la temperatura de set es de 30ºC, por lo cual, si la misma fuese menor a este valor, al encenderse el sistema arranca el control de calefacción.
En caso de que la temperatura sensada este 3ºC por debajo o 1ºC por encima de la temperatura seteada se enciende la alarma por temperatura.
Si la temperatura es mayor:
Suena la alarma acústica intermitentemente. Se enciende en forma intermitente el indicador de alarma TEMP. AIRE. Se apagan la resistencia calefactora junto con el ventilador de recirculación de aire.
Si la temperatura es menor:
Suena la alarma acústica intermitentemente. Se enciende en forma intermitente el indicador de alarma TEMP. AIRE.
3
Se enciende la resistencia calefactora (potencia máxima) junto con el ventilador de recirculación de aire.
En ambos casos la alarma acústica se puede silenciar oprimiendo el pulsador RESET ALARMA, transcurridos 10 minutos y si la falla no se corrige vuelve a sonar la alarma.
Para modificar la temperatura en el habitáculo, se debe presionar el botón SET_TEMP, al hacerlo se visualiza en el display la temperatura de set actual (sin decimales), la misma se modifica apretando los botones (+) o (-), una vez seleccionada la temperatura deseada, se debe aceptar con el botón SET (de otro modo los cambios no producen), y presionando el botón MUESTRA, vuelve a mostrar en display la temperatura del habitáculo.
Ante una falla en la circulación de aire, se enciende la alarma correspondiente, la cual, al igual que la alarma anterior, consta de una indicación sonora y una visual. Esta alarma trabaja como sigue:
Suena la alarma acústica intermitentemente. Se enciende en forma intermitente el indicador de alarma falla de aire. Se interrumpe la potencia del calefactor a través de un circuito de relé.
La alarma acústica NO se puede silenciar oprimiendo el pulsador RESET ALARMA.
4
DESARROLLO.
Este proyecto es un prototipo que usa un control ON-OFF de temperatura, el cual necesita muchos cambios y mejoras para poder usarse en una incubadora neonatal real. Este sistema cuenta con una unidad microprocesada para mostrar temperatura en display u otra para el control en sí mismo.
La unidad de muestreo en display de temperatura se hizo independiente del control porque asi se especifica en la norma IRAM 4220-2-19. Para el sensado de temperatura se armo interfaz para adaptar la señal de salida del sensor de temperatura a niveles de 0-5V que se puedan reconocer el la entrada de los microcontroladores utilizados. A efectos de simplificar se uso la misma interfaz para la unidad de control y la de muestreo.
A continuación se muestra circuito eléctrico utilizado para la simulación en proteus, puede verse que consta de tres bloque separados (la interfaz del sensor, el bloque de control y la etapa de muestreo), los cuales se interconectan entre si.
QAQBQCQDQEQFQG
QAQBQCQDQEQFQG
QAQBQCQDQEQFQG
QA
QB
QCQD
QE
QFQG
1 2 3
1
2
3
1b
2b
3b
4b
b1
b2
b3
1b
2b
3b
4b
b1
b2b3
p8
p7
p6
p5
p4
p3
p2
p1
p2
p1
p8
p7
p6
p5
p4
p3
p2
p1
seña
l aco
ndic
iona
da
señal acondicionada
señal acondicionada
BLOQUE DE CONTROL
PIC16F877A
muestra
temp --
temp ++
set
extensión 39ºC
Reset alarma
Interfaz sensor
R2
1k
R11k
SET_TEMP
R3
1k
++
R4
1k
--
SET_TEMP(2)
VALUE=5
SET
RESET ALARMA
EXT_39ºC
R5
1k
R6
1k
R7
1k
Q3_b
Q2_b
Q1_b
4_B
3_B
2_B
1_B
MUESTRA
set_temp
Falla vent
FALLA VENT
R81k
ETAPA DE MUESTREO
PIC16F873A
QA
QB
QCQD
QE
QFQG
Display 1
Display 2
Display 3
1B
2B
3B
4B
Interfaz sensor
Muestra
Set_temp
Q1b
Q2b
Q3b
D7
Alarma Acustica
D8
Alarma temp aire
D9
Ventilador
D10
Falla ventilador
D11
Calefactor
Pot calefaccion
Ventilador
Alarma Acustica
Alarma temp aire
Falla ventilador
31.0
D1
LM335
INTERFAZ SENSOR
LM335
A puerto A/Dsensor
DIAGRAMA GENERAL DE SIMULACION
Salida de datos
Entrada de datos
Control de Displays
repr
esen
taci
on s
alid
a de
pot
enci
a y
alar
mas
Pulsadores de control
El funcionamiento detallado de cada uno de los distintos bloques se explica a continuación.
Sensado de Temperatura.
Para el sensado de temperatura se utilizo el sensor integrado LM335, el cual tiene una salida lineal con una variación en la tensión de salida de 10mV/ºC. Los valores de salida de este sensor van desde 0V para 0ºK(-273ºC) en adelante.
Como el rango de lectura que se programo va de 20-45ºC, necesitamos saber la salida del sensor para estos valores de temperatura, se tiene:
5
Ahora bien estos valores no son los adecuados para enviar a la entrada del conversor AD del micro, entonces se hace una conversión lineal para llevar las variaciones que van de 2.93V a 3.18V a otras que van de 0V a 5V. Esto lo logramos con el bloque interfaz sensor, el circuito eléctrico se detalla a continuación.
R910k
R9(2)VALUE=22
3
26
74
15
U6
LM741
3
26
74
15
U5
LM741
U6(
V+)
VA
LUE=
22
U5(
V+)
VA
LUE=
22
U6(V-)VALUE=-22 U5(V-)
VALUE=-22
R1110k
R1010k
U6(OP)
R149k012
sensor
R121k2
R1324k
R14(1)
A puerto A/D
R14(1)VALUE=22
D21N4007 D3 - ZENER
1N4733A
31.0
D1
LM335
El diagrama consta de dos Amp. Operacionales, el primero se configura como inversor y el segundo como sumador para dar la escala necesaria de 0-5V a su salida.
Debe notarse que el circuito es solo de simulación, en el circuito práctico que se hizo se coloco a la salida del sensor un filtro pasa bajos, el cual es seguido por un operacional configurado como seguidor de tensión, a modo seguir la variaciones de tensión evitando un consumo innecesario de corriente.
6
3
26
74
15
U1
LM741
3
26
74
15
U2
LM741 3
26
74
15
U3
LM741
C133nF
11
33
22
PRES1 10k
Potenciometro paracalibrar sensor
1 2 3
J1 1: -22V2: GND3: +22V
R23M3
R310k
R4
10k
R51k2
R712k
R812k
R6
8k211 3 3
22
PRES2
1k
12
J2
CONN-H2
Conector de salidahacia la entradadel conversor A/D
R110k
123
J3
Conectorsensor
D21N4007 D3 - ZENER
1N4733A
Filtro pasa Bajo
Seguidor de tension
CIRCUITO PRACTICO
Etapa de muestreo.
Como se dijo antes, la unidad bloque de muestreo en display se hizo independientemente del control porque asi lo especifica la norma IRAM 4220-2-19.
En vista de los componentes que se pueden conseguir en el mercado de la zona, y debido al costo de los mismos, se opto por usar un PIC16f873A ya que de este modo el costo se hacía menor que si se usaban componentes discretos para visualizar un valor analógico en display.
Como se aprecia en el diagrama general de simulación en proteus que se muestra al principio, el bloque de muestreo tiene 5 conjuntos de líneas de entrada y un conjunto de líneas de salida.
Un conjunto se usa como E/S de alimentación eléctrica para los displays. El conjunto de entrada de datos consta de cuatro líneas de datos
provenientes del bloque de control, estas se usan para transmitir información cuando se quiere mostrar en display la temperatura de seteo, o dicho de otra forma estas líneas llevan el código BCD de la temperatura de seteo para que se visualice en display.
El conjunto de control de displays se usa para controlar los mismos desde el bloque de control cuando se está seteando temperatura.
Por último quedan dos líneas que proviene de los pulsadores de control y la entrada correspondiente a la señal acondicionada por la interfaz del sensor para conectarla al ADC.
7
A continuación se detalla diagrama eléctrico correspondiente al bloque de muestreo:
9
131211101514
13
12
11
10
9
15
14
Q1
Q2
Q3
1_b
2_b
3_b
1_b
3_b
2_b
Q3
Q2
Q1
rb0
rb1
ra0rb2rb3
rc0
rc1
rc2
rc3
rb3rb2
rb0rb1ra0
rc0rc1rc2rc3
R421k2 R43
1k2R441k2
Q22N2222
Q32N2222Q1
2N22221 2
3
U7:A4030
5 64
U7:B4030
8 910
U7:C4030
R36
4k7
R374k7
R38
4k7
R39
4k7
R404k7
R414k7
12
1311
U7:D
4030
R36(1)VALUE=5
RA0/AN02
RA1/AN13
RA2/AN2/VREF-/CVREF4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
OSC1/CLKIN9
OSC2/CLKOUT10
RC1/T1OSI/CCP2 12
RC2/CCP1 13
RC3/SCK/SCL 14
RB7/PGD 28RB6/PGC 27RB5 26
RB4 25RB3/PGM 24RB2 23RB1 22RB0/INT 21
RC7/RX/DT 18RC6/TX/CK 17RC5/SDO 16
RC4/SDI/SDA 15
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI 11
MCLR/Vpp/THV1
U3
PIC16F873APROGRAM=..\Programas\Programa 7 seg CCS\Control 7 segmentos.hex
XT14MHz
C1
33p
C2
33n
Set_tempMuestra
R35(1)
VALUE=5
R35
4k7
1A2 1Y 4
1B3
2A5 2Y 7
2B6
3A11 3Y 9
3B10
4A14 4Y 12
4B13
A/B1
E15
U1
74HC157
A7
B1
C2
D6
LT3
BI4
LE/STB5
QA 13
QB 12
QC 11
QD 10
QE 9
QF 15
QG 14
U2
4511R261k
R271k
R26(1)VALUE=5
R28220
R29220
R30220
R31220
R32220
R33220
R34220
1B
2B
3B
4B
R16
4k7
R17
4k7
R18
4k7
R19
4k7
R20
4k7
R21
4k7
R22
4k7
R23
4k7
R24
4k7
R25
4k7
QG
QF
QE
QD
QC
QB
QA
Display 1
Display 2
Display 3
Q1b
Q2b
Q3b
Interfaz sensor
Retorno catodo de displays
Control de Displays
Salida Codigo 7 segmentos
Entrada de datos
Si se observa el esquema, puede verse que el micro usado es un PIC16F873A, el cual trabaja en una frecuencia de 4MHz. La entrada de señal analógica proveniente de la interfaz del sensor se conecta al pin 2 del micro para ser convertida a un valor digital. Dicho valor se procesa mediante el ADC interno del micro, el cual da una salida de conversión de 10 bits, cuyos valores van desde 0 a 1023 (10n). Una vez obtenido el valor de la señal de entrada en el ADC interno, esta se procesa y se manda en código BCD al CI4511, el cual es un Driver y conversor BDC/7Segmentos, para ser mostrado en display. El CI 74HC157 conectado antes del CI 4511 es un multiplexor cuádruple de 2x1 canales, se usa para seleccionar que datos se deben mostrar, los datos correspondientes a la temperatura que salen del PIC16F873A o los correspondientes a la temperatura de seteo proveniente del bloque de control. El multiplexor se comanda, para que habilite uno u otro canal de datos, con el PICF16F873A mediante los pulsadores MUESTRA y SET_TEMP. Si se observa el circuito eléctrico, se ve que las salidas de control de los displays 7 segmentos se manejan con los transistores Q1, Q2 y Q3, y estos a su vez se controlan por medio de las compuertas X-OR conectadas a sus bases. Dichas compuertas cumplen la función de aislar las señales de control de display que provienen del Pic16F873A y del bloque de control de modo que no se den las dos a la vez y pueda ocasionarse un mal funcionamiento.
8
Los resistores conectados a la entrada del 74HC157 y de las compuertas X-OR, y que se conectan a Vd = 5V cumplen la función de interfaz de lógica TTL a lógica CMOS. Esto se hizo asi porque el microcontrolador maneja niveles de tensión TTL, mientras que El 74HC157 y las X-OR(CD4030) manejan niveles de tensión CMOS. A continuación se muestra el esquema eléctrico práctico utilizado para hacer la placa de muestreo, en el mismo se distinguen dos bloques internos los cuales se muestran más abajo.
QA
QB
QCQD
QE
QFQG
dp
QAQBQCQDQEQFQG
QAQBQCQDQEQFQG
QAQBQCQDQEQFQG
dp
SENSOR TEMPERATURA
PIC 16F873A
R171k2
R181k2
R191k2
Q2
2N2222
Q32N2222Q1
2N2222
rc0
rc1
rc2rc3
Q1aQ2aQ3a
set_temp
Muestra
sensor
CONMUTADOR
DRIVER 7 SEGMENTOS
E
A/B
1B2B3B4B
1A2A3A4A
QAQBQCQDQE
QFQG
R21k
R121k
1 23
U7:A4030
5 64
U7:B4030
8 910
U7:C4030
A/B
dp
a7
b6
c4
d2
e1
f9
g10
dp5
33
88
U8C-501G
a7
b6
c4
d2
e1
f9
g10
dp5
33
88
U9C-501G
a7
b6
c4
d2
e1
f9
g10
dp5
33
88
U10C-501G
1234
J1
datos set temp
R42
4k7
reset
123456
J2
pulsadores
1 2 3
J8control displays
E
gnd+
gnd+5V
12 1311
U7:D4030
R34
4k7
R35
4k7
R36
4k7
R37
4k7
R38
4k7
R39
4k7
5V
12
J7sensor
1 - sensor2 - GND
1 2
J5 Vin1 - GND2 - 5V
DIAGRAMA GENERAL PRACTICO
RA0/AN02
RA1/AN13
RA2/AN2/VREF-/CVREF4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
OSC1/CLKIN9
OSC2/CLKOUT10
RC1/T1OSI/CCP2 12
RC2/CCP1 13
RC3/SCK/SCL 14
RB7/PGD 28RB6/PGC 27RB5 26RB4 25RB3/PGM 24RB2 23RB1 22RB0/INT 21
RC7/RX/DT 18RC6/TX/CK 17RC5/SDO 16RC4/SDI/SDA 15
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI 11
MCLR/Vpp/THV1
U3
PIC16F873A
X1
4MHz
C1
33p
Q2aQ3a
Q1a
rc0
rc2rc3
rc1
Set_tempMuestra
sensor
A/B
reset
E
gnd+
C2
33n
SENSOR TEMPERATURA
9
1A2 1Y 4
1B3
2A5 2Y 7
2B6
3A11 3Y 9
3B10
4A14 4Y 12
4B13
A/B1
E15
U1
74HC157
A7
B1
C2
D6
LT3
BI4
LE/STB5
QA 13
QB 12
QC 11
QD 10
QE 9
QF 15
QG 14
U2
4511 R20
220
R21
220
R29
220
R30
220
R31
220
R32
220
R33
220
1A1B2A2B3A3B4A4B
A/BE
gnd+
QG QF QE QD QC QB QA
R1
220
dp
5V
R151k
R161k
R114k7
R134k7
R144k7
R224k7
R234k7
R244k7
R254k7
R264k7
R274k7
R284k7
CONMUTADOR
Se puede ver en los diagramas prácticos que la fuente de alimentación es externa, esto se pensó asi para poder implementar a futuro (dentro de la misma fuente general de alimentación) alguna protección por hardware por sobre carga y/o cortocircuito.
Bloque de control.
Este bloque es un control muy básico de temperatura que sirve para controlar un relé (el cual maneja la resistencia calefactora), una salida para el ventilador de recirculación de aire y algunas alarmas. El hecho de que controle un relé indica que se trata de un control ON-OFF. Ahora bien algo mejor sería usar un control PID, esto es una mejora para implementar a futuro. El corazón de este bloque es el Pic16F877A, el cual se encarga de convertir a un valor digital la señal que sale de la interfaz del sensor y de procesar dicho valor (al igual que lo hace el Pic16F873A en el bloque de muestreo) para tomarlo como referencia para controlar el calefactor. Se ve que del micro salen líneas reservadas para las alarmas. Estas se simulan mediante leds de indicación de distintos colores, asi como también el calefactor y el ventilador, pero en la práctica se uso un relé para la potencia. La condición de alarma que indica falla en la ventilación se simulo con una entrada digital mediante un pulsador debido a que no contábamos con un sensor adecuado para tal efecto, esto es un detalle a corregir a futuro.
A continuación se muestra el diagrama eléctrico de simulación de proteus del bloque de control.
10
RA0/AN02
RA1/AN13
RA2/AN2/VREF-/CVREF4
RA4/T0CKI/C1OUT6
RA5/AN4/SS/C2OUT7
RE0/AN5/RD8
RE1/AN6/WR9
RE2/AN7/CS10
OSC1/CLKIN13
OSC2/CLKOUT14
RC1/T1OSI/CCP2 16
RC2/CCP1 17
RC3/SCK/SCL 18
RD0/PSP0 19
RD1/PSP1 20
RB7/PGD 40RB6/PGC 39RB5 38RB4 37RB3/PGM 36RB2 35RB1 34RB0/INT 33
RD7/PSP7 30RD6/PSP6 29RD5/PSP5 28RD4/PSP4 27RD3/PSP3 22RD2/PSP2 21
RC7/RX/DT 26RC6/TX/CK 25RC5/SDO 24RC4/SDI/SDA 23
RA3/AN3/VREF+5
RC0/T1OSO/T1CKI 15
MCLR/Vpp/THV1
U4
PIC16F877A
XT0 8MHz
C3
22p
C4
22p
RESET 16F877A
R15(1)
VALUE=5
R154k7
muestraset_temp
temp --
temp ++set
extensión 39ºC
1_B2_B3_B4_B
Q1_bQ2_bQ3_bAlarma AcusticaAlarma temp aire
Reset alarma
Pot calefaccionVentilador
Falla vent
Falla ventilador
interfaz sensor
BLOQUE DE CONTROL
Se observa que el bloque de control no es más que el micro utilizado con sus respectivas E/S.
A continuación se muestra el prototipo resultante de este proyecto, todas las etapas explicadas, salvo la de control (por estar en desarrollo aun) fueron llevadas a cabo en una placa de circuito impreso.
11
Observación sobre los microcontroladores utilizados.
Si se ven los diagramas eléctricos se puede ver que de los dos microcontroladores ninguno se usa de modo de sacar el mayor provecho debido a que no se utilizan todos los pines de todos los puertos. Esto es porque en un futuro se agregaran más funciones que demanden mayor cantidad de pines E/S, asi que estos micros pueden servir para tal caso. Ambos microcontroladores tienen un ADC interno de 10 bits, de modo que el valor de temperatura que se lee en display es igual (teóricamente) al que tiene como referencia el control de temperatura.
12
ANEXOS.
Programación
Para este proyecto usamos el lenguaje de programación CCS, el cual puede trabajarse en conjunto con MPLAB para bajar los programas al respectivo microcontrolador.
A continuación se muestran los códigos de programación que se usaron en este proyecto.
Programa para el Pic del bloque de muestreo:
#include <16F873A.h>#device adc = 10 /*Con esto defino el modulo ADC(siempre se define despues de definir el pic chip a usar, si lo defino en otro momento no compila)*/#use delay(clock=4000000)
#fuses XT, NOWDT, PROTECT
#opt 9 //uso la maxima optimizacion de codigo
#use fast_io(a) //Selecciono los puertos A,B,y C como E/S digitales#use fast_io(b)#use fast_io(c)
#byte porta = 0x05#byte portb = 0x06#byte portc = 0x07
int aux1; //Numero de 8 bits sin signo
int flagtemp = 0; int cont = 0;
void muestra(float);void borrado();Dec2Bcd(int);
#int_rtccvoid interrup_temp(){cont ++; if(cont == 31) //como no me da para temporizar 2 segundos uso un {flagtemp = 1; //loop De 61 vueltas para lograrlo, De este modo temporizo cont = 0; //exactamente hasta 1.998848 segundos } //T = 4* Tosc* (256 -N10)* Rango del Divisor de Frec * loop set_timer0(0x00);}
void main(){float b = 0.02441; //Defino un numero de 32 bits en punto flotante float a;
13
setup_adc_ports(RA0_RA1_RA3_ANALOG); setup_adc(adc_clock_div_32); set_adc_channel(0); setup_counters(rtcc_internal, rtcc_div_256); /*clock interno, preescaler al TMR0, divido por 256*/ enable_interrupts(global); enable_interrupts(int_rtcc); /*habilito permiso de interrupciones por desbordamiento del TMR0*/ set_timer0(0x00); //inicializo el TMR0 en cero
set_tris_a(0x01); set_tris_b(0x03); set_tris_c(0x00); aux1 = 0;
output_bit(pin_b2, 0); output_bit(pin_b3, 0); output_bit(pin_b5, 0); output_bit(pin_b6, 0); output_bit(pin_b7, 0); do {if (flagtemp == 1) //En estas lineas se procesa el valor analogico {a = read_adc() * b + 20; //que entra al ADC interno del micro flagtemp = 0; } muestra(a); //llama a la funcion de muestra en display if(input(pin_b0) && (aux1 == 0)) //Si aprieto el boton de Set_temp desahibilito {aux1 = 1; //las salidas a los transistores del Pic16F873A borrado(); //para que entren los datos del bloque de control } }while(true);}
/*esta Funcion se encarga de mostrar la temperatura en display*/void muestra(float valor_temp){int De, U, dec, aux;
/*Aca esta la definicion de parametros*/ De = (int) (valor_temp/10); //decenas U = (int)(valor_temp - 10*De); //Unidades aux = 10*De + U; dec = (int)(10*valor_temp - 10*aux); //decimales /*Ahora convierto los parametros a codigo BCD*/ De = Dec2Bcd(De); //muestra decenas U = Dec2Bcd(U); //muestra unidades dec = Dec2Bcd(dec); //muestra decimales
/*Aca viene la rutina de muestreo en display*/ output_c(De);
14
output_bit(pin_b5, 1); delay_ms(15); output_bit(pin_b5, 0); output_c(U); output_bit(pin_b6, 1); delay_ms(20); output_bit(pin_b6, 0); output_c(dec); output_bit(pin_b7, 1); delay_ms(15); output_bit(pin_b7, 0);
return;}
/*esta es la funcion que transfiere el control de los displays al Pic16F877A que esta en bloque de control*/void borrado(){do {output_bit(pin_b5, 0); output_bit(pin_b6, 0); output_bit(pin_b7, 0); output_bit(pin_b3, 1); if(input(pin_b1) && (aux1 == 1)) {delay_ms(100); aux1 = 0; output_bit(pin_b3, 0); return; } }while(true);}
/*Funcion para convertir a codigo BCD*/Dec2Bcd(int valor){int aux2; aux2 = valor & 0x0F; return(aux2);}
15
Programa para el Pic del bloque de control:
#include <16F877A.h>#device adc = 10
#use delay(clock=8000000)#fuses HS, NOWDT, NOPROTECT
#opt 9 //uso la maxima optimizacion de codigo
#priority rtcc, timer1 //Priorizo interrupcion del TMR0 antes que la del TMR1
#use fast_io(a) //Selecciono los puertos A,B,C, D y E como E/S digitales#use fast_io(b)#use fast_io(c)#use fast_io(d)#use fast_io(e)
#byte porta = 0x05#byte portb = 0x06#byte portc = 0x07#byte portd = 0x08#byte porte = 0x09
int set = 30;int flagtemp = 0;int reset_alarma = 0;int cont = 0;int cont1 = 0;int aux1, aux2, aux3;int aux0 = 37;
float a;
#int_rtccvoid interrup_temp(){cont ++; if(cont == 31) //como no me da para temporizar 2 segundos uso un {flagtemp = 1; // loop De 61 vueltas para lograrlo, De este modo temporizo cont = 0; // exactamente hasta 1.998848 segundos } // T = 4* Tosc* (256 -N10)* Rango del Divisor de Frec * loop set_timer0(0x00);}
#int_timer1void interrup_TIMER1(){cont1 ++; if (cont1 == 38) {cont1 = 0; reset_alarma = 0; output_low(pin_d4); output_low(pin_d5); }
16
if (((int)a <= aux3) && ((int)a >= aux2)) reset_alarma = 0;
set_timer1(0x00);}
set_temp(int);Dec2Bcd(int);
void alarma(int);
void main(){int salida; float b = 0.02441;
setup_adc_ports(RA0_RA1_RA3_ANALOG); setup_adc(ADC_CLOCK_DIV_32); set_adc_channel(0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); /*clock interno, preescaler al TMR0,
divido por 256*/ set_timer0(0x00); //inicializo el TMR0 en cero setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); /*clock interno, preescaler al TMR1, divido por
8*/ enable_interrupts(global); //Habilito interrupciones globales enable_interrupts(INT_RTCC); //Habilito interrupcion por desbordamiento de TMR0 enable_interrupts(INT_TIMER1); //Habilito interrupcion por desbordamiento de TMR1 set_tris_a(0xFF); set_tris_b(0xF0); set_tris_c(0x00); set_tris_d(0x00); set_tris_e(0xF); output_c(0x00); output_d(0x00);
aux1 = 0;
do {aux2 = set-3; aux3 = set+1; if (flagtemp == 1) {a = read_adc() * b + 20; flagtemp = 0; }
if (input(pin_e2) && (aux1 == 0)) //Llamada a funcion set_temp() {delay_ms(100); aux1 = 1; set_temp(set); }
17
/* las siguientes lineas son para controlar el calefactor*/ if ((int)a < (set-1)) //Defino el arranque del calefactor {salida = 1; //con una histerisis de 1ºC } if ((int)a >= set) {salida = 2; } /* las siguientes lineas son De llamada a las funciones De alarma*/
if ((int)a < aux2) //Lamada alarma de temp_aire por debajo de 3ºC del set {if (reset_alarma == 0) {alarma(1); salida = 1; } else {alarma(2); salida = 1; } } if ((int)a > aux3) //Lamada alarma de temp_aire por encima de 1ºC del set {if (reset_alarma == 0) {alarma(1); salida = 2; } else {alarma(2); salida = 2; } } if (((int)a <= aux3) && ((int)a >= aux2)) //Si se está en condiciones normales {if (!input(pin_b5)) //normales apago todos los bits {output_low(pin_d4); //de alarma. output_low(pin_d5); output_low(pin_d6); } }
if (input(pin_b5)) //Llamada a funcion alarma falla_ventilacion {alarma(3); salida = 2; } /*Las siguientes lineas son de encendido y apagado del calefactor y el ventilador de recirculacion*/ switch (salida) {case 1:{output_bit(pin_c2, 1); output_bit(Pin_c3, 1); break;} case 2:{output_low(pin_c2); output_low(Pin_c3); break;} }
18
}while(true);}
/*Funcion de seteo de temperatura*/set_temp(int temp){int De, U; output_bit(pin_d3, 0); //deshabilito el tercer display do {De = (int) temp/10; //decenas U = (int)(temp-10*De); //Unidades De = Dec2Bcd(De); U = Dec2Bcd(U); /*muestro las decenas*/ output_b(De); output_bit(pin_d1, 1); delay_ms(20); output_bit(pin_d1, 0);
/*muestro las unidades*/ output_b(U); output_bit(pin_d2, 1); delay_ms(20); output_bit(pin_d2, 0);
if(input(pin_a5)) {delay_ms(20); if (input_state(pin_a5)) temp++; } if(input(pin_e0)) {delay_ms(20); if (input_state(pin_e0)) temp--; } /*Extension del rango de temperatura*/ if(input(pin_a2)) {delay_ms(20); if (input_state(pin_a2) && (aux0 == 37)) aux0 = 39; if (input_state(pin_a2) && (aux0 == 39)) aux0 = 37; } if (temp < 20) temp = 20; if (temp >= aux0) temp = aux0; if(input(pin_a4)) set = temp;
19
if (input(pin_e1) && (aux1 == 1)) {output_bit(pin_d1, 0); output_bit(pin_d2, 0); output_bit(pin_d3, 0); aux1 = 0; return(set);} }while(true);}
/*Funcion para convertir de Decimal a BCD9*/Dec2Bcd(int valor){int aux2; aux2 = valor & 0x0F; return(aux2);}
/* La siguiente funcion engloba todas las alarmas programadas*/void alarma(int tipo){switch (tipo) {case 1: //Alarma temp_aire {output_toggle(pin_d4); output_toggle(pin_d5); delay_ms(500); if(input(pin_b4)) //Pulsador De RESET ALARMA {output_low(pin_d4); //reseteo la alarma acustica reset_alarma = 1; set_timer1(0x00); //Habilito el TMR1 para que empiece a contar } break;} case 2: //Alarma temp_aire con nla acustica reseteada {output_low(pin_d4); output_toggle(pin_d5); delay_ms(500); break;} case 3: //Alarma falla ventilacion {output_toggle(pin_d4); output_toggle(pin_d6); delay_ms(500); break; } }}
20
Bibliografía
o Datasheet transistor 2n2222.o Datasheet transistor TIP 122.o Datasheet Amp. Op. LM 741.o Datasheet microcontrolador PIC16F877A.o Datasheet microcontrolador PIC16F873A.o Datasheet 74HC157 - multiplexor cuádruple de 2 a 1.o Datasheet M74HC4511 - BCD to 7 segment latch decoder driver.o Datasheet CD4030 - cuádruple XOR.
o Tutorial para crear componentes en Proteus.o Compilador C CCS y Simulador Proteus Para Microcontroladores Pic - Eduardo García
Breijo.o Manual de usuario del compilador PCW de CCS - Escrito por Andrés Cánovas López.o Manual_PIC16F87X_FIRTEC.o Curso PIC16f877 en español.pdf.o Amplificadores operacionales y circuitos integrados y lineales 5º edición – Robert F.
Coughlin – Frederick F. Driscoll.
o Norma IRAM 4220-2-19 de APARATOS ELECTROMEDICOS – INCUBADORAS DE BEBES.
o Manual de usuario de la incubadora para terapia intensiva modelo PC-305.o Manual de servicio técnico de la incubadora de transporte modelo TR-306.
21