dataloger para termopar memoria descriptiva

Anuncio
DATALOGER PARA TERMOPAR
(PERFIL DE TEMPERATURA DE UN HORNO DE CINTA CON COMPENSACIÓN DE UNIÓN FRÍA)
MEMORIA DESCRIPTIVA
AUTOR: Jesús Pablo Parrado Guardia.
DIRECTOR: Xavier Vilanova.
FECHA: Junio / 2003.
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
ÍNDICE
1
INTRODUCCIÓN .........................................................................................................5
1.1
Laboratorio Sensores de gases ......................................................................................................................... 5
1.1.1
Horno de Cinta..................................................................................................................................................5
1.2
Termopar ............................................................................................................................................................... 5
1.3
Compensación....................................................................................................................................................... 7
1.3.1
Sensores de temperatura utilizados como referencia ..................................................................................8
1.3.2
Compensación de unión fría por hardware.................................................................................................10
1.3.2.1
1.3.3
2
Método obtención de la temperatura del horno previo al proyecto (AD595)............................10
Compensación unión fría por software .......................................................................................................10
OBJETIVOS ...............................................................................................................12
2.1
3
Herramientas utilizadas ...................................................................................................................................13
DESCRIPCIÓN FUNCIONAL DEL DATA LOGGER..........................................14
3.1
Funciones del data logger.................................................................................................................................15
3.1.1
3.2
Entradas y salidas del data logger...............................................................................................................15
Diagrama de bloques del funcionamiento del data logger:.........................................................................16
3.2.1
Configuración del sistema.............................................................................................................................18
3.3
Adquisición .........................................................................................................................................................19
3.4
Transmisión........................................................................................................................................................20
4
4.1
DESCRIPCIÓN DEL HARDWARE DEL PROYECTO.......................................22
Chasis Data Logger...........................................................................................................................................22
MEMORIA DESCRIPTIVA Pag. 2
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
4.2
Chasis Alimentación.........................................................................................................................................23
4.3
Módulo Principal................................................................................................................................................24
4.3.1
Bloque microntrolador...................................................................................................................................25
4.3.2
Bloque UART .................................................................................................................................................27
4.3.3
Bloque I2C.......................................................................................................................................................28
4.3.4
Bloque Conectores.........................................................................................................................................29
4.4
Módulo de Adquisición......................................................................................................................................30
4.4.1
Bloque Termopar............................................................................................................................................31
4.4.2
Bloque Unión Fría ..........................................................................................................................................32
4.4.3
Bloque Reset, Fuente.....................................................................................................................................33
4.4.4
Bloque Conectores Pulsadores, Leds Micro..............................................................................................34
4.5
5
Módulo de Potencia............................................................................................................................................35
DESCRIPCIÓN SOFTWARE DEL PROYECTO .................................................38
5.1
Programa del PIC16F873 ................................................................................................................................38
5.1.1
Programa Principal. Selección de actividad................................................................................................38
5.1.2
Modificación de los parámetros de configuración....................................................................................41
5.1.3
Adquisición temperaturas, almacenamiento EEPROM.............................................................................43
5.1.4
Lectura temperaturas almacenadas en la EEPROM, Transmisión...........................................................48
5.1.5
Interrupciones.................................................................................................................................................52
5.2
Programa en C ...................................................................................................................................................55
5.2.1
Programa Principal..........................................................................................................................................56
5.2.2
Configuración .................................................................................................................................................58
5.2.3
Compensación ................................................................................................................................................59
5.2.3.1
Obtención Datos..................................................................................................................................59
5.2.3.2
Compensación de unión fría ..............................................................................................................61
5.2.4
Tranmisión.......................................................................................................................................................62
MEMORIA DESCRIPTIVA Pag. 3
PROYECTO
5.2.5
6
DATA
LOGGER
PARA
TERMOPAR
Interrupciones.................................................................................................................................................63
5.2.5.1
Interrupción del puerto serie..............................................................................................................63
5.2.5.2
Interrupción del temporizador............................................................................................................64
BLIBLIOGRAFÍA .......................................................................................................65
MEMORIA DESCRIPTIVA Pag. 4
PROYECTO
1
DATA
LOGGER
PARA
TERMOPAR
Introducción
Para el presente proyecto se desea diseñar y elaborar un sistema que adquiera y almacene la
señal (este tipo de dispositivos se denominan data loggers) de un termopar, que este caso será
una temperatura.
La utilidad casi exclusiva del data logger es almacenar perfiles de temperatura (evoluciones
de la temperatura medidas mediante un termopar) que se desarrollan en un horno, por lo que se
ha considerado prioritario que el sistema se adecue a las características de dicho entorno.
1.1
Laboratorio Sensores de gases
En el laboratorio número 335 (Sensores de Gases) de la Universitat Rovira i Virgili
situado en el campus Sescelades (Tarragona) se dispone de un horno de cinta. En el horno se
realizan diversos experimentos, para los que se desea conocer el perfil de temperatura que
desarrolla el experimento.
Para medir las altas temperaturas a las que se trabaja en dicho horno se utiliza un
termopar, en concreto del tipo K. Este tipo de sensor a diferencia de otros, permite medir
cualquier temperatura comprendida dentro del rango funcionamiento del horno de cinta.
1.1.1
Horno de Cinta
El horno que dispone el laboratorio es un horno de cinta. Está dividido en cuatro zonas
independientes en las que programa una temperatura para cada zona. Esta temperatura va desde
la temperatura ambiente hasta un máximo de 1100 ºC, que es la máxima temperatura que puede
suministrar el horno. Otro parámetro a escoger es la velocidad de movimiento de la cinta.
Dependiendo de la velocidad escogida, la cinta transportadora puede tardar entre 30 minutos y 2
horas en recorrer las cuatro zonas del horno, siendo la duración más habitual de
aproximadamente 1 hora. Regulando las temperaturas en cada zona y la velocidad de la cinta se
pueden obtener los diferentes perfiles de temperatura
1.2
Termopar
Un termopar es un transductor de temperatura formado por la unión de dos metales
diferentes en los extremos. Si las uniones entre metales están a diferentes temperaturas, se
produce una diferencia de tensión entre ambos extremos y una corriente eléctrica circulará a lo
largo del circuito. Este fenómeno se llama efecto Seebeck o efecto termoeléctrico. De esta forma
podemos observar una relación entre la diferencia de temperaturas y la diferencia de voltaje de
los extremos del termopar.
MEMORIA DESCRIPTIVA Pag. 5
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Figura 1.1 Forma de un termopar
Hay diferentes tipos de termopares, según sea la combinación de metales de que estén
fabricados, que proporcionan diferentes rangos de temperaturas y diferentes sensibilidades. La
principal virtud de los termopares es su amplio rango de medida, que va desde los -270 ºC a los
+1800 ºC, su relativo coste en comparación con sensores de otro tipo y similares características,
pero por el contrario su funcionamiento es muy no lineal. En la tabla 1.1 se puede observar los
principales tipos y sus características.
Tipo
Termopar
Conductor +
Conductor -
Rango Tª (ºC)
Rango tension (mV)
B
Platino
Rodio
0 a 1800
0 a +13.820
E
Cromo
Constantan
-270 a 1000
-9.835 a 76.373
J
Hierro
Constantan
-210 a 1200
-8.095 a 69.553
K
Cromo
Aluminio
-270 a 1372
-6.548 a 54.874
N
Nicrosil
Nisil
-270 a 1300
-4.345 a 47.502
R
Platinio-13%
Rodio
Platinio
-50 a 1768
-0.226 a 21.103
S
Platinio-10%
Rodio
Platinio
-50 a 1768
-0.235 a 18.693
T
Cobre
Constantan
-200 a 400
-5.603 a 20.872
Tabla 1.1: Propiedades de los termopares
Para medir el voltaje creado en el termopar se abre el circuito del termopar y se inserta el
voltímetro en paralelo. Al proceder de esta manera se producen nuevos termopares por la unión
de los metales del voltímetro, pero no modificarán el sistema si estos están a la misma temperatura
que el final del termopar (puede verse la referencia bibliográfica número uno Measuring
Temperature with Thermocouples, para una descripción más detallada). Por lo tanto se distinguen
MEMORIA DESCRIPTIVA Pag. 6
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
dos zonas, la zona de unión de los dos metales (unión termopar o unión caliente), que está en
contacto con el objeto al que se desea medir la temperatura, y el final del termopar (unión de
referencia o unión fría), donde se ha colocado el voltímetro conectando sus terminales a los
extremos de ambos metales, y se produce la caída de tensión. Esta tensión es proporcional a la
diferencia de temperaturas entre ambos extremos del termopar. La unión de referencia se
denomina a veces unión fría porque suele estar a menor temperatura que el otro extremo, que a
su vez es unión caliente.
1.3
Compensación
Un termopar produce una tensión E en función de la diferencia de temperaturas entre
ambos extremos E=∆(TJet-Tref) (fig. 1.1)
Figura 1.1 Variables a considerar en un termopar
Para poder determinar la temperatura absoluta de la unión termopar debe ser conocido el
valor de la temperatura de la unión de referencia. Los métodos que tienen en cuenta la
temperatura de referencia para contrarrestarla se denominan métodos de compensación.
El primer método utilizado (tradicional) consistía en mantener la unión de referencia a en un
baño de agua y hielo, con lo que se asegura que la unión de referencia está a cero grados
centígrados (Fig. 1.2).
Figura 1.2 Compensación Tradicional
MEMORIA DESCRIPTIVA Pag. 7
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Estudiando este sistema, se ha creado una tabla muy precisa, donde se relaciona el voltaje
del termopar producido y la temperatura de este para estas condiciones, por lo que es fácil
precisar la temperatura del termopar utilizando esta tabla. Además los valores de dicha tabla
pueden obtenerse con bastante exactitud mediante la utilización de cálculos polinómicos.
Aunque este método es bastante exacto no siempre es práctico llevarlo a la práctica.
Actualmente, con los desarrollos de la electrónica se pueden utilizar otros métodos de
compensación. Un segundo método consiste en medir la temperatura de la unión de referencia
con un sensor directo, obtener la tensión que produciría el termopar suponiendo que la unión de
referencia estuviese a cero grados y la unión termopar a la temperatura ambiente, y añadir está
tensión a la tensión producida por el propio termopar. De esta forma se pueden utilizar los
cálculos estudiados para el método tradicional de compensación. Este tipo de compensación se
denomina compensación de unión fría. Esta se puede implementar por hardware, variando la señal
analógica (amplificadores operacionales), o por software, mediante cálculos que realiza el un
ordenador.
1.3.1
Sensores de temperatura utilizados como referencia
En la compensación de unión fría se necesita conocer la temperatura de la unión de
referencia del termopar, por ello se necesita utilizar un sensor de temperatura auxiliar. Los
sensores térmicos más corrientes que se suelen utilizar en la compensación del termopar son los
siguientes:
1. Termistores. Básicamente son resistencias sensibles a la temperatura (transductor
resistivo) .Los hay de una gran variedad de formas y materiales. Los hay de dos tipos:
coeficiente de temperatura negativo (NTC), su resistencia disminuye al incrementarse
la temperatura, y de coeficiente de temperatura positivo (PTC), su resistencia aumenta
al incrementarse la temperatura, aunque este tipo es mucho menos utilizado que el
anterior, ya que la mayoría de los utilizados en aplicaciones de medida son NTC. Su
rango es de -100ºC a +450ºC. Precisión de ±0.1 ºC de -40 ºC a 100 ºC. Son un
poco no lineales.
2. RTD. Similar a las termistores, también son transductores resistivos dependientes de
la temperatura, a diferencia de los termistores (mayoritariamente) son PTC. Se suelen
llamar según la temperatura que tenga a 0ºC, así una PTC100 tiene 100 Ω a 0ºC.
Rango de temperaturas de -250ºC a 900ºC. Con una precisión de ±0.1 ºC para un
amplio margen de temperaturas, pudiendo llegar a ±0.01 ºC. Son casi lineales, pero
su precio es mucho mayor que los otros métodos.
3. Diodos y Transistores. Varían el voltaje en las uniones con la temperatura, por tanto
pueden usarse como medidores de esta. Rangos de -270 ºC a 175 ºC .Para un rango
de -55 ºC a -125ºC tienen una precisión de ±5 ºC o incluso ±2 ºC. La principal
característica de estos es su muy bajo coste.
MEMORIA DESCRIPTIVA Pag. 8
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
4. Sensores circuito integrado. Son una extensión de lo anterior pero con circuitería de
condicionamiento de señal y calibración ya integrado durante su fabricación. Permiten
un rango de -85ºC a 125ºC. Con una sensibilidad de hasta 0.2ºC-0.4ºC. Son
lineales. Coste bajo.
Tabla 1.2 Tabla comparativa de los diferentes sensores de temperatura
MEMORIA DESCRIPTIVA Pag. 9
PROYECTO
1.3.2
DATA
LOGGER
PARA
TERMOPAR
Compensación de unión fría por hardware
La compensación por hardware agrega a la tensión producida por el termopar una tensión
proporcional a la temperatura de referencia, que produciría el termopar en cuestión si tuviera una
tensión de referencia de cero grados, y la unión caliente estuviese a la temperatura ambiente. Con
esta adición la tensión resultante ya no depende de la temperatura en la unión de referencia y
representa la temperatura del objeto a medir en términos absolutos.
Aunque existe una relación no lineal entre tensión y temperatura en el termopar, para
determinados valores, esta proporcionalidad es casi lineal. Por lo que puede aproximarse la
proporcionalidad tensión-temperatura a una relación lineal.
La compensación por hardware tiene el inconveniente respecto de la de software que
suele ser menos precisa, principalmente porque suelen utilizarse aproximaciones simples de la
proporcionalidad no lineal, y necesita una red específica de compensación para cada tipo de
termopar, pero no necesita, en cambio, la utilización de ningún sistema computacional, además
dichas aproximaciones suelen ser válidas para muchos casos.
1.3.2.1 Método obtención de la temperatura del horno previo al proyecto (AD595)
En el Laboratorio de Sensores de Gases se utiliza un circuito que realiza la compensación
por hardware. Este circuito está formado principalmente por un integrado AD595 que es a su vez
realiza las funciones de amplificador de instrumentación y compensador. El integrado suministra
una salida de 10mV/ºC directamente proporcional a la señal del termopar de tipo K, aunque su
error es de ± 3ºC para un rango de temperaturas entre 0 y 50ºC, siendo mayor para
temperaturas superiores.
El presente proyecto intenta obtener las temperaturas a través de otro compensador, para
intentar reducir el error en las mediciones.
1.3.3
Compensación unión fría por software
La compensación la realiza el ordenador mediante cálculos una vez conoce las variables del
sistema. Suele ser mucho más precisa que la compensación por hardware ya que al utilizar un
ordenador, se utilizan aproximaciones polinómicas de alto grado con lo que se reduce el error.
Para este sistema de compensación es necesario conocer la temperatura de referencia a
compensar (Tref) y el voltaje del termopar producido para esta referencia (VMEAS ). Si estos datos
son conocidos, se aplica la ecuación (1.1)
VTC(TTC)=VMEAS+VTC(Tref ) (1.1)
Para aplicar la ecuación (1.1) deben seguir los siguientes pasos:
MEMORIA DESCRIPTIVA Pag. 10
PROYECTO
-
-
-
DATA
LOGGER
PARA
TERMOPAR
Medir la temperatura en la unión de referencia, Tref
Convertir esta temperatura en un voltaje equivalente, VT C(Tref). Se desea añadir la
temperatura ambiente a la tensión producida por el termopar. Para ello se transforma esa
temperatura en una tensión que habría producido el termopar, asumiendo que Tref sería la
temperatura en la unión termopar y que la unión de referencia hubiese una temperatura de
0 ºC. Para ello se usa la tabla polinomios del termopar (compensación tradicional).
Añadir el voltaje equivalente, al voltaje producido por el termopar, VMEAS . y así se
obtiene el verdadero voltaje que produciría el termopar en circuito abierto con una unión
de referencia de 0 ºC, VT C(TT C)
Finalmente se convierte el voltaje en temperatura, este valor es la temperatura del
termopar TT C, mediante otra tabla de polinomios correspondiente al termopar.
Para realizar este método, se requieren dos tipos de equivalencias, una equivalencia de
temperatura en voltaje y otra de voltaje en temperatura. Para realizar estas equivalencias se usará
bien un cálculo polinómico o una tabla de referencia. Los cálculos polinómicos a realizar aparecen
en las ecuaciones (1.2) y (1.3). (1.2) Transforma la temperatura en tensión y (1.3) transforma la
tensión en temperatura. En las ecuaciones c0, …, cn y d0, …, dn son coeficientes que dependen
del termopar utilizado. Los valores de estos coeficientes para cada termopar utilizado pueden
verse en el ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES del
presente proyecto.
V= c0 + c1T + c2T2 +...+ cnTn
(1.2)
T= d0 + d1V + d2V2 +...+ dnVn
(1.3)
La ecuación (1.2) es válida para todos los termopares excepto para los de tipo K si la
temperatura (T) es superior a los cero grados centígrados, en cuyo caso la ecuación a aplicar
sería la (1.4). Donde a0, a1, a2 son coeficientes del termopar K, al igual que lo son ci .
i= 0
(
V = ∑ ci ·T + a o exp a1 (T − a 2 )
i
2
) (1.4)
n
Normalmente, en los programas utilizados, para evitar las potencias y hacer las menos
operaciones posibles, se calculan las potencias de las ecuaciones (1.2) y (1.3) mediante
multiplicaciones sucesivas. Por ejemplo si tomamos hasta el cuarto grado la ecuación (1.3)
quedará:
T= a0 +V(a1+V(a2+V(a3+Va4)))
(1.5)
MEMORIA DESCRIPTIVA Pag. 11
PROYECTO
2
DATA
LOGGER
PARA
TERMOPAR
Objetivos
Para el presente proyecto se desea diseñar y elaborar un data logger. El data logger
adquirirá y almacenará datos para que posteriormente pueda volcarlos a un ordenador personal.
Se ha desarrollar tanto el hardware como el software que se necesite para el sistema.
La compensación del sistema será una compensación de unión fría por software. Los
cálculos de la compensación los realizará el ordenador, aprovechando así su alta capacidad de
cálculo. Para que realice los cálculos de compensación el data logger habrá de transferirle la
tensión producida por el termopar y la temperatura de la unión de referencia (ver apartado 1.3.3).
Por tanto el data logger adquirirá y almacenará las dos señales de tensión, la tensión producida
por el termopar y la temperatura ambiente.
Las señales a adquirir son señales analógicas, por lo que se necesita un conversor
analógico-digital que transforme las señales analógicas en señales digitales. Lo ideal sería que
tanto la temperatura ambiente como la tensión producida por el termopar se adquirieran a la vez,
pero como esto no es posible, existe un pequeño retardo entre ambas medidas que será
insignificante a efectos prácticos. El tiempo de muestreo de las señales será constante durante el
periodo que dure la adquisición.
Una vez adquiridas las señales se han de almacenar en una memoria. Esa memoria debe
ser una memoria no volátil para permitir así, que los datos contenidos en la memoria no se pierdan
al desconectarse la alimentación.
Posteriormente a la adquisición los datos almacenados han de poder ser trasvasados al
ordenador. Para transferir los datos entre el data logger y el ordenador se utilizará la
comunicación más simple que posee el ordenador, la comunicación asíncrona vía RS-232, usando
el puerto serie. Para gestionar toda la parte digital del data logger, anteriormente citada, se
utilizará un microcontrolador.
Se ha decidido que el hardware del data logger se adecue para la adquisición de un
termopar tipo K, que es el que se dispone en el laboratorio de sensores de gases, para los rangos
de medida con los que se trabaja en el horno. Siguiendo los rangos de trabajo del horno los
rangos de medida del termopar son:
-
Temperatura mínima: La temperatura ambiente.
-
Temperatura máxima: Unos 1100ºC, la máxima temperatura alcanzable por el horno.
Se ha decido en cambio que el software de compensación del data logger no se limite
sólo a ese termopar en concreto y a ese rango de medida, sino que permita la compensación de
diferentes tipos de termopares en todo su rango de medida. De esta forma se consigue que con
MEMORIA DESCRIPTIVA Pag. 12
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
un voltímetro de precisión y un sensor de temperatura ambiente se pueda calcular fácilmente
usando un ordenador la temperatura que capta un termopar. Además así, si se amplia el hardware
del data logger para permitir la adquisición de estas señales, el software ya estará preparado. El
software de compensación permite la compensación de los termopares tipos: B, E, J, K, N, R, S,
T.
El data logger ha de poder alimentarse tanto a través de una fuente de tensión laboratorio,
de esta forma se consigue mayor precisión con las tensiones de trabajo del data logger, o con una
fuente de alimentación que sea diseñada para este proyecto.
El data logger ha de ser un sistema simple y sencillo, por lo que para su utilización se
deben requerir solamente unas pocas señales de mando (marcha, adquisición, reset…). La
información del data logger sobre la acción que está desarrollando también ha de ser discreta, y
ceñirse únicamente a unos pocos leds.
2.1
Herramientas utilizadas
Para la implementación de los circuitos necesarios en el sistema (hardware) se utilizarán
placas de circuitos impreso, que serán diseñadas para poder realizar las funciones requeridas. Las
principales placas se implementarán en forma PCB utilizando el programa Orcad que permite el
diseño de tales circuitos y además es el disponible en la universidad. Una vez elaboradas las PCB
estas se colocarán en una caja conjuntamente con los elementos externos que deban sobresalir de
la caja (conectores, interruptores, leds…)
El software del sistema estará formado por los programas presentes en el microcontrolador y
en el ordenador. El programa del microcontrolador estará diseñado utilizando únicamente el
lenguaje ensamblador (el de los micros PIC, como posteriormente se indicará) porque de esta
forma, se consigue una más eficiente gestión de los recursos del microcontrolador. Además en los
laboratorios no se dispone actualmente de otro lenguaje de más alto nivel, C por ejemplo. En
concreto el ensamblador utilizado es el MPASM del entorno MPLAB. Estas herramientas
pueden obtenerse gratuitamente en la página de internet de microchip.
El programa del ordenador se ejecutará en el sistema operativo Ms-Dos, permitiendo así que
pueda utilizarse en cualquier ordenador personal. Deberán programarse en C, ya que este
lenguaje es un lenguaje de alto nivel, facilitando así su programación, pero permite acceder
también a recursos de bajo nivel, como las interrupciones del ordenador (temporizador, puerto
serie…). El programa utilizado en concreto para compilar los programas es el Turbo C++ de
Borland, y aunque este programa permite la utilización de código C++ simplemente se ha utilizado
código C estándar.
MEMORIA DESCRIPTIVA Pag. 13
PROYECTO
3
DATA
LOGGER
PARA
TERMOPAR
Descripción funcional del data logger
El corazón del data logger debe ser un microcontrolador, y para tal efecto se ha elegido
como controlador del sistema, el PIC16F873 de Microchip. Dicho microcontrolador además de
permitir realizar todas las funciones requeridas en el proyecto, está disponible tanto el
programador como el software necesario para su programación en los laboratorios de la escuela.
Para realizar la compensación de unión fría se necesita utilizar un sensor auxiliar que mida la
temperatura en la unión de referencia. Para medir lo más fielmente posible la temperatura en la
unión de referencia, lo más conveniente es que el sensor auxiliar esté lo más próximo posible a la
unión entre el termopar y el data logger. Se ha escogido utilizar un sensor de temperatura
integrado totalmente lineal, por ser esta la solución más fácil y económica. El sensor elegido es el
LM35 que proporciona una tensión de 10 mV por cada grado centígrado, con un pequeño error
inferior al 1 ºC
El PIC16F873 posee un conversor analógico-digital de diez bits integrado en el mismo
microcontrolador. Para utilizarlo simplemente se interactúan sobre determinados registros de
memoria del microcontrolador. Se utilizará dicho conversor para efectuar la adquisición de las
señales, la tensión proporcionada por el termopar y la tensión resultante en el sensor auxiliar. Las
tensiones producidas por los sensores son muy pequeñas, por lo que deberán ser amplificadas
para poder aprovechar al máximo las tensiones de trabajo del conversor.
Para controlar el tiempo entre adquisiciones se utilizarán dos módulos de temporización de
los que posee el microcontrolador. Uno controlará el tiempo de muestreo, finalizándose este se
iniciará la conversión de uno de los canales del conversor analógico. El otro temporizador
controlará el retardo entre las señales del termopar y del sensor auxiliar, que obviamente deberá
ser menor que el tiempo de muestreo; cuando finalice este tiempo se iniciará la conversión del
otro canal. Ambos temporizadores están mapeados a memoria en forma de registros, y deberán
utilizarse para gobernar el funcionamiento de estos. Se permitirá al usuario poder variar el tiempo
de muestreo.
La memoria no volátil que se utilizará para almacenar las tensiones digitalizadas procedentes
de los dos sensores utilizados será una EEPROM. En concreto una EEPROM serie que se
comunique con el microcontrolador mediante el bus I2C. Este tipo de memorias sólo utilizan dos
señales de datos, liberando recursos al microcontrolador y reduciendo el número de pines
necesarios respecto de otro tipo de memorias EEPROM. Hay muchas memorias serie que se
comunican mediante el bus I2C en el mercado, normalmente modelos M24X. Estas memorias
suelen tener idéntico patillaje y lo único que las diferencia es la capacidad de estas. El programa
está diseñado para poder utilizar diversos modelos de memoria EEPROM serie I2C,
aprovechando que la conexión de todas estas memorias es idéntica. Para controlar el periférico es
muy útil que el microcontrolador gestiona la comunicación serie I2C vía hardware (control de
MEMORIA DESCRIPTIVA Pag. 14
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
tiempos, generación de interrupción…), mediante un módulo llamado SSP (comunicación serie
síncrona periférica), por lo que para utilizar dicha comunicación únicamente se habrá de acceder a
determinados registros en la memoria.
Para la comunicación entre el data logger y el ordenador se utiliza la comunicación serie
asíncrona universal (USART), llegándole al ordenador señales con las especificaciones de
tensiones RS-232. También aquí la gestión de tiempos, interrupciones… es controlada por
hardware y la programación de este módulo (USART) se limita a manejar registros de memoria.
El microcontrolador PIC16F873 posee una pequeña memoria EEPROM, que aunque
insuficiente para albergar las adquisiciones producidas, permite guardar parámetros del sistema:
tiempo de adquisición, tipo de memoria EEPROM,… Al no ser fijos estos parámetros puede
adaptarse el sistema a múltiples configuraciones. Nuevamente la gestión de este módulo se realiza
a través de registros. Dichos registros específicos al igual que otros de generales, sin función
preconcebida, se encuentran en la memoria RAM del microcontrolador para poder ser utilizados
si
los
requiere
el
programa
del
PIC16F873.
El microcontrolador posee puertos de E/S que se utilizarán para conectar a ellos los
interruptores digitales como entradas, y los leds como salida. Los puertos también están
mapeados a memoria.
3.1
Funciones del data logger
El data logger puede funcionar de forma que realice una de las tres actividades siguientes:
-
Adquisición y almacenamiento de temperaturas. Se adquieren la tensión producida
por el termopar y la tensión procedente del sensor auxiliar de temperatura y se
almacenan en la memoria EEPROM.
-
Transmisión de temperaturas. Las señales guardadas en la EEPROM son leídas y
posteriormente enviadas al puerto serie del ordenador.
-
Cambio parámetros del sistema. El ordenador envía a través del puerto serie nuevos
parámetros de configuración del data logger (tiempo de adquisición, memoria ...) que
sustituyen a los anteriormente guardados en la EEPROM interna del microcontrolador
Para seleccionar una u otra actividad se utilizarán los conmutadores de selección de
actividad. Si una actividad se inicia, se activará el led señalizador de esa actividad, al igual que se
apagará cuando se finalice.
3.1.1
Entradas y salidas del data logger
Las señales de mando permiten acceder a las actividades anteriores son:
MEMORIA DESCRIPTIVA Pag. 15
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
-
Marcha/Paro. Inicia la actividad del data logger, si está a nivel alto iniciará el proceso
determinado por las otras señales.
-
Conmutación de Programación/Normal. Si está activo se iniciará un ciclo de
modificación de los parámetros internos de configuración al iniciarse marcha, si no, se
tendrá en cuenta el estado del segundo conmutador. Por tanto esta señal es prioritaria
respecto a la próxima señal.
-
Conmutación de Adquirir/Transmisión. Si no está activo programación, y el
conmutador está a cero se iniciará un ciclo de adquisición de temperaturas y
almacenamiento al pulsarse marcha, o si no, si el conmutador está a uno, modo
normal y se pulsa marcha, se inicia uno de transmisión de las temperaturas
almacenadas en la adquisición previa.
Tales señales estarán implementadas en forma de conmutador. También dispone el
sistema de un pulsador de reset que al pulsarlo reinicia el programa presente en el
microcontrolador.
Los visualizadores serán análogos a las opciones indican la actividad que está realizando
el microcontrolador. Si no hay ningún led encendido indicará que el sistema está inactivo:
3.2
-
Visualizador de Programación. Cuando está encendido representa que el sistema está
ejecutando un ciclo de programación.
-
Visualizador de Adquisición. Cuando está encendido representa que el sistema está
ejecutando un ciclo de adquisición
-
Visualizador de Transmisión. Cuando está encendido representa que el sistema está
ejecutando un ciclo de transmisión.
Diagrama de bloques del funcionamiento del data logger:
El diagrama funcional del sistema a implementar está representado en la fig 3.1
MEMORIA DESCRIPTIVA Pag. 16
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
INICIO
1
MEMORIA
EEPROM
LM35/TO
1
VS+
VOUT
2
4
PROGRAMACIÓN
/NORMAL
8
TMR1
5
COLA
RAM
ADQUISICIÓN/
TRANSMISIÓN
A/D
1
TMR0
PROGRAMACIÓN
4
8
5
TERMOPAR
USART
MSSP
I2C
ADQUISICIÓN
PIC16F873
TRANSMISIÓN
PC
MEM
EEPROM
M24X
Figura 3.1 Diagrama de bloques del data logger
Todos los elementos representados se encuentran dentro de la caja del data logger
excepto el ordenador personal.
El corazón del sistema es el microprocesador que gobierna todo el sistema. De el se
pueden distinguir diferentes módulos, los que utiliza el programa son:
-
La memoria RAM (GPR). Permite que se guarden datos temporales, por ejemplos
colas. El acceso a la memoria es el acceso más rápido de todos los módulos, por lo
que se utilizará para acceder a módulos más lentos y economizar tiempos.
-
La memoria EEPROM. Se guardan los datos de configuración del sistema, que se
utilizan para desarrollar los diferentes procesos que permite efectuar el data logger
-
TMR1. Controla el tiempo de muestreo, cuando se cumple el tiempo adquiere la señal
analógica.
-
TMR0. Controla el retardo entre la adquisición de una señal y la otra, cuando se
cumple el tiempo adquiere la señal analógica que quedaba adquirir.
-
A/D. Convierte las tensiones analógicas de los sensores en digitales cuando el timer lo
considera oportuno.
-
MSSP. Módulo que controla las comunicaciones serie síncronas I2C, que se utilizan
para comunicar el microcontrolador con la memoria EEPROM externa. En las
comunicaciones I2C el PIC es el maestro del bus.
-
USART. Módulo que se utiliza para realizar las comunicaciones asíncronas que se
realizan entre el PIC y el ordenador.
MEMORIA DESCRIPTIVA Pag. 17
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Las señales analógicas, que son amplificadas para que puedan ser leídas con exactitud
mediante el conversor, provienen de dos sensores:
-
LM35. Proporciona una tensión proporcional a la temperatura ambiente y situado en
la unión de referencia del termopar.
-
Termopar. Proporciona una caída de tensión proporcional a la diferencia de
temperaturas entre la unión “caliente” y “fría”.
Los mandos se utilizan para iniciar una actividad, si esa actividad es posible, se indica que
se lleva a cabo activando su correspondiente señalizador. Como ya se indicó anteriormente, y se
expresa en la figura hay tres mandos (Inicio, Programación/Normal, Adquisición/Transmisión) y
también tres señalizadores (Programación, Adquisición, Transmisión).
La EPROM M24X es donde se almacenan los datos de las temperaturas digitalizadas. Se
comunica al PIC a través del módulo SSP. En la comunicación serie el PIC será el maestro
(controla los tiempos) del bus y la memoria el esclavo.
El PC es el destinatario de la información almacenada en la EEPROM, le llegan al puerto
serie señales RS-232 que le llegan a través del módulo USART del microcontrolador
PIC16F873.
Una vez vistos los diferentes dispositivos que conforman el data logger se mostrarán cuales
son los que actúan en las diferentes actividades.
3.2.1
Configuración del sistema
En la figura 3.2 pueden observarse los diferentes elementos que intervienen en la actividad.
El ciclo de configuración del sistema se inicia si el data logger está inactivo, se activa el
conmutador de inicio y el conmutador programación/normal está en modo programación.
Entonces se enciende el señalizador de programación y se inicia la actividad.
El primer paso es esperar a que la USART reciba los datos procedentes del PC. Cuando
recibe uno, lo guarda en la memoria EEPROM interna del microcontrolador. La acción se irá
repitiendo hasta que se hayan recibido todos los datos y se hayan guardado en la memoria
EEPROM, entonces se considerará el ciclo acabado y se apagará el señalizador de
programación.
MEMORIA DESCRIPTIVA Pag. 18
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
INICIO
MEMORIA
EEPROM
PROGRAMACIÓN
PROGRAMACIÓN
USART
PIC16F873
PC
Figura 3.2 Ciclo de Configuración
3.3
Adquisición
En la figura 3.3 pueden observarse los diferentes elementos que intervienen en la actividad. El
ciclo de adquisición se inicia si el data logger está inactivo, se activa el conmutador de inicio, el
conmutador programación/normal está en modo normal y el conmutador adquisición/transmisión
está en modo adquisición. Entonces se enciende el señalizador de adquisición y se inicia la
actividad.
El TMR1 controla la adquisición del canal 0 y el TMR0 la del canal 1. Cuando los timers se
desbordan se inicia la conversión de las entradas analógicas. El tiempo de muestreo está contado
por el TMR1 y el retardo entre canales por el TMR0. Los temporizadores no trabajan
simultáneamente, cuando se cumple el tiempo de uno se inicia la cuenta del otro. La conversión
digital efectuada por el A/D se va guardando en la cola. Cuando la cola se considera llena se
trasvasan los datos de la memoria a la EEPROM utilizando el módulo MSSP. Cuando la memoria
EEPROM se llena se considera el ciclo acabado y se apaga el señalizador de adquisición.
MEMORIA DESCRIPTIVA Pag. 19
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
1
INICIO
LM35/TO
1
VS+
VOUT
2
4
NORMAL
8
TMR1
5
COLA
RAM
ADQUISICIÓN
A/D
1
TMR0
4
8
5
TERMOPAR
MSSP
I2C
ADQUISICIÓN
PIC16F873
MEM
EEPROM
M24X
Figura 3.3 Ciclo de adquisición
3.4
Transmisión
En la figura 3.4 pueden observarse los diferentes elementos que intervienen en la actividad. El
ciclo de transmisión se inicia si el data logger está inactivo, se activa el conmutador de inicio, el
conmutador programación/normal está en modo normal y el conmutador adquisición/transmisión
está en modo transmisión. Entonces se enciende el señalizador de transmisión y se inicia la
actividad.
Los datos almacenados en la memoria EEPROM se van extrayendo utilizando el módulo
MSSP, y son guardados temporalmente en la RAM, otra vez en forma de cola. Cuando la cola se
considera llena, se envían los datos a través de la USART al PC. Cuando se han leído todos los
datos almacenados en la memoria se acaba el ciclo y se apaga el señalizador de transmisión
MEMORIA DESCRIPTIVA Pag. 20
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
INICIO
NORMAL
COLA
RAM
USART
TRANSMISIÓN
MSSP
I2C
PIC16F873
TRANSMISIÓN
PC
MEM
EEPROM
M24X
Figura 3.4 Ciclo de transmisión
MEMORIA DESCRIPTIVA Pag. 21
PROYECTO
4
DATA
LOGGER
PARA
TERMOPAR
Descripción del hardware del proyecto
Para implementar el hardware que pueda realizar las funciones requeridas por el sistema se
han diseñado tres módulos hardware:
-
Módulo de Entradas/Salidas. En este módulo se encuentran las señales analógicas
procedentes del sensor de temperatura integrado y del termopar, tales señales son
amplificadas, permitiendo así aumentar la precisión de lectura del conversor analógico
digital. En este módulo también se encuentran las entradas digitales (conmutadores), y
las salidas digitales (visualizadores leds).
-
Módulo principal o data logger. Es el módulo donde tenemos localizado el
microcontrolador PIC16F873 y la memoria EEPROM por ejemplo. Al contener el
microcontrolador este módulo es el que controla todo el sistema
-
Módulo de Alimentación. Este módulo puede suministrar las tensiones de alimentación
del sistema. Estas tensiones son cinco y menos cincos voltios. También establece la
masa del sistema (GND).
Para albergar los módulos se utilizan cajas (chasis). El módulo E/S y el módulo principal
se encuentran dentro de una misma caja. El módulo de alimentación como es opcional su uso se
encuentra en otra caja. Por tanto en el proyecto a simple vista se podrán distinguir tres chasis:
4.1
-
Alimentación: Estará formada o por una fuente de laboratorio o por el módulo de
alimentación aquí diseñado. El módulo que se ha diseñado proporciona las tensiones
de +5 V, -5 V y 0 V
-
Data logger. En está caja se encuentran el módulo principal y el módulo E/S. Sobre la
caja se encontrarán los mandos y los señalizadotes con los que se interactúa con el
sistema
-
Ordenador. Dispondrá de al menos un puerto serie libre para conectar con el data
logger.
Chasis Data Logger
Por dentro la caja estará conectada tal como se ve en la figura 4.1. En la caja se encuentran
las placas de los dos módulos señalados, el principal y el de entradas/salidas. Externamente se
encuentran los siguientes elementos:
-
Conector RS-232. A el se conecta un cable null-modem (RS-232) que conectará al
data logger con el ordenador
MEMORIA DESCRIPTIVA Pag. 22
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
-
Bornes de alimentación: Hay 4 bornes con los que llega la alimentación al sistema: +5
V, GND, + Vcc, -Vcc. Son las alimentaciones de los amplificadores operacionales.
+Vcc debe tener un valor igual a +5 V o superior (hasta un máximo de unos 15 V)
-
Conmutadores. Los tres conmutadores para seleccionar la actividad: Inicio,
Programación/Normal, y Adquisición/Transmisión
-
Señalizadores: Los tres leds que indican la actividad: Programación, Adquisición y
Transmisión.
LP1
PROG
LP2
ADQ
LP3
TRAS
P1
5
9
4
8
3
7
2
6
1
SW4
1
2
M.ADQUISICIÓN
RESET
M.PRINCIPAL
J1
2
1
J2
+Vcc
2
2
2
TERMOPAR
J3
+5
J4
GND
J5
-Vcc
CONNECTOR DB9
1
3
1
3
1
3
INICIO
PRG/NOR ADQ/TRM
SW SPDT SW SPDT SW SPDT
Figura 4.1 Chasis Data Logger
4.2
Chasis Alimentación
Si no se pueden utilizar fuentes de tensión de laboratorio se ha diseñado un circuito de
fuente de alimentación que proporciona las tensiones en continua necesarias para que el data
logger funcione, a través de la tensión alterna de red. El circuito impreso se encuentra
resguardado en una caja, tal como puede verse en la fig. 4.2 en la que también pueden verse los
siguientes elementos:
-
Bornes de alimentación. Tres bornes de alimentación: +5 V, GND, -5 V.
-
Conector tensión de red. Conector al que se conecta un cable macho de tensión de
red, 220 V monofásicos alterna. Posee un fusible en su interior
-
Transformador. Transforma 220V en alterna a 9V y -9V. Las dos salidas del
transformador son las entradas para el módulo de alimentación.
MEMORIA DESCRIPTIVA Pag. 23
PROYECTO
DATA
LOGGER
PARA
T1
M.ALIMENTACIÓN
JP1
1
3
5
2
4
6
TERMOPAR
TRANSFORMER CT
ALIMENT+FUSE
J3
+5
J4
GND
J5
-5
Figura 4.2 Chasis Alimentación
4.3
Módulo Principal
El circuito implementado en el módulo principal está representado en la fig. 4.3
+5V
R2
2.2k
R1
2.2k
HEADER 5X2
9
1
20
JP3
13
8
11
10
1
3
4
5
2
6
VDD
C1 +
1uF
C2
1uF
+
+5V Y1
R1IN
R2IN
R1OUT
R2OUT
T1IN
T2IN
C1+
C1C2+
C2V+
V-
T1OUT
T2OUT
4 mHz
C9
15pF
C7
VCC
GND
4
5
P1
12
9
5
9
4
8
3
7
2
6
1
14
7
CONNECTOR DB9
GND
+5V
1 uF
+
15pF
GND
GND
1uF
WC
SDA
MAX232
C4
HEADER 3
GND
SCL
M24C16
GND
C3
+
+5V
U2
10
OSC1/CLKIN
MCLR/VPP/THV
PIC16F873
1
2
3
7
16
21
22
23
24
25
26
27
28
2
4
6
8
10
U3
6
15
+
1
3
5
7
9
11
12
13
14
15
16
17
18
VCC
HEADER 5X2
JP1
RA0/AN0
RC0/T1OSO/T1CKI
RA1/AN1
RC1/T1OSI/CCP2
RA2/AN2/VREFRC2/CCP1
RA3/AN3/VREF+
RC3/SCK/SCL
RA4/T0CKI
RC4/SDI/SDA
RA5/SS/AN4
RC5/SDO
RC6/TX/CK
RB0/INT
RC7/RX/DT
RB1
RB2
OSC2/CLKOUT
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
GND
2
3
4
5
6
7
GND
GND
2
4
6
8
10
19
8
1
3
5
7
9
8
U1
JP2
C5
1uF
GND
GND
GND
Figura 4.3 Módulo principal
De este módulo podemos diferenciar los siguientes bloques:
-
Microcontrolador: Formado por el PIC16F873 U1, el cristal de cuarzo Y1 y sus
correspondientes condensadores C9 y C7. Todos los demás contendrán algún pin del
micro
MEMORIA DESCRIPTIVA Pag. 24
PROYECTO
4.3.1
DATA
LOGGER
PARA
TERMOPAR
-
UART. Está formado por el MAX232 U2 y sus correspondientes condensadores
C1, C2, C3, C4, C5 y el conector DB9 P1. Permite la comunicación vía RS232
Nótese, como ya se profundizará más adelante, la numeración del conector DB9 (P1)
no corresponde con la habitual numeración de las líneas RS-232 (así el 1 sería el 5, el
4 el 2 y el 3 no varía)
-
I2C. Está formado por la memoria EEPROM U3 y las dos resistencias de pull-up del
bus
-
Conectores: Formado por los tres conectores JP1, JP2 y JP3. Los dos primeros
llevan entradas/salidas no conectadas en el módulo, y el tercero proporciona la
alimentación al módulo (+5 V, 0 V) y la señal de reset. Los dos primeros están
montados en un conector tipo bus de 10 pines y el tercero en un conector poste.
Bloque microntrolador
Se debía usar un microcontrolador por las características del sistema a implementar, y
para ello se ha escogido el PIC16F873 de Microchip, ya que puede realizar todas las funciones
requeridas para desarrollar el sistema, facilitando además su realización. Las principales
características del PIC16F873 son:
-
Procesador RISC. Juego reducido de 35 instrucciones con 14 bits de longitud. Todas
ellas se ejecutan en un ciclo de instrucción, excepto las de salto que pueden tardar
dos.
-
Arquitectura basada en bancos de registros. Todos los objetos están implementados
físicamente como registro.
-
4 K palabras de 14 bits para la memoria de código, tipo FLASH
-
128 bytes de memoria EEPROM y 192 bytes de memoria RAM como memoria de
datos.
-
Frecuencia máxima de 20 MHz.
-
22 líneas de entrada/salida
-
Hasta 13 fuentes de interrupción internas y externas.
-
Pila con 8 niveles.
-
Detección de baja tensión
-
ICSP. Permite la programación en serie del circuito
Dispositivos Periféricos internos integrados:
MEMORIA DESCRIPTIVA Pag. 25
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
-
Temporizadores: un temporizador de 16 bits, dos de 8 bits y un WDT
-
Conversor analógico/digital de 10 bits que permite hasta 5 entradas
-
Dos módulos de Captura-Comparación-PWM
-
USART. Puerto serie asíncrono.
-
SSP. Puerto Serie Síncono con SPI y I2C
Además comparativamente el PIC es los más baratos del mercado entre los de
características similares, tanto en el coste del integrado como en el de las herramientas, además la
mayoría de ellas pueden descargarse desde la página de internet de Microchip, es por esto que ha
sido el microcontrolador elegido.
Para realizar una la gestión de tiempos, que ha de ser bastante precisa se ha optado por
dotar al sistema oscilador de cuarzo que controlará el ciclo de instrucción del PIC16F873. Así el
esquema del sistema queda como sigue:
U1
9
1
20
11
12
13
14
15
16
17
18
10
OSC1/CLKIN
MCLR/VPP/THV
VDD
PIC16F873
GND
GND
21
22
23
24
25
26
27
28
RA0/AN0
RC0/T1OSO/T1CKI
RA1/AN1
RC1/T1OSI/CCP2
RA2/AN2/VREFRC2/CCP1
RA3/AN3/VREF+
RC3/SCK/SCL
RA4/T0CKI
RC4/SDI/SDA
RA5/SS/AN4
RC5/SDO
RC6/TX/CK
RB0/INT
RC7/RX/DT
RB1
RB2
OSC2/CLKOUT
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
19
8
2
3
4
5
6
7
+5V Y 1
4 mHz
C9
15pF
C7
15pF
GND
GND
GND
Figura 4.4 Bloque Microcontrolador
Para implementar un oscilador de cuarzo XT se necesita el propio cristal y dos
condensadores. Como la frecuencia elegida ha sido 4 MHz los condensadores escogidos son de
15pF, que están dentro del rango permitido para esta frecuencia de trabajo tal como se
MEMORIA DESCRIPTIVA Pag. 26
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
recomienda en el datasheet del microcontrolador. Nótese que el microcontrolador PIC16F873
tiene conexiones con todos los demás bloques del sistema.
4.3.2
Bloque UART
El integrado MAX232, estándar en industria, adapta las salidas de salida de la USART
del PIC ( 0 V- +5 V) al voltaje necesario para las especificaciones RS232, en concreto 0 V a –
10 V y 5 V a 10 V. El modelo elegido es de la casa Maxim, aunque hay otras marcas que
también lo comercializan como Texas Instruments. Las características más relevantes son:
-
Única fuente de tensión de 5V,
-
Necesita 5 condensadores externos de 1 µF para funcionar. Con ellos consigue pasar
desde una tensión de 5 V a +10 V y –10 V respectivamente
-
Permite el uso de 2 entradas / salidas
-
Velocidades de hasta 120 Kbps
El PIC16F873 gracias a su módulo USART que es capaz de enviar y recibir datos
asíncronamente siguiendo la norma RS-232-C. Para la comunicación utiliza dos líneas RC6/TX
(Transmisión) y RC7/RX (Recepción).Por estas líneas salen y entran señales típicas de una
comunicación asíncrona, bit de start, 8 bits de datos, bit de stop, pero están señales están
referidas entre 0 y 5 V; para que cumplan las especificaciones RS-232 el nivel bajo debe ser una
tensión negativa muy inferior a 0, ya a que este nivel de tensiones se considera que las líneas están
en reposo. Con el MAX232 y los condensadores electrolíticos se consigue adaptar las tensiones
de salida del micro de 0→-10 V y de +5→10 V. Mediante el conector DB9 podemos conectar
el módulo a un PC utilizando el típico cable NULL-MODEM. Este cable tiene la característica
que los terminales TX y RX de los extremos están cruzados, por lo que para el correcto
funcionamiento del sistema se debe utilizar cable de este tipo.
MEMORIA DESCRIPTIVA Pag. 27
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
U1
1
11
10
1
3
4
5
2
6
VDD
PIC16F873
C1 +
1uF
C2
1uF
+
R1IN
R2IN
VCC
13
8
OSC1/CLKIN
MCLR/VPP/THV
16
U2
10
R1OUT
R2OUT
T1IN
T2IN
C1+
C1C2+
C2V+
V-
T1OUT
T2OUT
5
9
4
8
3
7
2
6
1
14
7
MAX232
CONNECTOR DB9
GND
C3
+5V
C4
+
1uF
P1
12
9
15
+
20
11
12
13
14
15
16
17
18
GND
9
GND
GND
21
22
23
24
25
26
27
28
RA0/AN0
RC0/T1OSO/T1CKI
RA1/AN1
RC1/T1OSI/CCP2
RA2/AN2/VREFRC2/CCP1
RA3/AN3/VREF+ RC3/SCK/SCL
RA4/T0CKI
RC4/SDI/SDA
RA5/SS/AN4
RC5/SDO
RC6/TX/CK
RB0/INT
RC7/RX/DT
RB1
RB2
OSC2/CLKOUT
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
19
8
2
3
4
5
6
7
1 uF
+
C5
1uF
GND
GND
Figura 4.5 Bloque UART
El conector DB9 (P1) del esquema tiene una numeración diferente a la numeración de los
pines que se utiliza habitualmente para designar las líneas RS-232, en el esquema la numeración
va de abajo a arriba y en cambio la habitual es de arriba abajo. Así si se numerase de la misma
forma, el pin 1 sería el 5 GND, el 3 no variaría seguiría siendo en ambos casos TX, y el 4 sería el
2 RX.
4.3.3
Bloque I2C
El microcontrolador dispone de un módulo MSSP, que permite la comunicación serie
mediante el bus I2C.
En la comunicación serie modo I2C sólo se emplean dos líneas: SDA bidirecccional de
datos, y SCL que se encarga de transmitir los impulsos de reloj para la sincronización entre
dispositivos. Para implementar el bus I2C ambas líneas deben ir conectadas a sus respectivas
resistencias de pull-up.
Utilizamos el bus I2C para conectar el PIC16F873, que funciona como master (tiene el
dominio de la señal SCL) mediante sus pines RC4/SDA y RC3/SCL a la memoria EEPROM.
Las memorias EEPROM vía serie I2C, M24X tienen idéntico patillaje por lo que se
puede conectar cualquiera de ellas al sistema. Un ejemplo de estas memorias es la MC16 de ST-
MEMORIA DESCRIPTIVA Pag. 28
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Thompson, totalmente compatible con modelos de otras marcas como Microchip, y posee las
siguientes características:
-
Comunicación serie I2C, sólo necesita dos pines para comunicarse y velocidades de
100 kHz y 400 kHz. El que sólo utilicen dos pines para comunicarse permite un
encapsulado de 8 pines, bajando sensiblemente el coste del integrado frente a otras
memorias serie o paralelas.
-
Memoria de 2048 x 8 bits
-
Fuente de tensión de 4.5 V a 5 .5 V
-
Incremento automático de la dirección
-
Retención de la información durante más de 40 años y más de un millón de ciclos de
borrado/escritura
+5V
R1
2.2k
R2
2.2k
9
1
20
7
SCL
WC
VCC
GND
U3
6
SDA
4
11
12
13
14
15
16
17
18
M24C16
10
OSC1/CLKIN
MCLR/VPP/THV
VDD
PIC16F873
GND
GND
21
22
23
24
25
26
27
28
RA0/AN0
RC0/T1OSO/T1CKI
RA1/AN1
RC1/T1OSI/CCP2
RA2/AN2/VREFRC2/CCP1
RA3/AN3/VREF+
RC3/SCK/SCL
RA4/T0CKI
RC4/SDI/SDA
RA5/SS/AN4
RC5/SDO
RC6/TX/CK
RB0/INT
RC7/RX/DT
RB1
RB2
OSC2/CLKOUT
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
19
8
2
3
4
5
6
7
8
U1
Figura 4.6 Bloque I2C
4.3.4
Bloque Conectores
Para conectar el módulo principal con los otros módulos este dispone de tres conectores,
JP3 que un conector tipo poste que permite alimentar el módulo (+5 V,0 V) y también permite
MEMORIA DESCRIPTIVA Pag. 29
5
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
resetear el micro. Los otros dos conectores contienen todas las entradas o salidas que no se han
utilizado en los bloques anteriores, nueve en cada uno, son de tipo bus.
Todos los conectores provienen del módulo de adquisición. Del conector JP1 vendrán las
señales de temperatura, de los pulsadores/conmutador, y leds. Para el presente proyecto no se ha
utilizado las señales del microcontrolador presentes en el conector JP2, pero se ha creído
necesario juntarlas en un conector para poder utilizar dichas señales para una posible ampliación
del proyecto.
U1
2
4
6
8
10
2
3
4
5
6
7
HEADER 5X2
JP1
1
3
5
7
9
21
22
23
24
25
26
27
28
2
4
6
8
10
HEADER 5X2
9
1
20
JP3
OSC1/CLKIN
MCLR/VPP/THV
VDD
PIC16F873
1
2
3
+5V
RA0/AN0
RC0/T1OSO/T1CKI
RA1/AN1
RC1/T1OSI/CCP2
RA2/AN2/VREFRC2/CCP1
RA3/AN3/VREF+
RC3/SCK/SCL
RA4/T0CKI
RC4/SDI/SDA
RA5/SS/AN4
RC5/SDO
RC6/TX/CK
RB0/INT
RC7/RX/DT
RB1
RB2
OSC2/CLKOUT
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
GND
GND
1
3
5
7
9
19
8
JP2
HEADER 3
GND
Figura 4.7 Bloque conectores
4.4
Módulo de Adquisición
El esquema del circuito está representado en la figura 4.8
MEMORIA DESCRIPTIVA Pag. 30
11
12
13
14
15
16
17
18
10
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
JP5
4
3
2
1
GND
+5V
VV+
R 4 330
JP9
R 6 330
1
2
3
4
JP10
R14
10K
ALIMENTACIÓN FUENTE
R15
10K
R12
10K
1
3
5
7
9
+5V
U4
JP4
3
2
2
1
TERMOPAR
V+
5
1
8
R3
470
7
4
GND
6
+VIN VO
-VIN
2
4
6
8
10
LEDS
HEADER 5X2
REF
RG
RG
7
6
5
4
3
2
1
INA114
V-
V+
GND
+5V
JP6
V+
V-
R 5 330
R11
10K
ALIMENTACIÓN MICRO
JP8
R10 100
1
2
3
ENTRADAS
GND
GND
VS+
2
VOUT
3
2
+
U6
6
-
LM35/TO
JP7
DIODE
GND
2
1
+5V
RESET
OP-07
4
8
3
1
7
1
U5
+5V
D2
R8 1K
GND
3,9K
GND
R9
GND
V-
Figura 4.8 Módulo de Adquisición
De este módulo podemos diferenciar los siguientes bloques:
4.4.1
-
Termopar: Formado por el amplificador de instrumentación INA114 U4, el conector
del termopar JP4 y la resistencia para el amplificador R3. La salida del amplificador
se dirigirá hacia JP10.
-
Unión Fría. Formado por el sensor LM35 U5, el amplificador operacional OP07 y las
resistencias R8 y R9 de 1 kΩ y 3,9 kΩ respectivamente. La salida del amplificador
se dirigirá hacia JP10.
-
Reset, Fuente. Formado por el conector JP7, conector JP8, el diodo D2, La
resistencia R10 de 100 Ω, la resistencia R11 de 10 kΩ, el conector JP2. Aunque no
está en el esquema también se considera parte del bloque el destino del conector JP7,
el pulsador de reset
-
Conectores Pulsadores, Leds Micro. Formado por las resistencia R15,R14,R12 de
10 kΩ, las resistencia R4,R5,R6 de 330 Ω, los conectores JP6,JP9 y JP10. Aunque
no está en el esquema también se considera parte del bloque el destino del conector
JP6, las entradas digitales, el destino del conector JP9 los salidas digitales leds.
Bloque Termopar
Para amplificar la tensión del termopar se utiliza el amplificador de instrumentación
INA114 de la casa Burr-Brown. Este amplificador de instrumentación tiene como características
principales:
MEMORIA DESCRIPTIVA Pag. 31
PROYECTO
DATA
LOGGER
-
Bajo offset de tensión 25 µV
-
Baja Deriva de tensión: 0.25 µV/ºC
-
Alto rechazo en modo común: 115 dB
-
Amplio rango de alimentación: ±2.25 V a ±18V
TERMOPAR
U4
JP4
3
2
2
1
TERMOPAR
V+
PARA
5
1
8
R3
470
7
4
GND
+VIN VO
-VIN
6
REF
RG
RG
V+
VINA114
V-
Figura 4.9 Bloque Termopar
La amplificacación del amplificador de instrumentación, se ha configurado mediante la
resistencia R3 para que amplifique unas 108 veces la tensión del termopar, ver memoria de
cálculo apartado 1.3.
El amplificador de instrumentación está conectado a una tensión de alimentación negativa,
porque aunque no se pretende trabajar con tensiones negativas, si se trabaja con tensiones muy
pequeñas. Si la referencia negativa se pusiera a cero voltios, como el amplificador de
instrumentación no es common rail, no se pueden captar señales próximas a la tensión de
referencia, por eso se alimenta negativamente a los amplificadores, para anular la falta de
resolución sobre los cero voltios.
Si el termopar da una tensión negativa se producirá un error en la compensación del
termopar. Porque aunque el circuito acepta la entrada de tensiones negativas dando una tensión
de salida del amplificador de instrumentación también negativa, al llegar al conversor analógicodigital se leerá como la mínima tensión, en este caso 0 V, por lo que se lee una tensión errónea a
la que se produce. En teoría el termopar no debería suministrar tanta tensión como para que
amplificador se saturase positivamente.
4.4.2
Bloque Unión Fría
Esta formado por el sensor integrado LM35 que genera una tensión proporcional a la
temperatura en la unión de referencia, y el amplificador OP07 en forma de configuración no
inversora.
MEMORIA DESCRIPTIVA Pag. 32
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
+5V
+5V
GND
VS+
VOUT
2
3
2
+
6
-
LM35/TO
OP-07
4
8
3
1
U6
7
1
U5
R8 1K
GND
3,9K
R9
GND
Figura 4.10 Bloque unión fría
El LM35 es considerado uno de los sensores de circuito integrado estándar, esto es
debido a su bajo coste y su alta linealidad. Las características del integrado escogido más
relevantes son:
-
Su tensión de salida es proporcional a la temperatura en una proporción de 10
mV/ºC.
-
Su rango de funcionamiento puede estar comprendido entre -55ºC y +150ºC.
-
Su tensión de funcionamiento permite tensiones de 4 V hasta 30 V en contínua
-
El modelo LM35CZ tiene una precisión es ±0.4 ºC
El OP-07 es un amplificador operacional de bajo offset. Sus características más
importantes son:
4.4.3
-
Bajo offset de tensión 25 µV
-
Baja Deriva de tensión: 0.5 µV/ºC
-
Alto rechazo en modo común: 115 dB
-
Amplio rango de alimentación: ±3 V a ±18V
Bloque Reset, Fuente
El conector de alimentación del micro además de proporcionar la tensión de 5 V, y 0 V,
también proporciona el reset. Para implementar el reset se utiliza un pulsador, estando la señal de
reset normalmente a unos cinco voltios excepto cuando se pulse el pulsador, que pasará a ser
cero.
MEMORIA DESCRIPTIVA Pag. 33
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Como puede observarse en la figura donde debía colocarse un pulsador está colocado un
conector poste, esto es debido es que dicho pulsado no está colocado en la propia placa PCB
sino en el chasis, conectando el pulsador a la placa PCB mediante un cable.
+5V
R11
10K
ALIMENTACIÓN MICRO
JP8
R10 100
1
2
3
D2
DIODE
JP7
GND
2
1
+5V
RESET
GND
Figura 4.11 Bloque reset
En la siguiente figura puede observarse como la tensión proporcionada al módulo de
adquisición se obtiene mediante un conector poste que conecta el módulo con el otro módulo de
alimentación. De el se obtienen las tensiones de trabajo del módulo es decir las tensiones de
cinco, las tensiones de alimentación V+ y V- de los amplificadores operacionales, que serán de
cinco voltios y menos cinco voltios si se conecta al módulo de alimentación, y la masa del sistema
JP5
4
3
2
1
GND
VV+
ALIMENTACIÓN FUENTE
+5V
Figura 4.12 Bloque fuente
4.4.4
Bloque Conectores Pulsadores, Leds Micro
Para conectar los entradas y salidas digitales y comunicar tales señales al micro al igual
que las temperaturas, se utiliza el siguiente circuito:
MEMORIA DESCRIPTIVA Pag. 34
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
+5V
R4 330
JP9
R6 330
1
2
3
4
JP10
R14
10K
R15
10K
R12
10K
1
3
5
7
9
2
4
6
8
10
HEADER 5X2
LEDS
R5
330
GND
JP6
7
6
5
4
3
2
1
ENTRADAS
GND
Figura 4.13 Bloque conectores, pulsadores, leds
Los conmutadores en estado de reposo estarán a cero voltios, al igual que los conmutados,
el estado de los visualizadores dependerá obviamente del estado de las variables del programa
del micro que los controlan.
Al igual que ocurría con el pulsador de reset, en el circuito hay conectores donde debían
colocarse conmutadores o leds y en su lugar están colocados conectores poste, al igual que
anteriormente, esto es debido es que dichos elementos no están colocados en la propia placa
PCB sino en el chasis, conectados a la placa PCB mediante un cable.
4.5
Módulo de Potencia
Este módulo obtiene la alimentación a través de los conectores externos de tensión que se
pueden conectar a una fuente de tensión o al módulo de alimentación. Este módulo lleva la
alimentación hacia el módulo principal añadiéndole además la señal de reset.
Este circuito proporciona la alimentación necesaria para alimentar los restantes módulos,
las tensiones de cinco voltios, menos cinco y la masa. El circuito utilizado para implementar el
módulo es el siguiente:
MEMORIA DESCRIPTIVA Pag. 35
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
JP1
1
3
2
1
D1
U1
2
-
+
4
1
+
C1
2200uF
VIN
C2
100nF
GND
JP2
HEADER 3
VOUT
2
C3
100nF
D2
3
L7805/TO220
DIODE
HEADER 4
3
BRIDGE
1
2
3
4
1
GND
D3
+
4
3
+
C4
C5
100nF
VIN
VOUT
2
C6
100nF
1
-
GND
U2
2
D4
2200uF
DIODE
1
L7905/TO220
2
3
BRIDGE
GND
Figura 4.14 Módulo de potencia
También aunque no estén incluidos en módulo, también se ha considerado integrados la
toma de red, el fusible y el transformador que están sujetos al chasis y se conectan a este módulo.
El sistema se alimenta a través de una toma de corriente de 220 voltios en alterna,
monofásica. La tensión se lleva hacia el transformador mediante un cable de red, pero pasando
antes por un fusible.
El transformador reduce la tensión de 220 voltios a nueve voltios y reduce la corriente
máxima a 0,6 A, las tensiones de salida del transformador se conectan al módulo a traves del
conector JP1.
La tensión positiva del transformador en alterna será reducida por el transformador hasta
alcanzar los cinco voltios en contínua. Primero el puente de diodos rectifica la tensión del
transformador, después los condensadores C1 (electrolítico) y C2 (no electrolítico) la filtra, el
regulador de tensión 7805 regula la tensión de salida a 5 V y por último, el condensador C3
mejora la respuesta transitoria de la salida del regulador y su estabilidad.
Para la tensión negativa se realiza el mismo proceso aunque aquí se rectifica a partir de los
semiperiodos negativos de la tensión alterna del transformador en lugar de los positivos como se
realizaba en el anterior caso. D3, C4, C5, C6 son análogos a D1, C1, C2, C3. El regulador de
tensión 7905 se encarga de regular la tensión contínua negativa a la entrada del integrado a los
menos cinco voltios.
El conector JP2 sirve para llevar las alimentaciones de la fuente a los diferentes módulos
restantes.
El puente de diodos utilizado es el típico B40C1000, que permite una tensión máxima de 40 V y
una intensidad máxima de 1 A, aunque puede aguantar picos de 100 V y 45 A.
MEMORIA DESCRIPTIVA Pag. 36
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Los reguladores de tensión utilizados son el L7805 y el L7905 de la casa SGS-Thompson.
Tales reguladores están protegidos internamente contra cortocircuito. Su encapsulado T0-220
permite que se le pueda acoplar un disipador térmico ya que se suelen calentar si deben
suministrar intensidades altas.
Los diodos D2 y D4 impiden que si a la salida hay una tensión de signo contrario a la
suministrada por los reguladores de tensión, esto afecte a los reguladores, ya que si no existieran
tales diodos, esta situación podría ser muy perjudicial para ellos. Estos diodos son del tipo
1N4007.
MEMORIA DESCRIPTIVA Pag. 37
PROYECTO
5
DATA
LOGGER
PARA
TERMOPAR
Descripción software del proyecto
El software del proyecto controla el hardware anteriormente citado y está formado por
los programas:
5.1
-
Programa del microcontrolodar. Realizado en el lenguaje ensamblador del PIC, su
función es controlar todos los recursos que el sistema utilizará mediante el
microcontrolador, tanto los dispositivos internos del PIC como los dispositivos
externos.
-
Programa del ordenador. Realizado en C. Realiza los cálculos de compensación y
permiten modificar la configuración del data logger. Para realizar la compensación del
termopar se utilizan aproximaciones polinómicas con muchas multiplicaciones, por lo
que tales operaciones es mejor que las ejecute el ordenador, más sobrado de
recursos que el microcontrolador
Programa del PIC16F873
Se encarga de controlar las funciones del datalogger. El programa realizado se halla en la
memoria de programación del microcontrolador (FLASH). Las variables se guardan en la
memoria de datos RAM del microcontrolador. Algunas variables toman como valor inicial el valor
guardado en la EEPROM del microprocesador. Algunos recursos del microcontrolador son
controlados mediante interrupción (adquisición, recepción,…) y otros lo son por encuesta.
El programa está dividido principalmente en las tres actividades que debe ejecutar:
-
Recepción de configuración
-
Adquisición de temperaturas
-
Envío de datos almacenados
También otra parte fundamental del programa es la rutina de atención a las interrupciones,
que se genera al producirse una interrupción, provocando que se interrumpa momentáneamente el
desarrollo normal del programa.
5.1.1
Programa Principal. Selección de actividad
El algoritmo del siguiente trozo de programa está representado en la fig 5.1.
MEMORIA DESCRIPTIVA Pag. 38
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Lo primero que se hace en el programa es inicializar los recursos generales, tales como la
utilización de los puertos como entradas o como salidas, el ciclo de temporizador del timer 0 y la
velocidad del bus I2C.
MEMORIA DESCRIPTIVA Pag. 39
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Inicializaciones
Pulsador
Inicio ?
S
N
Programación?
S
N
Led Programación
A/D ?
RS232
S
N
Programación
Led Adquisición
Adquisición
Apagar Led
MEMORIA DESCRIPTIVA Pag. 40
Led Transmisión
Lectura Transmisión
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Fig 5.1 Algoritmo selección actividad
Una vez inicializados estos registros lo que hace el programa es comprobar el estado de los
conmutadores. Se espera a que se pulse el botón de inicio. Cuando esto se produce comprueba
el estado de los conmutadores de actividad para saber que actividad ha de realizar. La más
prioritaria es la de programación pero si no está activa realiza cualquiera de las otras dos,
transmisión o adquisición, según si el conmutador está a nivel alto o bajo. Si está a nivel alto se
producirá un ciclo de transmisión de datos hacia el ordenador, pero si está a nivel bajo se
producirá un ciclo de adquisición las señales analógicas. Cada vez que realiza una actividad
enciende el led correspondiente a dicha actividad. Cuando se acaba la actividad que estaba
realizando, entonces apaga el led correspondiente y vuelve a esperar otra vez que se le indique el
inicio de una nueva actividad, activando el conmutador de inicio.
5.1.2
Modificación de los parámetros de configuración
Si se escoge la opción de programación se escriben en la memoria EEPROM interna del
PIC16F873 los parámetros de configuración que se reciben vía puerto serie. Al escribir en
memoria se reemplazará cualquier valor anterior presente en la memoria por los nuevos valores
enviados. El algoritmo de esta rutina puede verse en la fig. 5.2.
MEMORIA DESCRIPTIVA Pag. 41
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Configuración
Inicializar
configuración
N
DIR MEM >
max_dir_mem
S ?
Restaurar
configuración
Retorno
Fig 5.2 Algoritmo configuración
Primero se inicializarán los recursos del sistema necesarios para la ejecución de esta
opción. La recepción de datos del puerto serie del ordenador, se realizará mediante el módulo
USART presente en el microcontrolador.
La llegada de datos a través del puerto serie, provocará una interrupción. La interrupción
leerá los datos recibidos y los guardará en la memoria EEPROM interna. Los datos se irán
guardando en posiciones consecutivas de la memoria al producirse la interrupción, incrementando
por tanto la dirección de la memoria EEPROM interna cada vez que se produce una interrupción.
La descripción de los parámetros guardados en la EEPROM aparece en la tabla 5.1. ,
pero para el uso concreto de cada una de las variables referirse a la memoria de cálculo. El
programa restará a la espera de que los datos recibidos sean igual al número de datos requeridos,
o sea que se hayan escrito todas las variables de configuración del data logger. Esto lo puede
comprobar comprobando si la dirección de la memoria EEPROM, señala o no una dirección más
elevada que la última dirección en que se guardará la última variable de configuración del sistema.
MEMORIA DESCRIPTIVA Pag. 42
PROYECTO
Posición
DATA
LOGGER
PARA
TERMOPAR
Contenido
0
Valor inicial del contador de la dirección de la EEPROM externa byte alto
1
Valor inicial del contador de la dirección de la EEPROM externa byte bajo
2
Valor inicial del contador de la dirección de la EEPROM externa en lectura
3
Tamaño de la página de escritura de la EEPROM externa
4
Tamaño máximo de la cola de escritura
5
Incremento byte bajo de dirección de la EEPROM externa
6
Incremento byte alto de dirección de la EEPROM externa
7
Valor inicial del contador para el TMR1
8
Valor inicial del contador para el TMR0
Tabla 5.1: Parámetros configuración EEPROM interna
Los datos que ha de recibir del ordenador serán nueve, los siete primero hacen referencia
al valor de inicialización para variables que se utilizan en el control de la EEPROM, y las dos
últimas para los temporizadores. El que se guarden en la EEPROM permite que se puedan
diferentes memorias y diferentes temporizaciones aumentando así la versatibilidad del sistema.
Cuando se hayan escrito todos los datos de configuración del sistema, se restauran los
recursos necesarios a su estado anterior a la ejecución de la configuración. Entre estas
restauraciones se incluirá la deshabilitación de la interrupción por recepción.
5.1.3
Adquisición temperaturas, almacenamiento EEPROM
El algoritmo de la función está representado en la figura 5.3. Si se escoge esta opción el
programa debe cada cierto tiempo convertir las señales analógicas a digitales y guardarlas en la
memoria EEPROM externa. Las señales analógicas a digitalizar son la tensión procedente del
termopar y del sensor de la temperatura ambiente LM35, aunque más concretamente la
amplificación de estás dos tensiones. El conversor utiliza dos entradas de adquisición, una por
sensor utilizado.
Como no se pueden digitalizar los dos canales a la vez, se utilizan dos temporizadores
para controlar el tiempo en la adquisición. Para controlar el tiempo de muestreo se utiliza el
temporizador TMR1 el cual provoca una interrupción cuando se cumple el tiempo prefijado,
MEMORIA DESCRIPTIVA Pag. 43
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
entonces se inicia la conversión de un canal. Para controlar el retardo entre una medida y la otra
se utilizará el temporizador TMR0, provocando también una interrupción al cumplirse el tiempo
prefijado e iniciándose la conversión del otro canal. Cuando se finaliza una conversión se produce
otra interrupción. Esta interrupción es la que es detectada por la rutina de adquisición y supone el
inicio de esta rutina. Los canales que se emplean en cada caso, son el canal cero para el LM35, y
el canal uno para el termopar, por tanto los temporizadores que provocarán el inicio de la
conversión de estos canales serán el TMR1 y el TMR0 respectivamente.
El PIC16F873 es un microcontrolador de ocho bits por lo que al realizar una conversión
analógica-digital el microcontrolador utiliza dos bytes de memoria para guardar los diez bits
resultantes. En un byte se guardan los ocho bits de mayor peso, y en otro byte los dos de menor
peso. Si se guardaran en memoria íntegramente los bytes que genera el conversor se produciría un
considerable derroche de espacio, ya que seis de los ocho bytes del último registro de memoria
de conversión no se utilizan. Por tal de aprovechar dicho espacio se ha decidido unir cuatro bytes
bajos de sólo dos bits significativos en un sólo byte. Así la memoria de la EEPROM estará
formada por sucesiones, expresadas en la tabla 5.2:
BYTE ALTO LM351 (LM110- LM102)
BYTE ALTO TERMOPAR1 (TC110- TC102)
BYTE ALTO LM352 (LM210- LM202)
BYTES BAJOS (LM101- LM100 -TC101- TC100-LM201- LM202-TC201- TC200)
BYTE ALTO TERMOPAR1 (TC110- TC102)
Tabla 5.2: Secuencia de información en memoria
El sistema guarda temporalmente las conversiones analógicas-digitales, siguiendo la
secuencia expresada en la tabla 5.2, en la memoria RAM. Se intenta aprovechar de esta forma, la
característica común en este tipo de memorias EEPROM que permite la escritura, en modo
página, de varios bytes a la vez. Así una vez la RAM contiene información suficiente como para
llenar una página de escritura, se enviará dicha información a la EEPROM I2C utilizando para ello
la comunicación propia del bus I2C. Esta forma de almacenamiento se considera una cola,
porque a la memoria se le accede de forma indirecta, a través de un índice de dirección, pudiendo
variar según los parámetros de configuración el tamaño de la página de escritura y por tanto el
tamaño máximo de la cola.
Para conseguir la secuencia de la tabla 5.2, primero se digitaliza la señal del canal
correspondiente al sensor LM35, posteriormente la del canal de termopar. Con estas dos
medidas ya se posee de información suficiente como para poder realizar la compensación
numérica, pero sólo se guardan del resultado de la conversión analógica-digital los bytes que
MEMORIA DESCRIPTIVA Pag. 44
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
contienen los bits de mayor peso de las respectivas conversiones en la cola, y se guardan en
registros temporales los bytes que contiene los bits de menor peso de la conversión. Se vuelven a
realizar dos conversiones más, ambas corresponden nuevamente al canal de entrada de la tensión
procedente del sensor de referencia LM35, y al canal de entrada de la tensión producida por el
termopar. Se guarda el byte alto de la primera de la dos últimas conversiones en la cola, el byte
bajo temporalmente en la RAM, al igual que el byte bajo de la última conversión. Como ya se
tienen todos los bits a agrupar, se unen los bits de menor peso de las cuatro conversiones en un
byte. Este byte se guarda en la cola, y por último se guarda el byte alto de la última conversión. El
resultado es que en la cola se agrupan los datos siguiendo la secuencia vista en la tabla 5.2
Según lo dicho anteriormente cada vez que se realiza una conversión se guarda un byte
en la cola, el byte alto de la conversión, excepto cuando se realiza la conversión del termopar de
la segunda medición, entonces se introducen dos bytes en la cola, uno que corresponde al byte
alto de dicha conversión y el otro corresponde a la unión de los bits de menor peso. Los datos se
van colocando en la cola hasta que esta llega en tamaño al de la página de escritura de la
EEPROM.
Este diferente incremento en la cola según se esté en ciclo de conversión u otro, puede
hacer que la cola pueda sobrepasar el tamaño de la página de escritura. Así por ejemplo, si sólo
queda un espacio en la cola para que esta iguale en tamaño el tamaño máximo de la página de
escritura de la EEPROM, si el siguiente ciclo corresponde a la conversión del termopar de la
segunda medición, al incrementarse en dos posiciones la cola, se puede sobrepasar el tamaño de
la página. Existen por tanto dos tipos de incrementos en la rutina, el anterior y el típico, que habría
ocurrido si para el caso anterior el ciclo de conversión no hubiera sido el del termopar de la
segunda medida, sino cualquier otro ciclo, no se hubiera superado la página y la cola quedaría
completada exactamente con el tamaño máximo que puede albergar la página.
MEMORIA DESCRIPTIVA Pag. 45
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Adquisición
Inicializar Adquisción
Inicializar Bucle
C
Inicializar Bucle
D
N
Conversión?
S
S
N
Canal 0?
Medida 0 ?
S
Medida 0 ?
S
N
N
TERMO1L
Canal 0, M 1
TERMO1L
Canal 0, M 0
LM352L
Canal 1
Agrupar y a cola
LM351L,TERMO1L,
LM352L, TERMO2L
LM351L
Canal 1
BYTE alto a cola
Cola llena?
S
N
A
MEMORIA DESCRIPTIVA Pag. 46
B
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Fig 5.3a. Algoritmo de adquisición
A
B
Escribir EEPROM
Cola llena?
S
último? primero
Escribir EEPROM
Cola quedan 16
D
Cola quedan 17
Dir baja
desborda?
S
Dir alta
desborda?
S
N
Restaurar Adquisción
C
Retorno
Fig 5.3b. Algoritmo de adquisición
MEMORIA DESCRIPTIVA Pag. 47
N
N
D
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Si se produce el caso de que la cola sobrepasa el tamaño máximo de la cola de escritura,
entonces se procede a vaciar la cola. Para vaciar la cola, los datos de la cola se envían a la
memoria EEPROM externa, por el bus I2C, utilizando para ello el módulo SSP del
microcontrolador. Al ser una cola, los primeros datos que se guardaron en la cola son los
primeros en ser enviados. Se enviarán tantos datos de la cola como quepan en una página de de
memoria, quedando en este caso un byte sin enviar. El byte que ha quedado sobrante se colocará
como el primero de la nueva cola, se reiniciará la cola, y el índice de la nueva cola se colocará en
la segunda posición. Si la cola no ha sobrepasado, pero si igualado el tamaño de la página,
simplemente se vaciará la cola y se reiniciará de momento vacía, estando el índice de cola
colocado en la primera posición de la cola.
La dirección de memoria de la EEPROM I2C, pueden ocupar según el tipo, más de un
byte, por lo que en este caso, serán necesarios dos bytes para indicar la posición a escribir.
Como la escritura se realiza empezando por las direcciones más bajas y se va incrementando
secuencialmente la dirección al escribirse una página, sólo será necesario incrementar el byte alto
cuando se produzca un desbordamiento del byte bajo, por lo que normalmente sólo habrá que
cambiar uno de los dos bytes de dirección, el byte bajo. Por tanto al escribir se deben utilizar dos
bucles que comprueben cuando se debe avanzar el byte alto de dirección y otro que compruebe
si se ha terminado de escribir la memoria. El ciclo finalizará cuando se complete la escritura de la
memoria, mientras tanto se irán escribiendo los datos en la memoria y incrementándose sus
direcciones en los dos bucles.
Cuando se finaliza la adquisición se deben deshabilitar las interrupciones tanto de los
temporizadoradores como del conversor analógico digital.
5.1.4
Lectura temperaturas almacenadas en la EEPROM, Transmisión
El algoritmo de esta rutina está reprensado en la figura 5.4.
Si se escoge esta opción con el conmutador, el programa debe leer toda la EEPROM
almacenada y transferirla al puerto serie. Durante el desarrollo del mismo, todos los recursos del
sistema se tratan mediante encuesta si se requieren, por lo que no se utilizan interrupciones.
Utiliza dos bucles igual que el apartado anterior debido a los dos bytes de dirección. En
uno al finalizarse el ciclo se incrementa el byte bajo de la dirección, y si este se desborda,
entonces se incrementa el byte alto y se reinicia el anterior bucle, acabando el ciclo cuando
también cuando se desborde el byte alto de dirección
La EEPROM permite una lectura secuencial de cualquier número de bytes en un solo
ciclo de comunicación por el bus I2C, pero debido a que la memoria del microcontrolador está
limitada, se establece un máximo de bits a leer inferior al máximo de memoria (normalmente 128
bytes). Los datos que se van leyendo se van guardando en una cola, del tamaño anteriormente
MEMORIA DESCRIPTIVA Pag. 48
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
citado. El utilizar la cola como medio intermedio entre la lectura y la transmisión permite poder
aprovechar esta característica, y por tanto minimizar el tiempo empleado.
El tamaño de esta cola de lectura, supera el número de bytes de la memoria de datos que
caben un solo banco de memoria, por lo que también será necesario utilizar el segundo banco de
memoria para almacenar los datos en la cola. Al incrementar las direcciones de la cola se ha de
controlar cuando se llega al segundo banco de memoria, porque en este caso, el índice indirecto
de la cola pasará a ser el de la primera área disponible de memoria del segundo banco, evitando
con este salto que se machaquen registros del sistema (SFR), ya que algunos de ellos están
situados al principio del segundo banco de memoria RAM, por lo que si no se produce este salto,
al incrementar la última posición del primer banco se accedería a ellos. Esta precaución
obviamente se dará en los dos ciclos en que se use la cola, es decir tanto en la lectura de la
EEPROM, como en la transmisión.
Para la lectura de la EEPROM se vuelve a utilizar el módulo SSP presente en el
PIC16F873, igual como se utilizó en la rutina anterior, pero en este caso se utilizan las rutinas de
lectura de la EEPROM y no las de escritura.
Para la transmisión dirigida al puerto serie del ordenador, se utiliza el módulo USART
presente en el microcontrolador. Así se transmiten uno a uno, por este módulo, todos los bytes de
la cola. Al final de cada transmisión se permite un cierto retardo para evitar posibles errores en la
transmisión de la información y asegurar así el correcto envío de esta, aunque no es necesario el
uso del retardo. Para estas temporizaciones se utilizará el TMR0, que a diferencia del apartado
anterior se tratará por encuesta.
El proceso a seguir es en este caso, es ir leyendo los bytes de la EEPROM mediante la
comunicación I2C, y guardando tales datos en la cola, uno a uno secuencialmente hasta llegar al
final de la cola. Esta cola se transmite al ordenador. Al finalizar la transmisión se reiniciará un
nuevo proceso, la cola se reinicia y se procederá a realizar la siguiente lectura, incrementando
para ello la dirección de memoria EEPROM. Se volverán a llenar la cola con los datos leídos de
la EEPROM, y se volverán a vaciar transmitiéndolos al ordenador. Este proceso se repetirá hasta
que se llegue al final de la memoria y por tanto se hayan acabado los dos bucles de dirección.
Una vez acabada la rutina se restablecerán las condiciones anteriores a la ejecución de
esta rutina.
MEMORIA DESCRIPTIVA Pag. 49
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Lectura, Transmisión
Inicializar Bucle
Inicializar Bucle
Proceso de
datos
N
S
Dir baja
desborda?
Dir alta
desborda?
S
N
Retorno
Fig 5.4.a. Algoritmo de transmisión
MEMORIA DESCRIPTIVA Pag. 50
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Procesar Datos
COLA = ini_bank 1
Leer EEPROM
COLA llega
a bank 2?
S
N
N
COLA = ini_bank 1
COLA llega
a fin ?
Leer EEPROM
S
COLA = ini_bank 1
COLA llega
a fin ?
S
Leer COLA
N
S
COLA llega
a bank 2?
COLA = ini_bank 1
N
N
COLA llega
a fin ?
Leer COLA
S
N
S
Retorno
MEMORIA DESCRIPTIVA Pag. 51
COLA llega
a fin ?
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Fig 5.4b. Algoritmo de transmisión
5.1.5
Interrupciones
El algoritmo de la rutina de interrupción puede verse en la figura 5.5. Hay cuatro posibles
causas de producción de interrupción, el desbordamiento del TMR0, el desbordamiento del
TMR1, la finalización de una conversión analógica-digital y la recepción de un dato enviado por el
puerto serie. Si se produce una interrupción y no se ha producido por ninguna de las
circunstancias anteriores se considera una interrupción espúrea.
Lo primero que se hace al entrar en una interrupción es guardar tanto el registro de estado
del microcontrolador, como el acumulador W, ya que ambos registros pueden ser modificados
por la interrupción y se desea que al volver de esta, estos registros conserven la información
anterior.
Los temporizadores se utilizan para controlar fielmente el tiempo de muestreo, TMR1, y
para controlar el retardo entre canales de adquisición. Al cumplirse el tiempo prefijado tanto para
el TMR0 como para el TMR1 se iniciarán las conversiones analógicas-digitales. Al finalizar el
tiempo asignado al primer temporizador se iniciará la conversión del canal cero y al finalizar el
otro temporizador se iniciará la conversión del otro canal, en este caso el canal cero.
Para evitar solapamiento no se utiliza la interrupción de los dos temporizadores a la vez.
Para evitar este problema, al atenderse una interrupción de un temporizador, se inhibe la
interrupción del mismo y se desinhibe la interrupción del otro. Así cuando se produce una
interrupción por el temporizador uno se inicia la conversión del conversor A/D, se inhibe la
interrupción del mismo y se permite la interrupción del temporizador cero. En cambio cuando se
produce una interrupción por el temporizador cero se inicia la conversión del conversor A/D se
inhibe la interrupción del mismo y se permite la interrupción del temporizador uno.
Aunque se inhiba uno de los temporizadores, deberá asegurarse que no se ejecute el trozo
de rutina de interrupción reservado a la interrupción del timer inhibido. Como los flags de
interrupción de los timers se activan al desbordarse el contador del temporizador aunque no esté
activa la interrupción de este, si simplemente se inhibe el timer, puede darse el caso de que se
ejecute la rutina de atención a las interrupciones por una acontecimiento diferente al del timer
inhibido; pero al examinar los flags de interrupción, como el flag del timer inhibido está activo, se
ejecute el trozo de rutina de la interrupción destinado al timer inhibido en lugar del trozo destinado
para el evento que provocó la interrupción. Para solucionarlo y diferenciar entre un flag que ha
sido fruto de una interrupción y otro que simplemente lo ha sido de un desbordamiento, se utiliza
una variable(bit) para cada timer, que se activará cuando se desinhiba una interrupción del timer y
se desactivará cuando se inhiba.
Como el tiempo de muestreo, que mide el TMR1, a menudo es superior al máximo tiempo
que puede temporizar el módulo, se utiliza una variable de incrementos para aumentar así el
MEMORIA DESCRIPTIVA Pag. 52
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
tiempo de temporización. Así cada vez que se produce una interrupción de este temporizador se
incrementa la variable. Cuando la variable de temporización llegue al máximo establecido, se
reiniciará la variable, se iniciará la adquisición, y la deshabilitación y habilitación anteriormente
mencionadas. Para el temporizador TMR0, no se requiere la utilización de ninguna variable
auxiliar, porque el tiempo de retardo que se busca, al ser un valor bajo se encuentra dentro de los
márgenes de duración de la temporización del TMRO. Idealmente este tiempo sería cero, pero es
necesario este retardo debido a que el conversor analógico-digital requiere cierto al menos cierto
retardo entre adquisición y adquisición.
IRQ
Guardar STATUS,W
S
IRQ no
overflow ?
S
TMR0 IRQ
?
N
N
A
Inicia A/D
Deshabilita TMR0
Habilita TMR1
B
Fig 5.5.a Algoritmo de interrupciones
MEMORIA DESCRIPTIVA Pag. 53
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
A
S
TMR1 IRQ
?
N
IRQ no
overflow ?
N
S
S
N_T1++
A/D Finalizada
A/D IRQ
?
N
N
N_T1
=max?
B
RX IRQ
?
S
S
N
N_T1=0
Lee RX
Inicia A/D
Escribe RX en
la EEPROM
Deshabilita TMR1
Habilita TMR0
Restaurar
STATUS,W
FIN
Fig 5.5.b Algoritmo de interrupciones
La finalización de una conversión analógica-digital produce una interrupción. En la que se
informa, mediante una variable, al programa principal de que hay un nuevo dato procedente de la
MEMORIA DESCRIPTIVA Pag. 54
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
conversión. En las anteriores interrupciones de los temporizadores no se informaba al programa
de ejecución normal de la existencia de estas interrupciones, ya que hasta que no se ha obtenido
el dato de conversión no se da el ciclo como completo.
Si es la interrupción por recepción se lee el dato recibido y se escribe en memoria
EEPROM interna. Seguidamente se incrementa la dirección de la memoria EEPROM para que en
la siguiente interrupción se ocupa la siguiente posición de dicha memoria. Al finalizar la
interrupción se restauran los registros guardados, el de estado y el acumulador, y se vuelve al
lugar donde se abandonó la ejecución del programa para atender la interrupción. Para el
programa en cuestión es una espera.
5.2
Programa en C
Con este programa se ejecutan todas las funciones asignadas al ordenador. La funciones
principales son realizar la compensación por software y permitir modificar la configuración del
data logger.
La comunicación con el data logger utiliza un puerto serie libre del ordenador, utilizando
señales RS-232, las propias para este puerto. La velocidad de transmisión preasignada es de
9600 bps. De las señales del RS-232 posibles sólo se tienen en cuenta TX, RX y GND
(transmisión, recepción y masa).
El programa utiliza tanto la interrupción del puerto serie, como la del temporizador
disponible en el ordenador, para controlar la recepción de datos por el puerto serie y la gestión
de tiempos respectivamente. Provocando una interrupción cuando se recibe un carácter.
Las rutinas utilizadas para la compensación del termopar no sólo se limitan al rango
utilizado o al termopar k, sino que permiten trabajar con otros tipos de termopar. Así se permite
el trabajo con termopares (B, E, J, K, N, R, S, T).
Siempre que el usuario procesa nuevos datos, tanto si han sido recibidos desde el data
logger o han sido introducidos mediante el teclado, se guardan esos datos en ficheros de texto,
para que estos puedan ser reutilizados en sucesivas ejecuciones del programa.
Los ficheros que se utilizan en el programa son los siguientes:
-
FICHCON. En él se guardan parámetros utilizados en la compensación del data
logger (Tensión alimentación, offset, …)
-
FICHTRM. En él se guardan los datos que se han enviado al data logger que se
guardaran en la memoria EEPROM interna del microcontrolador.
MEMORIA DESCRIPTIVA Pag. 55
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
-
FICHHEX. En él se guardan los datos que son enviados desde el data logger. Estos
bytes enviados son los bytes almacenados en la memoria EEPROM externa del data
logger.
-
FICHTXT. En él se guardan la temperatura, ya compensada, a la que se encontraba
el termopar
-
FICHVAL. En él se guardan la temperatura ambiente a la que se encontraba la unión
de referencia del termopar
-
FICHVOL. La tensión que produjo el termopar debido a la diferencia de temperatura
que se producía en los extremos del termopar.
La no falta de alguno de los tres primeros ficheros puede provocar un error de ejecución
del programa según sea la opción de ejecución del programa escogida.
5.2.1
Programa Principal
El algoritmo de este trozo de programa está representado en la figura 5.6.
MEMORIA DESCRIPTIVA Pag. 56
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
INICIO
Capturar parámetros de ejecución
N
N
ERROR
S
N
Op=5
Op ?
Op=1
Op=2
Op=6
Op=3
Capturar
configuración
S
Compensar
COM
Capturar
configuración
Op=4
Transmisión
Transmisión
FICHTRM
Configuración
S
Compensar
Manual
Compensar
FICHHEX
FIN
Fig 5.6 Algoritmo programa principal
El programa primero captura las opciones de ejecución del programa desde la línea de
comandos del sistema operativo MS-DOS. Al reconocer la línea de comandos el programa
deducirá que rutina deberá ejecutar. Si los datos son válidos, la rutina de análisis devuelve un
número que indica la opción de ejecución escogida, el puerto serie y el tipo de termopar utilizado.
Las opciones de ejecución son seis:
-
Compensación por software. Se cargan los parámetros de compensación guardados
en el fichero FICHCON, y si es correcto se irán compensado las temperaturas que
lleguen por el puerto serie, estos valores que lleguen se irán guardando en el fichero
FICHHEX, y las temperaturas adquiridas se irán guardando en los ficheros
correspondientes.
MEMORIA DESCRIPTIVA Pag. 57
PROYECTO
5.2.2
DATA
LOGGER
PARA
TERMOPAR
-
Compensación por software, a partir de un fichero. Igual que el anterior pero los
datos se extraen de un fichero FICHHEX. Esta opción permite por ejemplo si se
desean cambiar los parámetros de compensación no sea necesario volver a leer la
información del data logger
-
Transmisión configuración data logger. Se pregunta al usuario la información necesaria
para determinar los valores de la memoria de datos EEPROM que servirán como
configuración del data logger. La información solicitada (tiempo adquisición, memoria
EEPROM usada,…) se guarda en el fichero FICHTRM.
-
Transmisión configuración data logger, a partir de un fichero. Igual que el anterior,
pero no se pregunta al usuario, en su lugar se utiliza los datos guardados en fichero
FICHTRM que son los que se envían al data logger.
-
Modificarán los parámetros de la compensación. Se entran el valor de los parámetros
de compensación.
-
Compensación Manual. Se introduce manualmente la tensión producida por el
termopar y la temperatura ambiente de la unión de referencia, se aplican las fórmulas
de compensación y se devuelve la temperatura a la que se encontraba el termopar.
Configuración
Tanto la rutina de configuración como la de capturar configuración del diagrama anterior
se encargan de obtener los parámetros de configuración del programa ya sea a través del fichero
FICHCON o del teclado, en esta última rutina los datos obtenidos se guardan en FICHCON.
Los parámetros que contendrá el fichero FICHCON serán:
-
Puerto de comunicaciones. Será un número entero del uno al cuatro.
-
Vcc. Tensión máxima distinguible por el conversor A/D. Debe se un número (decimal)
entre 4.5-5.5
-
Voff. Tensión de offset del A.I. Número decimal.
-
Gref. Ganancia entre la entrada de la tensión procedente de la temperatura de
referencia y la salida del sensor. Número decimal.
-
Gter. Ganancia entre la entrada de la tensión procedente del termopar y la salida del
termopar. Número decimal.
MEMORIA DESCRIPTIVA Pag. 58
PROYECTO
5.2.3
DATA
LOGGER
PARA
TERMOPAR
Compensación
Para las dos primeras opciones se desean compensar datos. Se dará por finalizada la
actividad cuando no se deseen leer más datos del data logger o se haya acabado la transmisión
pulsando ESC para un primer caso; o cuando se haya llegado al final del fichero FICHHEX en el
otro caso.
La compensación de las temperaturas se hará simultánea a la lectura de datos, así cuando
se produzca la lectura de toda una secuencia de datos (tabla 5.2), se compensará esa secuencia y
se guardarán los resultados en los ficheros.
La tercera opción, la compensación manual, permite obtener la temperatura a la que está
el termopar si se indica la temperatura a la que está la unión de referencia y la tensión
proporcionada por el termopar.
5.2.3.1 Obtención Datos
La obtención de secuencias de datos es muy sencilla si se utiliza como fuente el fichero,
simplemente leer una línea de este, pero puede ser algo más compleja si la fuente es el propio
data logger.
El Algoritmo de obtención de datos desde el termopar está representado en la figura 5.7.
El data logger envía la memoria almacenada en la EEPROM externa secuencialmente empezando
por las posiciones iniciales de dicha memoria. Las conversiones analógicas-digitales son de diez
bits, pero los envíos son de ocho bits, por ello se necesitan al menos dos envíos para descifrar el
resultado íntegro que produjo la conversión. Para minimizar el espacio en la memoria EEPROM
se optó por enviar un byte formado por los dos bits de menor peso de las cuatro conversiones
analógicas-digitales, consiguiendo que en la memoria EEPROM no se requiera reservar bits de
memoria para “información basura”. De esta forma en una secuencia de información, véase tabla
5.2, habrá cuatro bytes que corresponden a los bits los ocho bits de mayor peso de cuatro
conversiones y un byte que agrupa los dos bits de menor peso de estas cuatro conversiones.
Cuando se completa la secuencia de datos se disponen de suficientes datos como para
realizar dos compensaciones y por tanto se obtendrá el valor de las dos temperaturas acaecidas
en dos instantes del termopar.
MEMORIA DESCRIPTIVA Pag. 59
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Obtener datos COM
S
N
IN=OUT ?
N
S
OUT=1024
OUT ++
OUT=0
N
T=1
Retorno
S
B. hi LM35 1
N
T=2
S
B.hi TERMOP 1
N
T=3
S
B.hi LM35 2
N
T=4
S
Byte bajo
B.hi TERMOP 1
T ++
T=0
Escribir byte
FICHHEX
Retorno
MEMORIA DESCRIPTIVA Pag. 60
Ciclo S
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Figura 5.7 Algoritmo obtención de datos
Cuando se recibe un byte se provoca una interrupción, y el dato se guarda en una cola
circular. Para controlar la posición de la cola se utilizan dos variables una indica la posición de los
últimos datos que han salido de la cola (out) y los últimos que han entrado (in). Cada vez que se
produce una interrupción aumenta in y cada vez que se realiza una compensación out. Por lo que
cuando in sea diferente de out significará que hay un nuevo datos a compensar.
Como el ciclo (ver Tabla 5.2) se repite sabiendo cual fue el último dato se sabe que
posición en el ciclo ocupa el dato actual. Así se obtendrá los cinco bytes del ciclo (LM351H,
TERMO1H, LM352H, byte bajo, TERMO2H). Después el programa recompondrá los datos,
uniendo bytes altos con bajos y aplicará la compensación.
Como la cola es circular cuando se llege a la última posición de la cola se pasará a la
primera posición.
5.2.3.2 Compensación de unión fría
Una vez se dispone de los cinco bytes que componen una secuencia de envío, el siguiente
paso es unir los bytes altos con sus correspondientes bits del byte bajo, de esta forma se pasa de
cinco bytes a cuatro números enteros. Para eso simplemente se rotará dos posiciones a la
izquierda el número byte alto y unirá con el byte bajo rotandolo hacia la derecha de forma que los
únicos bits significativos sean los dos últimos.
HIGH << 2 ⊕ LOW >> n = num (5.1)
n=6 para el primer LM35
n=4 para el primer termopar
n=2 para el segundo LM35
n=0 para el segundo termopar
Una vez aplicado (5.1) y obtenido las cuatro mediciones, el siguiente paso es obtener la
temperatura de referencia y la tensión que obtuvo el termopar en esos dos instantes, para ello se
utilizan las ecuaciones (2.9) y (2.10) de la memoria de cálculo. Para realizar la compensación
numérica se aplica la ecuación (1.1). La ecuación (1.1) requiere la utilización de dos cálculos
polinómicos para los cuales se aplicarán los coeficientes de aproximación ITS-90, una suma de
polinomios convertirá temperatura en tensión, y la otra lo contrario, tensión en temperatura. El
resultado obtenido al aplicar la ecuación (1.1) será en este caso, la temperatura del horno en ese
MEMORIA DESCRIPTIVA Pag. 61
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
instante medida a través del termopar. Una vez obtenidas, se guardan los valores de las
temperaturas del termopar ya compensadas en el fichero FICHTXT.
5.2.4
Transmisión
En esta opción envían los parámetros de configuración del data logger al mismo data
logger. Los datos a enviar serán los que el microcontrolador guarda en la memoria EEPROM
interna de que dispone. Estos datos se envían byte a byte en binario por el puerto serie. El
algoritmo de esta rutina está representado en la figura 5.8.
Transmisión
Inicializar TMR
INDICE=0
Obtención configuración D.L.
Guarda TABLA
INDICE=0
S
INDICE
=FIN?
Restaurar TMR
N
Retorno
S
TIEMPO
Envía TABLA
INDICE ++
N
Figura 5.8 Algoritmo de transmisión
MEMORIA DESCRIPTIVA Pag. 62
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Para evitar una posible pérdida o distorsión del envío por parte del microcontrolador, se
espera un cierto tiempo entre envíos. Para controlar este tiempo se utiliza la interrupción del
temporizador 8254 presente en el ordenador. Por tanto el primer paso será configurar los
registros de este integrado y la interrupción del mismo, debiendo restaurar al anterior estado del
sistema, antes de la ejecución de este programa, cuando se finalice el programa.
La única diferencia entre las dos rutinas que transmiten la configuración del data logger es
de donde obtienen los datos a enviar, del fichero o preguntando al usuario, y como se utiliza el
fichero FICHTRM, como lectura en el primer caso o como escritura en el segundo. El fichero
FICHTRM está compuesto por diferentes números en formato hexadecimal (bytes) y son los
mismos valores que contendrá la memoria de datos de la EEPROM interna del microcontrolador.
Tales campos son los valores iniciales que adoptan diferentes variables que utiliza el
microcontrolador (ver tabla 5.1)
Si el usuario desea utilizar unos nuevos valores de configuración para transmitirlos al data
logger, la rutina obtiene los datos a transmitir a partir de unas preguntas al usuario (las que se
vieron en el apartado 5.1.1.3). Una vez contestadas la preguntas se calculan los datos a transmitir
(ver memoria de cálculo, apartado 2.2.6.1) y se escriben los datos en el fichero FICHTRM para
que esos datos puedan ser reutilizados posteriormente, que previamente se abierto para escritura
y deberá cerrarse al finalizar la rutina. Ahora sólo falta enviar los datos al data logger para finalizar
la rutina.
Los byte a enviar son guardados en una tabla. Cuando la interrupción avisa que se puede
enviar un byte se envía el valor actual de la tabla y se incrementa el índice de la tabla. Este
proceso se repite hasta que el índice de la tabla llega al último valor, dándose por acabados los
envíos y acabada la rutina.
5.2.5
Interrupciones
Hay dos rutinas de servicio al la interrupción, una se provocará al detectarse la llegada de
un byte por el puerto serie, dicho puerto es controlado por un chip 8251 o alguno análogo al
mismo, y la otra al completarse el tiempo de temporizador del sistema, para ello se utiliza un
temporizador del tipo 8254.
5.2.5.1 Interrupción del puerto serie
El algoritmo de esta rutina está representado en la figura 5.9. La rutina de interrupción se
genera al recibir por el puerto serie, comprueba que se realmente se haya recibido el carácter. Si
se ha producido entra el carácter en la cola y se incrementa el señalizador de entrada in. Como es
una cola circular si de 1024 bytes si se alcanza este valor volverá al principio. Como en todas las
rutinas de servicio a la interrupción se acaban insertando un EOI.
MEMORIA DESCRIPTIVA Pag. 63
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Recibido Dato ?
N
S
Cola[in]=Dato
In ++
In=1024 ?
S
N
In=0
EOI
Figura 5.9 Algoritmo interrupción puerto serie
5.2.5.2 Interrupción del temporizador
La rutina de interrupción se genera al cumplirse el tiempo asignado al temporizador.
Como este tiempo suele ser muy pequeño, hasta que no se provocan diversas interrupciones no
se da por el tiempo por concluido. Para ello se utiliza una variable que se incrementa cada vez que
se provoca la rutina de servicio a la interrupción, cuando esta variable llega a un determinado
valor, se avisa al programa que se ha cumplido y se reinicia la variable. Como en todas las rutinas
de servicio a la interrupción se acaban insertando un EOI. El algoritmo de esta rutina está
representado en la figura 5.10.
MEMORIA DESCRIPTIVA Pag. 64
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
t ++
N
t = max_tiempo ?
S
t=0
TIEMPO
EOI
Figura 5.10 Algoritmo interrupción temporizador
6
Blibliografía
[1]
Aplication Note 043: Measuring Temperature with Termocouples. Travis Ferguson. National
Instruments
[2]
Curso C++. Salvador Pozo Coronado. http://c.conclase.net
[3]
El Universo Digital de IBM PC,
http://atc.ugr.es/docencia/udigital/index.html
AT
y
PS/2.
MEMORIA DESCRIPTIVA Pag. 65
Chiriaco
García
de
Celis.
DATALOGER PARA TERMOPAR
(PERFIL DE TEMPERATURA DE UN HORNO DE CINTA CON COMPENSACIÓN DE UNIÓN FRÍA)
MEMORIA DE CÁLCULO
AUTOR: Jesús Pablo Parrado Guardia.
DIRECTOR: Xavier Vilanova.
FECHA: Junio / 2003.
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
ÍNDICE
1
ERRORES....................................................................................................................5
1.1
Error Conversor A/D...........................................................................................................................................5
1.2
LM35.......................................................................................................................................................................5
1.3
Termopar K............................................................................................................................................................6
2
PROGRAMAS ..............................................................................................................8
2.1
Programa del PIC16F873...................................................................................................................................8
2.1.1
Variables ............................................................................................................................................................9
2.1.1.1
Registro STATUS ...............................................................................................................................10
2.1.1.2
Variables del programa .......................................................................................................................11
2.1.2
Programa principal.........................................................................................................................................13
2.1.2.1
Inicializaciones Puertos E/S...............................................................................................................13
2.1.2.2
Inicialización TMR0 ............................................................................................................................16
2.1.2.3
Inicialización SSP.................................................................................................................................18
2.1.2.4
Inicialización USART..........................................................................................................................21
2.1.3
Selección de Operación.................................................................................................................................23
2.1.4
Lectura de la EEPROM interna.....................................................................................................................24
2.1.5
Modificación de los parámetros de configuración ...................................................................................26
2.1.5.1
2.1.6
Incialización/Restauración Recepción vía USART ........................................................................26
Adquisición temperaturas, almacenamiento EEPROM ............................................................................29
2.1.6.1
Inicialización Adquisición..................................................................................................................32
2.1.6.1.1
Inicialización módulo A/D............................................................................................................33
2.1.6.1.2
Inicialización Timers ......................................................................................................................34
MEMORIA DE CÁLCULO Pag 2
PROYECTO
2.1.6.1.3
DATA
LOGGER
PARA
TERMOPAR
Preparar Interrupciones ................................................................................................................36
2.1.6.2
Unión de los bits de conversión bajos ............................................................................................36
2.1.6.3
Escritura EEPROM I2C. ......................................................................................................................37
2.1.6.3.1
2.1.6.4
2.1.7
Rutinas I2C .....................................................................................................................................40
Restaurar Adquisición........................................................................................................................43
Lectura temperaturas almacenadas en la EEPROM, Transmisión ..........................................................43
2.1.7.1
Incialización Transmisión...................................................................................................................44
2.1.7.2
Lectura EEPROM.................................................................................................................................45
2.1.7.3
Transmisión USART...........................................................................................................................47
2.1.7.3.1
2.1.7.4
Rutina Temporiza ...........................................................................................................................48
Fin Transmisión...................................................................................................................................48
2.1.8
Interrupciones ................................................................................................................................................49
2.1.9
Escritura EEPROM interna............................................................................................................................51
2.2
Programa en C................................................................................................................................................... 52
2.2.1
Cabecera ..........................................................................................................................................................52
2.2.2
Función Main .................................................................................................................................................55
2.2.3
Análisis de la línea de comandos ................................................................................................................56
2.2.4
Configuración interna del programa............................................................................................................58
2.2.5
Compensación................................................................................................................................................59
2.2.5.1
Compensación desde el data logger.................................................................................................59
2.2.5.2
Compensación desde el fichero ........................................................................................................60
2.2.5.3
Compensación manual........................................................................................................................62
2.2.5.4
Compensación por software ..............................................................................................................62
2.2.5.5
Transformación temperatura en tensión..........................................................................................64
2.2.5.6
Transformación de tensión en temperatura.....................................................................................64
2.2.5.7
Potencias en suma de productos ......................................................................................................65
2.2.5.8
Búsqueda polinomios de compensación.........................................................................................65
2.2.6
Transmisión ....................................................................................................................................................83
MEMORIA DE CÁLCULO Pag 3
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
2.2.6.1
Memoria ................................................................................................................................................83
2.2.6.2
Obtención de datos y transmsión.....................................................................................................86
2.2.6.3
Envío por el puerto serie ....................................................................................................................90
2.2.7
Interrupciones y Recursos del sistema.......................................................................................................91
2.2.7.1
PIC 8259 ................................................................................................................................................91
2.2.7.2
USART 8250.........................................................................................................................................92
2.2.7.3
Timer 8253.............................................................................................................................................97
2.2.7.4
Incialización USART...........................................................................................................................98
2.2.7.5
Restauración USART .......................................................................................................................100
2.2.7.6
Inicialización Timer............................................................................................................................101
2.2.7.7
Restauración Timer...........................................................................................................................101
2.2.7.8
Interrupción puerto serie..................................................................................................................101
2.2.7.9
Interrupción temporizador................................................................................................................102
MEMORIA DE CÁLCULO Pag 4
PROYECTO
1
DATA
LOGGER
PARA
TERMOPAR
Errores
A continuación se pretenden analizar los errores que se producen en el sistema para
encontrar soluciones que permitan reducir esto errorres a márgenes aceptables.
1.1
Error Conversor A/D
En un conversión analógica-digital la precisión de un bit será:
Vbit =
Vref ( +) − Vref ( − )
2n −1
(1.1)
Donde:
-
V ref( +) y Vref( − ) serían la máxima y la mínima tensión a las que trabaja el conversor.
-
n Es el número de bits del conversor
El conversor utilizado en el data logger es el conversor analógico digital interno del
PIC16F873 que es de 10 bits. Si se supone una Vref( + ) = 5 V y una Vref( − ) = 0 V y se aplica la
ecuación (1.2) queda:
Vbit =
1.2
5−0
mV
= 4,89
(1.2)
1023
bit
LM35
La correspondiencia entre temperatura y tensión en el sensor LM35 sigue la fórmula lineal:
E = T ·10
mV
(1.3)
ºC
Si se desean medir posibles temperaturas ambientes entre 0 ºC y 100 ºC, si se aplica la
ecuación (1.3) (véase 1.4), la tensión que proporcionará el sensor LM35 estará comprendida
entre 0 V y 1 V
mV
= 0V
ºC
(1.4)
mV
= 100º C·10
=1V
ºC
Emin = 0 º C·10
Emax
MEMORIA DE CÁLCULO Pag 5
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Hay dos versiones del sensor LM35 en el mercado: el LM35DZ, con una precisión de 0,9
ºC y el LM35CZ, con una precisión de 0,4 ºC. Cabe pues comprobar si el error de resolución
del conversor es menor que los error intrínseco del sensor. Para ello se calcula la temperatura que
corresponde la tensión de un bit para el conversor del sistema.
T = 4,89 mV ·1
1º C
= 0,489º C (1.5)
10 mV
En este caso el error producido es inferior al producido por el sensor LM35DZ, pero no en
el caso del LM35CZ.
Se puede, no obstante, reducir el error debido a la conversión, si se amplifica la señal del
sensor. Si se aumenta el márgen de tensiones hasta que este corresponda al márgen de trabajo del
conversor analógico-digital, se reducirá el error debido a las conversiones. El sistema se ha
amplificado utilizando una configuración no inversora, véase figura 4.10 de la memoria descriptiva,
en la que la expresión de la tensión de salida respecto a la entrada sigue la fórmula (1.6)
 R 
Vo = Vi 1 + 2  (1.6)
R1 

Si R2 = 3,9 kΩ y R1 = 1 kΩ, la tensión de salida seguirá la fórmula (1.7)
Vo = 4,9 Vi (1.7)
Añadiendo la amplificación a la fórmula (1.3), la correspondencia entre la tensión de
adquisición del conversor y la temperatura queda:
E = T ·49
mV
(1.8)
ºC
Por lo que ahora el error se ve reducido
4,89 mV ·1
1º C
≈ 0,1º C (1.9)
49 mV
Consiguiendo así que este valor sea muy inferior a la propia resolución del sensor.
1.3
Termopar K
Para realizar las equivalencias entre temperatura y tensión del termopar se han utilizado las
ecuaciones descritas en el apartado 1.3.3 de la memoria descriptiva.
Así suponiendo una temperatura de referencia de 0ºC si el margen de temperaturas de
trabajo varía entre los 0 ºC y los 1100 ºC, el margen de tensiones variará de:
MEMORIA DE CÁLCULO Pag 6
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
0 º C → 1100 º C
0 V → 45 mV
Teniendo en cuenta que las tensiones producidas por el termopar tienen valores muy
pequeños, resulta obvio que se deberá amplificar esta señal para adecuarla al rango de trabajo del
conversor analógico-digital. Para amplificar la señal producida por el termopar se utiliza el
amplicador de instrumentación INA114, cuya función de transferencia viene dada en la ecuación
1.17.
 50 kΩ 
V (1.10)
Vo =  1 +
RG  i

Si RG = 470 Ω la ganancia (G) es G=107,4.
Si la tensión máxima de salida es de 5 V, la máxima tensión de entrada para que el
amplificador de instrumentación no se sature serán unos 46,5 mV. Si se calcula la temperatura a la
que habría que someter el termopar K para que proporcionaria 46,5 mV, suponiendo una tensión
de referencia de cero grados, serían unos 1138 ºC. Por tanto con los valores escogidos se
asegura que se trabaja dentro del margen de temperaturas especificado, ya que se requiriéndose
que el sistema pueda captar una temperatura máxima de unos 1100 ºC, parámetro que se supera
holgadamente.
Al no ser la relación temperatura voltaje del termopar lineal, el cálculo del error será también
no lineal y por tanto variante. Por tanto, deberá calcularse exactamente para cada temperatura.
Pero para tener una cierta cota del error producido, se ha calculado el error para un ejemplo
concreto. Si se considera que la tensión de entrada del conversor es igual a la tensión de
resolución de un bit del conversor, aplicando (1.10) se puede calcular la tensión creada por el
termopar que, una vez amplicada, produciría la tensión de un bit.
 50 kΩ 
4.89 mV =  1 +
Vi
 470 Ω  (1.11)
Vi = 45,538 µ V
Si suponemos que esta tensión se produce considerando que la unión fría del termopar está a
0ºC, se obtiene que la temperatura correspondiente a la tensión de error es de 1,14 ºC. Por
tanto, el error debido a la conversión será normalmente superior al grado.
MEMORIA DE CÁLCULO Pag 7
PROYECTO
2
DATA
LOGGER
PARA
TERMOPAR
Programas
El presente proyecto consta de dos programas, uno funciona sobre el ordenador y el otro
sobre el microcontrolador. El primero se ha desarrolado en lenguaje de programación C y el
segundo en el lenguaje ensamblador de los microcontroladores PIC. Para la lectura de los
apartados que describen el funcionamiento del programa del ordenador se recomienda conocer el
lenguaje C, sino fuere así, una amplia descripción del lenguaje C puede encontrarse en la
bibliografía [2]. También se recomienda conocer el lenguaje de programación en ensablador de
los microcontrolodores PIC, es especialmente recomendable referise al apartado 13 del ANEXO
5.1: PIC16F87X para ver una descripción del conjunto de instrucciones utilizadas por el
microcontrolador.
El ANEXO 3:LISTADO DE PROGRAMAS contiene el listado íntegro de los programas,
reproduciendo íntegramente el contenido de los ficheros en c y en ensamblador.
2.1
Programa del PIC16F873
A la hora de desarrollar el programa, se muestran las diferentes partes que componen el
programa, desde el inicio hasta el fin.
El ensamblador en concreto utilizado para la ejecución del programa es el MPASM. Este
ensamblador establece que los programas deben seguir una estructura similar a:
List p=16F873
;Se indica el modo de procesador
include "P16F873.INC" ;se incluye la definicion de los registros internos
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG
0x00
;Inicio en el Vector de Reset
Goto Inicio
;Va a la primera instruccion del programa
;<<<<<<------------------- VECTOR DE INTERRUPCION -------------------->>>>>>>
ORG
0x04
;Inicio del vector de interrupcion
;Rutina ISR
;Programa
Así en la cabecera del programa se deberá indicar el microcontrolador que se va utilizar,
también suele indicarse la dirección de un fichero asociado donde se aparece la definición de los
registros internos de ese microcontrolador. Después deberá indicarse el vector de reset y la
dirección de incio del programa. Si el programa utiliza interrupciones deberá indicarse el vector de
interrupción, y normalmente a continuación, poner la rutina de servicio a las interrupciones.
MEMORIA DE CÁLCULO Pag 8
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Después de la rutina de atención a las interrupciones ya pueden colocarse las rutinas del
programa, no olvidándose por supuesto de la rutina de inicio del programa.
2.1.1
Variables
Las aquí consideradas variables son un byte (registro) de la memoria del
microcontrolador. En el programa se utilizan dos localizaciones para las variables, la memoria
datos RAM y la memoria de datos EEPROM, ambas integradas en el propio PIC16F873.
MEMORIA DE CÁLCULO Pag 9
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Tabla 2.1 Mapa de Memoria del PIC16F87X
Se utilizan dos tipos tipos de registros dentro de la memoria RAM, los registros
específicos (Special Function Registers, SFR) y los registros de propósito general (General
Purpose Registers, GPR). Los SFR son registros de memoria reservados para la gestión de
funcionones del sistema, a diferencia de los GPR que no tienen una función asignada de
anterioridad, y por tanto su valor depende del programa que en esos momentos se esté
ejecutando.Para identificar las variables se utilizan etiquetas. Normalmente las etiquetas de los
SFR no se definen en el programa en sí, sino que ya se han definido en el registro asociado.
El mapa de la memoria RAM, para el microcontrolador PIC16F873, donde aparecen
tanto los SFR como los GPR, aparece en la tabla 2.1. Como se obserba en la tabla, los registros
se dividen en cuatro bancos de memoria, banco 0, 1, 2, 3. Entre los SFR, los hay algunos que se
repiten en los cuatros bancos de memoria y otros que sólo aparecen en uno.
En el PIC16F873 hay 128 bytes de memoria EEPROM (00h-7Fh). El acceso a la
memoria EEPROM es indirecto y se realiza a través de registros específicos destinados a esa
funición
2.1.1.1
Registro STATUS
Seguramente en un programa del PIC, el registro más utilizado sea el STATUS (Registro de
Estado, ver tabla 2.2), porque, entre otras funciones, permite seleccionar el banco de memoria
donde se ubica un determinado registro de memoria. Las otras funciones que contiene son: la
información del estado de las operaciones aritméticas con la ALU del microcontrolador (bit de
cero Z, bit de carry C, bit de digital carry DC), y el estado del RESET o bien si ha habido una
ejecución de SLEEP o CLRWDT, además de citada selección del banco de memoria.
Para acceder a un registro de un banco de memoria determinado existen dos métodos de
direccionamento: el direccionamiento directo, si se accede directamente a la dirección del registro,
o el indirecto si se accede a la dirección a través de otro registro. Para acceder a los diferentes
bancos de memoria dependiendo del modo de direccionamiento se usarán unos u otros bits del
registro STATUS. Se usará el bit IRP si se usa el direccionamiento indirecto o los bits RP1, RP0
si se usa el direccionamiento directo.
MEMORIA DE CÁLCULO Pag 10
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Tabla 2.2 Registro STATUS
2.1.1.2
Variables del programa
Las variables guardadas en la EEPROM se utilizan para adecuar el sistema a diferentes
configuraciones, así, por ejemplo se permiten utilizar diferentes tipos de memoria EEPROM
externa, cambiar el tiempo de adquisición… Las de tipo RAM controlan la evolución del
programa, siendo muchas de estas inicializadas a partir de la lectura de la EEPROM interna.
Las variables de la memoria RAM son:
SALVAW
SALVASTATUS
equ
0x20
equ
;Guarda W en la IRQ, tambien @ 0xA0
0x21 ;Guarda STATUS en la IRQ
Las dos primeras se utilizan para preservar el W y el STATUS cuando se atiende a una
interrupción.
DATA_EE_ADDR
DATA_EE_DATA
equ
equ
0x22
0x23
;Direccion de la memoria EEPROM interna a escribir
;Dato a escribir en la memoria EEPROM
Estas dos variables las utiliza la rutina de escritura de la EEPROM interna del
microntrolador, y es donde se reflejan la dirección y el dato a escribir en la EEPROM.
AUX
equ
0x24
;Variable auxiliar para asignar el bit Add2,1 uso
MEMORIA DE CÁLCULO Pag 11
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Es una variable auxiliar que se utiliza sólo una vez por eso comparte dirección con otra
variable que en esos momentos no se utiliza.
LM351L
TERMO1L
LM352L
TERMO2L
equ
equ
equ
equ
0x24
0x25
0x26
0x27
;Byte
;Byte
;Byte
;Byte
bajo A/D LM35 1a medida
bajo A/D termopar 1a medida
bajo A/D LM35 2a medida
bajo A/D termopar 2a medida
Variables donde se guardan los bytes bajos de la conversión A/D para después poder
agruparlos.
Estado
Bmes
Ad_ok
Add2
T0_ok
T1_ok
equ
equ
equ
equ
equ
equ
0x28
0
1
2
3
4
;Bits: Ad_ok, Bmes, Add2
;Bit indica 1a/2a medida, Estado
;Bit indica fin A/D, Estado
;Bit indica 1/2 bytes @, Estado
;Bit activa uso TMR0, Estado
;Bit activa uso TMR1, Estado
Variable en la que se agrupan diferentes bits de control. En las secuencias de
temperaturas es necesario determinar si se está en el primer par de medidas (0), o en el segundo
(1). Informar al programa principal de que se ha producido la conversión A/D (1). Indicar si la
memoria M24x necesita dos bytes de dirección (1) o sólo uno (0). Si se debe atender al
señalizador del TMR0(1) o TMR1(1) o no porque está inhibido (0).
Index
DIRPAG
INIBANK2
equ
equ
equ
0x29
0x31
0xA1
;Indice de la cola
;Inicio de la cola en el banco 0
;Inicio de la cola en el banco 1
Direcciones de inicio de la cola, a la que se accede indirectamente mediante un índice.
DEVSEL
DIRH
DIRL
NDIRH
NDIRL
equ
equ
equ
equ
equ
0x2A
0x2B
0x2C
0x2D
0x2E
;Selector de dispositivo
;Byte alto @ EEPROM M24x
;Byte bajo @ EEPROM M24x
;Incrementos byte alto EEPROM M24x
;Incrementos byte bajo EEPROM M24x
Selector de dispositivo, byte de dirección alta y baja para las EEPROM I2C.
Incrementos de dirección en los bytes altos y bajos de las memorias.
t0
t1
equ
equ
0x2F
0x30
;Contador eventos TMR0
;Contador eventos TMR1
Retardos de cuentas de tiempos una vez se cumplen los tiempos fijados en TMR0 y
TMR1.
Las variables que se guardan en la memoria EEPROM interna son:
Ini_NDIRH
Ini_NDIRL
Ini_NDIRLR
MaxPagW
MaxRamPag
INCL
INCH
NTMR1
equ
equ
equ
equ
equ
equ
equ
equ
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
;Valor inicial de NDIRH(F8)
;Valor inicial de NDIRL(F0)
;Valor inicial de NDIRL en lectura(FE)
;Fin de pagina(F0)
;Fin de cola(EF)
;Incremento byte bajo @,1 pag(10)
;Incremento byte alto @(02)
;Valor inicial de t1(FD)
MEMORIA DE CÁLCULO Pag 12
PROYECTO
NTMR0
DATA
equ
0x08
LOGGER
PARA
TERMOPAR
;Valor inicial de t0(FD)
Estas variables son los denominados, parámetros de configuración del data logger, para
su descripción referirse a la tabla 5.1 de la memoria descriptiva.
Otras etiquetas que se usan a lo largo del programa son:
DEVSEL_W
W_R
TAH
TAL
TT
equ
equ
equ
equ
equ
b'10100000'
0
0x0B
0xDB
0x63
;Selección memoria M24x por bus I2C,W
;Bit de W/R, DEVSEL
;Valor inicial de TMR1H
;Valor inicial de TMR1L
;Valor inicial de TMR0
La dirección de las memorias M24x por el bus I2C, el bit de W/R que contiene el byte
DEVSEL, y los valores iniciales de cuentas de TMR1 y TMR0.
MaxReadA
MaxRead
MaxReadInc
equ
equ
equ
0x81
0x80
0x80
;Máximas lecturas con ACK
;Máximas lecturas
;Incremento de direccion en lectura
Valores máximos de la cola de lectura de las memorias I2C.
2.1.2
Programa principal
El programa empieza inicializando las entradas y salidas, establece la base de tiempos,
inicaliza las comunicaciones, MSSP y USART, y después ejecutará cuando así se requiera, la
actividad que indiquen las E/S. Cuando se acabe la actividad solicitada se volverá a esperar que
se requiera el inicio de otra actividad.
2.1.2.1
Inicializaciones Puertos E/S
Los registros PORTA, PORTB, PORTC y TRISA, TRISB, TRISC controlan las puertas
de entrada o salida del PIC16F873. Para configurar una señal de un puerto como entrada o
salida, se pone a uno su bit correspondiente del registro TRISx para ese puerto si se quiere
indicar como entrada, y a cero si se quiere indicar como salida. Una vez se ha configurado sus
señales como entrada o salida, para obtener información acerca del puerto deberá accederse al
registro PORTx correspondiente a cada puerto. Los pines accesibles a través de los puertos y su
función serán los reflejados en la tabla 2.3
MEMORIA DE CÁLCULO Pag 13
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Tabla 2.3 Puertos de entradas y salidas del PIC
Con el registro ADCON1 se indica que entradas se utilizarán como entradas analógicas, o
entradas/salidas digitales, o como tensiones de referencia. Los detalles pueden verse en la tabla
2.4
MEMORIA DE CÁLCULO Pag 14
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Tabla 2.4 Registro ACON1
Según el esquema circuital del data logger, como puede verse en el plano nº8, las
entradas/salidas del microcontrolador representan:
o RA0 es una entrada analógica que recibe la tensión producida por el sensor LM35.
o RA1 es una entrada analógica que recibe la tensión producida por el termopar.
o RA2 es una entrada digital que recibe el estado del conmutador inicio.
o RA3 no se utiliza.
o RA4 es una entrada
Programación/Normal.
digital
que
recibe
el
estado
del
conmutador
o RA5 es una entrada digital que recibe el estado del pulsador Adquisición/Transmisión.
o RB0-RB7 no son utilizadas en el sistema.
MEMORIA DE CÁLCULO Pag 15
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
o RC5 no es utilizada en el sistema.
o RC0 es una salida digital y representa el estado del led de Configuración.
o RC1 es una salida digital y representa el estado del led de Adquisición.
o RC2 es una salida digital y representa el estado del led de Envío.
o RC3 es la salida SCL del bus I2C
o RC4 es la entrada/salida SDA del bus I2C.
o RC6 es la salida TX de la comunicación asíncrona.
o RC7 es la entrada RX de la comunicación asíncrona.
Por lo que la inicialización de las entradas-salidas deberá ser:
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
Inicio
2.1.2.2
bsf
movlw
movwf
clrf
movlw
movwf
movlw
movwf
STATUS,RP0
b'00000100'
ADCON1
TRISB
b'10011000'
TRISC
b'00110111'
TRISA
;Selecciona Banco 1
;Configurar E/S ana,dig
;Configurar E/S ports
Inicialización TMR0
El registro OPTION_REG (Registro de Opciones) contiene varios bits de control para
configurar la preescala del TMR0 o del WDT (Watch-Dog), así como los bits INTEDG, que
regulan el flanco activo para la generación de interrupción, el uso del TMR0 y si habrán
resistencias de pull-up en el puerto B, véase la tabla 2.5
MEMORIA DE CÁLCULO Pag 16
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Tabla 2.8 Registro OPTION_REG
El TMR0 es un contador ascendente de 8 bits, que puede funcionar con el reloj interno o
externo, ser sensible al flanco ascendente o descendente y se le puede asignar un divisor de
frecuencia.
Al utilizar el TMR0 se debe tener en cuenta que:
1.
El bit T0CS (OPTION<5>) determina si está a 1 que el TMR0 funcione en
modo temporizador y si está a 0 en modo contador, con señal externa de reloj
por T0CKI.
2.
En el modo contador, el bit TOSE (OPTION<4>) selecciona el tipo de flanco
activo en T0CKI. (1: Descendente y 0: Ascendente).
3.
En modo contador el periodo de la señal externa debe ser como mínimo de 4
Tosc. En el modo temporizador la frecuencia de trabajo es Fosc/4.
4.
El bit PSA (OPTION<3>) asigna el divisor de frecuencia al TMR0 si esta a 0
y al WDT si esta a 1.
5.
El ratio al que funciona el divisor de frecuencia se elige con los bits PS2, PS1 y
PS0 (OPTION <2:0>)
MEMORIA DE CÁLCULO Pag 17
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
6.
El TMR0 se puede leer en cualquier momento para conocer el estado de la
cuenta
7.
Cuando se escribe un nuevo valor en TMR0 para establecer una nueva
temporización, los incrementos del mismo se inhiben durante los dos ciclos de
reloj posteriores.
8.
Como es un contador ascendente, conviene cargarlo con el complemento a 2
del valor deseado para la temporización. Las formulas a aplicar son:
temporizac ión = 4 · Tosc · (Valor cargado en TMR0) · (Rango del Divisor)
(2.1)
temporizac ión
Valor a cargar en TMR0 =
(Rango del Divisor)
4· Tosc
Cuando se desborda el TMR0, es decir, pasa del valor FFh a 00h, se activa el bit <2> de
INTCON (T0IF). Actúa como un señalizador del desbordamiento. Si, además, el bit <5> de
dicho registro esta a 1 (Permiso de interrupción), se genera una interrupción. El bit T0IF se debe
borrar por software una vez se atiende la interrupción.
9.
En el modo de reposo, el TMR0 se detiene, por lo que no puede originar
interrupción.
Si se escoge establecer un preescaler de 128 (Rango del divisor) al TMR0, el programa
queda de la siguiente manera:
movlw b'11000110'
;preescaler de 128 a TMR0
movwf OPTION_REG
2.1.2.3
Inicialización SSP
La comunicación serie síncrona (SSP) en modo I2C utiliza los siguientes registros:
SSPCON (Registro de control), SSPCON2 (Segundo registro de control), SSPSTAT (Registro
de estado), SSPBUF (Registro Buffer de Transmisión/Recepción), SSPSR (No es accesible
directamente como registro en memoria), SSPADD (Registro de direcciones).
En la inicialización se activará el módulo y se establecerá la velocidad de trabajo del
mismo, por lo que se utilizarán los registros SSPSTAT, SSPCON y SSPADD.
Con el registro SSPSTAT, representado en la tabla 2.6, se configura entre otras cosas la
velocidad del módulo I2C.
MEMORIA DE CÁLCULO Pag 18
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Tabla 2.6 Registro SSPSTAT
Con el registro SSPCON, representado en la tabla 2.7, configura el módulo de
comunicación serie síncrona (SSP) para trabajar en modo I2C
MEMORIA DE CÁLCULO Pag 19
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Tabla 2.7 Registro SSPCON
Con este registro, el SSPCON, se activa el módulo y se establece que el
microcontrolador actúe como maestro.
Con el registro SSPADD se puede establecer, una vez se ha configurado el
microcontrolador como maestro, la velocidad de comunicación del bus I2C. Así la frecuencia de
la comunicación I2C viene dada por la fórmula (2.2)
MEMORIA DE CÁLCULO Pag 20
PROYECTO
DATA
clock =
LOGGER
PARA
TERMOPAR
Fosc
(SSPADD + 1) (2.2)
4
Si la velocidad del bus I2C se configura a 100 kHz, el programa queda:
Inii2c
2.1.2.4
movlw
movwf
movlw
movwf
bcf
movlw
movwf
b'10000000'
SSPSTAT
.9
SSPADD
STATUS,RP0
b'00101000'
SSPCON
;Inicializa uso I2C
;Velocidad I2C
;SSPEN, clock=Fosc/4(SPPADD+1)
Inicialización USART
Para configurar la transmisión asíncrona se utilizan tres registros TXTSTA, RCSTA,
SPBRG.
Tabla 2.8 Registro TXSTA
MEMORIA DE CÁLCULO Pag 21
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
El registro específico TXSTA, representado en la figura 2.8, actúa como registro de
estado y control del transmisor.
El registro RCSTA, representado en la figura 2.9, actúa como registro de estado y control
del receptor.
Tabla 2.9 Registro RCSTA
La velocidad de comunicación se establecen por el valor cargado en el registro SPBRG y
el bit BRGH del registro TXSTA. Si BRGH está a uno se considera que se utiliza un modo de
velocidad alto (1), sino este modo será de velocidad bajo (0), en el modo asíncrono. Con la
fórmula (2.3) puede determinar la velocidad a la que está configurada la comunicación asíncrona.
BAUDIOS = FOSC / (n(x + 1)) (2.3)
n = 16 en el modo asíncrono de alta velocidad
MEMORIA DE CÁLCULO Pag 22
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
n = 64 en el modo asíncrono de baja velocidad
x = valor cargado en el registro SPBRG
siendo x = (F OSC / Baudios) / (n - 1) (2.4)
Si Fosc=4 MHz y la velocidad de transmisión son 9600 bps, SPBRG tendrá un valor de
25.
Para realizar una transmisión asíncrona utilizando el PIC16F873 se seguirán los siguientes
pasos:
o Inicializar el registro SPBRG para el ratio de velocidad deseado. Si se necesita una
velocidad alta, aunque no sea imprescindible es conveniente utilizarlo porque de esta
forma se minimizan los retardos. Poner a uno el bit BRGH del registro TXSTA.
o Permitir utilización del puerto de la transmisión asíncrona poniendo a cero el bit
SYNC y poniendo a uno el bit SPEN.
La inicialización de la USART queda:
Ini_USART
2.1.3
bsf
bsf
Movlw
movwf
bcf
bcf
bsf
STATUS,RP0 ;Selecciona banco 1
TXSTA,BRGH
.25
SPBRG
TXSTA,SYNC
STATUS,RP0 ;Selecciona banco 0
RCSTA,SPEN
Selección de Operación
Una vez acabadas las inicializaciones el siguiente paso es comprobar el estado de los
conmutadores. Para escoger la actividad a realizar se seguirá el esquema de la figura 5.1 de la
memoria descriptiva. La implementación de ese algoritmo en ensamblador quedará de la siguiente
forma:
;<<<<<<--------------------- SELECCION OPERACION --------------------->>>>>>>
M_P
Conf
No_P
clrf
Btfss
goto
PORTB
PORTA,2
M_P
btfss
goto
goto
PORTA,4
No_P
Ini_Recep
movlw INCH
;Control Pulsadores
;Transmision/Adquisicion
;goto sobrante
;2 bytes de direcciones?
MEMORIA DE CÁLCULO Pag 23
PROYECTO
Addres1
Addres2
TrAdq
DATA
call
movwf
btfss
goto
bcf
goto
bsf
Read_EE
AUX
AUX,1
Addres2
Estado,Add2
TrAdq
Estado,Add2
btfsc PORTA,5
goto Ini_Lec_Tr
LOGGER
PARA
TERMOPAR
;Si incremento alto es 2?
;si,1 byte direccion
;no,2 bytes direcciones
;Transmision/Adquisicion
En el código mostrado aparte de codificar el algoritmo 5.1 de la memoria descriptiva, si la
opción escogida utiliza la memoria EEPROM externa, es decir se ejecuta la opción de transmisión
o adquisición, se determina si la memoria asignada utiliza un único byte específico para albergar
sólo bits de direcciones, o necesita dos bytes específicos para albergar los bits de dirección. Si la
capacidad de la memoria EEPROM, necesita la utilización de uno a tres bits de dirección además
de los ocho del byte bajo de direcciones, estos bits de mayor peso, en vez de albergarse en un
byte específico de direcciones, se albergan en el registro selector de dispositivo. Si la capacidad
de la memoria EEPROM necesita de más de tres bits extra de direccionamiento, deberá utilizarse
un segundo byte de direcciones. Para distinguir cuando los bits de mayor peso de la dirección se
albergan en el byte selector de dispositivo o en segundo byte específico de direcciones, se
consulta si el incremento del byte alto de dirección es dos, cosa que deduce que los bits de mayor
peso de la dirección están contenidos en el byte selector de dispositivo. Los bits de dirección
albergados en el byte selector de dispositivo se sitúan a partir del segundo bit de menor peso, ya
que el bit de menor peso está reservado a la lectura/escritura del dispositivo (ver apartado
2.1.6.3), y por tanto, para no modificar el bit de menor peso, el incremento debe ser dos. En
cambio si el byte selector no se utiliza para albergar esos bits de direcciones, y para este
propósito se utiliza un byte de dirección específico, como los bits de dirección se sitúan a partir
del bit de menor peso, el incremento debe ser uno. Por lo expuesto basta con esta comprobación
para deducir el posicionamiento de los bits de mayor peso de la dirección. Si el incremento alto
de la direcciones es dos, significa que se utiliza un solo byte específico de direcciones por lo que
el bit Add2 (2 bytes de direcciones) del registro Estado deberá ponerse a cero, sino se cumple y
por tanto se deduce que el incremento es uno, el bit Add2 del registro Estado, sí debe activarse.
2.1.4
Lectura de la EEPROM interna
Durante el desarrollo del programa se deberá acceder a diversas variables que estarán
contenidas en la memoria de la EEPROM. Para leer y escribir la memoria de la EEPROM se
utilizan cuatro registros: EECON1 (Registro de control 1), EECON2 (Registro de control 2),
EEDATA (Registro de datos), EEADR (Registro de direcciones).
En el EEDATA se almacena el dato a leer o escribir en la memoria. Si lee una posición de
memoria de EEPROM, esta estará disponible en el registro EEDATA en el siguiente ciclo de
reloj.
MEMORIA DE CÁLCULO Pag 24
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
El EEADR es el registro donde se indica la dirección de memoria a escribir o leer, en el
PIC16F873 puede ir de 0 a 127, ya que hay 128 bytes de memoria, por lo que el bit más
significativo del registro debe siempre de mantenerse a cero.
El EECON2 no es físicamente un registro y se usa exclusivamente para indicar la
secuencia necesaria para la escritura de memoria.
El EECON1, representado en la figura 2.10, es el registro de control para el acceso a
memoria.
Tabla 2.10 Registro EECON1
Para leer los datos almacenados en la memoria EEPROM interna se utiliza la siguiente
subrutina, a la que previamente a su invocación se ha cargado la dirección a leer de la memoria a
través del registro acumulador (W). La rutina supone que el banco de memoria activo es el cero
en el momento de invocar la subrutina, al igual que acabará siendo al finalizar la subrutina. La
rutina devuelve en el acumulador el dato contenido en la EEPROM para la dirección que enviada.
Read_EE
bsf
movwf
bsf
bcf
STATUS,RP1 ;Bank 2
EEADR
STATUS,RP0 ;Bank 3
EECON1,EEPGD;Point to DATA Memory
MEMORIA DE CÁLCULO Pag 25
PROYECTO
DATA
bsf
bcf
movf
bcf
return
2.1.5
EECON1,RD
STATUS,RP0
EEDATA,W
STATUS,RP1
LOGGER
PARA
TERMOPAR
;EEPROM Read
;Bank 2
;W=EEDATA
;Bank 0
Modificación de los parámetros de configuración
Durante el desarrollo de esta actividad el programa principal sigue la evolución del
algoritmo 5.2 de la memoria descriptiva (ver también explicación), que expresándolo en lenguaje
ensamblador tendrá la siguiente forma:
;Ini_Recep
Programacion
movf
sublw
btfss
goto
DATA_EE_ADDR,W
0x09
STATUS,Z
Programacion
;Espera hasta que se reciban las
;9 direcciones
;No_Recep
goto
M_P
Ahora se pasará a desarrollar el trozo de rutina que ha quedado pendiente de este primer
análisis, la inicialización y la finalización de la recepción en modo USART.
2.1.5.1
Inicialización/Restauración Recepción vía USART
Los pasos a seguir al realizar una recepción son similares a los que se deben seguir para
una transmisión asíncrona, pero cambiando los bits específicos de la transmisión por los de
recepción
o Si la interrupción es deseada, habilitar el bit RCIE de PIE1 (GIE, PIE deben también
estar activados)
o Permitir la recepción poniendo a uno el bit CREN i asegurarse de que el bit RCIF del
registro PIR1 está a cero .
o Cuando se produzca la recepción, se activará RCIF y se producirá una interrupción si
se ha activado RCIE. Entonces, el dato estará disponible en el registro RCREG. El
reset del bit RCIF se debe efectuar por software. Para realizar nuevas recepciones se
deberá repetir este último paso.
Teniendo en cuenta que las recepciones del sistema se tratan mediante interrupción, se
deberá activarse esa interrupción.
El registro INTCON es un registro que contiene varios bits de habilitación y señalización
de interrupciones, ver tabla 2.11. El registro INTCON, si tiene activado el bit GIE y el PEIE
MEMORIA DE CÁLCULO Pag 26
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
permite la interrupción de dispositivos periféricos. A los dispositivos periféricos se les habilita la
interrupción mediante el bit correspondiente del registro habilitador de interrupciones periféricas
(PIE). Hay dos registros PIE, pero el que se utilizará en el programa es el registro PIE1,
representado en la figura 2.12
Tabla 2.11 Registro INTCON
MEMORIA DE CÁLCULO Pag 27
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Tabla 2.12 Registro PIE1
En nuestro caso el bit a que habilita la interrupción por recepción es RCIE, con lo que la
inicialización de las recepciones queda finalmente:
;Inicialización de la recepción e interrupción
Ini_Recep
bsf
PORTC,0
;Led Configuracion
Clrf
Bsf
bsf
movlw
movwf
bsf
bcf
DATA_EE_ADDR
RCSTA,CREN
STATUS,RP0
b'11000000'
INTCON
PIE1,RCIE
STATUS,RP0
;Direccion EE=0
;Recepción contínua
;Selecciona banco 1
;Hablita int globales(GIE) y periferica(PIE)
;Activa la interrupcion RX
;Selecciona banco 0
Para restaurar la recepción los pasos son similares pero a la inversa.
MEMORIA DE CÁLCULO Pag 28
PROYECTO
No_Recep
2.1.6
DATA
bcf
bsf
clrf
bcf
bcf
bcf
RCSTA,CREN
STATUS,RP0
INTCON
PIE1,RCIE
STATUS,RP0
PORTC,0
LOGGER
PARA
TERMOPAR
;Fin recepcion
;Selecciona banco 1
;Desactiva las interrupciones
;Desactiva la interrupcion RX
;Selecciona banco 0
;Fin Configuracion
Adquisición temperaturas, almacenamiento EEPROM
Aquí el algoritmo a desarrollar (y la explicación) aparece en la figura 5.3 de la memoria
descriptiva. Como la rutina es muy grande se ha dividido en subapartados, los trozos en que sólo
sale el nombre del subapartado es porque se explicarán en subapartados anteriores de la memoria
de cálculo
;<<<<<<---------------------- INICIO ADQUISICION --------------------->>>>>>>
;<<<<<<--------------------- INICIALIZACIONES ADQ -------------------->>>>>>>
;<<<<<<---------------------------- BUCLES --------------------------->>>>>>>
Ini_BAD
BdirH
BdirL
movlw Ini_NDIRH
call
Read_EE
movwf NDIRH
;Inicializamos las variables
movlw
call
movwf
clrf
Ini_NDIRL
Read_EE
NDIRL
DIRL
;La incializacion byte contador direccion bajo
btfss
Goto
bcf
Estado,Ad_ok
BdirL
Estado,Ad_ok
;Interrupcion acontecida?
;Contador de incrementos del byte direccion alto
;byte de direccion baja
;Prepara la proxima espera
;<<<<<<----------------- RECONOCIMIENTO CANAL,MEDIDA ----------------->>>>>>>
LM35_Termo
btfsc
goto
btfsc
goto
ADCON0,CHS0 ;LM35 o termopar?
Termopar
Estado,Bmes ;LM35-> Medida 0 o 1?
LM35_2
LM35_1
bsf
bsf
movf
bcf
movwf
goto
ADCON0,CHS0 ;Proximo canal 1 para completar medicion Tª
STATUS,RP0 ;Guarda byte bajo de la conversion
ADRESL,W
;para unirlos en un solo byte
STATUS,RP0
LM351L
Cola
LM35_2
bsf
bsf
movf
bcf
movwf
ADCON0,CHS0 ;Proximo canal 1 para completar medidicion Tª
STATUS,RP0 ;Guarda byte bajo de la conversion
ADRESL,W
;para unirlos en un solo byte
STATUS,RP0
LM352L
LM35_12
MEMORIA DE CÁLCULO Pag 29
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
goto
Cola
Termopar
btfsc
goto
Estado,Bmes
Termopar2
Termopar1
bcf
bsf
bsf
movf
bcf
movwf
goto
ADCON0,CHS0 ;Proximo canal 0
Estado,Bmes ;Proxima medida 1, las 2 medidas de la medicion OK
STATUS,RP0 ;Guarda byte bajo de la conversion
ADRESL,W
;para unirlos en un solo byte
STATUS,RP0
TERMO1L
Cola
Termopar2
bcf
bcf
bsf
movf
bcf
movwf
ADCON0,CHS0 ;Proximo canal 0
Estado,Bmes ;Proxima medida 0, las 2 medidas de la medicion OK
STATUS,RP0 ;Guarda byte bajo de la conversion
ADRESL,W
;para unirlos en un solo byte
STATUS,RP0
TERMO2L
;Termopar->Medida 0 o 1?
;<<<<<<---------------------- UNION BITS BAJOS ---------------------->>>>>>>
;<<<<<<-------------------------- A LA COLA -------------------------->>>>>>>
L_Cola
movf
movwf
incf
incf
TERMO2L,W
INDF
FSR,F
Index,F
;El byte se pasa a la cola
Cola
movf
movwf
incf
incfsz
goto
ADRESH,W
INDF
FSR,F
Index,F
Lleno
;Los bytes altos resultantes de la conversion
;se llevan a la cola
;La cola esta llena?
;<<<<<<-------------------------- COLA=MAX --------------------------->>>>>>>
;Escribir EEPROM
Last_No_Pasa movf
movwf
movlw
movwf
incf
movlw
call
movwf
goto
INDF,W
DIRPAG
DIRPAG
FSR
FSR,F
MaxPagW
Read_EE
Index
FinB
;El ultimo no ha podido entrar el la EEPROM
;Sera el primero de la nueva cola
Lleno
Index,W
BdirL
;pueden entrar los de la cola?
;no, que siga llenandose
incfsz
goto
;la cola vuelve a empezar
MEMORIA DE CÁLCULO Pag 30
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
;<<<<<<-------------------------- COLA=PAG --------------------------->>>>>>>
Vacia
movlw
movwf
movlw
call
movwf
call
btfss
goto
movf
call
V_Addres
movf
Call
movf
call
BW_E2PROM movf
call
incf
incfsz
goto
call
DIRPAG
;Si,los datos pasan a la memoria EEPROM
FSR
;Se repite el trozo de escritura en la E2PROM
MaxPagW
Read_EE
Index
Start
Estado,Add2
V_Addres
DEVSEL,W
Send
DIRH,W
Send
DIRL,W
Send
INDF,W
Send
FSR,F
Index,F
BW_E2PROM
Stop
New_Cola
DIRPAG
FSR
MaxRamPag
Read_EE
Index
FinB
movlw
movwf
movlw
call
movwf
goto
;la cola vuelve a iniciarse de momento vacia
;<<<<<<-------------------- FIN BUCLES,RESTAURAR --------------------->>>>>>>
FinB
movlw INCL
;Se incrementa la pagina de escritura
call
Read_EE
addwf DIRL,F
incfsz NDIRL,F
;se ha sobrepasado el tope de direcciones por byte bajo?
goto
BdirL
movlw INCH
;Se incrementa la direccion alta
call
Read_EE
addwf DIRH,F
Incremento
incfsz NDIRH,F
goto BdirH
;Se ha completado la memoria
;Restaurar
;<<<<<<------------------------ FIN ADQUISICION ---------------------->>>>>>>
Nótese que en el subapartado COLA=MAX y COLA=PAG se repite el código de
escritura de la EEPROM pero cambiando las etiquetas. Este trozo de programa se comenta en el
apartado 2.1.6.3, pero para tener en el mismo documento los dos trozos, en este aparece el
MEMORIA DE CÁLCULO Pag 31
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
código de escritura de la EEPROM con unas etiquetas y en el otro apartado aparece el otro
código.
2.1.6.1
Inicialización Adquisición
En la adquisición se utilizan cuatro módulos del microcontrolador: los temporizadores uno
y cero, el conversor A/D y el módulo MSSP. El módulo MSSP ya ha inicializado pero los otros
no, por lo que deberán inicializarse. Los temporizadores y el conversor A/D se tratan mediante
interrupción por lo que también hay que inicializar esas interrupciones
;<<<<<<--------------------- INICIALIZACIONES ADQ -------------------->>>>>>>
Ad_1
bsf
PORTC,1
;Led Adquisicion
AD_Add
btfss
goto
movlw
movwf
clrf
goto
movlw
movwf
Estado,Add2
DirhDevsel
DEVSEL_W
DEVSEL
DIRH
Ini_AD
DEVSEL_W
DIRH
;2 bytes direccion ?
bcf
bcf
bcf
bsf
bcf
movlw
movwf
movlw
call
movwf
Estado,Bmes ;Medida 0
Estado,Ad_ok ;No adquisiciones producidas
Estado,T0_ok ;No hacer caso del flag TMR0
Estado,T1_ok ;Hacer caso del flag TMR1
ADCON0,CHS0 ;Canal 0
DIRPAG
;Direccionamiento indirecto para cola que se pasara
FSR
;a la EEPROM
MaxRamPag ;Contador de bytes en la cola
Read_EE
Index
SoloDevsel
DirhDevsel
Ini_AD
;Bits direccion I2C
;direccion alta=0
;Bits direccion I2C y bits direccion alta
;de la memoria EEPROM
;Inicializar modulo A/D
;Inicializar Temporizador
;Inicializar Interrupciones
Primero se enciende el led de adquisición. Después si el bit Add2 está a cero (1 byte de
dirección) se usará un solo byte DIRH que hará a la vez las funciones de byte selector de
dispositivo y byte de direcciones alto (bits de mayor peso de la dirección), también se utilizará el
byte DIRL como byte de dirección bajo (bits de menor peso de la dirección). Si por el contrario,
Add2 está a uno (2 bytes de direcciones), se usará un byte específico como selector de
dispositivo DEVSEL, otro también específico como byte de dirección alto DIRH, y como byte de
dirección bajo se usará DIRL. Después de inicializar los valores de esos registros, se inicializa el
control de las adquisiciones: se establece que se empezará por el canal 0 (LM35), será el primer
par de medidas, no hay todavía adquisiciones producidas y se deberá cumplir primero el tiempo
MEMORIA DE CÁLCULO Pag 32
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
de muestreo (TMR1) antes que el retardo entre canales(TMR0). Por último se inicializa la cola, el
direccionamiento indirecto de esta, y el índice de la cola.
2.1.6.1.1 Inicialización módulo A/D
El módulo A/D del PIC16F873 tiene cuatro registros ADCON0, ADCON1, ADRESH,
ADRESL, los dos primeros son de control y los segundos guardan el resultado alto y bajo de la
conversión. El registro ADCON1, como ya se ha mostrado, configura la función de los pines
(analógico, digital, referencia), así como si los diez bits se justificarán a derecha o izquierda. El
registro ADCON0, representado en la figura 2.14, controla las operaciones en el módulo A/D.
Tabla 2.13 Registro ADCON0
El tiempo de conversión se define por TAD, que vendrá definido por los bits ADCS1,
ADCS0. El PIC16F873 necesita al menos un mínimo de 12 TAD para los diez bits de conversión.
Además se debe asegurar que TAD sea siempre superior a 1.6 µs. Si se escoge una escala de
ocho, sabiendo que la frecuencia de reloj son 4 MHz vemos como se cumplen las
especificaciones para el TAD.
TAD =
1
1
= 4·
·8 = 8 µs > 1.6 µs (2.6)
f osc
4·106
8
MEMORIA DE CÁLCULO Pag 33
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Para iniciar una conversión analógica-digital utilizando el PIC16F873 se seguirán los
siguientes pasos:
1- Configurar los pines analógicos / tensiones de referencia / E/S digitales (ADCON1)
2- Seleccionar el canal de entrada (ADCON0)
3- Seleccionar el reloj de conversión (ADCON0)
4- Iniciar el módulo A/D (ADCON0)
La inicialización del conversor será:
ADon
movlw b'01000001'
movwf ADCON0
;Fad=Fosc/8, ADON
2.1.6.1.2 Inicialización Timers
El TMR0 ya ha sido inicializado y ahora sólo hace falta cargar la temporización que se
utilizará en este apartado. El valor inicialmente fijado ha sido de veinte milisegundos, aunque
variando la etiqueta de este valor (TT) se puede establecer otra temporización. Si se ha asignado
un preescaler de 128 y el pic va a 4 MHz, aplicando la fórmula (2.1) el valor a cargar en el
TIMER 0 será 156. Expresado este valor en complemento a dos en hexadecimal es 0x63.
Podemos ver como se cumple lo citado en (2.5)
156·128·4·250 ns=19968 µs (2.5)
El temporizador TMR1 un temporizador/contador de 16 bits que consta de dos registros
de 8 bits (TMR1H, TMR1L). El par de registros (TMR1H:TMR1L) del temporizador se
incrementa de 0000h a FFFFh, desbordándose cuando pasa del último valor al primero, entonces
se activa el bit TMR1IF del registro PIR1 (bit 0).
Mediante el registro T1CON, representado en la figura 2.15, se establece el modo de
trabajo del TMR1.
MEMORIA DE CÁLCULO Pag 34
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Tabla 2.14 Registro T1CON
Para el programa se activa el temporizador uno y se establece una preescala de ocho y se
utilizará el módulo como temporizador, utilizando por tanto el reloj interno (Fosc/4). El valor del
temporizador TMR1 inicialmente fijado ha sido de medio segundo, aunque variando la etiquetas
que corresponden al valor tomará inicialmente este (TAH-TAL) se puede establecer otra
temporización. Para establecer el medio segundo en la temporización los valores a cargar en el
TMR1 aplicando (2.1)
0,5
= 62500 (2.6)
250n·4·8
Como se debe expresar el número en complemento a dos el valor inicial será 0x0BDB.
La inicialización queda por tanto:
Ini_TMR
movlw
call
movwf
movlw
call
NTMR1
Read_EE
t1
NTMR0
Read_EE
;Inicializa contador TMR1
;Inicializa contador TMR1
MEMORIA DE CÁLCULO Pag 35
PROYECTO
DATA
movwf
clrf
clrf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
t0
TMR1L
TMR1L
TAH
TMR1H
TAL
TMR1L
TT
TMR0
b'00110001'
T1CON
LOGGER
PARA
TERMOPAR
;Aseguramos que TMR1H tiene el valor deseado
;Aseguramos que TMR1H tiene el valor deseado
;Contar 0,5 s TMR1
;Contar 20 ms TMR0
;TMR1 ON preescale 1:8
2.1.6.1.3 Preparar Interrupciones
Durante la adquisición se utilizarán las interrupciones de los temporizadores uno y cero, y
del conversor analógico-digital. Como no pueden utilizar la interrupción de ambos temporizadores
a la vez, se ha establecido que las interrupciones iniciales serán las del conversor analógico-digital
y la del temporizador uno.
Ini_I_A
2.1.6.2
bsf
movlw
movwf
movlw
movwf
bcf
STATUS,RP0
b'01000001'
PIE1
b'11000000'
INTCON
STATUS,RP0
;Selecciona banco 1
;ADIE TMR1IE
;Hablita int globales(GIE) y periferica(PIE)
;Selecciona banco 0
Unión de los bits de conversión bajos
Se desea crear un byte agrupando los dos bits bajos de cuatro conversiones de tal forma
que los bits del byte que los agrupe corresponda, de mayor a menor peso, a la primera
conversión, segunda, tercera y cuarta. Teniendo en cuenta que en el byte bajo de la conversión
analógica-digital, los dos bits significativos son los de mayor peso, se deberán desplazar esos bits
a la derecha hasta colocarlos en la posición establecida del byte agrupación. Una vez se han
colocado en posición los bits significativos del byte bajo, se ponen a cero los bits restantes y se
suman todos los bytes bajos, dando como resultado el byte que se quería obtener.
;<<<<<<---------------------- UNION BITS BAJOS ---------------------->>>>>>>
L_Byte
bcf
rrf
rrf
rrf
rrf
rrf
rrf
andlw
movwf
rrf
rrf
rrf
rrf
STATUS,C
TERMO2L,F
TERMO2L,F
TERMO2L,F
TERMO2L,F
TERMO2L,F
TERMO2L,W
0x03
TERMO2L
LM352L,F
LM352L,F
LM352L,F
LM352L,W
;Une los 2 bits bajos de la conversion en un byte
;En el extremo derecha va el termopar medida 2
;por eso se rota el byte 6 veces a dcha
;Elimina bits basura
;bits colocados
;Coloca el LM35 medida 2
;por tanto 4 rotaciones
MEMORIA DE CÁLCULO Pag 36
PROYECTO
DATA
andlw
addwf
rrf
rrf
andlw
addwf
movf
andlw
addwf
2.1.6.3
0x0C
TERMO2L,F
TERMO1L,F
TERMO1L,W
0x30
TERMO2L,F
LM351L,W
0xC0
TERMO2L,F
LOGGER
PARA
TERMOPAR
;Elimina bits basura
;se suma, colocandose junto con las anteriores
;coloca el termopar medida 1
;2 rotaciones
;Elimina bits basura
;suma con las anteriores bits rotados
;En el extremo izda el LM35 medida 1, no rota
;Elimina bits basura
;se suman y la union se completa
Escritura EEPROM I2C.
El primer byte que le envía el master (PIC) a la memoria es el selector de dispositivo del
bus I2C (DEV_SEL), al recibirlo la memoria reconoce que el master se quiere comunicar con
ella. En la tabla 2.16 se aprecian diferentes valores que adopta DEV_SEL dependiendo del tipo
de memoria utilizada.
Los selectores de dispositivo (chip enable) de la memoria se consideran que están a cero,
ya que esos pines no se han conectado en la placa. Puede que aprovechando el espacio del
DEV_SEL donde sólo se requieren cuatro bits para identificar el dispositivo, se aprovechen hasta
un máximo de tres para indicar la dirección de memoria a utilizar. El bit cero se utiliza para indicar
si se va utilizar un ciclo de lectura o escritura.
Tabla 2.15 Byte Selector de Dispositivo
Después pueden seguir uno o dos bytes de direcciones (BYTE_ADDR). La escritura se
hará siempre en modo página con la mayor capacidad posible. Si se utiliza un único
BYTE_ADDR tal como indica la siguiente figura 2.1 los pasos a seguir son:
MEMORIA DE CÁLCULO Pag 37
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Figura 2.1 Modos de escritura un byte de dirección
Iniciar la transmisión mediante una condición de start, después le sigue una selección de
dispositivo (DEV SEL) con el bit R/W a cero. La memoria reconoce el envío, envía ACK, y
espera la transmisión del byte de dirección, vuelve a responder con el ACK. El micro enviará el
máximo de bytes escribibles por página, uno después de otro tras recibir el bit de ACK. Por
último enviará el stop y se dará por concluido el correspondiente ciclo de escritura.
Si se utilizan dos BYTE_ADDR, la filosofía es la misma únicamente que se utilizan dos
bytes en lugar de uno, pero por lo demás la secuencia es la misma como puede observarse en la
figura 2.2
MEMORIA DE CÁLCULO Pag 38
PROYECTO
DATA
LOGGER
PARA
Figura 2.2 Modos de escritura dos bytes de dirección
Si se implementa en código el trozo de programa queda:
W_E2PROM
movlw
movwf
movlw
call
movwf
call
btfss
goto
movf
call
W_Addres
movf
Call
movf
call
J_BW_E2PRO movf
call
incf
DIRPAG
;Los datos pasan a la memoria EEPROM
FSR
;respetando el orden en la cola
MaxPagW
Read_EE
Index
Start
;Se escribe en modo pagina
Estado,Add2 ;2 bytes direccion ?
W_Addres
DEVSEL,W
;Selector dispositivo
Send
DIRH,W
;DEVSEL o direccion alta
Send
DIRL,W ;Direccion baja
Send
INDF,W
;bytes de datos
Send
FSR,F
MEMORIA DE CÁLCULO Pag 39
TERMOPAR
PROYECTO
DATA
incfsz
goto
call
LOGGER
PARA
TERMOPAR
Index,F
;hasta completar la pagina de escritura
J_BW_E2PRO
Stop
2.1.6.3.1 Rutinas I2C
El módulo MSSP ya se ha activado al iniciarse la ejecución del programa, pero aún no se
han establecido las rutinas que se utilizarán en esta comunicación. Las secuencias que se utilizan
son las secuencias de start, stop, transmisión y recepción del SSPBUF (registro donde se guardan
los bits recibidos o los listos para transmitir), restart, y secuencia de reconocimiento
(acknolewdge). Dichas secuencia se inician utilizando el registro SSPCON2, representado en la
figura 2.15.
Tabla 2.16 Registro SSPCON2
Operaciones que se realizan con el bus I2C:
MEMORIA DE CÁLCULO Pag 40
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
o Condición Start: Una condición de start debe preceder cualquier transferencia de
datos. Se identifica porque el master cambia el estado de la señal SDA de alto a bajo,
mientras la señal SCL se mantiene estable en estado alto.
o Condición Stop: Una condición de stop finaliza una transferencia de datos. Se
identifica porque el master cambia el estado de la señal SDA de bajo a alto, mientras
la señal SCL se mantiene estable en estado alto.
o Envío y recepción de datos. Para enviar y recibir datos correctamente la señal SDA
tiene que ser estable mientras SCL esté en alto, mientras SCL esté a nivel bajo puede
cambiar el valor de SDA
o Bit ACK. El bit acknowledge (reconocimiento) se usa para indicar una transferencia
correcta del byte de datos. El transmisor, que tanto puede ser el maestro como el
esclavo del bus, cede la señal SDA al receptor después de enviar los ocho bits de
datos. Durante el noveno pulso de reloj, el receptor pone la señal SDA baja para
reconocer que recibió los ocho bits de datos. Un NoAck (no reconocimiento) se
produce si la señal SDA está a nivel alto en el noveno pulso de reloj. En una lectura
un NoAck seguido de una condición de parada se utiliza para forzar al dispositivo
transmisor a permanecer en estado stand-by hasta la próxima comunicación.
o Condición Restart. Análoga a la condición de start, es un segundo start antes de
finalizar la comunicación con la secuencia de stop.
Cuando el PIC16F873 acaba una secuencia de start, stop, restart, transmisión, recepción
o acknowledge el bit SSPIF del registro PIR1 se pone a uno, el reseteo del bit debe realizarse
por software.
Las rutinas del I2C implementadas serán la de start, stop, enviar, leer y terminar con un no
reconocimiento, leer y terminar con un reconocimiento.
En todas las rutinas excepto en las de lectura se sigue un proceso similar, se borra el
señalizador SSPIF, se activa la secuencia correspondiente y se espera recibir el ACK. En la
escritura la secuencia es escribir el dato presente en el acumulador en el registro SSPBUF. En las
rutinas de lectura después de activar la secuencia de lectura, se espera el dato, se guarda en el
acumulador, se borra el señalizador, y se envía una secuencia de reconocimiento, esta puede se
un ACK o un NACK, una vez se recibe la validación del esclavo se da por concluida la rutina.
;<<<<<<-------------------- SECUENCIA START I2C ---------------------->>>>>>>
Start
FinStart
bcf
bsf
bsf
bcf
PIR1,SSPIF
;Borra señalizador operacion I2C
STATUS,RP0
SSPCON2,SEN ;Inicia secuencia de start
STATUS,RP0
btfss PIR1,SSPIF
;Espera a que acabe la secuencia
MEMORIA DE CÁLCULO Pag 41
PROYECTO
DATA
LOGGER
PARA
goto FinStart
return
;<<<<<<------------------- SECUENCIA RESTART I2C --------------------->>>>>>>
Restart
FinRestart
bcf
PIR1,SSPIF
;Borra señalizador operacion I2C
bsf
STATUS,RP0
bsf
SSPCON2,RSEN;Inicia secuencia de restart
bcf
STATUS,RP0
btfss PIR1,SSPIF
;Espera a que acabe la secuencia
goto FinRestart
return
;<<<<<<--------------------- SECUENCIA STOP I2C ---------------------->>>>>>>
Stop
FinStop
bcf
PIR1,SSPIF
;Borra señalizador operacion I2C
bsf
STATUS,RP0
bsf
SSPCON2,PEN ;Inicia secuencia de stop
bcf
STATUS,RP0
btfss PIR1,SSPIF
;Espera a que acabe la secuencia
goto FinStop
return
;<<<<<<------------------- SECUENCIA ESCRITURA I2C ---------------->>>>>>>
Send
FinSend
bcf
PIR1,SSPIF
movwf SSPBUF
btfss PIR1,SSPIF
goto FinSend
return
;Borra señalizador operacion I2C
;Envia dato
;Espera ACK
;<<<<<<----------------- SECUENCIA LECTURA I2C CON ACK --------------->>>>>>>
Read
FinRead
FinNAck
bcf
PIR1,SSPIF
;Borra señalizador operacion I2C
bsf
STATUS,RP0
bsf
SSPCON2,RCEN;Inicia secuencia de lectura
bcf
STATUS,RP0
btfss PIR1,SSPIF
;Espera dato
goto FinRead
bcf
PIR1,SSPIF
;Borra señalizador operacion I2C
bsf
STATUS,RP0
bsf
SSPCON2,ACKDT
;Si ACK
bsf
SSPCON2,ACKEN
;Inicia secuencia de ACK
bcf
STATUS,RP0
btfss PIR1,SSPIF
;Espera a que acabe la secuencia
goto FinNAck
movf SSPBUF,W
;Dato listo en W
return
;<<<<<<----------------- SECUENCIA LECTURA I2C SIN ACK --------------->>>>>>>
ReadAck
bcf
PIR1,SSPIF
;Borra señalizador operacion I2C
MEMORIA DE CÁLCULO Pag 42
TERMOPAR
PROYECTO
FinReadAck
FinAck
2.1.6.4
DATA
LOGGER
PARA
TERMOPAR
bsf
STATUS,RP0
bsf
SSPCON2,RCEN;Inicia secuencia de lectura
bcf
STATUS,RP0
btfss PIR1,SSPIF
;Espera dato
goto FinReadAck
bcf
PIR1,SSPIF
;Borra señalizador operacion I2C
bsf
STATUS,RP0
bcf
SSPCON2,ACKDT
;No ACK
bsf
SSPCON2,ACKEN
;Inicia secuencia de ACK
bcf
STATUS,RP0
btfss PIR1,SSPIF
;Espera a que acabe la secuencia
goto FinAck
movf SSPBUF,W
;Dato listo en W
return
Restaurar Adquisición
Se han de desactivar las interrupciones, la del temporizador cero, uno y del conversor
A/D. Se ha el funcionamiento del temporizador uno y del conversor analógico-digital. Por último
apagar el led de adquisición y volver a esperar un próximo comando
;<<<<<<-------------------- FIN BUCLES,RESTAURAR --------------------->>>>>>>
Rest_Adq
2.1.7
bsf
clrf
bcf
bcf
bcf
bcf
bcf
bcf
goto
STATUS,RP0
;Selecciona banco 1
INTCON
;Borra GIE,PIE,T0IE
PIE1,TMR1IE ;Desactiva la interrupcion TIMER 1
PIE1,ADIE
;Desactiva la interrupcion A/D
STATUS,RP0 ;Selecciona banco 0
T1CON,TMR1ON;Desactiva el TIMER 1
ADCON0,ADON;Desactiva el A/D
PORTC,1
;Fin Adquisicion
M_P
;Vuelve a la espera de un proximo comando
Lectura temperaturas almacenadas en la EEPROM, Transmisión
Ahora el algoritmo a desarrollar aparece en la figura 5.4a de la memoria descriptiva,
quedando el trozo de programa de la siguiente forma:
;<<<<<<----------------------- INCIO TRANSMISION --------------------->>>>>>>
;<<<<<<--------------------- INICIALIZACIONES TRM -------------------->>>>>>>
;<<<<<<---------------------------- BUCLES --------------------------->>>>>>>
BdirH_R
clrf
movlw
call
movwf
DIRL
Ini_NDIRLR
Read_EE
NDIRL
BdirL_R
movlw DIRPAG
movwf FSR
movlw MaxReadA
;direccion baja
;Contador de incrementos del byte direccion bajo
;para una lectura de E2PROM
;Lectura secuencial de datos
;los datos se guardan en una cola para enviarlos
MEMORIA DE CÁLCULO Pag 43
PROYECTO
DATA
movwf Index
bcf
DIRH,W_R
LOGGER
PARA
TERMOPAR
;Primero se realiza una falsa escritura
;<<<<<<---------------------------- EE->RAM -------------------------->>>>>>>
;<<<<<<---------------------------- RAM->RS -------------------------->>>>>>>
;<<<<<<-------------------- FIN BUCLES,RESTAURAR --------------------->>>>>>>
FinBR
movlw
addwf
incfsz
goto
movlw
call
addwf
incfsz
goto
MaxReadInc
DIRL,F
NDIRL,F
BdirL_R
INCH
Read_EE
DIRH,F
NDIRH,F
BdirH_R
;se icrementa la direccion baja
;se ha desbordado?
;Se incrementa la direccion alta
;se ha trasmitido todo?
;Restaurar
;<<<<<<------------------------ FIN TRANSMISION ---------------------->>>>>>>
Al iniciar el bucle alto se inicializan la dirección alta y al iniciar el bucle bajo se inicializa la
cola, después se rellena la cola de datos que se leen de la memoria EEPROM, y una vez llenada
se vacía envíado los datos al ordenador, y vuelve a empezar hasta que se han transmitidos todos
los datos contenidos en la memoria.
2.1.7.1
Incialización Transmisión
Se enciende el led de transmisión. Se activa la transmisión asíncrona y se carga al TMR0
al valor prefijado. Después dependiendo de si se utiliza uno o dos bytes de direcciones, se inicia
sólo el byte DIRH, o los bytes DEVSEL y DIRH. También se inicia NDIRH.
;<<<<<<--------------------- INICIALIZACIONES TRM -------------------->>>>>>>
Ini_Lec_Tr
T_Adquirir
TRX_EN
I_T_C
LT_Add
LT_Dev
bsf
PORTC,2
movlw TT
movwf TMR0
bsf
STATUS,RP0
bsf
TXSTA,TXEN
bcf
STATUS,RP0
;Led Transmision
movlw
call
movwf
btfss
goto
movlw
movwf
clrf
;Inicializa las variables
;Contador de incrementos del byte direccion alto
Ini_NDIRH
Read_EE
NDIRH
Estado,Add2
LT_DD
DEVSEL_W
DEVSEL
DIRH
;Selecciona banco 1
;Activa la transmision
;Selecciona banco 0
;2 bytes direccion ?
;Bits direccion I2C
;direccion alta=0
MEMORIA DE CÁLCULO Pag 44
PROYECTO
DATA
LOGGER
LT_DD
goto
BdirH_R
movlw DEVSEL_W
movwf DIRH
2.1.7.2
Lectura EEPROM
PARA
TERMOPAR
;Bits direccion I2C y bits direccion alta
;de la memoria EEPROM
El proceso de lectura de la memoria EEPROM es similar al realizado en la escritura.
Puede observarse en la figura tal proceso en la figura 2.3, donde se expresan las diferentes formas
de lectura posibles en las memorias M24x, pudiendo variar únicamente que pueden haber dos
bytes de direcciones en lugar de uno como aquí se ha expresado.
Figura 2.3 Lectura EEPROM
Al leer se realizarán una lectura secuencial aleatoria, es decir se especifica la dirección del
primer byte con una falsa escritura, se realizará un start, se enviará el byte selector de dispositivo
MEMORIA DE CÁLCULO Pag 45
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
con el bit R/ W a cero y después de recibir el ACK se enviará el byte de dirección para recibir
nuevamente el ACK y aquí acaba la falsa escritura. La parte de lectura se iniciará con un restart,
se volverá a enviar el byte selector de dispositivo, pero con el bit R/ W a uno, indicando que se
procederán a efectuar lecturas, la memoria responderá con un acknowledge e irá enviando bytes
de datos mientras el microcontrolador le responda con un ACK, en el momento en que el micro
responda a la petición de reconocimiento con un NO ACK seguido de una secuencia de stop se
dará por concluida la lectura.
Al indicar la dirección del dispositivo EEPROM se diferencia entre el direccionamiento
utilizando un único byte específico de dirección o dos. Los bytes de los valores que se vayan
leyendo de la memoria se irán guardando en una cola. El tamaño prefijado de la cola se ha
establecido que serán 128 bytes, por lo que para guardar todos los datos de la cola se utilizarán
registros contenidos en los dos primeros bancos de memoria. También
El algoritmo 5.4.b de la memoria descriptiva, se ha tomado de referencia a la hora de
realizar el programa:
;<<<<<<---------------------------- EE->RAM -------------------------->>>>>>>
R_E2PROM
R_Addres
Seq_R
R_DEVSEL
R_DIRH
BR_E2PROM
Banco1
call
btfss
goto
movf
call
movf
Call
movf
call
Start
Estado,Add2
R_Addres
DEVSEL,W
Send
DIRH,W
Send
DIRL,W
Send
;Para indicar la direccion a leer
;2 bytes direccion ?
call
btfss
goto
bsf
movf
call
goto
bsf
movf
call
Restart
Estado,Add2
R_DIRH
DEVSEL,W_R
DEVSEL,W
Send
BR_E2PROM
DIRH,W_R
DIRH,W
Send
;Se relizan las lecturas secuencialmente
;donde el incremento de direccion es automatico
;2 bytes direccion ?
;lectura en el Selector dispositivo
call
movwf
incf
btfsc
goto
incfsz
goto
goto
ReadAck
INDF
FSR,F
FSR,7
Banco2
Index,F
BR_E2PROM
Fin_R
;Se leen los datos y se envia el ACK
;Se guardan en la cola
;Selector dispositivo
;DEVSEL o direccion alta
;lectura en la direccion alta
;La cola ha llenado el banco 1?
;avanza la cola,esta a punto de llenarse?
MEMORIA DE CÁLCULO Pag 46
PROYECTO
Banco2
DATA
incf
movlw
movwf
call
movwf
incf
incfsz
goto
B2R
Index,F
INIBANK2
FSR
ReadAck
INDF
FSR,F
Index,F
B2R
Fin_R
call
Read
movwf INDF
call
Stop
2.1.7.3
Transmisión USART
LOGGER
PARA
TERMOPAR
;no nos olvidamos que la cola ha avanzado
;se empiezan a colocar los datos en el banco 2
;Se leen los datos y se envia el ACK
;se siguen guardadon los datos ahora en el banco 2
;sigue avanzando,esta a punto de llenarse?
;se llena, y se finaliza la lectura
Cada transmisión seguirá el patrón habitual de las comunicaciones asíncronas: un bit de
inicio, ocho bits de datos y un bit de stop.
Teniendo en cuenta que ya se ha inicializado la USART del PIC16F873, para realizar
mediante este módulo una transmisión se seguirán los siguientes pasos:
o Permitir la transmisión poniendo a uno el bit TXEN, poner a cero el bit TXIF del
registro PIR1
o Iniciar la transmisión cargando el dato a transmitir en TXREG, internamente el micro
pasa los datos al registro TSR. Una vez finalizada la transmisión con el
correspondiente bit de stop, entonces TXIF valdrá uno. El reset del bit TXIF se debe
efectuar por software. Para realizar nuevas transmisiones repetir este último paso.
Los datos a transmitir estarán en la cola RAM que puede estar ubicada tanto en un banco
o en los dos bancos de memoria. Cuando se envía un dato se llama una rutina que puede producir
un retardo entre transmisión y transmisión. Teniendo en cuenta que el algoritmo de esta rutina
aparece en la figura 5.4.b de la memoria descriptiva, la parte del programa correspondiente a la
USART será:
;<<<<<<---------------------------- RAM->RS -------------------------->>>>>>>
Transmision
Trmt128
W_Tras btfss
movlw DIRPAG
;Se transmiten los datos de la cola
movwf FSR
movlw MaxRead
movwf Index
bcf
PIR1,TXIF
;Se borra el señalizador de escritura para empezar
movf
INDF,W
;se transmite el dato
movwf TXREG
PIR1,TXIF
;Encuesta para el final de la transmision
Goto W_Tras
call
Temporiza
;Evita fallos transmisión esperando un tiempo
incf
FSR,F
;se ha llegado al banco 1?
btfsc FSR,7
goto
Banco2T
MEMORIA DE CÁLCULO Pag 47
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Banco1T
incfsz
goto
goto
Index,F
Trmt128
FinBR
;Reduce la cola
Banco2T
incf
movlw
movwf
movf
movwf
call
btfss
goto
incf
incfsz
goto
Index,F
INIBANK2
FSR
INDF,W
TXREG
Temporiza
PIR1,TXIF
W_Tras2
FSR,F
Index,F
B2T
;no nos olvidamos que la cola se ha reducido
;empiezan a salir los datos en el banco 2
B2T
W_Tras2
;se transmite el dato
;Evita fallos transmisión
;se ha vaciado la cola?
2.1.7.3.1 Rutina Temporiza
Esta rutina se utiliza para retardar las transmisiones con la USART.Se retardan un número
de veces, el tiempo de retardo especificado en la EEPROM para el temporizador cero. Ese
número también puede ser cero y por tanto, no se retardará el sistema. La gestión del
temporizador cero, en este caso, se trata por encuesta.
Temporiza
Delay_20mS
Delay
2.1.7.4
bcf
STATUS,RP0
movlw NTMR0
call
Read_EE
movwf t0
incfsz to,F
goto
Delay_20mS
return
bcf
INTCON,T0IF
btfss INTCON,T0IF
goto
Delay
incfsz t0,F
goto Delay_20mS
return
;Selecciona banco 0
Fin Transmisión
Para finalizar la transmisión se desactiva la transmisión de la USART, se apaga el led de
transmisión y vuelve a esperar una nueva operación.
;<<<<<<-------------------- FIN BUCLES,RESTAURAR --------------------->>>>>>>
Fin
bsf
Bcf
bcf
bcf
goto
STATUS,RP0
TXSTA,TXEN
STATUS,RP0
PORTC,2
M_P
;Selecciona banco 1
;Desactiva la transmision
;Selecciona banco 0
;Finaliza la trasmision
;Vuelve a la espera de un proximo comando
MEMORIA DE CÁLCULO Pag 48
PROYECTO
2.1.8
DATA
LOGGER
PARA
TERMOPAR
Interrupciones
Por último el algoritmo de la rutina de interrupción aparece en la figura 5.5 de la memoria
descriptiva. La rutina de interrupción al guardar los bytes de estado y acumulador asegura que se
vuelva de la interrupción sin un imprevisto cambio.
El registro señalizador de las interrupciones periféricas es PIR1 y aparece en la tabla 2.17.
Tabla 2.17 Registro PIR1
Teniendo en cuenta los señalizadores y lo anterior la rutina de servicio a la interrupción
queda:
;<<<<<<------------------- VECTOR DE INTERRUPCION -------------------->>>>>>>
MEMORIA DE CÁLCULO Pag 49
PROYECTO
INTER
DATA
LOGGER
PARA
ORG
0x04
bcf
movwf
swapf
clrf
movwf
INTCON,GIE
SALVAW
;Salva W
STATUS,W
;Invierte STATUS --> W
STATUS
;Banco 0, borra IRP,RP1,RP0
SALVASTATUS
;Salva STATUS
TERMOPAR
;Inicio del vector de interrupcion
;No se guarda el PCLATH,solo se usa la página 1 de memoria de programa
Timer_0
Timer_1
ADC
Recept
btfss
goto
btfss
goto
bcf
bsf
bcf
bcf
bsf
bsf
bcf
bsf
goto
INTCON,T0IF
Timer_1
Estado,T0_ok
Timer_1
Estado,T0_ok
Estado,T1_ok
INTCON,T0IE
PIR1,TMR1IF
STATUS,RP0
PIE1,TMR1IE
STATUS,RP0
ADCON0,GO
Restaura_INT
;Interrupcion por TMR0?
btfss
goto
btfss
goto
incfsz
goto
movlw
call
movwf
bcf
bsf
bsf
bcf
bcf
bsf
bcf
bsf
goto
PIR1,TMR1IF
ADC
Estado,T1_ok
ADC
t1,F
Restaura_INT
NTMR1
Read_EE
t1
Estado,T1_ok
Estado,T0_ok
STATUS,RP0
PIE1,TMR1IE
INTCON,T0IF
INTCON,T0IE
STATUS,RP0
ADCON0,GO
Restaura_INT
;Interrupcion por TMR1?
btfss
goto
bcf
bsf
goto
PIR1,ADIF
Recept
PIR1,ADIF
Estado,Ad_ok
Restaura_INT
;¿Interrupcion por conversion?
btfss
goto
PIR1,RCIF
Restaura_INT
;¿Interrupcion por recepcion?
;No. Falsa interrupcion
;o solo overflow flag?
;No hacer caso del flag TMR0
;Hacer caso del flag TMR1
;Desactiva irq TMR0
;Repone Flag TMR1
;Selecciona banco 1
;Activa irq TMR1
;Selecciona banco 0
;Inicia la conversion A/D
;tiempo completado ?
;Repone contador TMR1
;No hacer caso del flag TMR1
;Hacer caso del flag TMR0
;Selecciona banco 1
;Desactiva irq TMR1
;Repone Flag
;Activa irq TMR0
;Selecciona banco 0
;Inicia la conversion A/D
;Si. Reponer Flag
;Datos listos
MEMORIA DE CÁLCULO Pag 50
PROYECTO
Restaura_INT
2.1.9
DATA
LOGGER
PARA
bcf
movf
movwf
call
incf
PIR1,RCIF
;Si. Reponer Flag
RCREG,W
;Lectura dato recibido
DATA_EE_DATA
;Guardar EEPROM
Write_EE
DATA_EE_ADDR,F
;Incrementar direccion
swapf
movwf
swapf
swapf
bsf
retfie
SALVASTATUS,W
STATUS
SALVAW,F
SALVAW,W
INTCON,GIE
TERMOPAR
;Invierte STATUS --> W
;Restaura STATUS
;Invierte --> F
;Restaura W
;Retorna habilitando todas las interrupciones
Escritura EEPROM interna
La rutina de escritura de la memoria de datos de la EEPROM del PIC16F873 necesita
que se le pasen la dirección y el dato a escribir, mediante las variables DATA_EE_ADDR y
DATA_EE_DATA; estas variables son traspasadas a su vez a los registros internos de dirección
y datos para la memoria EEPROM (EEADR, EEDATA). Se declara que se escribirá en memoria
de datos (EEPROM) no en memoria de programa (FLASH) y habilita la escritura. Para escribir
los datos se debe seguir la secuencia de instrucciones prefijada: primero 55h y después AAh son
enviados sucesivamente al registro EECON2. Se espera que la escritura finalice y para acabar se
deshabilitan las escrituras, evitando de esta forma posibles escrituras espúreas. La rutina
implementada quedará finalmente:
;<<<<<<----------------- ESCRITURA DE EEPROM INTERNA ----------------->>>>>>>
Write_EE
movf
bsf
movwf
bcf
movf
bsf
movwf
bsf
bcf
bsf
bcf
DATA_EE_ADDR,W
STATUS,RP1 ;Bank 2
EEADR
STATUS,RP1 ;Bank 0
DATA_EE_DATA,W
STATUS,RP1 ;Bank 2
EEDATA
STATUS,RP0 ;Bank 3
EECON1,EEPGD
;Point to DATA Memory
EECON1,WREN
;Enable writes
INTCON,GIE
;Disable interrupts
movlw
movwf
movlw
movwf
bsf
0x55
EECON2
0xAA
EECON2
EECON1,WR
;Required Sequence
bsf
INTCON,GIE
;Enable interrupts
bcf
STATUS,RP0
MEMORIA DE CÁLCULO Pag 51
PROYECTO
bcf
btfss
goto
bsf
bsf
bcf
bcf
bcf
return
Escrito
2.2
DATA
LOGGER
PARA
TERMOPAR
STATUS,RP1 ;Bank 0
PIR2,EEIF
;Wait for signal write complete
Escrito
STATUS,RP0
STATUS,RP1 ;Bank 3
EECON1,WREN
;Disable writes
STATUS,RP0
STATUS,RP1 ;Bank 0
Programa en C
A la hora de desarrollar el programa, se muestran las diferentes partes que componen el
programa, desde el inicio hasta el fin.
2.2.1
Cabecera
Primero se incluyen los ficheros donde se encuentran las funciones en C que se usarán a lo
largo del programa. Después se definen las direcciones de los registros que controlan el
temporizador 8254 del ordenador y la dirección del vector de la interrupción de este. La última
definición define el máximo de coeficientes que podrá tener la matriz de polinomios del termopar.
//Definiciones
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define INTVECT_Time 0x08 /* Timer 0 IRQ */
#define TIMER0 0x40 /* Adress Timer 0*/
#define control8254 TIMER0+3 /*Control Timer 0*/
#define max_coef 15 /*Maximo coefientes polinomicos para calculo termopar*/
Se definen dos estructuras, una agrupa los bytes que se enviarán al data logger, y la otra
los parámetros para el cálculo de la compensación por software de unión fría. Los nueve campos
de la primera estructura hacen referencia a las variables reflejadas en la tabla 5.1 de la memoria
descriptiva. Los campos de la segunda estructura son: la tensión máxima del conversor analógicodigital, el offset del INA114, la ganancia entrada conversor analógico-digital - temperatura de
referencia, y la ganancia tensión producida por el termopar - tensión de entrada del conversor
analógico-digital.
typedef unsigned char uchar;
typedef struct data_EE //Se agrupan los bytes a enviar al data logger
{
unsigned char Ini_NDIRH,Ini_NDIRL,Ini_NDIRLR;
unsigned char MaxPagW,MaxRamPag,INCL,INCH,NTMR1,NTMR0;
MEMORIA DE CÁLCULO Pag 52
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
} mem_EE;
typedef struct param_int //Se agrupan los parametros internos de compensacion
{
float Vcc,Voff,gao,gai;
} conf_in;
Para asignar el tiempo de muestreo requerido se necesita conocer la base de tiempos para
el muestreo, por lo que se indica mediante una constante. También se indica como constante el
número de veces que deberá ejecutarse la rutina de atención a la interrupción del timer para que
se de por cumplido el tiempo fijado, en este caso se ha considerado cinco.
//Constantes
const float escala=0.52;//Escala TMR1 del data logger
const int max_times=5; //Veces que se repite la IRQ 0 para dar alarma
Las variables globales utilizadas hacen referencia a la dirección inicial y al vector de
interrupción de la UART, al control de la cola, al retardo del timer y al cumplimiento del tiempo
del timer. Una variable se utiliza para indicar la evolución de los datos durante la secuencia de
envíos.
//Variables Globales
int PORT1;
int INTVECT;
int bufferin = 0;
int bufferout = 0;
uchar buffer[1025];
int temperatura=-1;
int times=0;
int envio=0;
//Registro de direccion de la UART
//Registro de direccion del PIC(8259)
//Principio de la cola
//Final de la cola
//Cola donde se guardan los bytes recibidos
//Identifica la secuencia de datos
//Controla el retardo para dar alarma
//Alarma producida realizar envio...
Las funciones que utiliza el programa son:
void interrupt (*oldport1isr)(); /*Punteros a ISR*/
void interrupt (*oldtimer0isr)();
Son punteros a las rutinas de servicio a la interrupción que se quieren cambiar en el
programa
void interrupt PORT1INT() /* Interrupt Service Routine (ISR) for PORT1 */
void interrupt TIMERINT() /* Interrupt Service Routine (ISR) for TIMER 0 */
Las rutinas de servicio a la interrupción del puerto serie y del temporizador.
int ini_usart(int com) /*Inicializa los registros internos de la USART permitiendo su uso, e
interrupcion*/
int fin_usart(int com) /*Fin uso de la USART*/
Inicialización y restaración de la UART, se le pasa el puerto serie a inicializar y devuelve
un uno si ese puerto es correcto.
void ini_timer(void) /*Inicializa los registros internos del TMR permitiendo su uso, e interrupcion*/
void fin_timer(void) /*Fin uso del TMR*/
Inicialización y restaración del temporizador.
MEMORIA DE CÁLCULO Pag 53
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
int ctermo(char termo,double num,double *c,int *n,int inv)
A partir del tipo de termopar, si se desean equivalencia temperatura-tensión o tensión
temperatura, y el valor al que se le aplicará el cálculo potencia, devuelve una cadena de
polinomios y la longitud de esa cadena. Si los datos pasados son correctos, devolverá un uno la
función.
double SUMCOEF(double *tab, float valor,int imax) /*Metodo rapido para el calculo de potencias*/
Método rápido para el cálculo de las ecuaciones (1.2) y (1.3) de la memoria descriptiva,
devuelve el resultado de la suma de potencias para la cadena de polinomios enviada, el número
de polinomios de esta cadena, y el valor al que se le aplicarán los polinomios.
double EmV(float T,char termo) /*Devuelve la tension que produciria el termopar a la temperatura
dada*/
double T90(float E,char termo) /*Devuelve la temperatura del termopar con la que se produce la
tension dada*/
Devuelven la equivalencia temperatura-tensión y tensión-temperatura para el termopar
asignado. Devuelven -1 si el termopar no es conocido o la magnitud excede el rango medible para
ese termopar.
int c_fria(uchar L1,uchar T1,uchar L2,uchar L,uchar T2,double *t1,double *t2,double *trm1,double
*trm2,double *V1,double *V2,conf_in *p,char ter) //Compensacion
Determina los cuatro valores de las conversiones contenidos en una serie de datos (L1,
T1, L2, Low, T2). Se le envían los parámetros de compensación en una variable estructura.
Devuelve las dos temperaturas ambientes y las dos tensiones producidas por el termopar que se
registraron en dos “muestreos” y las dos temperaturas del termopar resultantes ya compensadas.
Devuelve un uno si los datos son correctos
void adq(char op,int COM,conf_in *par) /*Gestiona bytes que llegan del serie, guarda los datos
gestionados en ficheros*/
Compensación de temperaturas que llegan del data logger por el puerto serie. Se le indica
el termopar usado, el puerto serie y los parámetros de compensación.
int adqf(char op,conf_in *par) /*Gestiona bytes del fichero,guarda las temperaturas procesadas en
ficheros*/
Compensación de temperaturas que están guardas en un fichero. Se le indica el termopar
usado, y los parámetros de compensación. Devuelve un uno si el fichero existe
int manual (char ter) //compensación manual
Compensación de una temperatura introduciendo datos que se han medido directamente
sobre el termopar. Se le indica el termopar usado, y devuelve un uno si el termopar es conocido y
las mediciones corresponden a valores que están localizados dentro del rango de medidas para
ese termopar.
void trmt (mem_EE *data) //Transmite los datos al data logger
Transmisión por el puerto serie de la configuración para el data logger.
void get_data (int COM) //Transmite al DL los parametros introducidos
MEMORIA DE CÁLCULO Pag 54
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
int get_dataf (int COM) //Transmite al DL los datos de un fichero
Transmitir la configuración por el puerto serie indicado, a través de preguntas al usuario o
mediante un fichero. Si existe ese fichero devolverá un uno la función.
int get_paramf(conf_in *p) /*Carga los parametros internos del fichero de configuracion*/
Carga los parámetros internos de compensación a través de un fichero. Devuelve un uno
si el fichero existe.
void get_param(conf_in *p) //Modifica los parametros internos del programa
Guarda los parámetros internos de compensación en el fichero.
int analisis (int c,char **v,int *comando,int *com,char *ter)
Se le pasan la línea de comandos del MS-DOS los elementos contenidos en ella. Al
analizar la lína la rutina devuelve: la opción de ejecución del programa a realizar, el puerto serie y
el termopar a utilizar. Devuelve un uno si la cadena de comandos era correcta.
int main(int argc,char *argv[])
Primera rutina que ejecuta el programa, se le pasa la línea de comandos empleada al
ejecutar el programa, y el número de elementos distinguidos de esa cadena. Devuelve un uno si se
produce algún error.
2.2.2
Función Main
El algoritmo que describe esta función aparece en la figura 5.6 de la memoria descriptiva,
quedando el trozo de programa de la siguiente forma:
int main(int argc,char *argv[])
{
char termo='0'; //Tipo de termopar
int opcion=0; //Opcion del programa escogida
int port=0;
//Puerto serie
conf_in param; //Parametros internos de compensacion
//Si la opcion se ha introducido correctamente sigue sino acaba
if (analisis(argc,argv,&opcion,&port,&termo)) return(1);
switch (opcion) //Sigue segun la opcion elegida
{
case 1:
//Compensacion datos procedentes puerto serie
if (get_paramf(&param))
//Si los parametros internos son correctos
{
adq(termo,port,&param); //Compensa los datos que vengan de alli
}
else return(1);
break;
case 2:
//Compensacion datos extraidos desde un fichero
if (get_paramf(&param))
{
adqf(termo,&param);
//Compensa
MEMORIA DE CÁLCULO Pag 55
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
}
else return(1);
break;
case 3:
//Transmite configuracion especifica al data logger
get_data(port);
break;
case 4:
//Transmite configuracion habitual al data logger
get_dataf(port);
break;
case 5:
//Modifica los parametros internos
get_param(&param);
break;
case 6:
//Compensación manual
manual(termo);
break;
}
return(0);
}
2.2.3
Análisis de la línea de comandos
Se utiliza para leer la línea de comandos y establecer a partir de ella la opción del
programa que se ejecutará, el tipo de termopar usado, el puerto de comunicaciones disponible, y
si se utilizará fichero. Si la cadena no es correcta la función devolverá cero con lo que se
considerará que se ha producido un error.
La sintaxis del programa es:
TERMO <comando> [/com=n] [/ter=n] [/fil]
Donde comando puede ser c, t, p, m (ver ANEXO 1:MANUAL USUARIO) y los
parámetros el puerto serie de comunicaciones (1-4), el termopar (B, E, J, K, N, R, S, T), y la
utilización de un fichero interno (sólo para los comandos c o t).
Para leer un número indeterminado de parámetros, se busca la secuencia de caracteres
que conforma un parámetro, cuando no se encuentren más parámetros, o haya un parámetro
repetido, o un parámetro incorrecto, estas dos últimas condiciones producen error si se producen,
se dará por finalizada la función. Si se produce un error de reconocimiento de la línea de
comandos se mostrará un texto de ayuda de la sintaxis del programa.
int analisis (int c,char **v,int *comando,int *com,char *ter)
{ //Interpreta la linea de comandos
int error=0; //Linea correcta
int n;
int p_com,p_ter,p_fil;
*com=1; *ter='k'; //Valores por defecto
if ((c>=2)) //Una cadena en la linea
{
if (*v[1]=='c') //Compensacion
MEMORIA DE CÁLCULO Pag 56
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
*comando=1;
else
if (*v[1]=='t') //Transmision
*comando=3;
else
if (*v[1]=='p') //Configuracion
*comando=5;
else
if (*v[1]=='m') //Manual
*comando=6;
else error=1;
p_com=p_ter=p_fil=0;
for (n=2;(n<c)&&(!error);n++)
{
p_com=(!p_com)&&(*v[n]=='/')&&(*(v[n]+1)=='c')&&(*(v[n]+2)=='o')&&(*(v[n]+3)=='m')&&(*(v[n]+4)=='=');
p_ter=(!p_ter)&&(*v[n]=='/')&&(*(v[n]+1)=='t')&&(*(v[n]+2)=='e')&&(*(v[n]+3)=='r')&&(*(v[n]+4)=='=');
p_fil=(!p_fil)&&(*v[n]=='/')&&(*(v[n]+1)=='f')&&(*(v[n]+2)=='i')&&(*(v[n]+3)=='l');
if (p_com) //com=n
{
*com=(int) *(v[n]+5)-48; //ASCII a numero
error=(*com<1)||(*com>4); //Puerto serie real
}
else
if (p_ter) //ter=n
{
*ter=*(v[n]+5); //Termopar permitido
error=!((*ter=='b')||(*ter=='e')||(*ter=='j')||(*ter=='k')||(*ter=='n')||(*ter=='r')||(*ter=='s')||(*ter=='t'));
}
else
if ((p_fil)&&((*comando==1)||(*comando==3))) //fil y c o t
{
*comando=*comando+1;
}
else error=1; //Parametro desconocido o repetido
}
}
else error=1; //No comando
if (error==1) //Muestra ayuda
{
printf("\nUso: TERMO <comando> [/com=n] [/ter=n] [/fil]\n\n<Comandos>\n");
printf("c Compensación termopar\n");
printf("t Transmisión configuración data logger\n");
printf("p Modificación/Creación par metros internos\n");
printf("m Compensación indicando tensión producida y temperatura ambiente\n\n");
printf("Parámetros\n");
printf("/com=n indica el puerto serie usado n=1|2|3|4 , por defecto n=1\n");
printf("/ter=n indica el tipo de termopar usado n=b|e|j|k|n|r|s|t , por defecto n=k\n");
printf("/fil indica si se utilizara fichero interno, por defecto no se utiliza\n");
printf("Nota este par metro no será válido para los comandos p o m\n");
}
return (error);
MEMORIA DE CÁLCULO Pag 57
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
}
2.2.4
Configuración interna del programa
Hay dos rutinas de configuración. Una crea o modifica los parámetros de compenasción
del data logger, get_param, guardándolos en el fichero FICHCON y otra los lee de dicho fichero,
get_paramf, para poder usar esos parámetros.
La rutina get_param permite al usuario variar los parámetros internos de compensación
del programa. Una vez el usuario ha introducido todos los datos requeridos, se guardan en el
fichero FICHCON. La rutina queda finalmente:
void get_param(conf_in *p) //Modifica los parametros internos del programa
{
int valor_ok;
FILE *fp;
printf("\nModificacion Parametros Compensacion\n\n");
fp=fopen("fichcon","wt"); //Se introducen todos los parametros en el fich
printf("Tensión alimentación Vcc (V) "); //Preguntas
scanf("%f",&p->Vcc);
printf("Tensión de offset (mV) ");
scanf("%f",&p->Voff);
printf("Ganancia LM35 T¦ ");
scanf("%f",&p->gao);
printf("Ganancia Termopar V ");
scanf("%f",&p->gai);
fprintf (fp,"%E ",p->Vcc);
//Guarda fichero
fprintf (fp,"%E ",p->Voff);
fprintf (fp,"%E ",p->gao);
fprintf (fp,"%E\n",p->gai);
fclose(fp);
}
La rutina get_paramf obtiene los parámetros de configuración del programa que se
guardaron en el fichero FICHCON. Si el fichero existe, la rutina devolverá un uno, sino devolverá
un cero. Una vez abierto el fichero se extraen todos los números presentes en el fichero
FICHCON que equivalen a las variables de configuración del programa. La rutina queda
finalmente:
int get_paramf(conf_in *p) /*Carga los parametros internos del
fichero de configuracion*/
{
int valor_ok=0; //Devuelve 1 si se realiza correctamente la carga
FILE *fp;
fp=fopen("fichcon","rt"); //Si existe el fichero de configuracion
valor_ok = !(fp==NULL);
if (valor_ok)
MEMORIA DE CÁLCULO Pag 58
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
{
//Carga los parametros
valor_ok=fscanf (fp,"%E",&p->Vcc);
if (valor_ok) valor_ok=fscanf (fp,"%E",&p->Voff);
if (valor_ok) valor_ok=fscanf (fp,"%E",&p->ts);
if (valor_ok) valor_ok=fscanf (fp,"%E",&p->gao);
if (valor_ok) valor_ok=fscanf (fp,"%E",&p->gai);
fclose(fp);
}
else printf ("\nFichero de par metros internos no encontrado\n");
return(valor_ok);
}
2.2.5
Compensación
Hay tres comandos que permiten compensar datos procedentes de un tempar, compensar
datos guardados en el termopar que llegan al ordenador a través de su puerto serie, compensar
temperaturas que ya han sido transferidas anteriormente y se encuentran guardadas en un fichero,
y compensar una única temperatura producida en un termopar introduciendo los datos que han
sido medidos por el usuario.
2.2.5.1
Compensación desde el data logger
Primero se abren los ficheros donde se guardarán los datos procesados. En FICHHEX se
guardan los datos que se van recibiendo, FICHVAL la temperatura ambiente, FICHVOL la
tensión producida por el termopar y FICHTXT la temperatura del termopar. Cuando se recibe un
dato se procesa, tal como se describe en el algoritmo de la figura 5.7 de la memoria descriptiva, y
cuando se tiene una secuencia de datos, se compensan los datos obtenidos. Cuando se pulsa
ESC, se acaba el programa y se cierran los ficheros. La rutina que queda tiene la siguiente forma:
void adq(char op,int COM,conf_in *par) /*Gestiona bytes que llegan del serie,
guarda los datos gestionados en ficheros*/
{
FILE *fp,*fv,*ft,*fa; //ficheros de texto
double Ta1,Ta2; //Temperatura ambiente
double Ttc1,Ttc2; //Temperatura del termopar
double v1,v2; //Tension termopar
uchar LM351H,TERMO1H,LM352H,TERMO2H,Low,ch; //Secuencia de datos
int c;
printf("\nCompensación Data Logger. Pulsa ESC para salir\n");
/* Se abren los ficheros:
fp->FICHHEX-> Fichero donde se guardan los guardan los datos
transmitidos por el data logger
fv->FICHVAL-> Fichero donde se guardan la temperatura ambiente de la
adquisicion
fa->FICHVOL-> Fichero donde se guardan la tension producida por el
termopar durantre la adquisicion
ft->FICHTXT-> Fichero donde se guardan la temperatura del temopar
durante la adquisicion, ya compensada*/
MEMORIA DE CÁLCULO Pag 59
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
fp=fopen("fichhex","wt");
fv=fopen("fichval","wt");
ft=fopen("fichtxt","wt");
fa=fopen("fichvol","wt");
ini_usart(COM); //Se recibe del termopar
do {
if (bufferin != bufferout)
//Si se ha recibido un caracter
{ch = buffer[bufferout]; //Avanza la cola
bufferout++;
if (bufferout == 1024) {bufferout = 0;}
/*Determina la posicion del byte enviado dentro de la secuencia
de datos y lo colocalo en fp*/
if (temperatura==0) {LM351H=ch; //Medida ambiente 1
fprintf(fp,"%x ",LM351H);}
else
if (temperatura==1) {TERMO1H=ch; //Medida termopar 1
fprintf(fp,"%x ",TERMO1H);}
else
if (temperatura==2) {LM352H=ch; //Medida ambiente 2
fprintf(fp,"%x ",LM352H);}
else
if (temperatura==3) {Low=ch; //Agrupacion bytes bajos
fprintf(fp,"%x ",Low);}
else
{
TERMO2H=ch; //Medida termopar 2
fprintf(fp,"%x\n",TERMO2H);
c_fria(LM351H,TERMO1H,LM352H,Low,TERMO2H,&Ta1,&Ta2,&Ttc1,&Ttc2,&v1,&v2,par,op);
fprintf(fv,"%E\n%E\n",Ta1,Ta2); //Guarda resultados
fprintf(ft,"%E\n%E\n",Ttc1,Ttc2);
fprintf(fa,"%E\n%E\n",v1,v2);
}
}
if (kbhit()){c = getch();}
} while (c !=27); //Acaba cuando se pulse ESC
fin_usart(COM); //Fin Adquisicion
fclose(fp);
//Cierra ficheros
fclose(fv);
fclose(ft);
fclose(fa);
printf("\nFicheros Generados\n");
}
2.2.5.2
Compensación desde el fichero
A diferencia de la rutina del apartado anterior, adqf lee los bytes del fichero FICHHEX,
no los obtiene del puerto serie. Como en el fichero FICHHEX una línea de este corresponde a
MEMORIA DE CÁLCULO Pag 60
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
una secuencia de datos, si se leen los cinco datos de la línea, estos se mandan a compensar. El
proceso irá leyendo líneas y compensándolas hasta que se llegue al final del fichero. Entonces se
cerrarán los ficheros y se retornará de la función.
int adqf(char op,conf_in *par) /*Gestiona bytes del fichero,guarda las
temperaturas procesadas en ficheros*/
{
FILE *fp,*fv,*ft,*fa; //ficheros de texto
double Ta1,Ta2; //Temperatura ambiente
double Ttc1,Ttc2; //Temperatura del termopar
double v1,v2;
uchar LM351H,TERMO1H,LM352H,TERMO2H,Low,ch; //Secuencia de datos
unsigned int LM351Hx,TERMO1Hx,LM352Hx,TERMO2Hx,Lowx; //Secuencia auxiliar
int valor_ok; //Rutina correcta, fin lectura
printf("\nCompensación Fichero Data Logger\n");
fv=fopen("fichval","wt"); //Abrir ficheros idem rutina anterior
ft=fopen("fichtxt","wt");
fa=fopen("fichvol","wt");
fp=fopen("fichhex","rt"); //pero FICHEX sera ahora la fuente
valor_ok = !(fp==NULL); //Si existe fichero
if (valor_ok)
{
do
{ //Coge una linea de 5 bytes
valor_ok=(fscanf
(fp,"%x%x%x%x%x",&LM351Hx,&TERMO1Hx,&LM352Hx,&Lowx,&TERMO2Hx)==5);
if (valor_ok) //Si se tienen suficientes datos
{
LM351H=LM351Hx;TERMO1H=TERMO1Hx;
LM352H=LM352Hx;TERMO2H=TERMO2Hx;Low=Lowx; //Compensa
c_fria(LM351H,TERMO1H,LM352H,Low,TERMO2H,&Ta1,&Ta2,&Ttc1,&Ttc2,&v1,&v2,par,op);
fprintf(fv,"%E\n%E\n",Ta1,Ta2); //Guarda resultados
fprintf(ft,"%E\n%E\n",Ttc1,Ttc2);
fprintf(fa,"%E\n%E\n",v1,v2);
}
}
while (!feof(fp)); //Terminar cuando se llegue al final del fichero
valor_ok=1; //Se ha abierto el fichero
}
else printf ("\nFichero de Adquisición no encontrado\n");
fclose(fv); //Cerrar/
fclose(ft);
fclose(fa);
fclose(fp);
if (valor_ok) printf("\nFichero Generado\n");
return(valor_ok);
}
MEMORIA DE CÁLCULO Pag 61
PROYECTO
2.2.5.3
DATA
LOGGER
PARA
TERMOPAR
Compensación manual
La función pregunta la temperatura ambiente y la tensión producida por el termopar que
han sido medidas. Aplica la fórmulas de compensación y escribe la temperatura a la que se
encontraba el termopar. La función devuelve -1 si sospecha de que se ha podido introducir datos
incorrectos.
int manual (char ter)
{
float ta,mV; //Tª ambiente, Tensión del termopar
double t,V; //V(ta), t(mV)
int pos_err; //error
printf("\nCalculo Temperatura Termopar a partir de las mediciones\n\n");
printf("Temperatura ambiente (ºC) "); //Ta
scanf("%f",&ta);
printf("Tensión producida por el termopar (mV) "); //E
scanf("%f",&mV);
V=EmV(ta,ter); //Aplicacion formula compensacion
t=T90(mV+V,ter);
pos_err=!((V==-1.0)||(t==-1.0)); //Resultado de posible error
printf("La temperatura del termopar es %f ºC\n",t); //Muestra T
return(pos_err);
}
2.2.5.4
Compensación por software
La función c_fria aplica las ecuaciones (5.1) de la memoria descriptiva con lo que se unen
los bits bajos con los altos dando como resultado un número entero. Una vez se obtiene los
números que registró el conversor analógico-digital, se debe averiguar la tensión que produjo el
termopar y la temperatura ambiente.
Si num es el número que fue obtenido por el conversor aplicando (1.1) La tensión a la
entrada del conversor estará expresada en la ecuación (2.8), donde Vref (+) es un parámetro
interno de compensación que tiene una valor sobre los cinco voltios.
Vbit = num ⋅
Vref (+ )
(2.8)
1023
Si num es fruto de la conversión de la tensión producida por el sensor LM35. La
temperatura de la unión de referencia será:
Tref =
Vbit
(2.9)
GTemp
El valor típico de GTemp= 49·10-3 , aunque este valor también es un parámetro de
compensación por lo que puede ligeramente cambiar.
MEMORIA DE CÁLCULO Pag 62
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
En cambio, si num es fruto de la conversión de la tensión producida por el termopar. La
tensión que suministró el termopar será:
VMEAS =
Vbit − Voff
(2.10)
GTerm
Hay dos variables del programa a considerar, la tensión de offset del amplificador
50 KΩ 
INA114 Voff y la ganancia para el termopar GTerm = 1 +
 . Ambos variables también son
470Ω 

parámetros de compensación.
Una vez obtenidas VMEAS y Tref ya se puede aplicar la ecuación de compensación (1.1)
de la memoria descriptiva.
Los cálculos anteriores se realizan sobre los datos de una secuencia de información, cinco
valores, por lo que al final se obtienen los valores correspondientes a: dos temperaturas
ambientes, dos tensiones producidas por el termopar y dos temperaturas del termopar. Todos
estos valores corresponden a la primera y a la segunda medida de la secuencia.
int c_fria(uchar L1,uchar T1,uchar L2,uchar L,uchar T2,double *t1,double *t2,double *trm1,double
*trm2,double *V1,double *V2,conf_in *p,char ter)
{ //Compensacion
unsigned int ref1,ref2,term1,term2; //Adquisicion
unsigned int ref11,ref22,term11,term22; //Adquisicion
double mV1,mV2;
int pos_err;
//Reagrupa bits altos y bajos
ref1=(L1<<2);
ref11=((L&0xC0)>>6);
ref1=ref1|ref11;
term1=(T1<<2);
term11=((L&0x30)>>4);
term1=term1|term11;
ref2=(L2<<2);
ref22=((L&0x0C)>>2);
ref2=ref2|ref22;
term2=(T2<<2);
term22=(L&0x03);
term2=term2|term22;
//Compensacion de valores de la primera medida
*t1=(p->Vcc) * (ref1/1.023E3) / (p->gao); //Tref
*V1=((p->Vcc) * 1000 * (term1/1.023E3) / (p->gai))-(p->Voff);
/*E en mV*/
mV1=EmV(*t1,ter);
*trm1= T90(*V1+mV1,ter); //Aplicacion formula compensacion
//Compensacion de valores de la segunda medida
*t2=(p->Vcc) * (ref2/1.023E3) / (p->gao); //Tref
MEMORIA DE CÁLCULO Pag 63
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
*V2=((p->Vcc) * 1000 * (term2/1.023E3) / (p->gai))-(p->Voff);
/*E en mV*/
mV2=EmV(*t2,ter);
*trm2= T90(*V2+mV2,ter); //Aplicacion formula compensacion
pos_err=!((mV1==-1.0)||(mV2==-1.0)||(*trm1==-1.0)||(*trm2==-1.0));
printf("%E %E %E %E\n",*t1,*trm1,*t2,*trm2);
return(pos_err);
}
2.2.5.5
Transformación temperatura en tensión
Trasforma la temperatura de referencia en el voltaje equivalente que produciría el
termopar a esta temperatura si la unión de referencia estuviese a cero grados centígrados. Primero
busca los coeficientes apropiados para el termopar dado y la temperatura indicada. Se aplica la
fórmula (1.2) de la memoria descriptiva o (1.5) si se utiliza el termopar K y la temperatura es
superior a los cero grados centígrados. Si no se encuentran los polinomios para esa temperatura o
termopar la función devulve -1, sino devuelve el resultado de la transformación
double EmV(float T,char termo) /*Devuelve la tension que produciria el termopar a la temperatura
dada*/
{
double E;
double pol[max_coef];
int n;
if (ctermo(termo,T,pol,&n,0))
{
if (termo=='k')
{
if (T<0)
{
E=SUMCOEF(pol,T,n);
}
else
{
E=SUMCOEF(pol,T,n);
E=E+(pol[n+1])*exp((pol[n+2])*(T-pol[n+3])*(T-pol[n+3]));
}
}
else //Otro termopar
E=SUMCOEF(pol,T,n);
}
else E=-1.0;
return(E);
}
2.2.5.6
Transformación de tensión en temperatura.
Trasforma el voltaje del termopar a temperatura suponiendo que la unión de referencia
está a cero grados centígrados. Primero busca los coeficientes apropiados para el termopar dado
MEMORIA DE CÁLCULO Pag 64
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
y la temperatura indicada. Se aplica la fórmula (1.3) de la memoria descriptiva. Si no se
encuentran los polinomios para esa temperatura o termopar la función devulve -1, sino devuelve el
resultado de la transformación.
double T90(float E,char termo) /*Devuelve la temperatura del termopar con la que se produce la
tension dada*/
{
double T;
double pol[max_coef];
int n;
if(ctermo(termo,E,pol,&n,1))
{
T=SUMCOEF(pol,E,n); //Suma potencia
}
else T=-1.0; //Rango no encontrado error
return(T);
}
2.2.5.7
Potencias en suma de productos
Esta función permite realizar menos operaciones al calcular sumas de productos de
potencias. Ver ecuación de la memoria descriptiva (1.5).
double SUMCOEF(const double *tab, float valor,int imax)
{
int i;
double suma=0.0;
for (i=imax;i>=0;i--)
{
suma=suma*valor+*(tab+i);
/*(1.5)*/
}
return (suma);
}
2.2.5.8
Búsqueda polinomios de compensación
Esta función busca la cadena de polinomios compensación a utilizar, indicando también su
número, a través del termopar usado y la temperatura o tensión que se pasa como parámetro a la
función. Debe indicarse si se buscan polinomios temperatura-tensión o tensión-temperatura.
Devuelve uno si se encuentran polinomios, la cadena devuelta a los polinomios para el termopar y
el valor dado.
int ctermo(char termo,double num,double *c,int *n,int inv)
/*Devuelve los coeficientes del termopar usado */
{
int ok=1; //Devuelve 1 si el termopar es conocido
switch (termo)
{
MEMORIA DE CÁLCULO Pag 65
PROYECTO
DATA
LOGGER
PARA
case 'b':
if (!inv)
{
/************************************
* This section contains coefficients for type B thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
0.000 to 630.615
*
630.615 to 1820.000
************************************/
if ((num>=0.000)&&(num<=630.615)) // min<t<max
{
*n=6;
*(c+0)=0.000000000000E+00; //Valores de los coeficientes
*(c+1)=-0.246508183460E-03;
*(c+2)=0.590404211710E-05;
*(c+3)=-0.132579316360E-08;
*(c+4)=0.156682919010E-11;
*(c+5)=-0.169445292400E-14;
*(c+6)=0.629903470940E-18;
}
else
if ((num>=630.615)&&(num<=1820.000)) // min<t<max
{
*n=8;
*(c+0)=-0.389381686210E+01;
*(c+1)=0.285717474700E-01;
*(c+2)=-0.848851047850E-04;
*(c+3)=0.157852801640E-06;
*(c+4)=-0.168353448640E-09;
*(c+5)=0.111097940130E-12;
*(c+6)=-0.445154310330E-16;
*(c+7)=0.989756408210E-20;
*(c+8)=-0.937913302890E-24;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type B thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
MEMORIA DE CÁLCULO Pag 66
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
* 250. to 700.
0.291 to 2.431 -0.02 to 0.03
* 700. to 1800.
2.431 to 13.820 -0.01 to 0.02
********************************************************/
else
{
if ((num>=0.291)&&(num<=2.431)) // min<E<max
{
*n=8;
*(c+0)=9.8423321E+01;
*(c+1)=6.9971500E+02;
*(c+2)=-8.4765304E+02;
*(c+3)=1.0052644E+03;
*(c+4)=-8.3345952E+02;
*(c+5)= 4.5508542E+02;
*(c+6)=-1.5523037E+02;
*(c+7)=2.9886750E+01;
*(c+8)=-2.4742860E+00;
}
else
if ((num>=2.431)&&(num<=13.820)) // min<E<max
{
*n=8;
*(c+0)=2.1315071E+02;
*(c+1)=2.8510504E+02;
*(c+2)=-5.2742887E+01;
*(c+3)=9.9160804E+00;
*(c+4)=-1.2965303E+00;
*(c+5)=1.1195870E-01;
*(c+6)=-6.0625199E-03;
*(c+7)=1.8661696E-04;
*(c+8)=-2.4878585E-06;
}
else ok=0;
}
break;
case 'e':
if (!inv)
{
/************************************
* This section contains coefficients for type E thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
MEMORIA DE CÁLCULO Pag 67
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 to 1000.000
************************************/
if ((num>=-270.000)&&(num<=0.000)) // min<E<max
{
*n=13;
*(c+0)=0.000000000000E+00;
*(c+1)=0.586655087080E-01;
*(c+2)=0.454109771240E-04;
*(c+3)=-0.779980486860E-06;
*(c+4)=-0.258001608430E-07;
*(c+5)=-0.594525830570E-09;
*(c+6)=-0.932140586670E-11;
*(c+7)=-0.102876055340E-12;
*(c+8)=-0.803701236210E-15;
*(c+9)=-0.439794973910E-17;
*(c+10)=-0.164147763550E-19;
*(c+11)=-0.396736195160E-22;
*(c+12)=-0.558273287210E-25;
*(c+13)=-0.346578420130E-28;
}
if ((num>=0.000)&&(num<=1000.000)) // min<E<max
{
*n=10;
*(c+0)=0.000000000000E+00;
*(c+1)=0.586655087100E-01;
*(c+2)=0.450322755820E-04;
*(c+3)=0.289084072120E-07;
*(c+4)=-0.330568966520E-09;
*(c+5)=0.650244032700E-12;
*(c+6)=-0.191974955040E-15;
*(c+7)=-0.125366004970E-17;
*(c+8)=0.214892175690E-20;
*(c+9)=-0.143880417820E-23;
*(c+10)=0.359608994810E-27;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type E thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
MEMORIA DE CÁLCULO Pag 68
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*
Range
range
range
*
(°C)
(mV)
(° C)
* -200. to 0.
-8.825 to 0.000 -0.01 to 0.03
*
0. to 1000.
0.000 to 76.373 -0.02 to 0.02
********************************************************/
else
{
if ((num>=-8.825)&&(num<=0.000)) // min<E<max
{
*n=8;
*(c+0)=0.0000000E+00;
*(c+1)=1.6977288E+01;
*(c+2)=-4.3514970E-01;
*(c+3)=-1.5859697E-01;
*(c+4)=-9.2502871E-02;
*(c+5)=-2.6084314E-02;
*(c+6)=-4.1360199E-03;
*(c+7)=-3.4034030E-04;
*(c+8)=-1.1564890E-05;
*(c+9)=0.0000000E+00;
}
else
if ((num>=0.000)&&(num<=76.373)) // min<E<max
{
*n=9;
*(c+0)=0.0000000E+00;
*(c+1)=1.7057035E+01;
*(c+2)=-2.3301759E-01;
*(c+3)=6.5435585E-03;
*(c+4)=-7.3562749E-05;
*(c+5)=-1.7896001E-06;
*(c+6)=8.4036165E-08;
*(c+7)=-1.3735879E-09;
*(c+8)=1.0629823E-11;
*(c+9)=-3.2447087E-14;
}
else ok=0;
}
break;
case 'j':
if (!inv)
{
/************************************
* This section contains coefficients for type J thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-210.000 to 760.000
MEMORIA DE CÁLCULO Pag 69
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*
760.000 to 1200.000
************************************/
if ((num>=-210.000)&&(num<=760.000)) // min<E<max
{
*n=8;
*(c+0)=0.000000000000E+00;
*(c+1)=0.503811878150E-01;
*(c+2)=0.304758369300E-04;
*(c+3)=-0.856810657200E-07;
*(c+4)=0.132281952950E-09;
*(c+5)=-0.170529583370E-12;
*(c+6)=0.209480906970E-15;
*(c+7)=-0.125383953360E-18;
*(c+8)=0.156317256970E-22;
}
else
if ((num>=760.000)&&(num<=1200.000)) // min<E<max
{
*n=5;
*(c+0)=0.296456256810E+03;
*(c+1)=-0.149761277860E+01;
*(c+2)=0.317871039240E-02;
*(c+3)=-0.318476867010E-05;
*(c+4)=0.157208190040E-08;
*(c+5)=-0.306913690560E-12;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type J thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
* -210. to 0.
-8.095 to 0.000 -0.05 to 0.03
*
0. to 760.
0.000 to 42.919 -0.04 to 0.04
*
760. to 1200
42.919 to 69.553 -0.04 to 0.03
********************************************************/
else
{
if ((num>=-8.095)&&(num<=0.000)) // min<E<max
{
MEMORIA DE CÁLCULO Pag 70
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*n=8;
*(c+0)=0.0000000E+00;
*(c+1)=1.9528268E+01;
*(c+2)=-1.2286185E+00;
*(c+3)=-1.0752178E+00;
*(c+4)=-5.9086933E-01;
*(c+5)=-1.7256713E-01;
*(c+6)=-2.8131513E-02;
*(c+7)=-2.3963370E-03;
*(c+8)=-8.3823321E-05;
}
else
if ((num>=0.000)&&(num<=42.919)) // min<E<max
{
*n=7;
*(c+0)=0.000000E+00;
*(c+1)=1.978425E+01;
*(c+2)=-2.001204E-01;
*(c+3)=1.036969E-02;
*(c+4)=-2.549687E-04;
*(c+5)=3.585153E-06;
*(c+6)= -5.344285E-08;
*(c+7)=5.099890E-10;
*(c+8)=0.000000E+00;
}
else
if ((num>=42.919)&&(num<=69.553)) // min<E<max
{
*n=5;
*(c+0)=-3.11358187E+03;
*(c+1)=3.00543684E+02;
*(c+2)=-9.94773230E+00;
*(c+3)=1.70276630E-01;
*(c+4)=-1.43033468E-03;
*(c+5)=4.73886084E-06;
*(c+6)=0.00000000E+00;
*(c+7)=0.00000000E+00;
}
else ok=0;
}
break;
case 'k':
if (!inv)
{
/************************************
* This section contains coefficients for type K thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation below 0 °C is of the form
* E = sum(i=0 to n) c_i t^i.
*
MEMORIA DE CÁLCULO Pag 71
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
* The equation above 0 °C is of the form
* E = sum(i=0 to n) c_i t^i + a0 exp(a1 (t - a2)^2).
*
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 to 1372.000
************************************/
if ((num>=-270.000)&&(num<=0.000)) // min<E<max
{
*n=10;
*(c+0)=0.000000000000E+00;
*(c+1)=0.394501280250E-01;
*(c+2)=0.236223735980E-04;
*(c+3)=-0.328589067840E-06;
*(c+4)=-0.499048287770E-08;
*(c+5)=-0.675090591730E-10;
*(c+6)=-0.574103274280E-12;
*(c+7)=-0.310888728940E-14;
*(c+8)=-0.104516093650E-16;
*(c+9)=-0.198892668780E-19;
*(c+10)=-0.163226974860E-22;
}
else
if ((num>=0.000)&&(num<=1372.000)) // min<E<max
{
*n=9;
*(c+0)=-0.176004136860E-01;
*(c+1)= 0.389212049750E-01;
*(c+2)= 0.185587700320E-04;
*(c+3)=-0.994575928740E-07;
*(c+4)= 0.318409457190E-09;
*(c+5)=-0.560728448890E-12;
*(c+6)=0.560750590590E-15;
*(c+7)=-0.320207200030E-18;
*(c+8)=0.971511471520E-22;
*(c+9)=-0.121047212750E-25;
*(c+(*n)+1) = 0.118597600000E+00;
*(c+(*n)+2) = -0.118343200000E-03;
*(c+(*n)+3) = 0.126968600000E+03;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type K thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
MEMORIA DE CÁLCULO Pag 72
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
* where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
* -200. to 0.
-5.891 to 0.000 -0.02 to 0.04
*
0. to 500.
0.000 to 20.644 -0.05 to 0.04
*
500. to 1372. 20.644 to 54.886 -0.05 to 0.06
********************************************************/
else
if ((num>=-5.891)&&(num<=0.000)) // min<E<max
{
*n=8;
*(c+0)=0.0000000E+00;
*(c+1)=2.5173462E+01;
*(c+2)=-1.1662878E+00;
*(c+3)=-1.0833638E+00;
*(c+4)=-8.9773540E-01;
*(c+5)=-3.7342377E-01;
*(c+6)=-8.6632643E-02;
*(c+7)=-1.0450598E-02;
*(c+8)=-5.1920577E-04;
*(c+9)=0.0000000E+00;
}
else
if ((num>=0.000)&&(num<=20.644)) // min<E<max
{
*n=9;
*(c+0)=0.000000E+00;
*(c+1)=2.508355E+01;
*(c+2)=7.860106E-02;
*(c+3)=-2.503131E-01;
*(c+4)=8.315270E-02;
*(c+5)=-1.228034E-02;
*(c+6)=9.804036E-04;
*(c+7)=-4.413030E-05;
*(c+8)=1.057734E-06;
*(c+9)=-1.052755E-08;
}
else
if ((num>=20.644)&&(num<=54.886)) // min<E<max
{
*n=6;
*(c+0)=-1.318058E+02;
*(c+1)=4.830222E+01;
*(c+2)=-1.646031E+00;
*(c+3)=5.464731E-02;
*(c+4)=-9.650715E-04;
*(c+5)=8.802193E-06;
*(c+6)=-3.110810E-08;
*(c+7)=0.000000E+00;
MEMORIA DE CÁLCULO Pag 73
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+8)=0.000000E+00;
}
else ok=0;
break;
case 'n':
if (!inv)
{
/************************************
* This section contains coefficients for type N thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 to 1300.000
************************************/
if ((num>=-270.000)&&(num<=0.000)) // min<E<max
{
*n=8;
*(c+0)=0.000000000000E+00;
*(c+1)=0.261591059620E-01;
*(c+2)=0.109574842280E-04;
*(c+3)=-0.938411115540E-07;
*(c+4)=-0.464120397590E-10;
*(c+5)=-0.263033577160E-11;
*(c+6)=-0.226534380030E-13;
*(c+7)=-0.760893007910E-16;
*(c+8)=-0.934196678350E-19;
}
else
if ((num>=0.000)&&(num<=1300.000)) // min<E<max
{
*n=10;
*(c+0)=0.000000000000E+00;
*(c+1)=0.259293946010E-01;
*(c+2)=0.157101418800E-04;
*(c+3)=0.438256272370E-07;
*(c+4)=-0.252611697940E-09;
*(c+5)=0.643118193390E-12;
*(c+6)=-0.100634715190E-14;
*(c+7)=0.997453389920E-18;
*(c+8)=-0.608632456070E-21;
*(c+9)=0.208492293390E-24;
*(c+10)=-0.306821961510E-28;
}
else ok=0;
}
/************************************
MEMORIA DE CÁLCULO Pag 74
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
* This section contains coefficients of approximate inverse
* functions for type N thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
* -200. to 0.
-3.990 to 0.000 -0.02 to 0.03
*
0. to 600.
0.000 to 20.613 -0.02 to 0.03
*
600. to 1300. 20.613 to 47.513 -0.04 to 0.02
********************************************************/
else
if ((num>=-3.990)&&(num<=0.000)) // min<E<max
{
*n=9;
*(c+0)=0.0000000E+00;
*(c+1)=3.8436847E+01;
*(c+2)=1.1010485E+00;
*(c+3)=5.2229312E+00;
*(c+4)=7.2060525E+00;
*(c+5)=5.8488586E+00;
*(c+6)=2.7754916E+00;
*(c+7)=7.7075166E-01;
*(c+8)=1.1582665E-01;
*(c+9)=7.3138868E-03;
}
else
if ((num>=0.000)&&(num<=20.613)) // min<E<max
{
*n=7;
*(c+0)=0.00000E+00;
*(c+1)=3.86896E+01;
*(c+2)=-1.08267E+00;
*(c+3)=4.70205E-02;
*(c+4)=-2.12169E-06;
*(c+5)=-1.17272E-04;
*(c+6)=5.39280E-06;
*(c+7)=-7.98156E-08;
*(c+8)=0.00000E+00;
*(c+9)=0.00000E+00;
}
else
if ((num>=20.613)&&(num<=47.513)) // min<E<max
{
*n=5;
*(c+0)=1.972485E+01;
MEMORIA DE CÁLCULO Pag 75
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+1)=3.300943E+01;
*(c+2)=-3.915159E-01;
*(c+3)=9.855391E-03;
*(c+4)=-1.274371E-04;
*(c+5)=7.767022E-07;
*(c+6)=0.000000E+00;
}
else ok=0;
break;
case 'r':
if (!inv)
{
/************************************
* This section contains coefficients for type R thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-50.000 to 1064.180
*
1064.180 to 1664.500
*
1664.500 to 1768.100
************************************/
if ((num>=-50.000)&&(num<=1064.180)) // min<E<max
{
*n=9;
*(c+0)=0.000000000000E+00;
*(c+1)=0.528961729765E-02;
*(c+2)=0.139166589782E-04;
*(c+3)=-0.238855693017E-07;
*(c+4)=0.356916001063E-10;
*(c+5)=-0.462347666298E-13;
*(c+6)=0.500777441034E-16;
*(c+7)=-0.373105886191E-19;
*(c+8)=0.157716482367E-22;
*(c+9)=-0.281038625251E-26;
}
else
if ((num>=1064.180)&&(num<=1664.500)) // min<E<max
{
*n=5;
*(c+0)=0.295157925316E+01;
*(c+1)=-0.252061251332E-02;
*(c+2)=0.159564501865E-04;
*(c+3)=-0.764085947576E-08;
*(c+4)=0.205305291024E-11;
*(c+5)=-0.293359668173E-15;
}
else
MEMORIA DE CÁLCULO Pag 76
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
if ((num>=1664.500)&&(num<=1768.100)) // min<E<max
{
*n=4;
*(c+0)=0.152232118209E+03;
*(c+1)=-0.268819888545E+00;
*(c+2)=0.171280280471E-03;
*(c+3)=-0.345895706453E-07;
*(c+4)=-0.934633971046E-14;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type R thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
*
-50. to 250.
-0.226 to 1.923 -0.02 to 0.02
*
250. to 1200.
1.923 to 13.228 -0.005 to 0.005
*
1064. to 1664.5 11.361 to 19.739 -0.0005 to 0.001
* 1664.5 to 1768.1 19.739 to 21.103 -0.001 to 0.002
********************************************************/
else
if ((num>=-0.226)&&(num<=1.923)) // min<E<max
{
*n=10;
*(c+0)=0.0000000E+00;
*(c+1)=1.8891380E+02;
*(c+2)=-9.3835290E+01;
*(c+3)=1.3068619E+02;
*(c+4)=-2.2703580E+02;
*(c+5)=3.5145659E+02;
*(c+6)=-3.8953900E+02;
*(c+7)=2.8239471E+02;
*(c+8)=-1.2607281E+02;
*(c+9)=3.1353611E+01;
*(c+10)=-3.3187769E+00;
}
else
if ((num>=1.923)&&(num<=13.228)) // min<E<max
{
*n=9;
*(c+0)=1.334584505E+01;
MEMORIA DE CÁLCULO Pag 77
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+1)=1.472644573E+02;
*(c+2)=-1.844024844E+01;
*(c+3)=4.031129726E+00;
*(c+4)=-6.249428360E-01;
*(c+5)=6.468412046E-02;
*(c+6)=-4.458750426E-03;
*(c+7)=1.994710149E-04;
*(c+8)=-5.313401790E-06;
*(c+9)=6.481976217E-08;
*(c+10)=0.000000000E+00;
}
else
if ((num>=11.361)&&(num<=19.739)) // min<E<max
{
*n=5;
*(c+0)=-8.199599416E+01;
*(c+1)=1.553962042E+02;
*(c+2)=-8.342197663E+00;
*(c+3)=4.279433549E-01;
*(c+4)=-1.191577910E-02;
*(c+5)=1.492290091E-04;
*(c+6)=0.000000000E+00;
}
else
if ((num>=19.739)&&(num<=21.103)) // min<E<max
{
*n=4;
*(c+0)=3.406177836E+04;
*(c+1)=-7.023729171E+03;
*(c+2)=5.582903813E+02;
*(c+3)=-1.952394635E+01;
*(c+4)=2.560740231E-01;
*(c+5)=0.000000000E+00;
}
else ok=0;
break;
case 's':
if (!inv)
{
/************************************
* This section contains coefficients for type S thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-50.000 to 1064.180
*
1064.180 to 1664.500
*
1664.500 to 1768.100
************************************/
MEMORIA DE CÁLCULO Pag 78
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
if ((num>=-50.000)&&(num<=1064.180)) // min<E<max
{
*n=8;
*(c+0)=0.000000000000E+00;
*(c+1)=0.540313308631E-02;
*(c+2)=0.125934289740E-04;
*(c+3)=-0.232477968689E-07;
*(c+4)=0.322028823036E-10;
*(c+5)=-0.331465196389E-13;
*(c+6)=0.255744251786E-16;
*(c+7)=-0.125068871393E-19;
*(c+8)=0.271443176145E-23;
}
else
if ((num>=1064.180)&&(num<=1664.500)) // min<E<max
{
*n=4;
*(c+0)=0.132900444085E+01;
*(c+1)=0.334509311344E-02;
*(c+2)=0.654805192818E-05;
*(c+3)=-0.164856259209E-08;
*(c+4)=0.129989605174E-13;
}
else
if ((num>=1664.500)&&(num<=1768.1)) // min<E<max
{
*n=4;
*(c+0)=0.146628232636E+03;
*(c+1)=-0.258430516752E+00;
*(c+2)=0.163693574641E-03;
*(c+3)=-0.330439046987E-07;
*(c+4)=-0.943223690612E-14;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type S thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
MEMORIA DE CÁLCULO Pag 79
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*
-50. to 250.
-0.235 to 1.874
-0.02 to 0.02
*
250. to 1200.
1.874 to 11.950 -0.01 to 0.01
*
1064. to 1664.5 10.332 to 17.536 -0.0002 to 0.0002
* 1664.5 to 1768.1 17.536 to 18.693 -0.002 to 0.002
********************************************************/
else
if ((num>=-0.235)&&(num<=1.874)) // min<E<max
{
*n=9;
*(c+0)=0.00000000E+00;
*(c+1)=1.84949460E+02;
*(c+2)=-8.00504062E+01;
*(c+3)=1.02237430E+02;
*(c+4)=-1.52248592E+02;
*(c+5)=1.88821343E+02;
*(c+6)=-1.59085941E+02;
*(c+7)=8.23027880E+01;
*(c+8)=-2.34181944E+01;
*(c+9)=2.79786260E+00;
}
else
if ((num>=1.874)&&(num<=11.950)) // min<E<max
{
*n=9;
*(c+0)=1.291507177E+01;
*(c+1)=1.466298863E+02;
*(c+2)=-1.534713402E+01;
*(c+3)=3.145945973E+00;
*(c+4)=-4.163257839E-01;
*(c+5)=3.187963771E-02;
*(c+6)=-1.291637500E-03;
*(c+7)=2.183475087E-05;
*(c+8)=-1.447379511E-07;
*(c+9)=8.211272125E-09;
}
else
if ((num>=10.332)&&(num<=17.536)) // min<E<max
{
*n=5;
*(c+0)=-8.087801117E+01;
*(c+1)=1.621573104E+02;
*(c+2)=-8.536869453E+00;
*(c+3)=4.719686976E-01;
*(c+4)=-1.441693666E-02;
*(c+5)=2.081618890E-04;
*(c+6)=0.000000000E+00;
}
else
if ((num>=17.536)&&(num<=18.693)) // min<E<max
{
*n=4;
*(c+0)=5.333875126E+04;
MEMORIA DE CÁLCULO Pag 80
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+1)=-1.235892298E+04;
*(c+2)=1.092657613E+03;
*(c+3)=-4.265693686E+01;
*(c+4)=6.247205420E-01;
*(c+5)=0.000000000E+00;
}
else ok=0;
break;
case 't':
if (!inv)
{
/************************************
* This section contains coefficients for type T thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 °C to 400.000
************************************/
if ((num>=-270.000)&&(num<=0.000)) // min<E<max
{
*n=14;
*(c+0)=0.000000000000E+00;
*(c+1)=0.387481063640E-01;
*(c+2)=0.441944343470E-04;
*(c+3)=0.118443231050E-06;
*(c+4)=0.200329735540E-07;
*(c+5)=0.901380195590E-09;
*(c+6)=0.226511565930E-10;
*(c+7)=0.360711542050E-12;
*(c+8)=0.384939398830E-14;
*(c+9)=0.282135219250E-16;
*(c+10)=0.142515947790E-18;
*(c+11)=0.487686622860E-21;
*(c+12)=0.107955392700E-23;
*(c+13)=0.139450270620E-26;
*(c+14)=0.797951539270E-30;
}
else
if ((num>=0.000)&&(num<=400.000)) // min<E<max
{
*n=8;
*(c+0)=0.000000000000E+00;
*(c+1)=0.387481063640E-01;
*(c+2)=0.332922278800E-04;
*(c+3)=0.206182434040E-06;
*(c+4)=-0.218822568460E-08;
*(c+5)= 0.109968809280E-10;
*(c+6)=-0.308157587720E-13;
MEMORIA DE CÁLCULO Pag 81
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+7)=0.454791352900E-16;
*(c+8)=-0.275129016730E-19;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type T thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
* -200. to 0.
-5.603 to 0.000 -0.02 to 0.04
*
.0 to 400.
0.000 to 20.872 -0.03 to 0.03
********************************************************/
else
if ((num>=-5.603)&&(num<=0.000)) // min<E<max
{
*n=7;
*(c+0)=0.0000000E+00;
*(c+1)=2.5949192E+01;
*(c+2)=-2.1316967E-01;
*(c+3)=7.9018692E-01;
*(c+4)=4.2527777E-01;
*(c+5)=1.3304473E-01;
*(c+6)=2.0241446E-02;
*(c+7)=1.2668171E-03;
}
else
if ((num>=0.000)&&(num<=20.872)) // min<E<max
{
*n=6;
*(c+0)=0.000000E+00;
*(c+1)=2.592800E+01;
*(c+2)=-7.602961E-01;
*(c+3)=4.637791E-02;
*(c+4)=-2.165394E-03;
*(c+5)=6.048144E-05;
*(c+6)=-7.293422E-07;
*(c+7)=0.000000E+00;
}
else ok=0;
break;
default:
ok=0; //Termopar no conocido
MEMORIA DE CÁLCULO Pag 82
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
}
return(ok);
}
2.2.6
Transmisión
Hay dos funciones que transmiten su nueva configuración al data logger. Una obtiene los
datos a transmitir a través del usuario, y otro los obtiene de un fichero, FICHTRM, donde
previamente se habían guardado datos procedentes de anteriores preguntas al usuario. Las
preguntas que se hacen al usuario son concerniente a la memoria EEPROM utilizada, el tiempo de
muestreo, y al posible retardo del microcontrolador al enviar los datos al puerto serie.
2.2.6.1
Memoria
El data logger permite la utilización de varios modelos de memoria EEPROM del tipo
M24X. En el programa se elige el tipo de memoria y automáticamente el programa sabe que
datos referentes a la memoria se establecen como parámetros de configuración.
La mayoría de los datos están expresados en complemento a dos porque sus variables
son incrementales. Así cuando pasa de 0xFF a 0x00 el microcontrolador percibe el
desbordamiento y se puede dar por finalizada la cuenta. Las variables a determinar aparecen en la
tabla 5.1 de la memoria descriptiva:
Entre los datos a transmitir, se encuentran los referentes a la memoria EEPROM. Para
determinar los valores referentes a la configuración de la memoria, se deberán terner en cuenta la
capacidad de las memorias EEPROM y la escritura en modo página tal como aparece en la tabla
2.18
MEMORIA
DIMENSIÓN
MODO PÁGINA
M24C01
128
16
M24C02
256
16
M24C04
512
16
M24C08
1024
16
M24C16
2048
26
M24128
16384
64
M24256
32768
64
Tabla 2.18 Capacidad EEPROMs
MEMORIA DE CÁLCULO Pag 83
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Si se pone nombre a las variables de la tabla 5.1 de la memoria descriptiva aparece la
tabla 2.19
MEMORIA DE CÁLCULO Pag 84
PROYECTO
Posición
DATA
Nombre
LOGGER
PARA
TERMOPAR
Contenido
0
NDIRH
Valor inicial del contador de la dirección EEPROM byte alto
1
NDIRL
Valor inicial del contador de la dirección EEPROM byte bajo
2
NDIRLR
Valor inicial del contador de la dirección EEPROM en lectura
3
PagW
Tamaño de la página de escritura de la EEPROM externa
4
MaxCola
Tamaño máximo de la cola de escritura
5
INCL
Incremento byte bajo de dirección de la EEPROM
6
INCH
Incremento byte alto de dirección de la EEPROM
7
t1
Valor inicial del contador para el TMR1
8
t0
Valor inicial del contador para el TMR0
Tabla 2.19 Parámetros configuración EEPROM interna
Las variables PagW, MaxCola y INCL se obtienen directamente de la capacidad de la
página para las respectivas memorias (2.11). INCL es directamente el valor de la página en
binario. PagW es ese mismo valor pero en binario en complemento a dos, y MaxCola es PagW
menos una unidad. INCH vale 2 para las memorias M24Cx (un byte de dirección específico) y
INCH vale 1 para las memorias M24128 y M24256 (dos bytes de dirección específico).
IncPag ? Page
PagW = 256 – IncPag (2.11)
MaxCola=PagW - 1
Para calcular las otras tres variables se tiene en cuenta la capacidad de la memoria. Para
calcular NDIRL se divide la máxima dimensión del byte bajo posible (la máxima posible será
256) por la página. Si la memoria supera los 256 bytes entonces serán necesarios dos bytes para
calcular la dirección de memoria, por lo que se calcula NDIRH. Para calcular NDIRH se divide la
dimensión la capacidad de la memoria entre 256. Para calcular NDIRLR se divide la máxima
dimensión del byte bajo entre el valor máximo de la cola de lectura, que si no se ha modificado el
valor inicial propuesto ha de ser 128
MEMORIA DE CÁLCULO Pag 85
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
max low
= NDIRL
Page
max low
= NDIRLR (2.12)
128
max
= NDIRH
256
Los resultados obtenidos expresados en hexadecimal y en complemento a dos si se
requiere:
MEMORIA
NDIRH
NDIRL NDIRLR
PagW
MaxCola
INCL
INCH
M24C01
FF
F8
FF
F0
EF
10
02
M24C02
FF
F0
FE
F0
EF
10
02
M24C04
FE
F0
FE
F0
EF
10
02
M24C08
FC
F0
FE
F0
EF
10
02
M24C16
F8
F0
FE
F0
EF
10
02
M24128
C0
FC
FE
C0
BF
40
01
M24256
80
FC
FE
C0
BF
40
01
Tabla 2.20 Parámetros de configuración data logger referentes a la EEPROM
2.2.6.2
Obtención de datos y transmsión
Al transmitir los datos se inicializa el temporizador del ordenador y la USART del sistema.
Si los datos a transmitir se obtienen de preguntas al usuario se utiliza la función get_data. En ella
se hacen tres preguntas el tiempo de muestreo, los retardos entre transmisiones al ordenador en el
data logger y la memoria utilizada. A partir de la respuesta a estas preguntas el programa
configura los datos que se enviarán al data logger. Antes de enviarse se guardan en el fichero, por
si esos datos se quieren utilizar con posterioridad.
Para determinar el parámetro del tiempo de muestreo, como la variable es incremental,
debe expresarse en complemento a 2, se utiliza la fórmula (2.13)
NTMR1 = 255 −
t
(2.13)
escala
MEMORIA DE CÁLCULO Pag 86
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Para calcular el parámetro de los retardos, que también se expresa en complemento a
dos, debe usarse la fórmula (2.14)
NTMR0=255-retardos (2.14)
Si NTMR0 vale 255 significará no se producirán retardos entre transmisiones en el data
logger.
void get_data (int COM) //Transmite al DL los parametros introducidos
{
unsigned int Ini_NDIRH,Ini_NDIRL,Ini_NDIRLR,MaxPagW,MaxRamPag; //Escaneo
unsigned int INCL,INCH,NTMR1,NTMR0; //del fichero
FILE *fp; //Fichero fuente
mem_EE *dato; //Posiciones memoria EEPROM del data logger
int valor_ok; //Funcionamiento correcto
int n; //Eleccion memoria
float num; //Tiempo muestreo
printf("\nTransferencia configuración al Data Logger");
printf("\na partir de los parámetros siguientes:\n");
ini_usart(COM); /*Aunque no se utiliza la irq port serie se activa*/
ini_timer();
fp=fopen("fichtrm","wt");
do
{
printf("\nTiempo muestreo aproximado (s) ? ");
scanf("%f",&num);
num = num/escala;
valor_ok = num>0; //El tiempo no puede se 0
if (valor_ok)
{
n = 256-ceil(num); //Redondea hacia arriba y complementa a 2
valor_ok = (n > 0);
}
}
while (!valor_ok);
printf("Tiempo de muestreo(s) %f\n",(256-n)*escala);
dato->NTMR1 = n;
do
{
printf("\nRetardos en la trasmisión (0-255) ? ");
scanf("%d",&n);
valor_ok = ((n>=0)&&(n < 255));
if (valor_ok) n=255-n; //Complemento a 2
}
while (!valor_ok);
dato->NTMR0 = n;
printf("\nTecle el número correspondiente al tipo de memoria utilizada\n");
printf("\n1 M24C01
2 M24C02
3 M24C04
4 M24C08\n");
printf("5 M24C16
6 M24128
7 M24256\n");
valor_ok=0;
do
MEMORIA DE CÁLCULO Pag 87
PROYECTO
DATA
LOGGER
PARA
{
scanf ("%d",&n); //Segun el tipo de memoria
switch (n)
{
case 1: dato->Ini_NDIRH=0xFF; //Se cargan los valores para la EEPROM
dato->Ini_NDIRL=0xF8; //precaculados
dato->Ini_NDIRLR=0xFF;
dato->MaxPagW=0xF0;
dato->MaxRamPag=0xEF;
dato->INCL=0x10;
dato->INCH=0x02;
valor_ok=1;
break;
case 2: dato->Ini_NDIRH=0xFF;
dato->Ini_NDIRL=0xF0;
dato->Ini_NDIRLR=0xFE;
dato->MaxPagW=0xF0;
dato->MaxRamPag=0xEF;
dato->INCL=0x10;
dato->INCH=0x02;
valor_ok=1;
break;
case 3: dato->Ini_NDIRH=0xFE;
dato->Ini_NDIRL=0xF0;
dato->Ini_NDIRLR=0xFE;
dato->MaxPagW=0xF0;
dato->MaxRamPag=0xEF;
dato->INCL=0x10;
dato->INCH=0x02;
valor_ok=1;
break;
case 4: dato->Ini_NDIRH=0xFC;
dato->Ini_NDIRL=0xF0;
dato->Ini_NDIRLR=0xFE;
dato->MaxPagW=0xF0;
dato->MaxRamPag=0xEF;
dato->INCL=0x10;
dato->INCH=0x02;
valor_ok=1;
break;
case 5: dato->Ini_NDIRH=0xF8;
dato->Ini_NDIRL=0xF0;
dato->Ini_NDIRLR=0xFE;
dato->MaxPagW=0xF0;
dato->MaxRamPag=0xEF;
dato->INCL=0x10;
dato->INCH=0x02;
valor_ok=1;
break;
case 6: dato->Ini_NDIRH=0xC0;
dato->Ini_NDIRL=0xFC;
dato->Ini_NDIRLR=0xFE;
MEMORIA DE CÁLCULO Pag 88
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
dato->MaxPagW=0xFC;
dato->MaxRamPag=0xFB;
dato->INCL=0x40;
dato->INCH=0x01;
valor_ok=1;
break;
case 7: dato->Ini_NDIRH=0x80;
dato->Ini_NDIRL=0xFC;
dato->Ini_NDIRLR=0xFE;
dato->MaxPagW=0xFC;
dato->MaxRamPag=0xFB;
dato->INCL=0x40;
dato->INCH=0x01;
valor_ok=1;
break;
default: printf("Opción Incorrecta\n");
}
}
while (!valor_ok);
trmt(dato);
fprintf (fp,"%x ",dato->Ini_NDIRH); //Guarda valores en fichero
fprintf (fp,"%x ",dato->Ini_NDIRL);
fprintf (fp,"%x ",dato->Ini_NDIRLR);
fprintf (fp,"%x ",dato->MaxPagW);
fprintf (fp,"%x ",dato->MaxRamPag);
fprintf (fp,"%x ",dato->INCL);
fprintf (fp,"%x ",dato->INCH);
fprintf (fp,"%x ",dato->NTMR1);
fprintf (fp,"%x\n",dato->NTMR0);
fin_timer();
//Fin Transmision
fin_usart(COM);
fclose(fp);
}
Si los datos a transmitir se obtienen de un fichero al usuario se utiliza la función get_dataf.
La dinámica es muy similar, pero los datos aquí se obtienen al leer una línea del fichero.
int get_dataf (int COM) //Transmite al DL los datos de un fichero
{
unsigned int Ini_NDIRH,Ini_NDIRL,Ini_NDIRLR,MaxPagW,MaxRamPag; //Escaneo
unsigned int INCL,INCH,NTMR1,NTMR0; //del fichero
FILE *fp; //Fichero fuente
mem_EE *dato; //Posiciones memoria EEPROM del data logger
int valor_ok; //Funcionamiento correcto
printf("\nTransferencia configuraci¢n al Data Logger");
printf("\na partir del fichero de transmisi¢n\n");
ini_usart(COM); /*Aunque no se utiliza la irq port serie se activa*/
ini_timer();
fp=fopen("fichtrm","rt");
valor_ok = !(fp==NULL); //Si existe sigue
if (valor_ok)
MEMORIA DE CÁLCULO Pag 89
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
{
fscanf (fp,"%x",&Ini_NDIRH); //Lee del fichero
fscanf (fp,"%x",&Ini_NDIRL);
fscanf (fp,"%x",&Ini_NDIRLR);
fscanf (fp,"%x",&MaxPagW);
fscanf (fp,"%x",&MaxRamPag);
fscanf (fp,"%x",&INCL);
fscanf (fp,"%x",&INCH);
fscanf (fp,"%x",&NTMR1);
fscanf (fp,"%x",&NTMR0);
dato->Ini_NDIRH=Ini_NDIRH; //Guarda en el registro
dato->Ini_NDIRL=Ini_NDIRL;
dato->Ini_NDIRLR=Ini_NDIRLR;
dato->MaxPagW=MaxPagW;
dato->MaxRamPag=MaxRamPag;
dato->INCL=INCL;
dato->INCH=INCH;
dato->NTMR1=NTMR1;
dato->NTMR0=NTMR0;
trmt(dato);
}
else printf ("\nFichero de Transmisi¢n configuraci¢n no encontrado\n");
fin_timer(); //Acaba transmision
fin_usart(COM);
fclose(fp);
return(valor_ok);
}
2.2.6.3
Envío por el puerto serie
Los datos simplemente se envían uno a uno por el puerto serie, se informa al usuario tanto
del inicio del envío como de su finalización. El orden de transferencia es idéntico a la posición de
las variable en la EEPROM y es el que espera recibir el data logger desde el otro extremo del
cable. El algoritmo de la rutina puede verse en la figura 5.8 de la memoria descriptiva. Una vez se
cumple el tiempo prefijado (interrupciones), el programa envía el dato al data logger hasta que
todos los datos hayan sido enviados.
void trmt (mem_EE *data) //Transmite los datos al data logger
{
unsigned char TAB[9];
int i;
TAB[0]=data->Ini_NDIRH; //Se transmiten tal como se guardaran en la EEPROM
TAB[1]=data->Ini_NDIRL;
TAB[2]=data->Ini_NDIRLR;
TAB[3]=data->MaxPagW;
TAB[4]=data->MaxRamPag;
TAB[5]=data->INCL;
TAB[6]=data->INCH;
TAB[7]=data->NTMR1;
TAB[8]=data->NTMR0;
MEMORIA DE CÁLCULO Pag 90
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
i=0;
printf("\nTransferiendo al Data Logger\n");
do{
if (envio==1) { outportb(PORT1,TAB[i]); //Si tiempo cumplido envia
printf("Enviado %d\n",i);
i++; //Espera al otro
envio=0;
}
}
while (i<9); //Hasta que se envien todos los datos
printf("\nTransferencia finalizada\n");
}
2.2.7
Interrupciones y Recursos del sistema
El programa utiliza tres módulos presentes en el ordenador:
-
El controlador de interrrupciones (PIC): Es el integrado 8259 o análogos. Permite la
interrupción de los dos módulos siguientes la USART, y el temporizador.
-
La USART: Es el integrado 8250 o análogos.
-
El temporizador: Es el integrado 8254 o análogos.
Tanto para la USART como para el temporizador, se utilizarán rutinas de inicialización y
restauración de dichos módulos, así como sus respectivas rutinas de servicio a la interrupción.
2.2.7.1
PIC 8259
Para programar las interrupciones el ordenador utiliza el integrado 8259 o derivados
también llamado PIC (Programmable interrupt controller). El 8259 gestiona las peticiones de
interrupción IRQ (Interrupt Request), según su nivel de prioridad. Una interrupción será aceptada
si no hay pendiente de ejecución otra interrupción de mayor prioridad, entonces se ejecuta su
correspondiente rutina de servicio a la interrupción ISR (Interrupt Service Routine). Para
configurar el 8259 se utilizan diferentes registros (ICWx, OCWx, IRR, ISR, IMR) que pemiten
controlar el funcionamiento del dispositivo, una descripción de los cuales está reflejada en la tabla
2.20.
En la práctica muchos de los registros del 8259 no se varían y se dejan tal como se
inicializaron al arrancarse el ordenador. Así basta con emascarar (habilitar) o desemarcarar una
interrupción para utilizar dicha interrupción, esto se realiza simplemente poniendo a cero el bit
correspondiente a la interrupción a desemascarar del PIC's Interrupt Mask Register (mantener los
otros bits intactos). El sistema al arrancarse el ordenador guarda las direcciones de las rutinas de
atención a las interrupciones en los denominados vectores de interrupción. Si se desea utilizar una
nueva rutina de servicio a la interrupción, se guarda la dirección de la rutina a substituir del vector
de interrupción, se coloca en el vector la dirección de la nueva rutina. Al final del programa se
MEMORIA DE CÁLCULO Pag 91
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
vuelve a colocar la primera rutina, restableciendo así el sistema tal como era al iniciarse el
programa.
address
20h
Read/Write Function
Write
Initialization Command Word 1 (ICW1)
Write
Operation Command Word 2 (OCW2)
Write
Operation Command Word 3 (OCW3)
Read
Interrupt Request Register (IRR)
Read
In-Service Register (ISR)
Write
Initialization Command Word 2 (ICW2)
Write
Initialization Command Word 3 (ICW3)
Write
Initialization Command Word 4 (ICW4)
21h
Read/Write Interrupt Mask Register (IMR)
Tabla 2.21 Registros PIC(8259)
Para utilizar una interrupción se deberán poner a cero los bits que correspondan a la
interrupción y cargar el vector de interrupción. Hay dos posibles fuentes de interrupción en el
sistema los puertos serie y el temporizador.
Según el puertos serie utilizado se controlan mediante diferentes interrupciones. El COM1
y COM3 utilizan la IRQ4 y el COM2 y COM4 utilizan la IRQ3. Por eso para habilitar las
interrupciones se pondrán a cero los bits tercero (IRQ3) o cuarto del registro IMR (IRQ4). El
vector de interrupción del Puerto serie es 0Bh (para COM1/COM3) o 0Ch (para
COM2/COM4).
La interrupción del temporizador 8254 es la IRQ0 y el vector de interrupción es el 08h.
2.2.7.2
USART 8250
El ordenador para gestionar el puerto serie utiliza el integrado 8250 (16550) o algún otro
de sus derivados. El 8250 dispone de 11 registros (uno más el 16550) pero sólo 3 líneas de
dirección para seleccionarlos. Lo que permite distinguir unos de otros será, aparte de las líneas de
direcciones es el sentido del acceso (en lectura o escritura) y el valor de un bit de uno de los
MEMORIA DE CÁLCULO Pag 92
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
registros: el bit DLAB del registro LCR, que es el bit 7 de dicho registro. Realmente, DLAB se
emplea sólo puntualmente para poder acceder y programar los registros que almacenan el divisor
de velocidad; el resto del tiempo, DLAB estará a 0 para acceder a otros registros más
importantes. La posición de los registros vendrá marcada por:
A2 A1 A0 DLAB MODO NOMBRE SIGNIFICADO
0
0
0
0
R
RBR
Receiver Buffer Register (Registro buffer de recepción)
0
0
0
1
R/W
DLL
Divisor Latch LSB (Divisor de velocidad, parte baja
0
0
0
0
W
THR
Transmitter Holding Register (Registro de retención de
transmisión
0
0
1
0
R/W
IER
Interrupt Enable Register (Registro de habilitación de
interrupciones)
0
0
1
1
R/W
DLM
Divisor latch MSB (Divisor de velocidad, parte alta)
0
1
0
X
R
IIR
Interrupt Identification Register
identificación de interrupciones)
0
1
0
X
W
FCR
FIFO Control Register (Registro de control FIFO)
SOLO 16550 -
0
1
1
X
R/W
LCR
Line Control Register (Registro de control de línea)
¡¡EL BIT 7 ES DLAB!!
1
0
0
X
R/W
MCR
Modem Control Register (Registro de control del
modem)
1
0
1
X
R/W
LSR
Line Status Register (Registro de estado de la línea)
1
1
0
X
R/W
MSR
Modem Status Register (Registro de estado del
modem)
1
1
1
X
R/W
SCR
Scratch Register (Registro residual)
(Registro
de
-
Tabla 2.22 Registros UART
o Registro 0: RHR (Receive Holding Register; Receive Buffer Register in some
literature). El circuito receptor del 8250 es programable para 5, 6, 7 u 8 bits de datos.
En el caso de emplear menos de 8, los bits superiores de este registro quedan a 0.
MEMORIA DE CÁLCULO Pag 93
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Los datos entran en serie, y se guardan en este registro cuando un carácter completa
el registro de desplazamiento de recepción, sus bits son volcados al RBR y el bit DR
del LSR es activado para indicar a la CPU que puede leer el RBR. El diseño del
8250 permite la recepción continua de datos sin pérdidas.
o Registro 1: IER (Interrupt Enable Register). Este registro de escritura se utiliza para
seleccionar qué interrupciones activan INTRPT y, por consiguiente, van a ser
solicitadas a la CPU. Deshabilitar el sistema de interrupciones inhibe el IIR y desactiva
la salida INTRPT. Bits:
o Bit 0: RHRI (Receive Holding Register Interrupt; RxRDY in some literature).
The UART generará una interrupción cuando se reciba un carácter en el
registro RHR si el bit está puesto a uno.
o Bit 1: THRI (Transmit Holding Register Interrupt; TxRDY). Si se pone a uno,
la UART genera una interrupción cuando un carácter se mueva del THR al
registro de envío, TSR interno (Internal Shift Register).
o Bit 2: RLSI (Receive Line Status Interrupt; ERROR). Si se pone a uno, la
UART interrumpe cuando se produce un error de paridad o de
sobreescritura, o cuando se encuentra una condición de break
o Bit 3: MSI (Modem Status Interrupt; DELTA). Si se pone a uno, la UART
interrumpe cuando una línea RS-232 cambia de estado.
o Bits 4-7: Unused
o Registro 0 DLAB 1: Divisor Latch LSB (DLL Divisor Latch Low). Son los bits 7-0
del divisor del velocidad.
o Registro a DLAB 1: Divisor Latch MSB (DLH Divisor Latch High). Son los bits 15-8
del divisor del velocidad. La unión de este registro con el anterior, ambos registros de
8 bits, constituyen un valor de 16 bits que será el divisor que se aplicará a la
frecuencia base para seleccionar la velocidad a emplear. Dicha frecuencia base (por
ejemplo, 1.8432 MHz) será dividida por 16 veces el valor almacenado aquí. Por
ejemplo, para obtener 9600 baudios:
1843200
= 12 (2.15)
16·9600
o Registro 2: ISR (Interrupt Status Register; also refered to as the Interrupt
Identification Register). Informa del evento que causó la interrupción de la UART.
Bits:
o Bit 0: Indica si se ha producido una interrupción.
MEMORIA DE CÁLCULO Pag 94
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
o Bits 1-2: Indica la causa de la interrupción:
§
00 -> RS-232 cambio en la línea.
§
01 -> THR vaciado
§
10 -> RHR contiene un carácter
§
11 -> Condición de error
o Bits 3-7: No usados
-
Registro 3: LCR (Line Control Register). Configura la UART. También monitoriza el
uso de los registros 0 y 1 mediante el uso del bit DLR (Divisor Latch Register). Bits:
o Bits 0-1: Establece el número de bits de datos:
§
00 -> 5-bits de datos
§
01 -> 6-bits de datos
§
10 -> 7-bits de datos
§
11 -> 8-bits de datos
o Bit 2: Establece el número de bits de stop.
§
0 -> indica un bit de stop por palabra.
§
1-> indica dos bits de stop por palabra.
o Bits 3-5: Establece la paridad.
§
000 -> No paridad
§
001 -> Impar
§
011 -> Par
§
101 -> Marca (‘1’)
§
111 -> Espacio (‘0’)
o Bit 6: Break control; Envía al receptor una condición de break.
o Bit 7: El bit DLAB (Divisor Latch Access Bit) puesto a 1 permite acceder a
los Latches divisores DLL y DLM del BRG en lectura y escritura. Para
acceder al RBR, THR y al IER debe ser puesto a 0
MEMORIA DE CÁLCULO Pag 95
PROYECTO
-
DATA
LOGGER
PARA
TERMOPAR
Registro 4 R: MCR (Modem Control Register). Controla las líneas de la interfície RS232. Es sólo de lectura. Bits:
o Bit 0: Controla la línia RS-232 DTR (Data Terminal Ready).
o Bit 1: Controla RS-232 RTS (Request to Send) .
o Bit 2: GPO1 (General Purpose Output 1).
o Bit 3: GPO2 (General Purpose Output 2). Habilita las interrupciones para ser
enviadas de la UART al PIC.
o Bit 4: Test de Eco (loop back).
nuevamente a la fuente.
Todos los caracteres seran enviados
o Bits 5-7: No usados.
-
Registro 4 W : FCR (Fifo Control Register). Sólo disponible en el 16550, no en el
8250. Es sólo de escritura. Bits:
o Bit 0: Habilita el borrado de colas XMIT y RCVR
o Bit 1: Borrar cola RCVR.
o Bit 2: Borrar cola XMIT.
o Bit 3: A uno si cambiar los pines RXRDY y TXRDY del modo 0 al modo 1.
o Bit 4-5: No usados
o Bit 6-7: Tamaño de la cola:
-
§
00-> 1 byte.
§
01-> 4 bytes.
§
10-> 8 bytes.
§
11-> 14 bytes.
Registro 5: LSR (Line Status Register). Almacena información general sobre el estado
de los bits de la UART. Bits:
o Bit 0: Puesto a uno si RHR contiene un carácter (called RxRDY or RDR,
depending on literature).
o Bit 1: Error de sobreescritura (character overwrote the last in the RHR)
MEMORIA DE CÁLCULO Pag 96
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
o Bit 2: Error de Paridad.
o Bit 3: Error de Framing(stop bit was set to 0 instead of 1)
o Bit 4: Condición de Break.
o Bit 5: THE (or TBE). Transmit Buffer Empty. Si está puesto a uno, la UART
envía los datos del THR al OSR (Output Shift Register) y los datos pueden
ser escritos con total seguridad sin sobrescribir nada.
o Bit 6: Transmisor vacío; tanto el THR and TSR(shift register) están vacíos si
su estado es uno.
o Bit 7: No utilizado en el 8250.
-
Register 6: MSR (Modem Status Register). Muestra el estado de las líneas de control
del módem. Después de leer los bits 0-3 se ponen a cero.Bits:
o Bit 0: CTS (Clear To Send) ha cambiado(since last read of MSR).
o Bit 1: DSR (Data Set Ready) ha cambiado.
o Bit 2: RI (Ring Indicator) ha cambiado a uno desde la última vez en que el
MSR fue leído.
o Bit 3: CD (Carrier Detect) ha cambiado.
o Bit 4: Valor del CTS.
o Bit 5: Valor del DSR.
o Bit 6: Valor del RI.
o Bit 7: Valor del CD.
2.2.7.3
Register 7: SPR (Scratch Pad Register) No tiene una function específica.
Timer 8253
El 8253/4 es un chip temporizador que puede ser empleado como reloj de tiempo real.
Este circuito integrado posee 3 contadores totalmente independientes, que pueden ser
programados de 6 formas diferentes. Todos estos parámetros son accesibles a través del registro
de control del 8253
MEMORIA DE CÁLCULO Pag 97
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Tabla 2.23 Registro control 8253
El 8254 es muy flexible a la hora de ser programado. Basta con tener en cuenta dos
cosas: por un lado, escribir siempre primero la palabra de control, antes de enviar la cuenta inicial
al contador. Por otro, dicha cuenta inicial debe seguir exactamente el formato seleccionado en la
palabra de control (enviar sólo byte bajo, enviar sólo byte alto, o bien enviar ambos
consecutivamente). Teniendo en cuenta que cada contador tiene su propio puerto y que la palabra
de control indica el contador al que está asociada, no hay que seguir un orden especial a la hora
de programar los contadores. Esto significa que, por ejemplo, se puede enviar la palabra de
control de cada contador seguida de su cuenta inicial, o bien enviar todas las palabras de control
para los 3 contadores y después las 3 cuentas iniciales; también es válida cualquier combinación
intermedia de estas secuencias (por ejemplo: enviar la palabra de control para el contador 0,
después la palabra de control para el contador 1, después la parte baja de la cuenta para el
contador 0, luego la parte baja de la cuenta para el contador 1, la parte alta de la cuenta para el
contador 0, etc...).
Un nuevo valor de cuenta inicial puede ser almacenado en un contador en cualquier
momento, sin que ello afecte al modo en que ha sido programado (el resultado de esta operación
dependerá del modo, como se verá más adelante). Si se programa el contador para leer/escribir
la cuenta como dos bytes consecutivos (bajo y alto), el sentido común indica que entre ambos
envíos/recepciones no conviene transferir el control a una subrutina que utilice ese mismo
contador para evitar un resultado incorrecto.
De los seis modos de operación que permite el temporizador, normalmente se utiliza el
modo 2 Rate Generator (Generador de ritmo). En este modo, el contador funciona como un
divisor por N. Es empleado típicamente para las interrupciones de los relojes de tiempo real. Este
modo es, por tanto, periódico, y la misma secuencia de temporización se repite indefinidamente.
Para una cuenta inicial N, la secuencia se repite cada N ciclos de reloj.
2.2.7.4
Incialización USART
A la rutina se le envía el puerto de comunicaciones serie que se utilizarán en la
comunicación. Según el puerto se establecerán el vector de interrupción y la dirección del puerto
de comunicaciones.
MEMORIA DE CÁLCULO Pag 98
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Una vez se guarda la antigua rutina de servicio a la interrupción del puerto serie y se
establece que se utilizará la creada en este programa, se procede a inicializar el puerto serie.
Se establece la velocidad de transmisión, el modo de transmisión: ocho bits de datos, uno
de start y otro de stop, sin paridad. Se inicializa la FIFO, 14 bytes de cola, y se borra su
contenido. Se permite la interrupción y se asigna que se produzca cuando se reciban datos.
La rutina de inicialización del puerto serie quedará:
void ini_usart(int com)
{
uchar PIC;
switch (com)
{
case 1:
PORT1=0x3F8;
INTVECT=0x0C;
PIC=0xEF;
break;
case 2:
PORT1=0x2F8;
INTVECT=0x0B;
PIC=0xF7;
break;
case 3:
PORT1=0x3E8;
INTVECT=0x0C;
PIC=0xEF;
break;
case 4:
PORT1=0x2E8;
INTVECT=0x0B;
PIC=0xF7;
break;
}
outportb(PORT1 + 1 , 0);
/* Turn off interrupts - Port1 */
oldport1isr = getvect(INTVECT); /* Save old Interrupt Vector of later
recovery */
setvect(INTVECT, PORT1INT);
/*
PORT 1 - Communication Settings
*/
outportb(PORT1 + 3 , 0x80); /* SET DLAB ON */
outportb(PORT1 + 0 , 0x0C); /* Set Baud rate - Divisor Latch Low Byte */
/* Default 0x03 = 38,400 BPS */
/*
0x01 = 115,200 BPS */
/*
0x02 = 57,600 BPS */
MEMORIA DE CÁLCULO Pag 99
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
/*
0x06 = 19,200 BPS */
/*
0x0C = 9,600 BPS */
/*
0x18 = 4,800 BPS */
/*
0x30 = 2,400 BPS */
outportb(PORT1 + 1 , 0x00); /* Set Baud rate - Divisor Latch High Byte */
outportb(PORT1 + 3 , 0x03); /* 8 Bits, No Parity, 1 Stop Bit */
outportb(PORT1 + 2 , 0xC7); /* FIFO Control Register */
outportb(PORT1 + 4 , 0x08); /* OUT2 */
outportb(0x21,(inportb(0x21) & PIC)); /* Set Programmable Interrupt Controller */
outportb(PORT1 + 1 , 0x01); /* Interrupt when data received */
}
2.2.7.5
Restauración USART
Para restaurar la USART, se restaura la anterior rutina de servicio a la interrupción serie,
teniendo en cuenta para ello que puerto serie ha sido utilizado. Se inhibe la interrupción, y se
restaurala anterior rutina de atención a la interrupción de la USART.
El trozo de programa de finalización de utilización del puerto serie quedará:
void fin_usart(int com)
{
uchar PIC;
switch (com)
{
case 1:
PIC=0x10;
break;
case 2:
PIC=0x08;
break;
case 3:
PIC=0x10;
break;
case 4:
PIC=0x08;
break;
}
outportb(PORT1 + 1 , 0);
/* Turn off interrupts - Port1 */
outportb(0x21,(inportb(0x21) | PIC));
setvect(INTVECT, oldport1isr); /* Restore old interrupt vector */
}
MEMORIA DE CÁLCULO Pag 100
PROYECTO
2.2.7.6
DATA
LOGGER
PARA
TERMOPAR
Inicialización Timer
Una vez se guarda la antigua rutina de servicio a la interrupción del timer, se establece que
se utilizará la creada en este programa. Se utilizará el primer temporizador del 8253, en modo
dos, y se introducen los dos bytes de cuenta del temporizador de dieciséis bits.
void ini_timer(void)
{
oldtimer0isr = getvect(INTVECT_Time);
setvect(INTVECT_Time, TIMERINT);
outportb(control8254,0x34); /* Modo operacion en 8254*/
outportb(TIMER0,0x01); /* byte alto del timer 0*/
outportb(TIMER0,0xFF); /* byte bajo del timer 0*/
outportb(0x21,(inportb(0x21) & 0xFE));
}
2.2.7.7
Restauración Timer
Al finalizar el uso del temporizador se restaura la anterior rutina de servicio a la
interrupción del temporizador.
void fin_timer(void)
{
outportb(0x21,(inportb(0x21) | 0x01));
setvect(INTVECT_Time, oldtimer0isr);
}
2.2.7.8
Interrupción puerto serie
La rutina de interrupción se genera al recibir por el puerto serie, comprueba que se
contenga un carácter en RHR, si se contiene informa al programa principal de que la cola se ha
incrementado y debe guardarse el carácter. Como es una cola circular de 1024 bytes si se
alcanza este valor volverá al principio. También mediante la variable temperatura va guardando el
valor que ocupa dicho byte en la secuencia de datos de envío. Como todas las rutinas de servicio
a la interrupción se acaban insertando un EOI.
void interrupt PORT1INT() /* Interrupt Service Routine (ISR) for PORT1 */
{
int c;
do { c = inportb(PORT1 + 5);
if (c & 1) {buffer[bufferin] = inportb(PORT1);
valor[bufferin]=temperatura;
temperatura++;
bufferin++;
if (temperatura==5) {temperatura = 0;}
if (bufferin == 1024) {bufferin = 0;}}
}while (c & 1);
outportb(0x20,0x20);
}
MEMORIA DE CÁLCULO Pag 101
PROYECTO
2.2.7.9
DATA
LOGGER
PARA
TERMOPAR
Interrupción temporizador
La rutina de interrupción del temporizador, va contando hasta que se llega al valor
máximo de cuenta, entonces reinicia la cuenta y avisa al programa de que la cuenta ya ha
finalizado. Como todas las rutinas de servicio a la interrupción se acaban insertando un EOI.
void interrupt TIMERINT() /* Interrupt Service Routine (ISR) for TIMER 0 */
{
times++;
if (times==max_times)
{
envio=1;
times=0;
}
outportb(0x20,0x20);
}
MEMORIA DE CÁLCULO Pag 102
DATALOGER PARA TERMOPAR
(PERFIL DE TEMPERATURA DE UN HORNO DE CINTA CON COMPENSACIÓN DE UNIÓN FRÍA)
PLANOS
AUTOR: Jesús Pablo Parrado Guardia.
DIRECTOR: Xavier Vilanova.
FECHA: Junio / 2003.
5
4
3
2
1
+5V
R1
2.2k
D
9
1
20
JP3
VDD
1
3
4
5
2
6
C1 +
1uF
C2
1uF
+
R1OUT
R2OUT
T1IN
T2IN
C1+
C1C2+
C2V+
V-
T1OUT
T2OUT
4 mHz
B
GND
8
VCC
GND
14
7
C
CONNECTOR DB9
+5V
1 uF
1uF
C7
+
15pF
GND
5
9
4
8
3
7
2
6
1
GND
C3
HEADER 3
P1
12
9
MAX232
C4
C8
15pF
5
4
11
10
R1IN
R2IN
VCC
13
8
+5V Y 1
GND
WC
SDA
M24C16
GND
16
U2
10
+
+5V
MCLR/VPP/THV
SCL
7
OSC1/CLKIN
PIC16F873
1
2
3
6
GND
HEADER 5X2
U3
11
12
13
14
15
16
17
18
15
+
C
21
22
23
24
25
26
27
28
2
4
6
8
10
RA0/AN0
RC0/T1OSO/T1CKI
RA1/AN1
RC1/T1OSI/CCP2
RA2/AN2/VREFRC2/CCP1
RA3/AN3/VREF+
RC3/SCK/SCL
RA4/T0CKI
RC4/SDI/SDA
RA5/SS/AN4
RC5/SDO
RC6/TX/CK
RB0/INT
RC7/RX/DT
RB1
RB2
OSC2/CLKOUT
RB3/PGM
RB4
RB5
RB6/PGC
RB7/PGD
GND
GND
2
3
4
5
6
7
19
8
2
4
6
8
10
HEADER 5X2
JP1
1
3
5
7
9
D
U1
JP2
1
3
5
7
9
R2
2.2k
C5
1uF
B
GND
GND
GND
A
A
Title
Size
A
Date:
5
4
3
Diagrama Data Logger
Document Number
7
Thursday, June 19, 2003
2
Rev
1
Sheet
1
of
1
6
5
4
3
2
1
JP5
4
3
2
1
D
GND
+5V
V-
D
V+
R4 330
JP9
R6 330
1
2
3
4
JP10
R14
10K
ALIMENTACIÓN FUENTE
R15
10K
R12
10K
1
3
5
7
9
+5V
U4
JP4
3
2
2
1
TERMOPAR
V+
5
1
8
R3
470
7
4
C
GND
+VIN VO
-VIN
6
2
4
6
8
10
LEDS
HEADER 5X2
R5 330
GND
REF
RG
RG
+5V
JP6
7
6
5
4
3
2
1
V+
VINA114
V-
V+
R11
10K
C
ALIMENTACIÓN MICRO
JP8
R10 100
1
2
3
ENTRADAS
GND
VS+
GND
1
VOUT
2
3
2
+
GND
2
1
6
-
LM35/TO
DIODE
JP7
+5V
RESET
OP-07
4
8
3
+5V
D2
U6
7
1
U5
R8 1K
GND
B
3,9K
B
GND
R9
GND
V-
A
A
Title
Size
A
Date:
5
4
3
Diagrama Adquisición
Document Number
8
Thursday, January 16, 2003
2
Rev
1
Sheet
1
of
1
6
5
D
4
3
2
1
D
1
JP1
3
2
1
D1
U1
2
-
+
4
1
+
C1
VIN
C2
100nF
2200uF
GND
JP2
HEADER 3
VOUT
2
C3
100nF
1
2
3
4
D2
3
L7805/TO220
DIODE
HEADER 4
3
BRIDGE
GND
1
C
C
D3
2
-
+
4
3
+
C5
100nF
C4
VIN
GND
U2
VOUT
2
C6
100nF
D4
2200uF
DIODE
1
L7905/TO220
3
BRIDGE
GND
B
B
A
A
Title
Size
A
Date:
5
4
3
Diagrama Fuente Alimentación
Document Number
9
Thursday, June 19, 2003
2
Rev
1
Sheet
1
of
1
6
DATALOGER PARA TERMOPAR
(PERFIL DE TEMPERATURA DE UN HORNO DE CINTA CON COMPENSACIÓN DE UNIÓN FRÍA)
PRESUPUESTO
AUTOR: Jesús Pablo Parrado Guardia.
DIRECTOR: Xavier Vilanova.
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
FECHA: Junio / 2003.
ÍNDICE
1.1
MEDICIONES........................................................................................................................................................3
1.2
CUADRO DE PRECIOS ......................................................................................................................................8
1.3
APLICACIÓN DE PRECIOS........................................................................................................................... 14
1.4
RESUMEN DEL PRESUPUESTO ................................................................................................................... 20
PRESUPUESTO Pag 2
PROYECTO
1.1
DATA
LOGGER
PARA
TERMOPAR
MEDICIONES
Num
Uts.
Descripción
Cantidad
ZÓCALO DIL DE 8 PINES
TORNEADO, PASO DE 7.62 mm
ZÓCALO DIP DE 16 PINES
TORNEADO, PASO DE 7.62 mm
ZÓCALO DIP DE 28 PINES ESTRECHO
TORNEADO, PASO DE 7.62 mm
CONECTOR POSTE DE 2 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 3 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 4 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 7 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 2 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE 2.54 mm
CONECTOR POSTE DE 3 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE 2.54 mm
CONECTOR POSTE DE 4 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE 2.54 mm
CONECTOR POSTE DE 7 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE 2.54 mm
CONECTOR BUS DE 10 VÍAS HEMBRA
MONTAJE RECTO PCB
CONECTOR BUS DE 10 VÍAS MACHO
INCLUYE SOPORTE
CONECTOR REGLETA 2 VÍAS
TERMINALES CON TORNILLO, ANCHO CABLE 2,5 mm2, PASO
DE 5 mm
CONECTOR DB9
CONECTOR DB9 HEMBRA TERMINAL RECTO
3
CAPÍTULO 1: CONECTORES
1-01
U
1-02
U
1-03
U
1-04
U
1-05
U
1-06
U
1-07
U
1-08
U
1-09
U
1-10
U
1-11
U
1-12
U
1-12
U
1-13
U
1-14
U
PRESUPUESTO Pag 3
1
1
2
2
4
2
2
2
4
2
3
2
1
1
PROYECTO
Num
Uts.
DATA
LOGGER
PARA
Descripción
TERMOPAR
Cantidad
CAPÍTULO 2: COMPONENTES CAJA DATA LOGGER
2-01
U
2-02
U
2-03
U
2-04
U
2-05
U
2-06
U
2-07
U
2-08
U
2-09
U
2-10
U
2-11
U
2-12
U
2-13
U
2-14
U
2-15
U
2-16
U
2-17
U
2-18
U
2-19
U
2-20
U
LM35
SENSOR
TEMPERATURA
GRADOS
CENTÍGRADOS,
ENCAPSULADO TO-92
OP07
AMPLIFICADOR OPERACIONAL
DE BAJO OFFSET,
ENCAPSULADO DIP 8
INA114
AMPLIFI.
INSTRUMENTACIÓN
DE
PRECISIÓN,
ENCAPSULADO DIP 8
PIC16F873
MICROCONTROLADOR 8 BITS, ENCAPSULADO DIP 28
M24C16
MEMORIA EEPROM 16KBITS I2C, ENCAPSULADO DIP 8
MAX232
INTERFAZ COMUNICACIÓN RS232, ENCAPSULADO DIP 16
CRISTAL 4 MHz
CRISTAL CUARZO XT, ENCAPSULADO HC49
DIODO 1N4148
DIODO SILICIO DE SEÑAL
RESISTENCIA 100 Ω
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25 W, 5%
RESISTENCIA 330 Ω
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25 W, 5%
RESISTENCIA 1 kΩ
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25 W, 5%
RESISTENCIA 3,9 kΩ
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25 W, 5%
RESISTENCIA 10 kΩ
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25 W, 5%
RESISTENCIA 470 Ω
RESISTENCIA DE PELÍCULA METÁLICA 0,25 W, 1%
CONDENSADOR 1 µF
CONDENSADOR
ELECTROLÍTICO
POLARIZADOS
ALUMINIO, 25 V
CONDENSADOR 15 pF
CONDENSADOR CERÁMICO MULTICAPA NO POLARIZADO
25 V
LED
LED ROJO ESTÁNDAR DE 3 mm
INTERRUPTOR
INTERRUPTOR CON ACTUADOR DESLIZANTE PCB, PASO
2,54 mm
PULSADOR
PULSADOR 4 SOPORTES PCB
TERMOPAR K
TERMOPAR K CON PUNTA SOLDADA Y AISLAMIENTO DE
FIBRA DE VIDRIO
PRESUPUESTO Pag 4
1
1
1
1
1
1
1
1
1
3
1
1
4
1
5
2
3
3
1
1
PROYECTO
Num
Uts.
DATA
LOGGER
PARA
Descripción
TERMOPAR
Cantidad
CAPÍTULO 3: COMPONENTES CAJA FUENTE ALIMENTACIÓN
3-01
U
3-02
U
3-03
U
3-04
U
3-05
U
3-06
U
3-06
U
L7805
REGULADOR DE TENSIÓN 5V, ENCAPSULADO TO-220
L7905
REGULADOR DE TENSIÓN -5V, ENCAPSULADO TO-220
B40C
PUENTE RECTIFICADOR DE DIODOS, CIRCULAR, 40V 1,5 A
CONDENSADOR 2200 µF
CONDENSADOR ELECTROLÍTICO POLARIZADO ALUMINIO,
25 V
CONDENSADOR 100 Nf
CONDENSADOR TÁNTALO NO POLARIZADO 25 V
DIODO 1N4007
DIODO SILICIO DE SEÑAL
TRANSFORMADOR
TRANSFORMADOR FERRITA 220-9 V 0,6 A
PRESUPUESTO Pag 5
1
1
2
1
2
2
1
PROYECTO
Num
Uts.
DATA
LOGGER
PARA
Descripción
TERMOPAR
Cantidad
CAPÍTULO 4: CAJAS, SOPORTES, CABLES
4-01
U
4-02
U
4-03
U
4-04
U
4-05
M
4-06
M
4-07
M
4-08
U
4-09
U
4-10
U
PLACA PCB
PLACA FOTOSENSIBLE CON BAÑO DE COBRE
PLACA TOPO
PLACA PERFORADA EN REJILLA 2,54 mm
SEPARADORES
SEPARADORES HEXAGONALES DE METAL Y TUERCAS M3
RADIADOR
RADIADOR TO-220 CON TORNILLO Y TUERCA M3
CABLE BUS DE 10 VÍAS
CABLE HILOS TRENZADOS PLANOS PVC, PASO
CONDUCTOR DE 1,27 mm
CABLE 4 NÚCLEOS
CABLE FLEXIBLE, PVC, HILOS 0,75 mm2
CABLE 8 NÚCLEOS
CABLE FLEXIBLE, PVC, HILOS 0,75 mm2
CABLE PUERTO SERIE
CABLE NULL-MODEM DB9
CABLE ALIMENTACIÓN
CABLE RED TRES HILOS CON CLAVIJA EUROPEA
CAJA
CAJA PLÁSTICO
PRESUPUESTO Pag 6
3
1
12
2
0,20
0,50
0,50
1
1
2
PROYECTO
Num
DATA
LOGGER
Uts.
PARA
TERMOPAR
Descripción
Cantidad
CONFIGURACIÓN HARDWARE
HORAS DEDICADAS AL DISEÑO, MONTAJE Y PRUEBA DEL
HARDWARE DEL PROYECTO
CONFIGURACIÓN SOFTWARE
HORAS DEDICADAS AL DISEÑO, MONTAJE Y PRUEBA DEL
SOFTWARE DEL PROYECTO
150
CAPÍTULO 5: MANO DE OBRA
5-01
H
5-02
H
PRESUPUESTO Pag 7
250
PROYECTO
1.2
DATA
LOGGER
PARA
TERMOPAR
CUADRO DE PRECIOS
Num
Uts.
Descripción
Precio
Precio en letra
0,26
VEINTISEÍS CÉNTIMOS DE
EURO
CUARENTA
Y
OCHO
CÉNTIMOS DE EURO
SETENTA Y CINCO CÉNTIMOS
DE EURO
CUARENTA Y UNO CÉNTIMOS
DE EURO
CUARENTA
Y
OCHO
CÉNTIMOS DE EURO
SESENTA Y DOS CÉNTIMOS DE
EURO
OCHENTA
Y
CUATRO
CÉNTIMOS DE EURO
VEINTISIETE CÉNTIMOS DE
EURO
CAPÍTULO 1: CONECTORES
1-01
U
1-02
U
1-03
U
1-04
U
1-05
U
1-06
U
1-07
U
1-08
U
1-09
U
1-10
U
1-11
U
1-12
U
1-12
U
1-13
U
1-14
U
ZÓCALO DIL DE 8 PINES
TORNEADO, PASO DE 7.62 mm
ZÓCALO DIP DE 16 PINES
TORNEADO, PASO DE 7.62 mm
ZÓCALO DIP DE 28 PINES ESTRECHO
TORNEADO, PASO DE 7.62 mm
CONECTOR POSTE DE 2 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 3 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 4 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 7 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 2 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE
2.54 mm
CONECTOR POSTE DE 3 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE
2.54 mm
CONECTOR POSTE DE 4 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE
2.54 mm
CONECTOR POSTE DE 7 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE
2.54 mm
CONECTOR BUS DE 10 VÍAS HEMBRA
MONTAJE RECTO PCB
CONECTOR BUS DE 10 VÍAS MACHO
INCLUYE SOPORTE
CONECTOR REGLETA 2 VÍAS
TERMINALES CON TORNILLO, ANCHO CABLE
2,5 mm2, PASO DE 5 mm
CONECTOR DB9
CONECTOR DB9 HEMBRA TERMINAL RECTO
PRESUPUESTO Pag 8
0,48
0,75
0,41
0,48
0,62
0,84
0,27
0,32
TRENTA Y DOS CÉNTIMOS DE
EURO
0,41
CUARENTA Y UNO CÉNTIMOS
DE EURO
0,48
CUARENTA
Y
CÉNTIMOS DE EURO
1,00
UN EURO
0,84
OCHENTA
Y
CUATRO
CÉNTIMOS DE EURO
SESENTA Y DOS CÉNTIMOS DE
EURO
0,62
0,72
OCHO
SETENTA Y DOS CÉNTIMOS DE
EURO
PROYECTO
Num
Uts.
DATA
LOGGER
Descripción
PARA
Precio
TERMOPAR
Precio en letra
CAPÍTULO 2: COMPONENTES CAJA DATA LOGGER
2-01
U
2-02
U
2-03
U
2-04
U
2-05
U
2-06
U
2-07
U
2-08
U
2-09
U
2-10
U
2-11
U
2-12
U
2-13
U
2-14
U
2-15
U
2-16
U
2-17
U
LM35
SENSOR
TEMPERATURA
GRADOS
CENTÍGRADOS, ENCAPSULADO TO-92
OP07
AMPLIFICADOR OPERACIONAL DE BAJO
OFFSET, ENCAPSULADO DIP 8
INA114
AMPLIFI. INSTRUMENTACIÓN DE PRECISIÓN,
ENCAPSULADO DIP 8
PIC16F873
MICROCONTROLADOR
8
BITS,
ENCAPSULADO DIP 28
M24C16
MEMORIA
EEPROM
16KBITS
I2C,
ENCAPSULADO DIP 8
MAX232
INTERFAZ
COMUNICACIÓN
RS232,
ENCAPSULADO DIP 16
CRISTAL 4 MHz
CRISTAL CUARZO XT, ENCAPSULADO HC49
DIODO 1N4148
DIODO SILICIO DE SEÑAL
RESISTENCIA 100 Ω
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25
W, 5%
RESISTENCIA 330 Ω
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25
W, 5%
RESISTENCIA 1 kΩ
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25
W, 5%
RESISTENCIA 3,9 kΩ
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25
W, 5%
RESISTENCIA 10 kΩ
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25
W, 5%
RESISTENCIA 470 Ω
RESISTENCIA DE PELÍCULA METÁLICA 0,25
W, 1%
CONDENSADOR 1 µF
CONDENSADOR
ELECTROLÍTICO
POLARIZADOS ALUMINIO, 25 V
CONDENSADOR 15 pF
CONDENSADOR CERÁMICO MULTICAPA NO
POLARIZADO 25 V
LED
LED ROJO ESTÁNDAR DE 3 mm
PRESUPUESTO Pag 9
3,90
TRES EUROS CON NOVENTA
CÉNTIMOS DE EURO
0,48
CUARENTA
Y
CÉNTIMOS DE EURO
11,90
ONCE EUROS CON NOVENTA
CÉNTIMOS DE EURO
10,78
DIEZ EUROS CON SETENTA Y
OCHO CÉNTIMOS DE EURO
1,50
UN EURO CON CINCUENTA
CÉNTIMOS DE EURO
1,50
UN EURO CON CINCUENTA
CÉNTIMOS DE EURO
0,51
0,03
CINCUENTA Y UNO CÉNTIMOS
DE EURO
TRES CÉNTIMOS DE EURO
0,04
CUATRO CÉNTIMOS DE EURO
0,04
CUATRO CÉNTIMOS DE EURO
0,04
CUATRO CÉNTIMOS DE EURO
0,04
CUATRO CÉNTIMOS DE EURO
0,04
CUATRO CÉNTIMOS DE EURO
0,05
CINCO CÉNTIMOS DE EURO
0,18
DIECIOCHO
EURO
0,14
CATORCE CÉNTIMOS DE EURO
0,14
CATORCE CÉNTIMOS DE EURO
OCHO
CÉNTIMOS
DE
PROYECTO
2-18
U
2-19
U
2-20
U
DATA
LOGGER
INTERRUPTOR
INTERRUPTOR
CON
ACTUADOR
DESLIZANTE PCB, PASO 2,54 mm
PULSADOR
PULSADOR 4 SOPORTES PCB
TERMOPAR K
TERMOPAR K CON PUNTA SOLDADA Y
AISLAMIENTO DE FIBRA DE VIDRIO
PRESUPUESTO Pag 10
PARA
TERMOPAR
1,00
UN EURO
0,72
SETENTA Y DOS CÉNTIMOS DE
EURO
12,00
DOCE EUROS
PROYECTO
Num
Uts.
DATA
LOGGER
Descripción
PARA
TERMOPAR
Precio
Precio en letra
CAPÍTULO 3: COMPONENTES CAJA FUENTE ALIMENTACIÓN
3-01
U
3-02
U
3-03
U
3-04
U
3-05
U
3-06
U
3-06
U
L7805
REGULADOR DE TENSIÓN 5V, ENCAPSULADO
TO-220
L7905
REGULADOR
DE
TENSIÓN
-5V,
ENCAPSULADO TO-220
B40C
PUENTE
RECTIFICADOR
DE
DIODOS,
CIRCULAR, 40V 1,5 A
CONDENSADOR 2200 µF
CONDENSADOR
ELECTROLÍTICO
POLARIZADO ALUMINIO, 25 V
CONDENSADOR 100 Nf
CONDENSADOR TÁNTALO NO POLARIZADO
25 V
DIODO 1N4007
DIODO SILICIO DE SEÑAL
TRANSFORMADOR
TRANSFORMADOR FERRITA 220-9 V 0,6 A
PRESUPUESTO Pag 11
0,51
CINCUENTA Y UNO CÉNTIMOS
DE EURO
0,51
CINCUENTA Y UNO CÉNTIMOS
DE EURO
0,14
CATORCE CÉNTIMOS DE EURO
0,20
VEINTE CÉNTIMOS DE EURO
0,14
CATORCE CÉNTIMOS DE EURO
0,04
CUATRO CÉNTIMOS DE EURO
8,00
OCHO EUROS
PROYECTO
Num
Uts.
DATA
LOGGER
Descripción
PARA
TERMOPAR
Precio
Precio en letra
2,50
0,06
DOS EUROS CON CINCUENTA
CÉNTIMOS DE EURO
UN
EURO
CON
VEINTE
CÉNTIMOS DE EURO
SEIS CÉNTIMOS DE EURO
0,20
VEINTE CÉNTIMOS DE EURO
1,10
UN EURO CON DIEZ CÉNTIMOS
DE EURO
0,50
CINCUENTA CÉNTIMOS DE
EURO
OCHENTA
CÉNTIMOS
DE
EURO
DOS EUROS CON CINCUENTA
CÉNTIMOS DE EURO
UN
EURO
CON
VEINTE
CÉNTIMOS DE EURO
CAPÍTULO 4: CAJAS, SOPORTES, CABLES
4-01
U
4-02
U
4-03
U
4-04
U
4-05
M
4-06
M
4-07
M
4-08
U
4-09
U
4-10
U
PLACA PCB
PLACA FOTOSENSIBLE CON BAÑO DE COBRE
PLACA TOPO
PLACA PERFORADA EN REJILLA 2,54 mm
SEPARADORES
SEPARADORES HEXAGONALES DE METAL Y
TUERCAS M3
RADIADOR
RADIADOR TO-220 CON TORNILLO Y
TUERCA M3
CABLE BUS DE 10 VÍAS
CABLE HILOS TRENZADOS PLANOS PVC,
PASO CONDUCTOR DE 1,27 mm
CABLE 4 NÚCLEOS
CABLE FLEXIBLE, PVC, HILOS 0,75 mm2
CABLE 8 NÚCLEOS
CABLE FLEXIBLE, PVC, HILOS 0,75 mm2
CABLE PUERTO SERIE
CABLE NULL-MODEM DB9
CABLE ALIMENTACIÓN
CABLE RED TRES HILOS CON CLAVIJA
EUROPEA
CAJA
CAJA PLÁSTICO
PRESUPUESTO Pag 12
1,20
0,80
2,50
1,50
3,50
TRES EUROS CON CINCUENTA
CÉNTIMOS DE EURO
PROYECTO
Num
Uts.
DATA
LOGGER
Descripción
PARA
TERMOPAR
Precio
Precio en letra
2,50
DOS EUROS CON CINCUENTA
CÉNTIMOS DE EURO
2,50
DOS EUROS CON CINCUENTA
CÉNTIMOS DE EURO
CAPÍTULO 5: MANO DE OBRA
5-01
H
5-02
H
CONFIGURACIÓN HARDWARE
HORAS DEDICADAS AL DISEÑO, MONTAJE Y
PRUEBA DEL HARDWARE DEL PROYECTO
CONFIGURACIÓN SOFTWARE
HORAS DEDICADAS AL DISEÑO, MONTAJE Y
PRUEBA DEL SOFTWARE DEL PROYECTO
PRESUPUESTO Pag 13
PROYECTO
1.3
DATA
LOGGER
PARA
TERMOPAR
APLICACIÓN DE PRECIOS
Num
Uts.
Descripción
Precio unitario
Total Medido
Total €
0,26
3
0,78
0,48
1
0,48
0,75
1
0,75
0,41
2
0,82
0,48
2
0,96
0,62
4
2,48
0,84
2
1,68
0,27
2
0,54
0,32
2
0,64
0,41
4
1,64
0,48
2
0,96
1,00
3
3,00
0,84
2
1,68
0,62
1
0,62
0,72
1
0,72
CAPÍTULO 1: CONECTORES
1-01
U
1-02
U
1-03
U
1-04
U
1-05
U
1-06
U
1-07
U
1-08
U
1-09
U
1-10
U
1-11
U
1-12
U
1-12
U
1-13
U
1-14
U
ZÓCALO DIL DE 8 PINES
TORNEADO, PASO DE 7.62 mm
ZÓCALO DIP DE 16 PINES
TORNEADO, PASO DE 7.62 mm
ZÓCALO DIP DE 28 PINES ESTRECHO
TORNEADO, PASO DE 7.62 mm
CONECTOR POSTE DE 2 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 3 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 4 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 7 VÍAS HEMBRA
TERMINAL RECTO, PASO DE 2.54 mm
CONECTOR POSTE DE 2 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE
2.54 mm
CONECTOR POSTE DE 3 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE
2.54 mm
CONECTOR POSTE DE 4 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE
2.54 mm
CONECTOR POSTE DE 7 VÍAS MACHO
INCLUYE CONTACTO DE CRIMPAR, PASO DE
2.54 mm
CONECTOR BUS DE 10 VÍAS HEMBRA
MONTAJE RECTO PCB
CONECTOR BUS DE 10 VÍAS MACHO
INCLUYE SOPORTE
CONECTOR REGLETA 2 VÍAS
TERMINALES CON TORNILLO, ANCHO CABLE
2,5 mm2, PASO DE 5 mm
CONECTOR DB9
CONECTOR DB9 HEMBRA TERMINAL RECTO
TOTAL CAPÍTOLULO 1:
PRESUPUESTO Pag 14
17,75 €
PROYECTO
Num
Uts.
DATA
LOGGER
Descripción
PARA
Precio unitario
TERMOPAR
Total Medido
Total €
3,90
1
3,90
0,48
1
0,48
11,90
1
11,90
10,78
1
10,78
1,50
1
1,50
1,50
1
1,50
0,51
1
0,51
0,03
1
0,03
0,04
1
0,04
0,04
3
0,12
0,04
1
0,04
0,04
1
0,04
0,04
4
0,16
0,05
1
0,05
0,18
5
0,90
0,14
2
0,28
0,14
3
0,42
CAPÍTULO 2: COMPONENTES CAJA DATA LOGGER
2-01
U
2-02
U
2-03
U
2-04
U
2-05
U
2-06
U
2-07
U
2-08
U
2-09
U
2-10
U
2-11
U
2-12
U
2-13
U
2-14
U
2-15
U
2-16
U
2-17
U
LM35
SENSOR
TEMPERATURA
GRADOS
CENTÍGRADOS, ENCAPSULADO TO-92
OP07
AMPLIFICADOR OPERACIONAL DE BAJO
OFFSET, ENCAPSULADO DIP 8
INA07
AMPLIFI. INSTRUMENTACIÓN DE PRECISIÓN,
ENCAPSULADO DIP 8
PIC16F873
MICROCONTROLADOR
8
BITS,
ENCAPSULADO DIP 28
M24C16
MEMORIA
EEPROM
16KBITS
I2C,
ENCAPSULADO DIP 8
MAX232
INTERFAZ
COMUNICACIÓN
RS232,
ENCAPSULADO DIP 16
CRISTAL 4 MHz
CRISTAL CUARZO XT, ENCAPSULADO HC49
DIODO 1N4148
DIODO SILICIO DE SEÑAL
RESISTENCIA 100 Ω
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25
W, 5%
RESISTENCIA 330 Ω
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25
W, 5%
RESISTENCIA 1 kΩ
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25
W, 5%
RESISTENCIA 3,9 kΩ
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25
W, 5%
RESISTENCIA 10 kΩ
RESISTENCIA DE PELÍCULA DE CARBÓN 0,25
W, 5%
RESISTENCIA 470 Ω
RESISTENCIA DE PELÍCULA METÁLICA 0,25
W, 1%
CONDENSADOR 1 µF
CONDENSADOR
ELECTROLÍTICO
POLARIZADOS ALUMINIO, 25 V
CONDENSADOR 15 pF
CONDENSADOR CERÁMICO MULTICAPA NO
POLARIZADO 25 V
LED
LED ROJO ESTÁNDAR DE 3 mm
PRESUPUESTO Pag 15
PROYECTO
2-18
U
2-19
U
2-20
U
DATA
LOGGER
INTERRUPTOR
INTERRUPTOR
CON
ACTUADOR
DESLIZANTE PCB, PASO 2,54 mm
PULSADOR
PULSADOR 4 SOPORTES PCB
TERMOPAR K
TERMOPAR K CON PUNTA SOLDADA Y
AISLAMIENTO DE FIBRA DE VIDRIO
PARA
TERMOPAR
1,00
3
3,00
0,72
1
0,72
12,00
1
12,00
TOTAL CAPÍTULO 2:
PRESUPUESTO Pag 16
48,37 €
PROYECTO
Num
Uts.
DATA
LOGGER
Descripción
PARA
Precio unitario
TERMOPAR
Total Medido
Total €
CAPÍTULO 3: COMPONENTES CAJA FUENTE ALIMENTACIÓN
3-07
U
3-02
U
3-03
U
3-04
U
3-05
U
3-06
U
3-06
U
L7805
REGULADOR DE TENSIÓN 5V, ENCAPSULADO
TO-220
L7905
REGULADOR
DE
TENSIÓN
-5V,
ENCAPSULADO TO-220
B40C
PUENTE
RECTIFICADOR
DE
DIODOS,
CIRCULAR, 40V 1,5 A
CONDENSADOR 2200 µF
CONDENSADOR
ELECTROLÍTICO
POLARIZADO ALUMINIO, 25 V
CONDENSADOR 100 Nf
CONDENSADOR TÁNTALO NO POLARIZADO
25 V
DIODO 1N4007
DIODO SILICIO DE SEÑAL
TRANSFORMADOR
TRANSFORMADOR FERRITA 220-9 V 0,6 A
0,51
1
0,51
0,51
1
0,51
0,14
2
0,14
0,20
1
0,20
0,14
2
0,28
0,04
2
0,08
8,00
1
8,00
TOTAL CAPÍTULO 3:
PRESUPUESTO Pag 17
9,86 €
PROYECTO
Num
Uts.
DATA
LOGGER
Descripción
PARA
TERMOPAR
Precio unitario
Total Medido
Total €
2,50
3
7,50
1,20
1
1,20
0,06
12
0,72
0,20
2
0,40
1,10
0,20
0,55
0,50
0,50
0,25
0,80
0,50
0,40
2,50
1
2,50
1,50
1
1,50
3,50
2
7,00
CAPÍTULO 4: CAJAS, SOPORTES, CABLES
4-01
U
4-02
U
4-03
U
4-04
U
4-05
M
4-06
M
4-07
M
4-08
U
4-09
U
4-10
U
PLACA PCB
PLACA FOTOSENSIBLE CON BAÑO DE COBRE
PLACA TOPO
PLACA PERFORADA EN REJILLA 2,54 mm
SEPARADORES
SEPARADORES HEXAGONALES DE METAL Y
TUERCAS M3
RADIADOR
RADIADOR TO-220 CON TORNILLO Y
TUERCA M3
CABLE BUS DE 10 VÍAS
CABLE HILOS TRENZADOS PLANOS PVC,
PASO CONDUCTOR DE 1,27 mm
CABLE 4 NÚCLEOS
CABLE FLEXIBLE, PVC, HILOS 0,75 mm2
CABLE 8 NÚCLEOS
CABLE FLEXIBLE, PVC, HILOS 0,75 mm2
CABLE PUERTO SERIE
CABLE NULL-MODEM DB9
CABLE ALIMENTACIÓN
CABLE RED TRES HILOS CON CLAVIJA
EUROPEA
CAJA
CAJA PLÁSTICO
TOTAL CAPÍTULO 4:
PRESUPUESTO Pag 18
21,69 €
PROYECTO
Num
Uts.
DATA
LOGGER
Descripción
PARA
TERMOPAR
Precio unitario
Total Medido
Total €
2,50
150
375,00
2,50
250
625,00
CAPÍTULO 5: MANO DE OBRA
5-01
H
5-02
H
CONFIGURACIÓN HARDWARE
HORAS DEDICADAS AL DISEÑO, MONTAJE Y
PRUEBA DEL HARDWARE DEL PROYECTO
CONFIGURACIÓN SOFTWARE
HORAS DEDICADAS AL DISEÑO, MONTAJE Y
PRUEBA DEL SOFTWARE DEL PROYECTO
TOTAL CAPÍTULO 5:
PRESUPUESTO Pag 19
1000,00 €
PROYECTO
1.4
DATA
LOGGER
PARA
TERMOPAR
RESUMEN DEL PRESUPUESTO
•
•
•
•
•
CAPÍTULO 1: CONECTORES
17,75 €
CAPÍTULO 2: COMPONENTES CAJA DATA LOGGER
48,37 €
CAPÍTULO 3: COMPONENTES CAJA FUENTE ALIMENTACIÓN
9,86 €
CAPÍTULO 4: CAJAS, SOPORTES, CABLES
21,69 €
CAPÍTULO 5: MANO DE OBRA
1000,00 €
PRESUPUSTO DE EJECUCIÓN MATERIAL (P.E.M.)
•
•
1097,67 €
BENEFICIO INDUSTRIAL (6% DEL P.E.M.)
GASTOS GENERALES (13% DEL P.E.M.)
65,86 €
142,70 €
PRESUPUSTO DE EJECUCIÓN CONTRATO (P.E.C.)
•
1306,23 €
I.V.A (16%)
209,00 €
PRESUPUESTO DE LICITACIÓN
1515,23 €
Mil quinientos quince euros con veintitrés céntimos de euro
Tarragona, a 31 de maig del 2003
Enginyer Tècnic Industrial
Signat: Pablo Parrado Guardia
PRESUPUESTO Pag 20
DATALOGER PARA TERMOPAR
(PERFIL DE TEMPERATURA DE UN HORNO DE CINTA CON COMPENSACIÓN DE UNIÓN FRÍA)
PLIEGO DE CONDICIONES
AUTOR: Jesús Pablo Parrado Guardia.
DIRECTOR: Xavier Vilanova.
FECHA: Junio / 2003.
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
ÍNDICE
1
1.1
1.2
1.3
2
CONDICIONES GENERALES .................................................................................3
Condiciones legales y administrativas ........................................................................................................3
Condiciones Económicas................................................................................................................................4
Condiciones Facultativas ...............................................................................................................................4
CONDICIONES TÉCNICAS ......................................................................................4
2.1
Condiciones técnicas de materiales y equipos ...........................................................................................5
2.1.1
Descripción general del montaje ..............................................................................................................5
2.1.1.1
Especificaciones de componentes electrónicos..........................................................................5
2.1.1.1.1
Conductores ................................................................................................................................5
2.1.1.1.2
Conectores...................................................................................................................................5
2.1.1.1.3
Resistores lineales fijos .............................................................................................................6
2.1.1.1.4
Condensadores ...........................................................................................................................6
2.1.1.1.4.1
Condensadores electrolíticos .............................................................................................6
2.1.1.1.4.2
Condensadores cerámicos multica.....................................................................................6
2.1.1.1.5
Diodos..........................................................................................................................................7
2.1.1.1.5.1
Diodos de señal ....................................................................................................................7
2.1.1.1.5.2
Diodos Rectificadores..........................................................................................................7
2.1.1.1.5.3
LEDS.......................................................................................................................................7
2.1.1.1.6
Amplificadores operacionales ..................................................................................................7
2.1.1.1.7
Amplificador de instrumentación.............................................................................................7
2.1.1.1.8
Driver/Receiver RS-232..............................................................................................................8
2.1.1.1.9
EEPROM ......................................................................................................................................8
2.1.1.1.10
Microntrolador............................................................................................................................8
2.1.2
Diseño de placas de circuito impreso......................................................................................................8
2.1.2.1
Protecciones contra ruidos.............................................................................................................9
2.2
Condiciones técnicas de ejecución............................................................................................................ 10
2.2.1
Fabricación de placas de circuito impreso............................................................................................11
2.2.2
Soldadura de los componentes ..............................................................................................................12
2.2.3
Mecanización de las cajas .......................................................................................................................12
2.2.3.1
Aparatos de medida utilizados.....................................................................................................13
2.3
Especificaciones del sistema...................................................................................................................... 13
PLIEGO DE CONDICIONES Pag 2
PROYECTO
1
DATA
LOGGER
PARA
TERMOPAR
Condiciones Generales
Este apartado, abarca una serie de condiciones importantes tales como: las legales y
administrativas, económicas y facultativas.
1.1
Condiciones legales y administrativas
Todos los objetivos a desarrollar en el proyecto se ejecutarán cumpliendo la normativa
UNE referente a todas las partes implicadas y especificas en el apartado “31 Electrónica” del
catálogo de la asociación Española de Normalización y Certificación (AENOR), tales como:
31.020.- Componentes electrónicos en general.
31.040.- Resistencias eléctricas.
31.040.10.- Resistencias fijas.
31.040.20.- Potenciómetros, resistencias variables. 31.060.- Condensadores.
31.060.10.- Condensadores fijos en general.
31.080.- Dispositivos semiconductores
31.160.- Filtros eléctricos.
31.180.- Tarjetas y circuitos impresos.
31.200.- Circuitos integrados, microelectrónica, etc.
A su vez se han de cumplir los aspectos técnicos de instalación que afecten directa o
indirectamente al presente trabajo, incluidos en los Reglamentos Electrotécnicos de BAJA
TENSIÓN. A continuación se citan las instrucciones complementarias más importantes del
reglamento electrotécnico para baja tensión, instrucciones MIBT:
0.17 – Instalaciones interiores o receptoras. Prescripciones de carácter general.
0.21 – Instalaciones interiores o receptoras. Protecciones contra sobreintensidades y
obretensiones.
029 – Instalaciones a pequeñas tensiones.
030 – Instalaciones a tensiones especiales.
031 – Receptores. Prescripciones generales.
035 – Receptores. Transformadores y autotransformadores. Reactancias y rectificadores.
Condensadores.
PLIEGO DE CONDICIONES Pag 3
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
044 – Normas LINE de obligado cumplimiento publicadas por el Instituto de
Racionalización y Normalización (IRANOR).
Finalmente, se ajustará a la reglamentación de la Administración local que corresponda.
1.2
Condiciones Económicas
La forma de efectuar el abono del equipo será al contado si éste está ya construido. Si se
ha de proceder a su fabricación, se abonará en dos plazos de pago: uno a cuenta para iniciar el
trabajo de fabricación y el resto al finalizar el mismo, siempre y cuando se cumplan los requisitos
expuestos en las condiciones facultativas.
1.3
Condiciones Facultativas
Ofertas expuestas por la empresa proyectista:
Se compromete a realizar los trabajos expuestos en el presente proyecto hasta efectuar su
venta.
No se compromete a realizar los trabajos ajenos de cualquier tipo no especificados en el
presente proyecto.
En el caso de que el primer pago no se efectúe para dar inicio a la fabricación y no pague
el demandante una vez cumpla el primer plazo acordado, se procederá a la paralización de la
construcción. En este caso, se podrá aumentar el valor del primer plazo a abonar en un 20%.
El plazo de garantía, de un año, será cumplido por la empresa proyectista, siempre y
cuando se justifique que la avería sea ajena al mal uso del equipo.
Requisitos obligatorios a cumplir por el comprador:
Cualquier retraso producido en el proceso de fabricación par causas ajenas a la empresa
o debidamente justificadas, será aceptado por el demandante, sin opción a reclamar por daños y
perjuicios.
Una vez pasen los plazos de garantía no tiene derecho a reclamar gratuitamente ajustes y
reparaciones en el equipo global.
Cuando se efectúe el contrato, acordando ambas partes lo expuesto anteriormente y se
fijen las fechas de pago según correspondan, se procederá a su cierre firmando los documentos
oportunos.
2
CONDICIONES TÉCNICAS
Las condiciones técnicas se dividen en las condiciones materiales y equipos y condiciones de
ejecución
PLIEGO DE CONDICIONES Pag 4
PROYECTO
2.1
DATA
LOGGER
PARA
TERMOPAR
Condiciones técnicas de materiales y equipos
A continuación se van a expresar las condiciones que deben cumplir los componentes por
adquirir, los componentes por fabricar, los materiales, el diseños de placas de circuito impreso
(propiedades, dimensiones,...), las protecciones contra ruidos, las especificaciones del equipo,
etc. Estas condiciones garantizan el cumplimento de las normativas y reglamentaciones vigentes
que puedan afectarles, ya expresadas en las condiciones generales, legales y administrativas.
En los accesos se especifican las librerías y catálogos de los componentes electrónicos
utilizados.
2.1.1
Descripción general del montaje
El hardware diseñado del equipo está colocado dentro de cajas. En ellas se ubican todos
los componentes del sistema.
Antes de llegar al montaje final se ha de conocer una serie de especificaciones, referentes
al presente proyecto, para la elección correcta de los componentes electrónicos.
2.1.1.1 Especificaciones de componentes electrónicos
A continuación se especifican algunos de los componentes que forman la circuitería del
equipo. Para el resto de componentes o si se desea conocer más especificaciones de los ya
nombrados, ver las librerías o catálogos descritos en los anexos.
2.1.1.1.1 Conductores
Los conductores utilizados son circulares ya que éstos tienen ventajas sobre otro tipo de
sección: tienen un área menor, implicando una mayor disipación calorífica y buena flexibilidad.
Los conductores externos para la conexión entre la alimentación eléctrica y la alimentación
son de conexión cable de manguera con clavija shuko y base aérea con toma a masa CN-230 de
l’5 metros de longitud, cuya referencia es 50-TH.
El data logger y el PC se conectan mediante un cable NULL-MODEM de conectores de
nueve pines, cuyas líneas de transmisión y recepción están cruzadas.
Para conectar las cajas de alimentación y del data logger se utilizan tres bananas de 0,5 de
conector banana de 5 mm
2.1.1.1.2 Conectores
Todas las conexiones de alimentación externas e internas entre tarjetas de circuito impreso
se realizan con conectores, ya sean regletas, conectores con ala de seguridad (poste), o tipo IDC
(bus). Los dos primeros con un paso de 160 mm y el segundo con uno de 100 mm. Para la
conexión con el PC se utiliza un conector DB-9. Los conectores entre la fuente y el data logger
son de tipo banana.
PLIEGO DE CONDICIONES Pag 5
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
2.1.1.1.3 Resistores lineales fijos
En el presente trabajo se utilizan resistencias de tolerancias l% y 5% correspondientes a
las series E96 y E24, respectivamente.
Una vez realizados los cálculos y obtenidos los valores adecuados para las resistencias,
donde no es necesaria la precisión, ya que los niveles de cambio (tensiones) son muy distantes, se
utilizan resistencias de la serie E24 de tolerancia 5%. Pero donde requiere paso de intensidad con
la menor fluctuación de la misma y notable precisión, se utilizan resistencias de la serie E96 cuya
resistencia es del 1%.
Dichos resistores utilizados disipan potencias menores o iguales a 250 mW. De manera
que, es necesario escoger valores de resistencias que disipen mucho más que la potencia práctica
a disipar, cuyo valor sea el menor posible para evitar al máximo posibles ruidos.
Los resistores de tolerancias del 5% están formados por una película de carbón y los de
1% por una película metálica.
Características generales de los resistores:
Potencia máxima = 0’25 W (70 ºC)
Coeficiente de temperatura =± 50 ppm/ºC
Tensión limite nominal = 250 V (DC o AC rms)
Rigidez dieléctrica = 500 V (DC o AC rms)
2.1.1.1.4 Condensadores
En el presente trabajo se han utilizado dos tipos de condensadores: electrolíticos y
cerámicos multicapa; descritos a continuación.
2.1.1.1.4.1 Condensadores electrolíticos
Una de las características más notables de estos condensadores es su gran capacidad
para un determinado volumen, es decir, valores relativamente grandes para un espesor del
dieléctrico reducido, por lo que resulta una capacidad de valor elevado.
En el presente trabajo se utilizan condensadores fabricados de aluminio. Su polaridad es
fija y se emplean a frecuencias bajas, para rectificadores, filtros y desacoplos a bajas frecuencias.
Las principales características del dieléctrico son
Las capacidades que se pueden obtener con este dieléctrico oscilan entre l a 150.000 pF.
2.1.1.1.4.2 Condensadores cerámicos multicapa
El dieléctrico de estos condensadores es un elemento cerámico. Son condensadores con
una muy pequeña inductancia y una excelente característica en alta frecuencia.
PLIEGO DE CONDICIONES Pag 6
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Las capacidades de estos condensadores son bajas, de picofaradios. Las tolerancias en
las capacidades son del orden del 5 %.
2.1.1.1.5 Diodos
Para el presente trabajo se distinguen dos tipos de diodos: diodos rectificadores y diodos
emisores de luz (LED); descritos a continuación.
2.1.1.1.5.1 Diodos de Rectificadores
Son diodos de propósito general, de fabricación plana epitaxial sobre silicio, con cápsula
de plástico. Permiten tensiones de 40 V en valor eficaz y intensidades de hasta 1A.
Si el encapsulado contiene un único diodo, este deberá ser del tipo DO-35, con banda de
polaridad en el cátodo. Si el encapsulado contiene un puente de diodos, esté deberá ser circular
de cuatro contactos
2.1.1.1.5.2 LEDS
Los LEDs serán de color rojo de 5 mm de diámetro, están fabricados con
fósforoarsenoide de galio, lo que les proporciona esa brillante luz roja. Los LEDs deberán
satisfacer las siguiente características:
-
Empaquetado T-1 ¾ , cátodo estrecho.
Pico espectral: λpeak=625 nm.
Media línea espectral: ∆λ ½=45 nm.
Tensión: VR=5 V.
Corriente: IF=30 mA.
2.1.1.1.6 Amplificadores operacionales
En el presente proyecto se ha utilizado solamente un tipo de amplificador operacional.
Éste, de referencia OP07C, se ha escogido principalmente por ser un amplificador de precisión.
Debido a sus dos características determinantes, se ha utilizado en los circuitos diseñados al tener
un bajo offset (30 µV) y una pequeñísima variación de este parámetro respecto a la temperatura
(0’5 µV/ºC) . El encapsulado del amplificador es el DIP 8.
2.1.1.1.7 Amplificador de instrumentación
El amplificador de instrumentación utilizado es el INA114, un amplificador de
instrumentación de precisión. Este amplificador debe tener un bajo offset y una deriva con la
temperatura también baja. En concreto las características del integrado son:
PLIEGO DE CONDICIONES Pag 7
PROYECTO
-
DATA
LOGGER
PARA
TERMOPAR
Encapsulado: DIP 8
Tensión de offset máxima de 50 µV
Deriva con la temperatura máxima de 0.25µV/ºC
Alto Rechazo en modo común
2.1.1.1.8 Driver/Receiver RS-232
El Driver RS-232 debe satisfacer la normas y especificaciones EIA/TIA-RS232E y V.28.
El módulo actualmente implementado es el MAX232, por lo que deberá utilizarse este módulo u
otro equivalente que posea las siguientes características:
-
Tensión de Alimentación de 5 V.
Conexión de cinco condensadores electrolíticos de 1 µF.
Encapsulado DIP de 16 vías.
2.1.1.1.9 EEPROM
La memoria EEPROM debe comunicarse vía seria mediante el interfase I2C y debe tener
el encapsulado DIP de 8 vías, y permitir la alimentación a 5 V.
Estas características han sido considerandas a la hora de realizar el programa, con lo que
se ha conseguido que este no limite más el rango de memorias a utilizar. Las memorias que
permiten estas características son la memorias tipo M24x que fabrican, tanto Microchip, como
SGS-Thompson.
2.1.1.1.10 Microntrolador
El Microcontrolador debe ser un microcontrolador de 28 pines de la família Microchip, en
concreto de la gama media, por lo que constará de un repertorio de 35 instrucciones de 14 bits.
Si no se desea modificar el programa, deberádisponer de los módulos USART e I2C y un
conversor A/D de diez bits. Los modelos de la casa Microchip que actualmente poseen dichas
características, ambos con memoria de programa tipo FLASH, son:
- PIC16F873: Es el que se ha utilizado en el diseño del sistema. Posee una memoria de
programa de 4096x14 bits.
- PIC16F876: La única diferencia con el anterior es que este posee una memoria de
programa de 8192x14 bits.
Dichos modelos deben estar en un encapsulado tipo DIP estrecho de 28 pines.
2.1.2
Diseño de placas de circuito impreso
Todas las placas de circuito impreso se han diseñado con el programa informática “Orcad
9.2”, para la posterior impresión de los fotolitos.
PLIEGO DE CONDICIONES Pag 8
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Para su realización se han escogido placas presensibilizadas positivas a dos caras y
también se han diseñado, sin utilizar los trazados automáticos de pistas, para conseguir una mayor
fiabilidad en las placas, siguiendo lo expresado en los siguientes puntos:
•
Utilizar en todos los recorridos de pistas o nets, giros de 45º, entre pads y vías, desde su
lugar de origen hasta su llegada.
•
Minimizar el recorrido de las pistas, llevando la pista correspondiente a su lugar de
destino por el camino más corto y con el número menor de vías, si es posible, ninguna.
•
Para las pistas pertenecientes a las alimentaciones de todas las placas se ha procurado no
realizar ninguna vía en sus recorridos.
•
Se ha procurado establecer un mínimo para la anchura de las pistas de 0’8 mm, sin llegar
a los 0’5 mm. establecidos en las normas. También se ha establecido la misma anchura, como
mínimoentre las pistas de polaridad positiva, las realimentaciones y los controles con sus
respectivas masas.
•
Se han evitado al máximo los lazos de masassiempre y cuando no exista plano de masa
en dicha cara.
•
Las pistas que van soldadas a los pins de conectores y potenciómetros van
obligatoriamente en la cara contraria donde se encajan, es decir, en su respectiva cara de
soldadura.
Todas las pistas de la placa o placas tienen anchuras diferentes, dependiendo de la
intensidad máxima que circulará a través de ellas. Dichas anchuras son aproximadamente:
para las señales analógicas de 0’8 mm, y para alimentaciones y masas de 0’8y 2
mm,respectivamente
La anchura (a), conocida la intensidad máxima (Imax) que ha de recorrer la pista o net,
viene dada por la expresión siguiente:
a = anchura del net o pista
Imax = intensidad máxima que ha de recorrer la pista o net
a=
(I max )3
27
(2.1)
Todos los pads son circulares, de diámetro l’8, 2, 3 y 3’5 mm u ovalados de l’5 x 3 mm.
Las vías son circulares, generalmente, de 2 mm de diámetro.
Las placas de circuito impreso presensibilizadas positivas a dos caras, son de fibra de
vidrio. Cada una de ellas tiene sus medidas características para la posterior ubicación en las cajas.
El proceso de fabricación de las mismas se especifican en las condiciones mecánicas.
2.1.2.1 Protecciones contra ruidos
PLIEGO DE CONDICIONES Pag 9
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
En el diseño del hardware se ha seguido una serie de criterios para prevenir al máximo
todo tipo de ruidos en el sistema y daños en los componentes de cada uno de los circuitos.
Los ruidos externos o interferencias pueden ser eléctricos, magnéticos y
electromagnéticos
Los eléctricos y magnéticos se producen a través de las capacidades parásitas e
inductancias mutuas entre circuitos adyacentes. Por ello se han diseñado una serie de fuentes de
alimentación para cada una de las alimentaciones, independizando al máximo la unión entre ellas
salvo en plano de masa. La utilización de transformadores con toma de masa media para evitar las
masas flotantes y unir todas las masas a la salida de sus respectivos secundarios, se evita al
máximo el desequilibrio de las ondas senoidales y diferentes caídas de tensión en la masa de cada
fuente. Cada una de dichas alimentaciones se ha procurado llevar lo más próximo que se pueda
en las placas de los circuitos impresos a los pins de los integrados que necesiten suministro,
uniendo las masas de las diferentes alimentaciones con un plano de masa, ya sean digitales o
analógicos, ya que todos provienen del mismo módulo de alimentación. Evitar los lazos de masas
uniendo siempre que se pueda todas las masas en un punto común.
Los electromagnéticos se producen alrededor de los cables del equipo y pistas de los
circuitos impresos, actuando éstos como antena. Aparte de lo expuesto anteriormente, se han
utilizado para prevenir al máximo dicho ruido, conectores y cableado adecuado para cada tipo de
señal. También se procura no pasar las pistas de alimentación de una cara a otra en las placas de
los diferentes circuitos impresos siempre que se pueda.
El ruido interno o inherente es debido a fenómenos de agitación térmica de electrones en
resistores y en la generación y recombinación aleatoria de pares de electrones-agujeros en los
semiconductores. Para prevenir este tipo de ruido se han utilizado componentes adecuados para
cada caso, dependiendo del valor de intensidad que ha de pasar, ya sean resistores fijos o
variables, transistores, etc.
Para la protección de integrados y el resto de componentes de los circuitos se utilizan,
aparte de los ya expresados, condensadores no polarizados colocados en paralelo lo más
próximo posible de los pins de alimentación de cada integrado, para evitar picos de tensión
excesivos, ya sean éstos positivos o negativos, en los intentos de conexión o desconexión del
equipo.
Como protección contra los errores, cuando se ha requerido precisión, se han utilizado,
aparte de los ya comentados:
– Resistencias de película metálica con la tolerancia mínima del l%.
– Operacionales con una mínima fluctuación de la tensión de salida respecto a la temperatura y
con una gran impedancia de salida.
– Eliminación de las tensiones e intensidades de offset.
2.2
Condiciones técnicas de ejecución
PLIEGO DE CONDICIONES Pag 10
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
A continuación se va a expresar la forma de ejecutar, fabricar y montar diferentes partes
de la instalación en el equipo, garantizando el cumplimiento de las normativas y reglamentaciones
vigentes que puedan afectarles, ya expresadas en las condiciones legales y administrativas.
2.2.1
Fabricación de placas de circuito impreso
Una vez diseñadas y obtenidos los fotolitos en papel de acetato, se puede ya efectuar la
fabricación de dichas placas, siguiendo paso a paso las siguientes operaciones:
•
Inicialmente se ha de poner a punto la maquinaria y materiales a utilizar: insoladora o
lámpara de luz actínica, revelador y el atacante o, en su defecto, una disolución de sosa cáustica y
agua, atacador rápido que se puede sustituir por una disolución con la siguiente composición:
33% de hidruro de cloro, 33% de agua oxigenada de 110 volúmenes y 33% de agua. Y por
último se necesitan las placas de circuito impreso de material fotosensible positivo de doble cara
de material de fibra de vidrio. Previamente dichas placas han sido cortadas con las medidas
oportunas.
•
Colocar la placa de circuito impreso entre los fotolitos previamente unidos. Introducirla
en la insoladora cubriéndola con el plástico. Activar la bomba de vacío para evitar la formación
de burbujas de aire entre las transparencias y las caras de la placa. Posteriormente se cierra el
circuito superior y se introduce en el interior de la insoladora para poder después conectar la luz
actínica durante el tiempo aconsejado por el fabricante.
•
El tiempo de exposición depende de la lámpara usada, de la distancia de esta placa, del
material fotosensible usado y de la antigüedad de éste. Para ello el fabricante indica cual es el
tiempo óptimo recomendado.
•
Acabada la exposición, se retira la placa de la insoladora y se coloca dentro del líquido
revelador. El tiempo de revelado depende de la marca de la placa, indicando su fabricante cuál es
el adecuado. De todas formas, dicho tiempo, sirve como referencia ya que paco a poco se van
viendo las pistas y por lo tanto, cuando está suficientemente revelado, las pistas se deber ver
nítidas y el resto de superficie ausente de cualquier sustancia fotosensible, es decir, se debe ver el
cobre limpio.
•
Una vez revelada la placa, se coloca debajo del grifo y se limpia con agua con lo que
produciremos un paro del revelado. Posteriormente, se puede pasar a la fase del atacado. Para
ello se sumerge en el atacador rápido o en la disolución, observando como va desapareciendo el
cobre libre y las pistas se mantienen intactas. Una vez que haya desaparecido toda la superficie de
cobre que forma parte de las pistas, se saca la placa del atacador y se limpia con agua para parar
la fase del atacador.
•
Como fase final se deberá limpiar la emulsión fotosensible que recubre las pistas con
alcohol o acetona. Éstas están ya preparadas para su recubrimiento de estaño en la máquina
provista de dos rodillos en contacto con el estaño de la cubeta.
•
Posteriormente se procede a su limpieza con agua y ya se puede pasar a la mecanización
de los agujeros (pads o vías), con los diámetros de broca correspondientes, con el taladro. Los
PLIEGO DE CONDICIONES Pag 11
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
diámetros vienen marcados por el grosor de los pins de los diferentes tipos de componentes, con
un mínimo de tolerancia.
La colocación de los componentes es lo más próxima a la placa guardando cierta
distancia en reguladores, transistores, etc.
2.2.2
Soldadura de los componentes
La soldadura utilizada en el presente proyecto es por fusión de la aleación metálica a
través de la aplicación de temperatura. Este tipo de soldadura es sencilla, segura, rápida y con
una gran calidad.
Pasos y fases producidos en la soldadura blanda por fusión:
•
El pin hace referencia a todos los tipos de componentes a soldar y extremos del
cableado. Se supone que la pista, pad o vía en las placas de C.I. alcanzan su temperatura óptima
al calentar la base metálica del pin a soldar.
•
Limpieza previa de la punta del soldador eléctrico y resto de componentes a soldar
(placa, pins de los componentes y cableado).
•
Esperar que la punta del soldador alcance la temperatura de trabajo.
•
Establecer íntimo contacto o unión entre la base metálica del pin a soldar con el metal a
fundir. Este material a fundir es un hilo que tiene una composición del 63% de estaño y 37% de
plomo, provista de una resina que facilita la limpieza de las superficies en contacto en el momento
de la soldadura. Dicha resina también facilita y protege la soldadura de posteriores oscilaciones
aceleradas al entrar en contacto con el oxígeno del aire a temperaturas elevadas.
•
Aplicación de suficiente temperatura, 183 ºC, para calentar el pin a soldar y fundir el
material.
•
La soldadura, en estado de fusión, humedece las bases del metal, provocando su
posterior formación intermetálica.
•
Por último, el enfriamiento de la soldadura efectuada.
Es importante soldar alternadamente pins de diferentes componentes, para evitar que
dichos componentes alcancen temperaturas demasiado elevadas y se produzca un deterioro.
2.2.3
Mecanización de las cajas
Una vez realizado un estudio previo sobre la cantidad y dimensiones aproximadas de las
placas de circuito impreso, se disponen éstas para estudiar la mejor forma de ubicar las mismas
en las cajas que reúnen buenas características. Tras haber seleccionado la forma de fijar cada una
de las futuras placas, se puede proceder al diseño y fabricación de las mismas.
PLIEGO DE CONDICIONES Pag 12
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
La disposición de las placas de C.I. en las cajas simplifica notablemente problemas
posteriores, ya que solucionan problemas de extracción o incorporación de placas y reparación
del conjunto ubicado en una caja.
2.2.3.1 Aparatos de medida utilizados
Los aparatos de medida utilizados en la investigación y fabricación del equipo en el
presente proyecto, son los siguientes.
PROGRAMABLE DIGITAL MULTIMETER “HAMEG HM 8112-2”
DIGITAL MULTMETER “KT KT-9201”
2.3
Especificaciones del sistema
El hardware del sistema permite medir la temperatura mediante un temopar tipo K, dentro
de los rangos de funcionamiento del horno del cinta del laboratorio de gases (Tª ambiente - 1100
ºC), aplicando la compensación por software.
El software del sistema no sólo se limita a la compensación del termopar K anteriormente
descrito sino que está implementada la compensación de cualquier termopar: B, E, J, K, N, R, S
Se alimenta el sistema a 220 Vef y 50 Hz.
La comunicación entre el sistema y el ordenador se realiza mediante RS232.
El ordenador a utilizar debe ser un PC IBM o compatible y debe disponer de al menos un
puerto serie libre y tener instalado el sistema operativo MS-DOS o compatibles.
PLIEGO DE CONDICIONES Pag 13
DATALOGER PARA TERMOPAR
(PERFIL DE TEMPERATURA DE UN HORNO DE CINTA CON COMPENSACIÓN DE UNIÓN FRÍA)
ANEXO 1: MANUAL USUARIO
AUTOR: Jesús Pablo Parrado Guardia.
DIRECTOR: Xavier Vilanova.
FECHA: Junio / 2003.
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
ÍNDICE
1
FUNCIONAMIENTO DEL DATA LOGGER............................................................3
2
FUNCIONAMIENTO DEL PROGRAMA ORDENADOR ......................................4
2.1
Comado c sin /fil..................................................................................................................................................5
2.2
Comando c con /fil..............................................................................................................................................5
2.3
Comando t sin /fil................................................................................................................................................6
2.4
Comando t con /fil...............................................................................................................................................7
2.5
Comando p............................................................................................................................................................7
2.6
Comando m...........................................................................................................................................................8
2.7
Mensajes de error ...............................................................................................................................................8
ANEXO 1: MANUAL USUARIO Pag 2
PROYECTO
1
DATA
LOGGER
PARA
TERMOPAR
Funcionamiento del Data Logger
El funcionamiento del data logger es simple:
1.
Conectar la alimentación al data logger, conectando los cuatro bornes de
alimentación a las tensiones adecuadas:
a. +5 , debe conectarse a una fuente de alimentación de estrictamente cinco
voltios (se permite un margen de ± 0,5 V)
b. +Vcc, debe conectarse a una fuente igual o superior a +5. –Vcc debe ser
una tensión negativa y suele ser simétrica a +Vcc.
c. GND, las masas del data logger y fuentes de alimentación deben ser las
mismas
2.
Realizar las conexiones dependiendo del modo de trabajo a realizar. Hay tres
modos con el data logger:
a. Programación. Se cambia la configuración del data logger. El data logger
recibe la configuración del ordenador. Para que reciba la configuración
debe conectarse el data logger al puerto serie del ordenador mediante un
cable null-modem RS-232.
b. Adquisición. Se adquieren las señales para la compensación del data logger
y se guardan en la memoria del data logger. Debe ponerse en contacto el
termopar con la superficie a medir
c. Transmisión. Se transmiten al ordenador las señales que se adquirieron
previamente. Necesita que el data logger esté conectado al puerto serie del
ordenador mediante el cable RS-232.
3.
Una vez conectados los instrumentos para el modo de trabajo escogido, se
inicia la actividad utilizando los conmutadores del sistema:
a. Marcha/Paro. Inicia la actividad del data logger, si está en ON iniciará el
proceso determinado por las otras señales.
b. Conmutación de Programación/Normal. Si está activo se iniciará un ciclo
de programación al iniciarse marcha, si no, se tendrá en cuenta el estado del
segundo conmutador.
c. Conmutación de Adquisición/Transmisión. Si no está activo programación,
si está a uno se iniciará un ciclo de adquisición de temperaturas y
almacenamiento al pulsarse marcha, o si no, uno de transmisión de las
temperaturas almacenadas en la adquisición previa.
ANEXO 1: MANUAL USUARIO Pag 3
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Al activar la marcha el data logger indicará el modo de trabajo a realizar mediante
los leds de visualización.
-
Visualizador de Programación. Cuando está encendido indica que el sistema está
ejecutando un ciclo de programación.
-
Visualizador de Adquisición. Cuando está encendido indica que el sistema está
ejecutando un ciclo de adquisición
-
Visualizador de Transmisión. Cuando está encendido indica que el sistema está
ejecutando un ciclo de transmisión.
4.
2
El sistema dispone de un pulsador de reset que al pulsarlo reinicia el programa.
Funcionamiento del Programa Ordenador
El programa se ejecuta sobre el sistema operativo MS-DOS. Para acceder a él se
deberá escribir el nombre del programa en la línea de comandos y especificar el parámetro
deseado. Si no se especifica ningún parámetro aparece la sintaxis del programa:
Uso: TERMO <comando> [/com=n] [/ter=n] [/fil]
<Comandos>
c Compensación temperaturas data logger
t Transmisión configuración data logger
p Modificación/Creación parámetros internos
m Compensación indicado tensión producida y temperatura ambiente
Parámetros
/com=n indica el puerto serie usado n=1|2|3|4 , por defecto n=1
/ter=n indica el tipo de termopar usado n=b|e|j|k|n|r|s|t , por defecto n=k
/fil indica si se utilizara fichero interno, por defecto no se utiliza
Nota este parámetro no será válido para los comandos p o m
El comando c compensa las temperaturas guardadas en el data logger que le llegan
por el puerto serie. Las variables manejadas durante la compensación se guardan en
diversos ficheros. Antes de comenzar la rutina de compensación el programa abre
internamente el fichero donde se guardan los parámetros de compensación del data logger,
FICHCON. Si no puede abrir el fichero no se ejecuta la rutina de compensación y se acaba
el programa. Cuando se reciben datos por el puerto serie, estos se guardan en el fichero
FICHHEX. El fichero FICHHEX puede utilizarse como fuente para la compensación,
evitando así la conexión al data logger, si el comando c contiene el parámetro /fil. Los
ANEXO 1: MANUAL USUARIO Pag 4
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
ficheros generados en la compensación son: FICHVAL que guarda la temperatura ambiente
presente durante la adquisición, FICHVOL registra la tensión producida por el termopar, y
FICHTXT la temperatura en términos absolutos a la que se encontraba el termopar
(compensación).
El comando t transmite la configuración del data logger para que este la reciba y
cambie la actual configuración por esta. El programa pregunta al usuario los parámetros de
configuración a transmitir, y son guardados en el fichero FICHTRM. Si se especifica el
parámetro /fil, transmite el último FICHTRM guardado y no pregunta esos parámetros al
usuario.
El comando p permite modificar los parámetros internos utilizados para compensar
el sistema, el programa pregunta esos parámetros al usuario y los guarda en el fichero
FICHCON.
El comando m calcula la temperatura a la que se encuentra un termopar, si se le
indica la temperatura ambiente y la tensión que produce.
2.1
Comado c sin /fil
Una vez se entra en esta opción aparece el siguiente mensaje:
Compensación Data Logger. Pulsa ESC para salir
Aparecen en la pantalla las temperaturas una vez compensadas que se van
recibiendo, una temperatura ambiente, una del termopar, otra ambiente y otra del termopar,
y así sucesivamente hasta que se reciben todas las temperaturas. Cuando se pulsa ESC se da
por finalizado el programa.
Fichero Generado
Con lo que se informa que los ficheros han sido generados.
2.2
Comando c con /fil
Los mensajes son similares al anterior, y el programa acaba cuando se termina de
leer el fichero FICHHEX
Compensación Fichero Data Logger
Aparecen en la pantalla las temperaturas una vez compensadas que se van
extrayendo del fichero, una temperatura ambiente, una del termopar, otra ambiente y otra
del termopar, y así sucesivamente hasta que se lee todo el fichero.
Fichero Generado
Se da por finalizada la compensación y se informa que los ficheros han sido
generados.
ANEXO 1: MANUAL USUARIO Pag 5
PROYECTO
2.3
DATA
LOGGER
PARA
TERMOPAR
Comando t sin /fil
Primero el programa pregunta unos cuantos valores para poder deducir los
parámetros de configuración a enviar al data logger.
Transferencia configuración al Data Logger
a partir de los parámetros siguientes:
Tiempo muestreo aproximado (s) ?
La primera pregunta se refiere al tiempo que transcurrirá entre las medidas de
temperaturas, y deberá expresarse en segundos. El usuario deberá indicar un tiempo
aproximando, obviamente superior a cero, y el programa calculará el valor preciso, siendo
este valor nunca inferior al aproximado. Un ejemplo de resultado puede ser:
Tiempo de muestreo(s) 1.500000
Con la segunda se indica el valor del contador a cargar para el temporizador de
retardos en la transmisión. Poner un valor diferente de cero puede resolver problemas en la
recepción de los datos aunque retarda la finalización de esta. El valor máximo son 255
unidades.
Retardos en la trasmisión (0-255) ?
La última pregunta se refiere al tipo de memoria EEPROM I2C presente en el data
logger. Permitiendo la configuración el programa de los siguientes dispositivos.
Únicamente el usuario deberá introducir el número correspondiente
Tecle el número correspondiente al tipo de memoria utilizada
1 M24C01
2 M24C02
3 M24C04
4 M24C08
5 M24C16
6 M24128
7 M24256
8 M24512
Una vez acabadas la preguntas el data logger muestra la sucesiva transmisión de
parámetros. Apareciendo en siguiente mensaje
Transferiendo al Data Logger
Enviado 0
Enviado 1
Enviado 2
Enviado 3
Enviado 4
Enviado 5
Enviado 6
Enviado 7
ANEXO 1: MANUAL USUARIO Pag 6
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Enviado 8
Transferencia finalizada
Con el que se van indicando los byte que se van enviado. Al acabar las preguntas los
bytes a transmitir se guardan en el fichero FICHTRM
2.4
Comando t con /fil
Exactamente igual que el anterior pero no salen las preguntas.
Transferencia configuración al Data Logger
Transferiendo al Data Logger
Enviado 0
Enviado 1
Enviado 2
Enviado 3
Enviado 4
Enviado 5
Enviado 6
Enviado 7
Enviado 8
Transferencia finalizada
2.5
Comando p
Se desean modificar los parámetros de compensación del data logger.
Modificacion Parametros Compensacion
Que se extraerán de las siguientes preguntas
Tensión alimentación Vcc (V)
La tensión a la que se conecta la borna de +5 en el data logger.
Tensión de offset (mV)
Tensión de offset real del amplificador de instrumentación INA114.
Ganancia LM35
La ganancia entre entrada A/D y temperatura. Suele indicarse 49E-3
ANEXO 1: MANUAL USUARIO Pag 7
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Ganancia Termopar V
La ganancia tensión del termopar y entrada A/D. Suele indicarse 107.4
2.6
Comando m
Se desea calcular la temperatura en el termopar a partir de las medidas realizadas.
Calculo Temperatura Termopar a partir de las mediciones
Esas medidas son:
Temperatura ambiente (ºC)
La temperatura a la que se ha medido la tensión producida en el termopar
Tensión producida por el termopar (mV)
La tensión producida en mV.
Con lo que aparece un mensaje similar a:
temperatura del termopar es 125.1 ºC
2.7
Mensajes de error
Aparte del mensaje de error que se produce si no se introduce correctamente la línea
de comandos del programa, ver apartado 2, también se muestran mensajes de error si no se
encuentran ficheros que se pretendía utilizar. Así aparece:
Fichero de Adquisición no encontrado
Si se ha ejecutado TERMO c /fil y no se encuentra en el directorio actual
FICHTRM.
Fichero de Transmisión configuración no encontrado
Si se ha ejecutado TERMO t /fil (pueden haber más parámetros) y no se encuentra
en el directorio actual FICHTRM.
Fichero de parámetros internos no encontrado
Si se ha ejecutado TERMO c o TERMO p y no se encuentra en el directorio actual
FICHCON.
ANEXO 1: MANUAL USUARIO Pag 8
DATALOGER PARA TERMOPAR
(PERFIL DE TEMPERATURA DE UN HORNO DE CINTA CON COMPENSACIÓN DE UNIÓN FRÍA)
ANEXO 2: JUEGO DE PRUEBAS
AUTOR: Jesús Pablo Parrado Guardia.
DIRECTOR: Xavier Vilanova.
FECHA: Junio / 2003.
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
ÍNDICE
1
CONFIGURACIÓN DEL DATA LOGGER ..............................................................3
1.1
Especificaciones de cálculo ordenador ..........................................................................................................3
1.1.1
1.2
Transmisión configuración ordenador-microcontrolador.......................................................................3
1.2.1
2
Fichero FICHCON..........................................................................................................................................3
Fichero FICHTRM ..........................................................................................................................................4
EVOLUCIÓN TEMPERATURA AMBIENTE ..........................................................4
2.1
Fichero de transmisión datos microcontrolador-ordenador ...................................................................4
2.2
Fichero/Gráfica de temperatura ambiente ..................................................................................................4
2.3
Fichero/Gráfica de temperatura termopar ..................................................................................................5
3
SIMULACIÓN TERMOPAR .......................................................................................6
3.1
Fichero de transmisión datos microcontrolador-ordenador ...................................................................7
3.2
Fichero/Gráfica de temperatura ambiente ..................................................................................................7
3.3
Fichero/Gráfica de temperatura termopar ..................................................................................................8
4
COMPENSACIÓN MANUAL.....................................................................................9
ANEXO 2: JUEGO DE PRUEBAS Pag 2
PROYECTO
1
DATA
LOGGER
PARA
TERMOPAR
Configuración del data logger
Antes de empezar a adquirir con el data logger se ha de haber configurado previamente
tanto el data logger como las especificaciones del sistema en el programa del ordenador.
Las configuraciones seguidamente adoptadas se mantendrán constantes para todas las
pruebas salvo que se indique lo contrario.
1.1
Especificaciones de cálculo ordenador
Se ejecuta el programa del ordenador TERMO con los siguientes parámetros:
TERMO p
Introduciendo los siguientes valores en los diferentes campos:
-
Tensión alimentación: 5.1 V
-
Tensión offset: 0 V
-
Ganancia tensión entrada A/D / temperatura ambiente: 49E-3
-
Ganancia tensión entrada A/D / tensión producida termopar: 108
1.1.1
Fichero FICHCON
En este fichero se guardan las especificaciones introducidas que serán utilizadas si se
ejecuta otro comando del programa TERMO.
5.100000E+00 0.000000E+00 4.900000E-02 1.080000E+02
Podemos comprobar como los valores del fichero corresponden con los valores
anteriormente indicados
1.2
Transmisión configuración ordenador-microcontrolador
Se ejecuta el programa del ordenador TERMO con los siguientes parámetros:
TERMO t /com=1
Introduciendo los siguientes valores en los diferentes campos:
-
Tiempo adquisición: 1.0 s
-
Tipo de memoria: M24C16 (5)
-
Retardos de transmisión: 0
ANEXO 2: JUEGO DE PRUEBAS Pag 3
PROYECTO
1.2.1
DATA
LOGGER
PARA
TERMOPAR
Fichero FICHTRM
En este fichero se guardan los datos que se han enviado al data logger y son:
f8 f0 fe f0 ef 10 2 fd ff
Podemos comprobar que corresponden a los valores calculados para los parámetros
indicados.
2
Evolución temperatura ambiente
El experimento se ha realizado a una temperatura ambiente de una casa no climatizada
y a una tensión diferencial del termopar de 0V.
Se ejecuta el programa del ordenador TERMO con los siguientes parámetros:
TERMO c /com=1 /ter=k
2.1
Fichero de transmisión datos microcontrolador-ordenador
La memoria EEPROM que se va enviando al ordenador se guarda en este fichero.
Los valores están expresados en hexadecimal y conforman una cadena de envíos (tabla). A
continuación podemos observar unos cuantos valores obtenidos. El fichero completo está
incluido en el proyecto para poder observar tales valores.
37 0 37 cc 0
38 0 38 c0 0
38 0 38 80 0
Puede observarse como el segundo y quinto campo son nulos, al igual que los bits 0,
1, 4 y 5 del cuarto campo, ya que corresponden a la conversión de las medidas del termopar
y para este caso son nulas.
2.2
Fichero/Gráfica de temperatura ambiente
Con los datos del fichero de la temperatura ambiente la gráfica de la temperatura
ambiente del termopar a la que se desarrollo el sistema es:
ANEXO 2: JUEGO DE PRUEBAS Pag 4
PROYECTO
2.3
DATA
LOGGER
PARA
TERMOPAR
Fichero/Gráfica de temperatura termopar
Con los datos del fichero de la temperatura del termopar, La gráfica de la temperatura
del termopar a la que se desarrollo el sistema es:
ANEXO 2: JUEGO DE PRUEBAS Pag 5
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Podemos observar como ambas gráficas son iguales, excepto en las muestras 250 y
498 en las que el conversor guardó un bit en lugar de un cero como en las demás muestras y
al no ser en entras muestras la tensión del termopar cero difieren ambas muestras. Si se
observan los ficheros (también adjuntados) podrá observarse como los valores de estos son
un poco diferentes, centésimas de grados, esto es debido a que al aplicar los polinomios se
comete un error de esa magnitud.
3
Simulación termopar
El programa se ejecuta igual que en el apartado anterior
Como no disponemos de ningún termopar hemos introducido una tensión
prácticamente constante equivalente a la que podría producir un termopar. Los valores de
dicha tensión, expresados en mV son:
ANEXO 2: JUEGO DE PRUEBAS Pag 6
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Está gráfica se ha obtenido de los datos almacenados en la memoria EEPROM que
corresponden a las medidas del termopar
3.1
Fichero de transmisión datos microcontrolador-ordenador
Unos cuantos de los valores del fichero son:
36 d9 36 34 da
36 da 36 a3 d9
36 da 36 87 d9
Aquí obviamente la tensión simulada como termopar no es cero
3.2
Fichero/Gráfica de temperatura ambiente
La gráfica de la temperatura ambiente a la que se realizo la simulación es:
ANEXO 2: JUEGO DE PRUEBAS Pag 7
PROYECTO
3.3
DATA
LOGGER
PARA
TERMOPAR
Fichero/Gráfica de temperatura termopar
La gráfica de la temperatura del termopar a la que se simulo el sistema es:
ANEXO 2: JUEGO DE PRUEBAS Pag 8
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
Puede observarse como la tensión del termopar media unos 40,26 mV produciría unos
975ºC pero al estar a una temperatura ambiente de unos 22ºC el termopar está a los 997ºC
que muestra la gráfica.
4
Compensación Manual
Para probar el comando se ejecuta el programa TERMO con los siguientes
parámetros:
TERMO m /ter=b
Si se introducen 22 ºC y 15 mV la temperatura a la que corresponden estas
condiciones es
317.245496 ºC
ANEXO 2: JUEGO DE PRUEBAS Pag 9
DATALOGER PARA TERMOPAR
(PERFIL DE TEMPERATURA DE UN HORNO DE CINTA CON COMPENSACIÓN DE UNIÓN FRÍA)
ANEXO 3: LISTADO DE PROGRAMAS
AUTOR: Jesús Pablo Parrado Guardia.
DIRECTOR: Xavier Vilanova.
FECHA: Junio / 2003.
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
ÍNDICE
1
PROGRAMA ENSAMBLADOR................................................................................3
2
PROGRAMA C ..........................................................................................................16
ANEXO 3: LISTADO DE PROGRAMAS Pag 2
PROYECTO
1
DATA
LOGGER
PARA
TERMOPAR
Programa Ensamblador
;****************************************************************************
; PROGRAMA : termo.asm
; Funcion : Programa data logger para termopar
;
;
; Revision : 0.0
27/05/2003
Programa para : PIC16F873
; CPU Clock : 4 MHz
Reloj instruccion : 1 MHz = 1 us
;
WDT : Deshabilitado
Tipo de reloj : XT
; Code Prot : OFF
;****************************************************************************
List p=16F873
;Se indica el modo de procesador
include "P16F873.INC" ;se incluye la definicion de los
;registros internos
DEVSEL_W
W_R
Bmes
Ad_ok
Add2
T0_ok
T1_ok
Paro
MaxReadA
MaxRead
MaxReadInc
TAH
TAL
TT
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
b'10100000'
0
0
1
2
3
4
5
0x81
0x80
0x80
0x0B
0xDB
0x63
Ini_NDIRH
Ini_NDIRL
Ini_NDIRLR
MaxPagW
MaxRamPag
INCL
INCH
NTMR1
NTMR0
equ
equ
equ
equ
equ
equ
equ
equ
equ
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
;Valor inicial de NDIRH(F8)
;Valor inicial de NDIRL(F0)
;Valor inicial de NDIRL en lectura(FE)
;Fin de pagina(F0)
;Fin de cola(EF)
;Incremento byte bajo @,1 pag(10)
;Incremento byte alto @(02)
;Valor inicial de t1(FE)
;Valor inicial de t0(FF)
equ
equ
equ
equ
equ
equ
equ
equ
equ
0x20
0x21
0x22
0x23
0x24
0x24
0x25
0x26
0x27
SALVAW
SALVASTATUS
DATA_EE_ADDR
DATA_EE_DATA
LM351L
AUX
TERMO1L
LM352L
TERMO2L
;Selección memoria M24x por bus I2C,W
;Bit de W/R
;Bit indica 1a/2a medida, Estado
;Bit indica fin A/D, Estado
;Bit indica 1/2 bytes @, Estado
;Bit activa uso TMR0
;Bit activa uso TMR1
;Máximas lecturas con ACK
;Máximas lecturas
;Incremento de direccion en lectura
;Valor inicial de TMR1H
;Valor inicial de TMR1L
;Valor inicial de TMR0
;Guarda W en la IRQ, tambien @ 0xA0
;Guarda STATUS en la IRQ
;Direccion de la memoria EEPROM interna a escribir
;Dato a escribir en la memoria EEPROM
;Byte bajo A/D LM35 1a medida
;Variable auxiliar para asignar el bit Add2,1 uso
;Byte bajo A/D termopar 1a medida
;Byte bajo A/D LM35 2a medida
;Byte bajo A/D termopar 2a medida
ANEXO 3: LISTADO DE PROGRAMAS Pag 3
PROYECTO
Estado
Index
DEVSEL
DIRH
DIRL
NDIRH
NDIRL
t0
t1
DIRPAG
INIBANK2
DATA
equ
0x29
0x2A
0x2B
0x2C
0x2D
0x2E
0x2F
0x30
0x31
0xA1
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
LOGGER
PARA
TERMOPAR
0x28 ;Bits: Ad_ok, Bmes, Add2
;Indice de la cola
;Selector de dispositivo,E2PROM 2 bytes direccion
;Byte alto @ EEPROM M24x
;Byte bajo @ EEPROM M24x
;Incrementos byte alto EEPROM M24x
;Incrementos byte bajo EEPROM M24x
;Contador eventos TMR0
;Contador eventos TMR1
;Inicio de la cola en el banco 0
;Inicio de la cola en el banco 1
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG
goto
0x00
Inicio
;Inicio en el Vector de Reset
;Va a la primera instruccion del
;programa
;<<<<<<------------------- VECTOR DE INTERRUPCION -------------------->>>>>>>
INTER
ORG
0x04
;Inicio del vector de interrupcion
movwf
swapf
clrf
movwf
SALVAW
STATUS,W
STATUS
SALVASTATUS
;Salva W
;Invierte STATUS --> W
;Banco 0, borra IRP,RP1,RP0
;Salva STATUS
;No se guarda el PCLATH,solo se usa la pagina 1 de memoria de programa
Timer_0
Timer_1
btfss
goto
btfss
goto
bcf
bsf
bcf
bcf
bsf
bsf
bcf
bsf
goto
INTCON,T0IF
Timer_1
Estado,T0_ok
Timer_1
Estado,T0_ok
Estado,T1_ok
INTCON,T0IE
PIR1,TMR1IF
STATUS,RP0
PIE1,TMR1IE
STATUS,RP0
ADCON0,GO
Restaura_INT
;Interrupcion por TMR0?
btfss
goto
btfss
goto
incfsz
goto
movlw
call
movwf
bcf
PIR1,TMR1IF
ADC
Estado,T1_ok
ADC
t1,F
Restaura_INT
NTMR1
Read_EE
t1
Estado,T1_ok
;Interrupcion por TMR1?
;o solo overflow flag?
;No hacer caso del flag TMR0
;Hacer caso del flag TMR1
;Desactiva irq TMR0
;Repone Flag TMR1
;Selecciona banco 1
;Activa irq TMR1
;Selecciona banco 0
;Inicia la conversion A/D
;tiempo completado ?
;Repone contador TMR1
;No hacer caso del flag TMR1
ANEXO 3: LISTADO DE PROGRAMAS Pag 4
PROYECTO
DATA
LOGGER
PARA
bsf
bsf
bcf
bcf
bsf
bcf
bsf
goto
Estado,T0_ok
STATUS,RP0
PIE1,TMR1IE
INTCON,T0IF
INTCON,T0IE
STATUS,RP0
ADCON0,GO
Restaura_INT
ADC
btfss
goto
bcf
bsf
goto
PIR1,ADIF
;¿Interrupcion por conversion?
Recept
PIR1,ADIF
;Si. Reponer Flag
Estado,Ad_ok ;Datos listos
Restaura_INT
Recept
btfss
goto
bcf
movf
movwf
call
incf
PIR1,RCIF
;¿Interrupcion por recepcion?
Restaura_INT ;No. Falsa interrupcion
PIR1,RCIF
;Si. Reponer Flag
RCREG,W
;Lectura dato recibido
DATA_EE_DATA
;Guardar EEPROM
Write_EE
DATA_EE_ADDR,F
;Incrementar direccion
Restaura_INT swapf
movwf
swapf
swapf
bsf
retfie
;Hacer caso del flag TMR0
;Selecciona banco 1
;Desactiva irq TMR1
;Repone Flag
;Activa irq TMR0
;Selecciona banco 0
;Inicia la conversion A/D
SALVASTATUS,W
;Invierte STATUS --> W
STATUS
;Restaura STATUS
SALVAW,F
;Invierte --> F
SALVAW,W
;Restaura W
INTCON,GIE
;Retornça habilitando todas las interrupciones
;<<<<<<----------------- LECTURA DE EEPROM INTERNA ------------------->>>>>>>
Read_EE
bsf
movwf
bsf
bcf
bsf
bcf
movf
bcf
return
STATUS,RP1
EEADR
STATUS,RP0
EECON1,EEPGD
EECON1,RD
STATUS,RP0
EEDATA,W
STATUS,RP1
;Bank 2
;Load Address
;Bank 3
;Point to DATA Memory
;EEPROM Read
;Bank 2
;W=EEDATA
;Bank 0
;<<<<<<----------------- ESCRITURA DE EEPROM INTERNA ----------------->>>>>>>
Write_EE
movf
bsf
movwf
bcf
movf
bsf
movwf
bsf
bcf
bsf
bcf
TERMOPAR
DATA_EE_ADDR,W
STATUS,RP1
EEADR
STATUS,RP1
DATA_EE_DATA,W
STATUS,RP1
EEDATA
STATUS,RP0
EECON1,EEPGD
EECON1,WREN
INTCON,GIE
;Load Address
;Bank 2
;Bank 0
;Load Data
;Bank 2
;Bank 3
;Point to DATA Memory
;Enable writes
;Disable interrupts
ANEXO 3: LISTADO DE PROGRAMAS Pag 5
PROYECTO
Escrito
DATA
LOGGER
PARA
movlw
movwf
movlw
movwf
bsf
0x55
EECON2
0xAA
EECON2
EECON1,WR
;Required Sequence
bsf
bcf
bcf
btfss
goto
bsf
bsf
bcf
bcf
bcf
return
INTCON,GIE
STA TUS,RP0
STATUS,RP1
PIR2,EEIF
Escrito
STATUS,RP0
STATUS,RP1
EECON1,WREN
STATUS,RP0
STATUS,RP1
;Enable interrupts
;Bank 0
;Wait for signal write complete
;Bank 3
;Disable writes
;Bank 0
;<<<<<<-------------------- SECUENCIA START I2C ---------------------->>>>>>>
Start
FinStart
bcf
Bsf
bsf
bcf
btfss
Goto
return
PIR1,SSPIF
STATUS,RP0
SSPCON2,SEN
STATUS,RP0
PIR1,SSPIF
FinStart
;Borra señalizador operacion I2C
;Inicia secuencia de start
;Espera a que acabe la secuencia
;<<<<<<------------------- SECUENCIA RESTART I2C --------------------->>>>>>>
Restart
FinRestart
bcf
Bsf
bsf
bcf
btfss
Goto
return
PIR1,SSPIF
;Borra señalizador operacion I2C
STATUS,RP0
SSPCON2,RSEN
;Inicia secuencia de restart
STATUS,RP0
PIR1,SSPIF
;Espera a que acabe la secuencia
FinRestart
;<<<<<<--------------------- SECUENCIA STOP I2C ---------------------->>>>>>>
Stop
FinStop
Send
FinSend
bcf
Bsf
Bsf
Bcf
btfss
Goto
return
PIR1,SSPIF
;Borra señalizador operacion I2C
STATUS,RP0
SSPCON2,PEN
;Inicia secuencia de stop
STATUS,RP0
PIR1,SSPIF
;Espera a que acabe la secuencia
FinStop
bcf
Movwf
btfss
Goto
return
PIR1,SSPIF
SSPBUF
PIR1,SSPIF
FinSend
;Borra señalizador operacion I2C
;Envia dato
;Espera ACK
ANEXO 3: LISTADO DE PROGRAMAS Pag 6
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
;<<<<<<----------------- SECUENCIA LECTURA I2C CON ACK --------------->>>>>>>
Read
FinRead
FinNAck
bcf
Bsf
bsf
bcf
btfss
Goto
bcf
bsf
bsf
bsf
bcf
btfss
Goto
movf
return
PIR1,SSPIF
;Borra señalizador operacion I2C
STATUS,RP0
SSPCON2,RCEN
;Inicia secuencia de lectura
STATUS,RP0
PIR1,SSPIF
;Espera dato
FinRead
PIR1,SSPIF
;Borra señalizador operacion I2C
STATUS,RP0
SSPCON2,ACKDT
;Si ACK
SSPCON2,ACKEN
;Inicia secuencia de ACK
STATUS,RP0
PIR1,SSPIF
;Espera a que acabe la secuencia
FinNAck
SSPBUF,W
;Dato listo en W
;<<<<<<----------------- SECUENCIA LECTURA I2C SIN ACK --------------->>>>>>>
ReadAck
FinReadAck
FinAck
bcf
PIR1,SSPIF
;Borra señalizador operacion I2C
Bsf
STATUS,RP0
bsf
SSPCON2,RCEN
;Inicia secuencia de lectura
bcf
STATUS,RP0
btfss
PIR1,SSPIF
;Espera dato
Goto FinReadAck
bcf
PIR1,SSPIF
;Borra señalizador operacion I2C
bsf
STATUS,RP0
bcf
SSPCON2,ACKDT
;No ACK
bsf
SSPCON2,ACKEN
;Inicia secuencia de ACK
bcf
STATUS,RP0
btfss
PIR1,SSPIF
;Espera a que acabe la secuencia
Goto FinAck
movf SSPBUF,W
;Dato listo en W
return
;<<<<<<----------------- TEMPORIZA --------------->>>>>>>
Temporiza
Delay_20mS
Delay
bcf
movlw
call
movwf
incfsz
goto
return
bcf
btfss
goto
incfsz
goto
return
STATUS,RP0
;Selecciona banco 0
NTMR0
;Inicializa cuenta
Read_EE
t0
to,F
;Cuenta es 0?
Delay_20mS
INTCON,T0IF
INTCON,T0IF
Delay
t0,F
Delay_20mS
;Espera retardo
;tiempo cumplido ?
;cuenta acabada ?
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
Inicio
bcf
STATUS,RP1
ANEXO 3: LISTADO DE PROGRAMAS Pag 7
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
bsf
movlw
movwf
clrf
movlw
movwf
movlw
movwf
movlw
movwf
STATUS,RP0
b'00000100'
ADCON1
TRISB
b'10011000'
TRISC
b'00110111'
TRISA
b'11000110'
OPTION_REG
;Bank 1
;Configurar E/S ana,dig
Inii2c
movlw
movwf
movlw
movwf
bcf
movlw
movwf
b'10000000'
;Inicializa uso I2C
SSPSTAT
.9
;Velocidad I2C
SSPADD
STATUS,RP0
b'00101000'
SSPCON
; SSPEN, clock=Fosc/4(SPPADD+1)
Ini_USART
bsf
bsf
movlw
movwf
bcf
bcf
bsf
STATUS,RP0
TXSTA,BRGH
.25
SPBRG
TXSTA,SYNC
STATUS,RP0
RCSTA,SPEN
;Configurar E/S ports
;preescaler de 128 a TMR0
;Selecciona banco 1
;Velocidad Alta
;9600 bps
;Comunicacion asincrona
;Selecciona banco 0
;USART activada
;<<<<<<--------------------- SELECCION OPERACION --------------------->>>>>>>
M_P
btfss
goto
PORTA,2
M_P
;Control Pulsadores
Conf
btfss
goto
goto
PORTA,4
No_P
Ini_Recep
;Transmision/Adquisicion
movlw
call
movwf
btfss
goto
bcf
goto
bsf
INCH
Read_EE
AUX
AUX, 1
Addres2
Estado,Add2
TrAdq
Estado,Add2
;2 bytes de direcciones?
btfsc
Goto
PORTA,5
Ini_Lec_Tr
;Transmision/Adquisicion
No_P
Addres1
Addres2
TrAdq
;goto sobrante
;Si incremento alto es 2?
;si,1 byte direccion
;no,2 bytes direcciones
;<<<<<<---------------------- INICIO ADQUISICION --------------------->>>>>>>
;<<<<<<--------------------- INICIALIZACIONES ADQ -------------------->>>>>>>
Ad_1
bsf
PORTC,1
;Led Adquisicion
AD_Add
btfss
Estado,Add2
;2 bytes direccion ?
ANEXO 3: LISTADO DE PROGRAMAS Pag 8
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
goto
movlw
movwf
clrf
goto
movlw
movwf
DirhDevsel
DEVSEL_W
DEVSEL
DIRH
Ini_AD
DEVSEL_W
DIRH
Ini_AD
bcf
bcf
bcf
bsf
bcf
movlw
movwf
movlw
call
movwf
Estado,Bmes ;Medida 0
Estado,Ad_ok ;No adquisiciones producidas
Estado,T0_ok ;No hacer caso del flag TMR0
Estado,T1_ok ;Hacer caso del flag TMR1
ADCON0,CHS0;Canal 0
DIRPAG
;Direccionamiento indirecto para cola que se pasara
FSR
;a la EEPROM
MaxRamPag ;Contador de bytes en la cola
Read_EE
Index
ADon
movlw
movwf
movlw
call
movwf
movlw
call
movwf
clrf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
bsf
movlw
movwf
movlw
movwf
bcf
b'01000001'
ADCON0
NTMR1
Read_EE
t1
NTMR0
Read_EE
t0
TMR1L
TAH
TMR1H
TAL
TMR1L
TT
TMR0
b'00110001'
T1CON
STATUS,RP0
b'01000001'
PIE1
b'11000000'
INTCON
STATUS,RP0
SoloDevsel
DirhDevsel
Ini_TMR
Ini_I_A
;Bits direccion I2C
;direccion alta=0
;Bits direccion I2C y bits direccion alta
;de la memoria EEPROM
;Fad=Fosc/8, ADON
;Inicializa contador TMR1
;Inicializa contador TMR1
;Aseguramos que TMR1H tiene el valor deseado
;Contar 0,5 s TMR1
;Contar 20 ms TMR0
;TMR1 ON preescale 1:8
;Selecciona banco 1
;ADIE TMR1IE
;Hablita int globales(GIE) y periferica(PIE)
;Selecciona banco 0
;<<<<<<---------------------------- BUCLES --------------------------->>>>>>>
Ini_BAD
BdirH
BdirL
movlw Ini_NDIRH
call
Read_EE
movwf NDIRH
;Inicializamos las variables
movlw
call
movwf
clrf
Ini_NDIRL
Read_EE
NDIRL
DIRL
;La incializacion byte contador direccion bajo
;Termopar->Medida 0 o 1?
btfss
Estado,Ad_ok ;Interrupcion acontecida?
;Contador de incrementos del byte direccion alto
;byte de direccion baja
ANEXO 3: LISTADO DE PROGRAMAS Pag 9
PROYECTO
DATA
Goto
bcf
LOGGER
PARA
TERMOPAR
BdirL
Estado,Ad_ok ;Prepara la proxima espera
;<<<<<<----------------- RECONOCIMIENTO CANAL,MEDIDA ----------------->>>>>>>
LM35_Termo
btfsc
goto
btfsc
goto
ADCON0,CHS0;LM35 o termopar?
Termopar
Estado,Bmes ;LM35-> Medida 0 o 1?
LM35_2
LM35_1
bsf
bsf
movf
bcf
movwf
goto
ADCON0,CHS0;Proximo canal 1 para completar medicion Tª
STATUS,RP0 ;Guarda byte bajo de la conversion
ADRESL,W
;para unirlos en un solo byte
STATUS,RP0
LM351L
Cola
LM35_2
bsf
bsf
movf
bcf
movwf
goto
ADCON0,CHS0;Proximo canal 1 para completar medidicion Tª
STATUS,RP0 ;Guarda byte bajo de la conversion
ADRESL,W
;para unirlos en un solo byte
STATUS,RP0
LM352L
Cola
Termopar
btfsc
goto
Estado,Bmes
Termopar2
Termopar1
bcf
bsf
bsf
movf
bcf
movwf
goto
ADCON0,CHS0;Proximo canal 0
Estado,Bmes ;Proxima medida 1, las 2 medidas de la medicion OK
STATUS,RP0 ;Guarda byte bajo de la conversion
ADRESL,W
;para unirlos en un solo byte
STATUS,RP0
TERMO1L
Cola
Termopar2
bcf
bcf
bsf
movf
bcf
movwf
ADCON0,CHS0;Proximo canal 0
Estado,Bmes ;Proxima medida 0, las 2 medidas de la medicion OK
STATUS,RP0 ;Guarda byte bajo de la conversion
ADRESL,W
;para unirlos en un solo byte
STATUS,RP0
TERMO2L
LM35_12
;<<<<<<---------------------- UNION BITS BAJOS ---------------------->>>>>>>
L_Byte
bcf
rrf
rrf
rrf
rrf
rrf
rrf
andlw
movwf
rrf
rrf
STATUS,C
TERMO2L,F
TERMO2L,F
TERMO2L,F
TERMO2L,F
TERMO2L,F
TERMO2L,W
0x03
TERMO2L
LM352L,F
LM352L,F
;No carry
;Une los 2 bits bajos de la conversion en un byte
;En el extremo derecha va el termopar medida 2
;por eso se rota el byte 6 veces a dcha
;Elimina bits basura
;bits colocados
;Coloca el LM35 medida 2
;por tanto 4 rotaciones
ANEXO 3: LISTADO DE PROGRAMAS Pag 10
PROYECTO
DATA
rrf
rrf
andlw
addwf
rrf
rrf
andlw
addwf
movf
andlw
addwf
LM352L,F
LM352L,W
0x0C
TERMO2L,F
TERMO1L,F
TERMO1L,W
0x30
TERMO2L,F
LM351L,W
0xC0
TERMO2L,F
LOGGER
PARA
TERMOPAR
;Elimina bits basura
;se suma, colocandose junto con las anteriores
;coloca el termopar medida 1
;2 rotaciones
;Elimina bits basura
;suma con las anteriores bits rotados
;En el extremo izda el LM35 medida 1, no rota
;Elimina bits basura
;se suman y la union se completa
;<<<<<<-------------------------- A LA COLA -------------------------->>>>>>>
L_Cola
movf
movwf
incf
incf
TERMO2L,W
INDF
FSR,F
Index,F
;El byte se pasa a la cola
Cola
movf
movwf
incf
incfsz
goto
ADRESH,W
INDF
FSR,F
Index,F
Lleno
;Los bytes altos resultantes de la conversion
;se llevan a la cola
;La cola esta llena?
;<<<<<<-------------------------- COLA=MAX --------------------------->>>>>>>
W_E2PROM
movlw
movwf
movlw
call
movwf
call
btfss
goto
movf
call
W_Addres
movf
Call
movf
call
J_BW_E2PROM
call
incf
incfsz
goto
call
DIRPAG
;Los datos pasan a la memoria EEPROM
FSR
;respetando el orden en la cola
MaxPagW
Read_EE
Index
Start
;Se escribe en modo pagina
Estado,Add2 ;2 bytes direccion ?
W_Addres
DEVSEL,W
;Selector dispositivo
Send
DIRH,W
;DEVSEL o direccion alta
Send
DIRL,W
;Direccion baja
Send
movf INDF,W
;bytes de datos
Send
FSR,F
Index,F
;hasta completar la pagina de escritura
J_BW_E2PROM
Stop
Last_No_Pasa movf
movwf
movlw
movwf
incf
movlw
call
INDF,W
DIRPAG
DIRPAG
FSR
FSR,F
MaxPagW
Read_EE
;El ultimo no ha podido entrar el la EEPROM
;Sera el primero de la nueva cola
;la cola vuelve a empezar
ANEXO 3: LISTADO DE PROGRAMAS Pag 11
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
movwf Index
goto
FinB
Lleno
incfsz
goto
Index,W
BdirL
;pueden entrar los de la cola?
;no, que siga llenandose
;<<<<<<-------------------------- COLA=PAG --------------------------->>>>>>>
Vacia
movlw
movwf
movlw
call
movwf
call
btfss
goto
movf
call
V_Addres
movf
Call
movf
call
BW_E2PROM movf
call
incf
incfsz
goto
call
DIRPAG
;Si,los datos pasan a la memoria EEPROM
FSR
;Se repite el trozo de escritura en la E2PROM
MaxPagW
Read_EE
Index
Start
Estado,Add2
V_Addres
DEVSEL,W
Send
DIRH,W
Send
DIRL,W
Send
INDF,W
Send
FSR,F
Index,F
BW_E2PROM
Stop
New_Cola
DIRPAG
FSR
MaxRamPag
Read_EE
Index
FinB
movlw
movwf
movlw
call
movwf
goto
;la cola vuelve a iniciarse de momento vacia
;<<<<<<-------------------- FIN BUCLES,RESTAURAR --------------------->>>>>>>
FinB
movlw
call
addwf
incfsz
goto
movlw
call
addwf
INCL
Read_EE
DIRL,F
NDIRL,F
BdirL
INCH
Read_EE
DIRH,F
;Se incrementa la pagina de escritura
Incremento
incfsz
Goto
NDIRH,F
BdirH
;Se ha completado la memoria
Rest_Adq
bsf
clrf
bcf
bcf
bcf
STATUS,RP0
;Selecciona banco 1
INTCON
;Borra GIE,PIE,T0IE
PIE1,TMR1IE ;Desactiva la interrupcion TIMER 1
PIE1,ADIE
;Desactiva la interrupcion A/D
STATUS,RP0
;Selecciona banco 0
;se ha sobrepasado el tope de direcciones por byte bajo?
;Se incrementa la direccion alta
ANEXO 3: LISTADO DE PROGRAMAS Pag 12
PROYECTO
DATA
bcf
bcf
bcf
goto
LOGGER
PARA
TERMOPAR
T1CON,TMR1ON
;Desactiva el TIMER 1
ADCON0,ADON
;Desactiva el A/D
PORTC,1
;Fin Adquisicion
M_P
;Vuelve a la espera de un proximo comando
;<<<<<<------------------------ FIN ADQUISICION ---------------------->>>>>>>
;<<<<<<----------------------- INCIO TRANSMISION --------------------->>>>>>>
;<<<<<<--------------------- INICIALIZACIONES TRM -------------------->>>>>>>
Ini_Lec_Tr
T_Adquirir
TRX_EN
I_T_C
LT_Add
LT_Dev
LT_DD
bsf
movlw
movwf
bsf
Bsf
Bcf
PORTC,2
;Led Transmision
TT
TMR0
STATUS,RP0
;Selecciona banco 1
TXSTA,TXEN ;Activa la transmision
STATUS,RP0
;Selecciona banco 0
movlw
call
movwf
btfss
goto
movlw
movwf
clrf
goto
movlw
movwf
Ini_NDIRH
Read_EE
NDIRH
Estado,Add2
LT_DD
DEVSEL_W
DEVSEL
DIRH
BdirH_R
DEVSEL_W
DIRH
;Inicializa las variables
;Contador de incrementos del byte direccion alto
;2 bytes direccion ?
;Bits direccion I2C
;direccion alta=0
;Bits direccion I2C y bits direccion alta
;de la memoria EEPROM
;<<<<<<---------------------------- BUCLES --------------------------->>>>>>>
BdirH_R
clrf
movlw
call
movwf
DIRL
Ini_NDIRLR
Read_EE
NDIRL
;direccion baja
;Contador de incrementos del byte direccion bajo
;para una lectura de E2PROM
BdirL_R
movlw
movwf
movlw
movwf
bcf
DIRPAG
FSR
MaxReadA
Index
DIRH,W_R
;Lectura secuencial de datos
;los datos se guardan en una cola para enviarlos
;Primero se realiza una falsa escritura
;<<<<<<---------------------------- EE->RAM -------------------------->>>>>>>
R_E2PROM
R_Addres
Seq_R
call
btfss
goto
movf
call
movf
Call
movf
call
Start
Estado,Add2
R_Addres
DEVSEL,W
Send
DIRH,W
Send
DIRL,W
Send
;Para indicar la direccion a leer
;2 bytes direccion ?
call
btfss
Restart
Estado,Add2
;Se relizan las lecturas secuencialmente
;donde el incremento de direccion es automatico
;Selector dispositivo
;DEVSEL o direccion alta
ANEXO 3: LISTADO DE PROGRAMAS Pag 13
PROYECTO
R_DEVSEL
R_DIRH
BR_E2PROM
Banco1
Banco2
B2R
Fin_R
DATA
LOGGER
PARA
TERMOPAR
goto
bsf
movf
call
goto
bsf
movf
call
R_DIRH
;2 bytes direccion ?
DEVSEL,W_R ;lectura en el Selector dispositivo
DEVSEL,W
Send
BR_E2PROM
DIRH,W_R
;lectura en la direccion alta
DIRH,W
Send
call
movwf
incf
btfsc
goto
incfsz
goto
goto
ReadAck
INDF
FSR,F
FSR,7
Banco2
Index,F
BR_E2PROM
Fin_R
;Se leen los datos y se envia el ACK
;Se guardan en la cola
incf
movlw
movwf
call
movwf
incf
incfsz
goto
Index,F
INIBANK2
FSR
ReadAck
INDF
FSR,F
Index,F
B2R
;no nos olvidamos que la cola ha avanzado
;se empiezan a colocar los datos en el banco 2
call
Read
movwf INDF
call
Stop
;La cola ha llenado el banco 1?
;avanza la cola,esta a punto de llenarse?
;Se leen los datos y se envia el ACK
;se siguen guardadon los datos ahora en el banco 2
;sigue avanzando,esta a punto de llenarse?
;se llena, y se finaliza la lectura
;<<<<<<---------------------------- RAM->RS -------------------------->>>>>>>
Transmision
Trmt128
W_Tras
Banco1T
Banco2T
B2T
movlw
movwf
movlw
movwf
bcf
movf
movwf
btfss
Goto
call
incf
btfsc
goto
incfsz
goto
goto
DIRPAG
FSR
MaxRead
Index
PIR1,TXIF
INDF,W
TXREG
PIR1,TXIF
W_Tras
Temporiza
FSR,F
FSR,7
Banco2T
Index,F
Trmt128
FinBR
;Se transmiten los datos de la cola
incf
movlw
movwf
movf
movwf
Index,F
INIBANK2
FSR
INDF,W
TXREG
;no nos olvidamos que la cola se ha reducido
;empiezan a salir los datos en el banco 2
;Se borra el señalizador de escritura para empezar
;se transmite el dato
;Encuesta para el final de la transmision
;Evita fallos transmisión esperando un tiempo
;se ha llegado al banco 1?
;Reduce la cola
;se transmite el dato
ANEXO 3: LISTADO DE PROGRAMAS Pag 14
PROYECTO
W_Tras2
DATA
call
btfss
Goto
incf
incfsz
goto
Temporiza
PIR1,TXIF
W_Tras2
FSR,F
Index,F
B2T
LOGGER
PARA
TERMOPAR
;Evita fallos transmisión
;se ha vaciado la cola?
;<<<<<<-------------------- FIN BUCLES,RESTAURAR --------------------->>>>>>>
FinBR
Fin
movlw
addwf
incfsz
goto
movlw
call
addwf
incfsz
Goto
MaxReadInc
DIRL,F
NDIRL,F
BdirL_R
INCH
Read_EE
DIRH,F
NDIRH,F
BdirH_R
;se icrementa la direccion baja
bsf
Bcf
bcf
bcf
goto
STATUS,RP0
;Selecciona banco 1
TXSTA,TXEN ;Desactiva la transmision
STATUS,RP0
;Selecciona banco 0
PORTC,2
;Finaliza la trasmisision
M_P
;Vuelve a la espera de un proximo comando
;se ha desbordado?
;Se incrementa la direccion alta
;se ha trasmitido todo?
;<<<<<<------------------------ FIN TRANSMISION ---------------------->>>>>>>
;<<<<<<-------------------------- RECEPCION -------------------------->>>>>>>
Ini_Recep
bsf
clrf
bsf
bsf
movlw
movwf
bsf
bcf
Programacion movf
sublw
btfss
goto
No_Recep
bcf
Bsf
clrf
bcf
bcf
bcf
goto
Final
goto
End
PORTC,0
;Led Configuracion
DATA_EE_ADDR
;Direccion EE=0
RCSTA,CREN ;Recepción contínua
STATUS,RP0
;Selecciona banco 1
b'11000000'
;Hablita int globales(GIE) y periferica(PIE)
INTCON
PIE1,RCIE
;Activa la interrupcion RX
STATUS,RP0 ;Selecciona banco 0
DATA_EE_ADDR,W
;Espera hasta que se reciban las
0x09
;10 direcciones
STATUS,Z
Programacion
RCSTA,CREN ;Fin recepcion
STATUS,RP0
;Selecciona banco 1
INTCON
;Desactiva las interrupciones
PIE1,RCIE
;Desactiva la interrupcion RX
STATUS,RP0 ;Selecciona banco 0
PORTC,0
;Fin Configuracion
M_P
Final
;No se ejecuta
;Fin del programa fuente
ANEXO 3: LISTADO DE PROGRAMAS Pag 15
PROYECTO
2
DATA
LOGGER
PARA
Programa C
/*
/* Name
: Programa Data Logger para termopar
/* Written By : Pablo Parrado
/* Date
: 27/05/03
/*
*/
*/
*/
*/
*/
//Definiciones
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#define INTVECT_Time 0x08 /* Timer 0 IRQ */
#define TIMER0 0x40 /* Adress Timer 0*/
#define control8254 TIMER0+3 /*Control Timer 0*/
#define max_coef 15 /*Maximo coefientes polinomicos para calculo termopar*/
typedef unsigned char uchar;
typedef struct data_EE //Se agrupan los bytes a enviar al data logger
{
unsigned char Ini_NDIRH,Ini_NDIRL,Ini_NDIRLR;
unsigned char MaxPagW,MaxRamPag,INCL,INCH,NTMR1,NTMR0;
} mem_EE;
typedef struct param_int //Se agrupan los parametros internos de compensacion
{
float Vcc,Voff,gao,gai;
} conf_in;
//Constantes
const float escala=0.5;//Escala TMR1 del data logger
const int max_times=5; //Veces que se repite la IRQ 0 para dar alarma
//Variables Globales
int PORT1;
int INTVECT;
int bufferin = 0;
int bufferout = 0;
uchar buffer[1025];
int temperatura=-1;
int times=0;
int envio=0;
//Registro de direccion de la UART
//Registro de direccion del PIC(8259)
//Principio de la cola
//Final de la cola
//Cola donde se guardan los bytes recibidos
//Identifica la secuencia de datos
//Controla el retardo para dar alarma
//Alarma producida realizar envio
//Funciones
void interrupt (*oldport1isr)(); /*Punteros a ISR*/
void interrupt (*oldtimer0isr)();
void interrupt PORT1INT() /* Interrupt Service Routine (ISR) for PORT1 */
{
int c;
do { c = inportb(PORT1 + 5); //Si hay nuevo caracter
ANEXO 3: LISTADO DE PROGRAMAS Pag 16
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
if (c & 1) {
buffer[bufferin] = inportb(PORT1); //A la cola cirular
temperatura++; //Identifica la secuencia de datos
bufferin++;
if (temperatura==5) {temperatura = 0;}
if (bufferin == 1024) {bufferin = 0;}}
}while (c & 1);
outportb(0x20,0x20);
}
void interrupt TIMERINT() /* Interrupt Service Routine (ISR) for TIMER 0 */
{
times++;
//Incrementa el contador
if (times==max_times) //Si se llega al valor prefijado
{
envio=1;
//Realizar un envio
times=0;
//Reinicializar el contador
}
outportb(0x20,0x20);
}
int ini_usart(int com) /*Inicializa los registros internos de la USART
permitiendo su uso, e interrupcion*/
{
uchar PIC;
int err=1;
switch (com) //Direcciones de registros segun puerto serie usado
{
case 1:
PORT1=0x3F8;
INTVECT=0x0C;
PIC=0xEF;
break;
case 2:
PORT1=0x2F8;
INTVECT=0x0B;
PIC=0xF7;
break;
case 3:
PORT1=0x3E8;
INTVECT=0x0C;
PIC=0xEF;
break;
case 4:
PORT1=0x2E8;
INTVECT=0x0B;
PIC=0xF7;
break;
default:
err=0;
}
if (err)
{
ANEXO 3: LISTADO DE PROGRAMAS Pag 17
TERMOPAR
PROYECTO
DATA
outportb(PORT1 + 1 , 0);
LOGGER
PARA
/* Turn off interrupts - Port1 */
oldport1isr = getvect(INTVECT); /* Save old Interrupt Vector of later
recovery */
setvect(INTVECT, PORT1INT);
/*
PORT 1 - Communication Settings
*/
outportb(PORT1 + 3 , 0x80); /* SET DLAB ON */
outportb(PORT1 + 0 , 0x0C); /* Set Baud rate - Divisor Latch Low Byte */
/* Default 0x03 = 38,400 BPS */
/*
0x01 = 115,200 BPS */
/*
0x02 = 57,600 BPS */
/*
0x06 = 19,200 BPS */
/*
0x0C = 9,600 BPS */
/*
0x18 = 4,800 BPS */
/*
0x30 = 2,400 BPS */
outportb(PORT1 + 1 , 0x00); /* Set Baud rate - Divisor Latch High Byte */
outportb(PORT1 + 3 , 0x03); /* 8 Bits, No Parity, 1 Stop Bit */
outportb(PORT1 + 2 , 0xC7); /* FIFO Control Register */
outportb(PORT1 + 4 , 0x08); /* OUT2 */
outportb(0x21,(inportb(0x21) & PIC)); /* Set Programmable Interrupt Controller */
outportb(PORT1 + 1 , 0x01); /* Interrupt when data received */
}
return(err);
}
void ini_timer(void) /*Inicializa los registros internos del TMR
permitiendo su uso, e interrupcion*/
{
oldtimer0isr = getvect(INTVECT_Time); /* Save old Interrupt Vector of later
recovery */
setvect(INTVECT_Time, TIMERINT);
outportb(control8254,0x34); /* Modo operacion en 8254*/
outportb(TIMER0,0x01); /* byte alto del timer 0*/
outportb(TIMER0,0xFF); /* byte bajo del timer 0*/
outportb(0x21,(inportb(0x21) & 0xFE)); /* Set Programmable Interrupt
Controller */
}
int fin_usart(int com) /*Fin uso de la USART*/
{
uchar PIC;
int err=1;
switch (com)
//Segun el puerto se dishibiran una u otra irq
{
case 1:
PIC=0x10;
break;
case 2:
PIC=0x08;
ANEXO 3: LISTADO DE PROGRAMAS Pag 18
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
break;
case 3:
PIC=0x10;
break;
case 4:
PIC=0x08;
break;
default:
err=0;
}
if (err)
{
outportb(PORT1 + 1 , 0);
/* Turn off interrupts - Port1 */
outportb(0x21,(inportb(0x21) | PIC));
setvect(INTVECT, oldport1isr); /* Restore old interrupt vector */
}
return(err);
}
void fin_timer(void) /*Fin uso del TMR*/
{
outportb(0x21,(inportb(0x21) | 0x01)); /* Turn off interrupts - TMR */
setvect(INTVECT_Time, oldtimer0isr); /* Restore old interrupt vector */
}
int ctermo(char termo,double num,double *c,int *n,int inv)
/*Devuelve los coeficientes del termopar usado */
{
int ok=1; //Devuelve 1 si el termopar es conocido
switch (termo)
{
case 'b':
if (!inv)
{
/************************************
* This section contains coefficients for type B thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
0.000 to 630.615
*
630.615 to 1820.000
************************************/
if ((num>=0.000)&&(num<=630.615)) // min<t<max
{
*n=6;
*(c+0)=0.000000000000E+00; //Valores de los coeficientes
*(c+1)=-0.246508183460E-03;
*(c+2)=0.590404211710E-05;
*(c+3)=-0.132579316360E-08;
ANEXO 3: LISTADO DE PROGRAMAS Pag 19
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+4)=0.156682919010E-11;
*(c+5)=-0.169445292400E-14;
*(c+6)=0.629903470940E-18;
}
else
if ((num>=630.615)&&(num<=1820.000)) // min<t<max
{
*n=8;
*(c+0)=-0.389381686210E+01;
*(c+1)=0.285717474700E-01;
*(c+2)=-0.848851047850E-04;
*(c+3)=0.157852801640E-06;
*(c+4)=-0.168353448640E-09;
*(c+5)=0.111097940130E-12;
*(c+6)=-0.445154310330E-16;
*(c+7)=0.989756408210E-20;
*(c+8)=-0.937913302890E-24;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type B thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
* 250. to 700.
0.291 to 2.431 -0.02 to 0.03
* 700. to 1800.
2.431 to 13.820 -0.01 to 0.02
********************************************************/
else
{
if ((num>=0.291)&&(num<=2.431)) // min<E<max
{
*n=8;
*(c+0)=9.8423321E+01;
*(c+1)=6.9971500E+02;
*(c+2)=-8.4765304E+02;
*(c+3)=1.0052644E+03;
*(c+4)=-8.3345952E+02;
*(c+5)= 4.5508542E+02;
*(c+6)=-1.5523037E+02;
*(c+7)=2.9886750E+01;
*(c+8)=-2.4742860E+00;
}
else
if ((num>=2.431)&&(num<=13.820)) // min<E<max
{
ANEXO 3: LISTADO DE PROGRAMAS Pag 20
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*n=8;
*(c+0)=2.1315071E+02;
*(c+1)=2.8510504E+02;
*(c+2)=-5.2742887E+01;
*(c+3)=9.9160804E+00;
*(c+4)=-1.2965303E+00;
*(c+5)=1.1195870E-01;
*(c+6)=-6.0625199E-03;
*(c+7)=1.8661696E-04;
*(c+8)=-2.4878585E-06;
}
else ok=0;
}
break;
case 'e':
if (!inv)
{
/************************************
* This section contains coefficients for type E thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 to 1000.000
************************************/
if ((num>=-270.000)&&(num<=0.000)) // min<t<max
{
*n=13;
*(c+0)=0.000000000000E+00;
*(c+1)=0.586655087080E-01;
*(c+2)=0.454109771240E-04;
*(c+3)=-0.779980486860E-06;
*(c+4)=-0.258001608430E-07;
*(c+5)=-0.594525830570E-09;
*(c+6)=-0.932140586670E-11;
*(c+7)=-0.102876055340E-12;
*(c+8)=-0.803701236210E-15;
*(c+9)=-0.439794973910E-17;
*(c+10)=-0.164147763550E-19;
*(c+11)=-0.396736195160E-22;
*(c+12)=-0.558273287210E-25;
*(c+13)=-0.346578420130E-28;
}
if ((num>=0.000)&&(num<=1000.000)) // min<t<max
{
*n=10;
*(c+0)=0.000000000000E+00;
*(c+1)=0.586655087100E-01;
*(c+2)=0.450322755820E-04;
*(c+3)=0.289084072120E-07;
*(c+4)=-0.330568966520E-09;
ANEXO 3: LISTADO DE PROGRAMAS Pag 21
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+5)=0.650244032700E-12;
*(c+6)=-0.191974955040E-15;
*(c+7)=-0.125366004970E-17;
*(c+8)=0.214892175690E-20;
*(c+9)=-0.143880417820E-23;
*(c+10)=0.359608994810E-27;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type E thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
*
Range
range
range
*
(°C)
(mV)
(° C)
* -200. to 0.
-8.825 to 0.000 -0.01 to 0.03
*
0. to 1000.
0.000 to 76.373 -0.02 to 0.02
********************************************************/
else
{
if ((num>=-8.825)&&(num<=0.000)) // min<E<max
{
*n=8;
*(c+0)=0.0000000E+00;
*(c+1)=1.6977288E+01;
*(c+2)=-4.3514970E-01;
*(c+3)=-1.5859697E-01;
*(c+4)=-9.2502871E-02;
*(c+5)=-2.6084314E-02;
*(c+6)=-4.1360199E-03;
*(c+7)=-3.4034030E-04;
*(c+8)=-1.1564890E-05;
*(c+9)=0.0000000E+00;
}
else
if ((num>=0.000)&&(num<=76.373)) // min<E<max
{
*n=9;
*(c+0)=0.0000000E+00;
*(c+1)=1.7057035E+01;
*(c+2)=-2.3301759E-01;
*(c+3)=6.5435585E-03;
*(c+4)=-7.3562749E-05;
*(c+5)=-1.7896001E-06;
*(c+6)=8.4036165E-08;
ANEXO 3: LISTADO DE PROGRAMAS Pag 22
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+7)=-1.3735879E-09;
*(c+8)=1.0629823E-11;
*(c+9)=-3.2447087E-14;
}
else ok=0;
}
break;
case 'j':
if (!inv)
{
/************************************
* This section contains coefficients for type J thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-210.000 to 760.000
*
760.000 to 1200.000
************************************/
if ((num>=-210.000)&&(num<=760.000)) // min<t<max
{
*n=8;
*(c+0)=0.000000000000E+00;
*(c+1)=0.503811878150E-01;
*(c+2)=0.304758369300E-04;
*(c+3)=-0.856810657200E-07;
*(c+4)=0.132281952950E-09;
*(c+5)=-0.170529583370E-12;
*(c+6)=0.209480906970E-15;
*(c+7)=-0.125383953360E-18;
*(c+8)=0.156317256970E-22;
}
else
if ((num>=760.000)&&(num<=1200.000)) // min<t<max
{
*n=5;
*(c+0)=0.296456256810E+03;
*(c+1)=-0.149761277860E+01;
*(c+2)=0.317871039240E-02;
*(c+3)=-0.318476867010E-05;
*(c+4)=0.157208190040E-08;
*(c+5)=-0.306913690560E-12;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type J thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
ANEXO 3: LISTADO DE PROGRAMAS Pag 23
TERMOPAR
PROYECTO
*
*
*
*
*
DATA
LOGGER
PARA
The coefficients are in units of °C and mV and are listed in
the order of constant term up to the highest order.
The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
+ d_n*E^n,
where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
* -210. to 0.
-8.095 to 0.000 -0.05 to 0.03
*
0. to 760.
0.000 to 42.919 -0.04 to 0.04
*
760. to 1200
42.919 to 69.553 -0.04 to 0.03
********************************************************/
else
{
if ((num>=-8.095)&&(num<=0.000)) // min<E<max
{
*n=8;
*(c+0)=0.0000000E+00;
*(c+1)=1.9528268E+01;
*(c+2)=-1.2286185E+00;
*(c+3)=-1.0752178E+00;
*(c+4)=-5.9086933E-01;
*(c+5)=-1.7256713E-01;
*(c+6)=-2.8131513E-02;
*(c+7)=-2.3963370E-03;
*(c+8)=-8.3823321E-05;
}
else
if ((num>=0.000)&&(num<=42.919)) // min<E<max
{
*n=7;
*(c+0)=0.000000E+00;
*(c+1)=1.978425E+01;
*(c+2)=-2.001204E-01;
*(c+3)=1.036969E-02;
*(c+4)=-2.549687E-04;
*(c+5)=3.585153E-06;
*(c+6)= -5.344285E-08;
*(c+7)=5.099890E-10;
*(c+8)=0.000000E+00;
}
else
if ((num>=42.919)&&(num<=69.553)) // min<E<max
{
*n=5;
*(c+0)=-3.11358187E+03;
*(c+1)=3.00543684E+02;
*(c+2)=-9.94773230E+00;
*(c+3)=1.70276630E-01;
*(c+4)=-1.43033468E-03;
*(c+5)=4.73886084E-06;
*(c+6)=0.00000000E+00;
*(c+7)=0.00000000E+00;
ANEXO 3: LISTADO DE PROGRAMAS Pag 24
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
}
else ok=0;
}
break;
case 'k':
if (!inv)
{
/************************************
* This section contains coefficients for type K thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation below 0 °C is of the form
* E = sum(i=0 to n) c_i t^i.
*
* The equation above 0 °C is of the form
* E = sum(i=0 to n) c_i t^i + a0 exp(a1 (t - a2)^2).
*
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 to 1372.000
************************************/
if ((num>=-270.000)&&(num<=0.000)) // min<t<max
{
*n=10;
*(c+0)=0.000000000000E+00;
*(c+1)=0.394501280250E-01;
*(c+2)=0.236223735980E-04;
*(c+3)=-0.328589067840E-06;
*(c+4)=-0.499048287770E-08;
*(c+5)=-0.675090591730E-10;
*(c+6)=-0.574103274280E-12;
*(c+7)=-0.310888728940E-14;
*(c+8)=-0.104516093650E-16;
*(c+9)=-0.198892668780E-19;
*(c+10)=-0.163226974860E-22;
}
else
if ((num>=0.000)&&(num<=1372.000)) // min<t<max
{
*n=9;
*(c+0)=-0.176004136860E-01;
*(c+1)= 0.389212049750E-01;
*(c+2)= 0.185587700320E-04;
*(c+3)=-0.994575928740E-07;
*(c+4)= 0.318409457190E-09;
*(c+5)=-0.560728448890E-12;
*(c+6)=0.560750590590E-15;
*(c+7)=-0.320207200030E-18;
*(c+8)=0.971511471520E-22;
*(c+9)=-0.121047212750E-25;
*(c+(*n)+1) = 0.118597600000E+00;
*(c+(*n)+2) = -0.118343200000E-03;
*(c+(*n)+3) = 0.126968600000E+03;
}
else ok=0;
ANEXO 3: LISTADO DE PROGRAMAS Pag 25
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type K thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
* -200. to 0.
-5.891 to 0.000 -0.02 to 0.04
*
0. to 500.
0.000 to 20.644 -0.05 to 0.04
*
500. to 1372. 20.644 to 54.886 -0.05 to 0.06
********************************************************/
else
if ((num>=-5.891)&&(num<=0.000)) // min<E<max
{
*n=8;
*(c+0)=0.0000000E+00;
*(c+1)=2.5173462E+01;
*(c+2)=-1.1662878E+00;
*(c+3)=-1.0833638E+00;
*(c+4)=-8.9773540E-01;
*(c+5)=-3.7342377E-01;
*(c+6)=-8.6632643E-02;
*(c+7)=-1.0450598E-02;
*(c+8)=-5.1920577E-04;
*(c+9)=0.0000000E+00;
}
else
if ((num>=0.000)&&(num<=20.644)) // min<E<max
{
*n=9;
*(c+0)=0.000000E+00;
*(c+1)=2.508355E+01;
*(c+2)=7.860106E-02;
*(c+3)=-2.503131E-01;
*(c+4)=8.315270E-02;
*(c+5)=-1.228034E-02;
*(c+6)=9.804036E-04;
*(c+7)=-4.413030E-05;
*(c+8)=1.057734E-06;
*(c+9)=-1.052755E-08;
}
else
if ((num>=20.644)&&(num<=54.886)) // min<E<max
{
*n=6;
*(c+0)=-1.318058E+02;
ANEXO 3: LISTADO DE PROGRAMAS Pag 26
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+1)=4.830222E+01;
*(c+2)=-1.646031E+00;
*(c+3)=5.464731E-02;
*(c+4)=-9.650715E-04;
*(c+5)=8.802193E-06;
*(c+6)=-3.110810E-08;
*(c+7)=0.000000E+00;
*(c+8)=0.000000E+00;
}
else ok=0;
break;
case 'n':
if (!inv)
{
/************************************
* This section contains coefficients for type N thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 to 1300.000
************************************/
if ((num>=-270.000)&&(num<=0.000)) // min<t<max
{
*n=8;
*(c+0)=0.000000000000E+00;
*(c+1)=0.261591059620E-01;
*(c+2)=0.109574842280E-04;
*(c+3)=-0.938411115540E-07;
*(c+4)=-0.464120397590E-10;
*(c+5)=-0.263033577160E-11;
*(c+6)=-0.226534380030E-13;
*(c+7)=-0.760893007910E-16;
*(c+8)=-0.934196678350E-19;
}
else
if ((num>=0.000)&&(num<=1300.000)) // min<t<max
{
*n=10;
*(c+0)=0.000000000000E+00;
*(c+1)=0.259293946010E-01;
*(c+2)=0.157101418800E-04;
*(c+3)=0.438256272370E-07;
*(c+4)=-0.252611697940E-09;
*(c+5)=0.643118193390E-12;
*(c+6)=-0.100634715190E-14;
*(c+7)=0.997453389920E-18;
*(c+8)=-0.608632456070E-21;
*(c+9)=0.208492293390E-24;
*(c+10)=-0.306821961510E-28;
}
ANEXO 3: LISTADO DE PROGRAMAS Pag 27
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type N thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
* -200. to 0.
-3.990 to 0.000 -0.02 to 0.03
*
0. to 600.
0.000 to 20.613 -0.02 to 0.03
*
600. to 1300. 20.613 to 47.513 -0.04 to 0.02
********************************************************/
else
if ((num>=-3.990)&&(num<=0.000)) // min<E<max
{
*n=9;
*(c+0)=0.0000000E+00;
*(c+1)=3.8436847E+01;
*(c+2)=1.1010485E+00;
*(c+3)=5.2229312E+00;
*(c+4)=7.2060525E+00;
*(c+5)=5.8488586E+00;
*(c+6)=2.7754916E+00;
*(c+7)=7.7075166E-01;
*(c+8)=1.1582665E-01;
*(c+9)=7.3138868E-03;
}
else
if ((num>=0.000)&&(num<=20.613)) // min<E<max
{
*n=7;
*(c+0)=0.00000E+00;
*(c+1)=3.86896E+01;
*(c+2)=-1.08267E+00;
*(c+3)=4.70205E-02;
*(c+4)=-2.12169E-06;
*(c+5)=-1.17272E-04;
*(c+6)=5.39280E-06;
*(c+7)=-7.98156E-08;
*(c+8)=0.00000E+00;
*(c+9)=0.00000E+00;
}
else
if ((num>=20.613)&&(num<=47.513)) // min<E<max
{
*n=5;
ANEXO 3: LISTADO DE PROGRAMAS Pag 28
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+0)=1.972485E+01;
*(c+1)=3.300943E+01;
*(c+2)=-3.915159E-01;
*(c+3)=9.855391E-03;
*(c+4)=-1.274371E-04;
*(c+5)=7.767022E-07;
*(c+6)=0.000000E+00;
}
else ok=0;
break;
case 'r':
if (!inv)
{
/************************************
* This section contains coefficients for type R thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-50.000 to 1064.180
*
1064.180 to 1664.500
*
1664.500 to 1768.100
************************************/
if ((num>=-50.000)&&(num<=1064.180)) // min<t<max
{
*n=9;
*(c+0)=0.000000000000E+00;
*(c+1)=0.528961729765E-02;
*(c+2)=0.139166589782E-04;
*(c+3)=-0.238855693017E-07;
*(c+4)=0.356916001063E-10;
*(c+5)=-0.462347666298E-13;
*(c+6)=0.500777441034E-16;
*(c+7)=-0.373105886191E-19;
*(c+8)=0.157716482367E-22;
*(c+9)=-0.281038625251E-26;
}
else
if ((num>=1064.180)&&(num<=1664.500)) // min<t<max
{
*n=5;
*(c+0)=0.295157925316E+01;
*(c+1)=-0.252061251332E-02;
*(c+2)=0.159564501865E-04;
*(c+3)=-0.764085947576E-08;
*(c+4)=0.205305291024E-11;
*(c+5)=-0.293359668173E-15;
}
else
if ((num>=1664.500)&&(num<=1768.100)) // min<t<max
{
*n=4;
ANEXO 3: LISTADO DE PROGRAMAS Pag 29
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+0)=0.152232118209E+03;
*(c+1)=-0.268819888545E+00;
*(c+2)=0.171280280471E-03;
*(c+3)=-0.345895706453E-07;
*(c+4)=-0.934633971046E-14;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type R thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
*
-50. to 250.
-0.226 to 1.923 -0.02 to 0.02
*
250. to 1200.
1.923 to 13.228 -0.005 to 0.005
*
1064. to 1664.5 11.361 to 19.739 -0.0005 to 0.001
* 1664.5 to 1768.1 19.739 to 21.103 -0.001 to 0.002
********************************************************/
else
if ((num>=-0.226)&&(num<=1.923)) // min<E<max
{
*n=10;
*(c+0)=0.0000000E+00;
*(c+1)=1.8891380E+02;
*(c+2)=-9.3835290E+01;
*(c+3)=1.3068619E+02;
*(c+4)=-2.2703580E+02;
*(c+5)=3.5145659E+02;
*(c+6)=-3.8953900E+02;
*(c+7)=2.8239471E+02;
*(c+8)=-1.2607281E+02;
*(c+9)=3.1353611E+01;
*(c+10)=-3.3187769E+00;
}
else
if ((num>=1.923)&&(num<=13.228)) // min<E<max
{
*n=9;
*(c+0)=1.334584505E+01;
*(c+1)=1.472644573E+02;
*(c+2)=-1.844024844E+01;
*(c+3)=4.031129726E+00;
*(c+4)=-6.249428360E-01;
*(c+5)=6.468412046E-02;
*(c+6)=-4.458750426E-03;
ANEXO 3: LISTADO DE PROGRAMAS Pag 30
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+7)=1.994710149E-04;
*(c+8)=-5.313401790E-06;
*(c+9)=6.481976217E-08;
*(c+10)=0.000000000E+00;
}
else
if ((num>=11.361)&&(num<=19.739)) // min<E<max
{
*n=5;
*(c+0)=-8.199599416E+01;
*(c+1)=1.553962042E+02;
*(c+2)=-8.342197663E+00;
*(c+3)=4.279433549E-01;
*(c+4)=-1.191577910E-02;
*(c+5)=1.492290091E-04;
*(c+6)=0.000000000E+00;
}
else
if ((num>=19.739)&&(num<=21.103)) // min<E<max
{
*n=4;
*(c+0)=3.406177836E+04;
*(c+1)=-7.023729171E+03;
*(c+2)=5.582903813E+02;
*(c+3)=-1.952394635E+01;
*(c+4)=2.560740231E-01;
*(c+5)=0.000000000E+00;
}
else ok=0;
break;
case 's':
if (!inv)
{
/************************************
* This section contains coefficients for type S thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-50.000 to 1064.180
*
1064.180 to 1664.500
*
1664.500 to 1768.100
************************************/
if ((num>=-50.000)&&(num<=1064.180)) // min<t<max
{
*n=8;
*(c+0)=0.000000000000E+00;
*(c+1)=0.540313308631E-02;
*(c+2)=0.125934289740E-04;
*(c+3)=-0.232477968689E-07;
*(c+4)=0.322028823036E-10;
*(c+5)=-0.331465196389E-13;
ANEXO 3: LISTADO DE PROGRAMAS Pag 31
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+6)=0.255744251786E-16;
*(c+7)=-0.125068871393E-19;
*(c+8)=0.271443176145E-23;
}
else
if ((num>=1064.180)&&(num<=1664.500)) // min<t<max
{
*n=4;
*(c+0)=0.132900444085E+01;
*(c+1)=0.334509311344E-02;
*(c+2)=0.654805192818E-05;
*(c+3)=-0.164856259209E-08;
*(c+4)=0.129989605174E-13;
}
else
if ((num>=1664.500)&&(num<=1768.1)) // min<t<max
{
*n=4;
*(c+0)=0.146628232636E+03;
*(c+1)=-0.258430516752E+00;
*(c+2)=0.163693574641E-03;
*(c+3)=-0.330439046987E-07;
*(c+4)=-0.943223690612E-14;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type S thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
*
*
*
*
the approximate inverse function for each subrange is also given.
The coefficients are in units of °C and mV and are listed in
the order of constant term up to the highest order.
The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
*
-50. to 250.
-0.235 to 1.874
-0.02 to 0.02
*
250. to 1200.
1.874 to 11.950 -0.01 to 0.01
*
1064. to 1664.5 10.332 to 17.536 -0.0002 to 0.0002
* 1664.5 to 1768.1 17.536 to 18.693 -0.002 to 0.002
********************************************************/
else
if ((num>=-0.235)&&(num<=1.874)) // min<E<max
{
*n=9;
*(c+0)=0.00000000E+00;
*(c+1)=1.84949460E+02;
*(c+2)=-8.00504062E+01;
ANEXO 3: LISTADO DE PROGRAMAS Pag 32
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
*(c+3)=1.02237430E+02;
*(c+4)=-1.52248592E+02;
*(c+5)=1.88821343E+02;
*(c+6)=-1.59085941E+02;
*(c+7)=8.23027880E+01;
*(c+8)=-2.34181944E+01;
*(c+9)=2.79786260E+00;
}
else
if ((num>=1.874)&&(num<=11.950)) // min<E<max
{
*n=9;
*(c+0)=1.291507177E+01;
*(c+1)=1.466298863E+02;
*(c+2)=-1.534713402E+01;
*(c+3)=3.145945973E+00;
*(c+4)=-4.163257839E-01;
*(c+5)=3.187963771E-02;
*(c+6)=-1.291637500E-03;
*(c+7)=2.183475087E-05;
*(c+8)=-1.447379511E-07;
*(c+9)=8.211272125E-09;
}
else
if ((num>=10.332)&&(num<=17.536)) // min<E<max
{
*n=5;
*(c+0)=-8.087801117E+01;
*(c+1)=1.621573104E+02;
*(c+2)=-8.536869453E+00;
*(c+3)=4.719686976E-01;
*(c+4)=-1.441693666E-02;
*(c+5)=2.081618890E-04;
*(c+6)=0.000000000E+00;
}
else
if ((num>=17.536)&&(num<=18.693)) // min<E<max
{
*n=4;
*(c+0)=5.333875126E+04;
*(c+1)=-1.235892298E+04;
*(c+2)=1.092657613E+03;
*(c+3)=-4.265693686E+01;
*(c+4)=6.247205420E-01;
*(c+5)=0.000000000E+00;
}
else ok=0;
break;
case 't':
if (!inv)
{
/************************************
* This section contains coefficients for type T thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
ANEXO 3: LISTADO DE PROGRAMAS Pag 33
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 °C to 400.000
************************************/
if ((num>=-270.000)&&(num<=0.000)) // min<t<max
{
*n=14;
*(c+0)=0.000000000000E+00;
*(c+1)=0.387481063640E-01;
*(c+2)=0.441944343470E-04;
*(c+3)=0.118443231050E-06;
*(c+4)=0.200329735540E-07;
*(c+5)=0.901380195590E-09;
*(c+6)=0.226511565930E-10;
*(c+7)=0.360711542050E-12;
*(c+8)=0.384939398830E-14;
*(c+9)=0.282135219250E-16;
*(c+10)=0.142515947790E-18;
*(c+11)=0.487686622860E-21;
*(c+12)=0.107955392700E-23;
*(c+13)=0.139450270620E-26;
*(c+14)=0.797951539270E-30;
}
else
if ((num>=0.000)&&(num<=400.000)) // min<t<max
{
*n=8;
*(c+0)=0.000000000000E+00;
*(c+1)=0.387481063640E-01;
*(c+2)=0.332922278800E-04;
*(c+3)=0.206182434040E-06;
*(c+4)=-0.218822568460E-08;
*(c+5)= 0.109968809280E-10;
*(c+6)=-0.308157587720E-13;
*(c+7)=0.454791352900E-16;
*(c+8)=-0.275129016730E-19;
}
else ok=0;
}
/************************************
* This section contains coefficients of approximate inverse
* functions for type T thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
* Temperature
Voltage
Error
*
range
range
range
ANEXO 3: LISTADO DE PROGRAMAS Pag 34
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
*
(°C)
(mV)
(° C)
* -200. to 0.
-5.603 to 0.000 -0.02 to 0.04
*
.0 to 400.
0.000 to 20.872 -0.03 to 0.03
********************************************************/
else
if ((num>=-5.603)&&(num<=0.000)) // min<E<max
{
*n=7;
*(c+0)=0.0000000E+00;
*(c+1)=2.5949192E+01;
*(c+2)=-2.1316967E-01;
*(c+3)=7.9018692E-01;
*(c+4)=4.2527777E-01;
*(c+5)=1.3304473E-01;
*(c+6)=2.0241446E-02;
*(c+7)=1.2668171E-03;
}
else
if ((num>=0.000)&&(num<=20.872)) // min<E<max
{
*n=6;
*(c+0)=0.000000E+00;
*(c+1)=2.592800E+01;
*(c+2)=-7.602961E-01;
*(c+3)=4.637791E-02;
*(c+4)=-2.165394E-03;
*(c+5)=6.048144E-05;
*(c+6)=-7.293422E-07;
*(c+7)=0.000000E+00;
}
else ok=0;
break;
default:
ok=0; //Termopar no conocido
}
return(ok);
}
double SUMCOEF(double *tab, float valor,int imax)
{ /*Metodo rapido para el calculo de potencias*/
int i;
double suma=0.0;
for (i=imax;i>=0;i--)
{
suma=suma*valor+*(tab+i); //(1.5)
}
return (suma);
}
double EmV(float T,char termo) /*Devuelve la tension que produciria el termopar a la
temperatura dada*/
{
double E;
double pol[max_coef];
int n;
ANEXO 3: LISTADO DE PROGRAMAS Pag 35
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
if (ctermo(termo,T,pol,&n,0)) //Si polinomios encontrados
{
if (termo=='k') //Termopar K
{
if (T<0)
{
E=SUMCOEF(pol,T,n); //(1.3)
}
else
//T>0
{
//(1.4)
E=SUMCOEF(pol,T,n);
E=E+(pol[n+1])*exp((pol[n+2])*(T-pol[n+3])*(T-pol[n+3]));
}
}
else //Otro termopar
E=SUMCOEF(pol,T,n); //(1.3)
}
else E=-1.0; //Devuelve -1 como error
return(E);
}
double T90(float E,char termo) /*Devuelve la temperatura del termopar con la que se
produce la tension dada*/
{
double T;
double pol[max_coef];
int n;
if(ctermo(termo,E,pol,&n,1))
{
T=SUMCOEF(pol,E,n); //Suma potencia (1.3)
}
else T=-1.0; //Rango no encontrado error
return(T);
}
int c_fria(uchar L1,uchar T1,uchar L2,uchar L,uchar T2,double *t1,double *t2,double *trm1,double
*trm2,double *V1,double *V2,conf_in *p,char ter)
{ //Compensacion
unsigned int ref1,ref2,term1,term2; //Reagrupamiento
unsigned int ref11,ref22,term11,term22; //Reagrupamiento
double mV1,mV2; //Tension de compensacion de la Ta ambiente
int pos_err; //Error
//Reagrupa bits altos y bajos
ref1=ref11=ref2=ref22=term1=term11=term2=term22=0;
ref1=(L1<<2);
ref11=((L&0xC0)>>6);
ref1=ref1|ref11;
term1=(T1<<2);
term11=((L&0x30)>>4);
term1=term1|term11;
ANEXO 3: LISTADO DE PROGRAMAS Pag 36
PROYECTO
DATA
LOGGER
PARA
ref2=(L2<<2);
ref22=((L&0x0C)>>2);
ref2=ref2|ref22;
term2=(T2<<2);
term22=(L&0x03);
term2=term2|term22;
//Compensacion de valores de la primera medida
*t1=(p->Vcc) * (ref1/1.023E3) / (p->gao); //Tref
*V1=((p->Vcc) * 1000 * (term1/1.023E3) - (p->Voff)) / (p->gai); /*E en mV*/
mV1=EmV(*t1,ter);
*trm1= T90(*V1+mV1,ter); //Aplicacion formula compensacion
//Compensacion de valores de la segunda medida
*t2=(p->Vcc) * (ref2/1.023E3) / (p->gao); //Tref
*V2=((p->Vcc) * 1000 * (term2/1.023E3) - (p->Voff)) / (p->gai); /*E en mV*/
mV2=EmV(*t2,ter);
*trm2= T90(*V2+mV2,ter); //Aplicacion formula compensacion
pos_err=!((mV1==-1.0)||(mV2==-1.0)||(*trm1==-1.0)||(*trm2==-1.0));
printf("%E %E %E %E\n",*t1,*trm1,*t2,*trm2);
return(pos_err);
}
void adq(char op,int COM,conf_in *par) /*Gestiona bytes que llegan del serie,
guarda los datos gestionados en ficheros*/
{
FILE *fp,*fv,*ft,*fa; //ficheros de texto
double Ta1,Ta2; //Temperatura ambiente
double Ttc1,Ttc2; //Temperatura del termopar
double v1,v2; //Tension termopar
uchar LM351H,TERMO1H,LM352H,TERMO2H,Low,ch; //Secuencia de datos
int c;
printf("\nCompensaci¢n Data Logger. Pulsa ESC para salir\n");
/* Se abren los ficheros:
fp->FICHHEX-> Fichero donde se guardan los guardan los datos
transmitidos por el data logger
fv->FICHVAL-> Fichero donde se guardan la temperatura ambiente de la
adquisicion
fa->FICHVOL-> Fichero donde se guardan la tension producida por el
termopar durantre la adquisicion
ft->FICHTXT-> Fichero donde se guardan la temperatura del temopar
durante la adquisicion, ya compensada*/
fp=fopen("fichhex","wt");
fv=fopen("fichval","wt");
ft=fopen("fichtxt","wt");
fa=fopen("fichvol","wt");
ini_usart(COM); //Se recibe del termopar
do {
if (bufferin != bufferout)
//Si se ha recibido un caracter
{ch = buffer[bufferout]; //Avanza la cola
bufferout++;
if (bufferout == 1024) {bufferout = 0;}
/*Determina la posicion del byte enviado dentro de la secuencia
de datos y lo colocalo en fp*/
ANEXO 3: LISTADO DE PROGRAMAS Pag 37
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
if (temperatura==0) {LM351H=ch; //Medida ambiente 1
fprintf(fp,"%x ",LM351H);}
else
if (temperatura==1) {TERMO1H=ch; //Medida termopar 1
fprintf(fp,"%x ",TERMO1H);}
else
if (temperatura==2) {LM352H=ch; //Medida ambiente 2
fprintf(fp,"%x ",LM352H);}
else
if (temperatura==3) {Low=ch; //Agrupacion bytes bajos
fprintf(fp,"%x ",Low);}
else
{
TERMO2H=ch; //Medida termopar 2
fprintf(fp,"%x\n",TERMO2H);
c_fria(LM351H,TERMO1H,LM352H,Low,TERMO2H,&Ta1,&Ta2,&Ttc1,&Ttc2,&v1,&v2,par,op);
fprintf(fv,"%E\n%E\n",Ta1,Ta2); //Guarda resultados
fprintf(ft,"%E\n%E\n",Ttc1,Ttc2);
fprintf(fa,"%E\n%E\n",v1,v2);
}
}
if (kbhit()){c = getch();}
} while (c !=27); //Acaba cuando se pulse ESC
fin_usart(COM); //Fin Adquisicion
fclose(fp);
//Cierra ficheros
fclose(fv);
fclose(ft);
fclose(fa);
printf("\nFicheros Generados\n");
}
int adqf(char op,conf_in *par) /*Gestiona bytes del fichero,guarda las
temperaturas procesadas en ficheros*/
{
FILE *fp,*fv,*ft,*fa; //ficheros de texto
double Ta1,Ta2; //Temperatura ambiente
double Ttc1,Ttc2; //Temperatura del termopar
double v1,v2;
uchar LM351H,TERMO1H,LM352H,TERMO2H,Low,ch; //Secuencia de datos
unsigned int LM351Hx,TERMO1Hx,LM352Hx,TERMO2Hx,Lowx; //Secuencia auxiliar
int valor_ok; //Rutina correcta, fin lectura
printf("\nCompensación Fichero Data Logger\n");
fv=fopen("fichval","wt"); //Abrir ficheros idem rutina anterior
ft=fopen("fichtxt","wt");
fa=fopen("fichvol","wt");
fp=fopen("fichhex","rt"); //pero FICHEX sera ahora la fuente
valor_ok = !(fp==NULL); //Si existe fichero
if (valor_ok)
{
ANEXO 3: LISTADO DE PROGRAMAS Pag 38
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
do
{ //Coge una linea de 5 bytes
valor_ok=(fscanf
(fp,"%x%x%x%x%x",&LM351Hx,&TERMO1Hx,&LM352Hx,&Lowx,&TERMO2Hx)==5);
if (valor_ok) //Si se tienen suficientes datos
{
LM351H=LM351Hx;TERMO1H=TERMO1Hx;
LM352H=LM352Hx;TERMO2H=TERMO2Hx;Low=Lowx; //Compensa
c_fria(LM351H,TERMO1H,LM352H,Low,TERMO2H,&Ta1,&Ta2,&Ttc1,&Ttc2,&v1,&v2,par,
op);
fprintf(fv,"%E\n%E\n",Ta1,Ta2); //Guarda resultados
fprintf(ft,"%E\n%E\n",Ttc1,Ttc2);
fprintf(fa,"%E\n%E\n",v1,v2);
}
}
while (!feof(fp)); //Terminar cuando se llegue al final del fichero
valor_ok=1; //Se ha abierto el fichero
}
else printf ("\nFichero de Adquisición no encontrado\n");
fclose(fv); //Cerrar/
fclose(ft);
fclose(fa);
fclose(fp);
if (valor_ok) printf("\nFichero Generado\n");
return(valor_ok);
}
void trmt (mem_EE *data) //Transmite los datos al data logger
{
unsigned char TAB[9];
int i;
TAB[0]=data->Ini_NDIRH; //Se transmiten tal como se guardaran en la EEPROM
TAB[1]=data->Ini_NDIRL;
TAB[2]=data->Ini_NDIRLR;
TAB[3]=data->MaxPagW;
TAB[4]=data->MaxRamPag;
TAB[5]=data->INCL;
TAB[6]=data->INCH;
TAB[7]=data->NTMR1;
TAB[8]=data->NTMR0;
i=0;
printf("\nTransferiendo al Data Logger\n");
do{
if (envio==1) { outportb(PORT1,TAB[i]); //Si tiempo cumplido envia
printf("Enviado %d\n",i);
i++; //Espera al otro
envio=0;
}
}
while (i<9); //Hasta que se envien todos los datos
printf("\nTransferencia finalizada\n");
ANEXO 3: LISTADO DE PROGRAMAS Pag 39
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
}
int get_dataf (int COM) //Transmite al DL los datos de un fichero
{
unsigned int Ini_NDIRH,Ini_NDIRL,Ini_NDIRLR,MaxPagW,MaxRamPag; //Escaneo
unsigned int INCL,INCH,NTMR1,NTMR0; //del fichero
FILE *fp; //Fichero fuente
mem_EE *dato; //Posiciones memoria EEPROM del data logger
int valor_ok; //Funcionamiento correcto
printf("\nTransferencia configuración al Data Logger");
printf("\na partir del fichero de transmisión\n");
ini_usart(COM); /*Aunque no se utiliza la irq port serie se activa*/
ini_timer();
fp=fopen("fichtrm","rt");
valor_ok = !(fp==NULL); //Si existe sigue
if (valor_ok)
{
fscanf (fp,"%x",&Ini_NDIRH); //Lee del fichero
fscanf (fp,"%x",&Ini_NDIRL);
fscanf (fp,"%x",&Ini_NDIRLR);
fscanf (fp,"%x",&MaxPagW);
fscanf (fp,"%x",&MaxRamPag);
fscanf (fp,"%x",&INCL);
fscanf (fp,"%x",&INCH);
fscanf (fp,"%x",&NTMR1);
fscanf (fp,"%x",&NTMR0);
dato->Ini_NDIRH=Ini_NDIRH; //Guarda en el registro
dato->Ini_NDIRL=Ini_NDIRL;
dato->Ini_NDIRLR=Ini_NDIRLR;
dato->MaxPagW=MaxPagW;
dato->MaxRamPag=MaxRamPag;
dato->INCL=INCL;
dato->INCH=INCH;
dato->NTMR1=NTMR1;
dato->NTMR0=NTMR0;
trmt(dato);
}
else printf ("\nFichero de Transmisión configuración no encontrado\n");
fin_timer(); //Acaba transmision
fin_usart(COM);
fclose(fp);
return(valor_ok);
}
void get_data (int COM) //Transmite al DL los parametros introducidos
{
unsigned int Ini_NDIRH,Ini_NDIRL,Ini_NDIRLR,MaxPagW,MaxRamPag; //Escaneo
unsigned int INCL,INCH,NTMR1,NTMR0; //del fichero
FILE *fp; //Fichero fuente
mem_EE *dato; //Posiciones memoria EEPROM del data logger
int valor_ok; //Funcionamiento correcto
int n; //Eleccion memoria
float num; //Tiempo muestreo
ANEXO 3: LISTADO DE PROGRAMAS Pag 40
PROYECTO
DATA
LOGGER
PARA
printf("\nTransferencia configuración al Data Logger");
printf("\na partir de los parámetros siguientes:\n");
ini_usart(COM); /*Aunque no se utiliza la irq port serie se activa*/
ini_timer();
fp=fopen("fichtrm","wt");
do
{
printf("\nTiempo muestreo aproximado (s) ? ");
scanf("%f",&num);
num = num/escala;
valor_ok = num>0; //El tiempo no puede se 0
if (valor_ok)
{
n = 256-ceil(num); //Redondea hacia arriba y complementa a 2
valor_ok = (n > 0);
}
}
while (!valor_ok);
printf("Tiempo de muestreo(s) %f\n",(256-n)*escala);
dato->NTMR1 = n;
do
{
printf("\nRetardos en la trasmisión (0-255) ? ");
scanf("%d",&n);
valor_ok = ((n>=0)&&(n < 255));
if (valor_ok) n=255-n; //Complemento a 2
}
while (!valor_ok);
dato->NTMR0 = n;
printf("\nTecle el número correspondiente al tipo de memoria utilizada\n");
printf("\n1 M24C01 2 M24C02
3 M24C04
4 M24C08\n");
printf("5 M24C16
6 M24128
7 M24256
8 M24512\n");
valor_ok=0;
do
{
scanf ("%d",&n); //Segun el tipo de memoria
switch (n)
{
case 1: dato->Ini_NDIRH=0xFF; //Se cargan los valores para la EEPROM
dato->Ini_NDIRL=0xF8; //precaculados
dato->Ini_NDIRLR=0xFF;
dato->MaxPagW=0xF0;
dato->MaxRamPag=0xEF;
dato->INCL=0x10;
dato->INCH=0x02;
valor_ok=1;
break;
case 2: dato->Ini_NDIRH=0xFF;
dato->Ini_NDIRL=0xF0;
dato->Ini_NDIRLR=0xFE;
dato->MaxPagW=0xF0;
dato->MaxRamPag=0xEF;
dato->INCL=0x10;
dato->INCH=0x02;
valor_ok=1;
ANEXO 3: LISTADO DE PROGRAMAS Pag 41
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
break;
case 3: dato->Ini_NDIRH=0xFE;
dato->Ini_NDIRL=0xF0;
dato->Ini_NDIRLR=0xFE;
dato->MaxPagW=0xF0;
dato->MaxRamPag=0xEF;
dato->INCL=0x10;
dato->INCH=0x02;
valor_ok=1;
break;
case 4: dato->Ini_NDIRH=0xFC;
dato->Ini_NDIRL=0xF0;
dato->Ini_NDIRLR=0xFE;
dato->MaxPagW=0xF0;
dato->MaxRamPag=0xEF;
dato->INCL=0x10;
dato->INCH=0x02;
valor_ok=1;
break;
case 5: dato->Ini_NDIRH=0xF8;
dato->Ini_NDIRL=0xF0;
dato->Ini_NDIRLR=0xFE;
dato->MaxPagW=0xF0;
dato->MaxRamPag=0xEF;
dato->INCL=0x10;
dato->INCH=0x02;
valor_ok=1;
break;
case 6: dato->Ini_NDIRH=0xC0;
dato->Ini_NDIRL=0xFC;
dato->Ini_NDIRLR=0xFE;
dato->MaxPagW=0xFC;
dato->MaxRamPag=0xFB;
dato->INCL=0x40;
dato->INCH=0x01;
valor_ok=1;
break;
case 7: dato->Ini_NDIRH=0x80;
dato->Ini_NDIRL=0xFC;
dato->Ini_NDIRLR=0xFE;
dato->MaxPagW=0xFC;
dato->MaxRamPag=0xFB;
dato->INCL=0x40;
dato->INCH=0x01;
valor_ok=1;
break;
case 8:break;
default: printf("Opci¢n Incorrecta\n");
}
}
while (!valor_ok);
trmt(dato);
fprintf (fp,"%x ",dato->Ini_NDIRH); //Guarda valores en fichero
fprintf (fp,"%x ",dato->Ini_NDIRL);
fprintf (fp,"%x ",dato->Ini_NDIRLR);
ANEXO 3: LISTADO DE PROGRAMAS Pag 42
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
fprintf (fp,"%x ",dato->MaxPagW);
fprintf (fp,"%x ",dato->MaxRamPag);
fprintf (fp,"%x ",dato->INCL);
fprintf (fp,"%x ",dato->INCH);
fprintf (fp,"%x ",dato->NTMR1);
fprintf (fp,"%x\n",dato->NTMR0);
fin_timer();
//Fin Transmision
fin_usart(COM);
fclose(fp);
}
int get_paramf(conf_in *p) /*Carga los parametros internos del
fichero de configuracion*/
{
int valor_ok=0; //Devuelve 1 si se realiza correctamente la carga
FILE *fp;
fp=fopen("fichcon","rt"); //Si existe el fichero de configuracion
valor_ok = !(fp==NULL);
if (valor_ok)
{
//Carga los parametros
valor_ok=fscanf (fp,"%E",&p->Vcc);
if (valor_ok) valor_ok=fscanf (fp,"%E",&p->Voff);
if (valor_ok) valor_ok=fscanf (fp,"%E",&p->gao);
if (valor_ok) valor_ok=fscanf (fp,"%E",&p->gai);
fclose(fp);
}
else printf ("\nFichero de par metros internos no encontrado\n");
return(valor_ok);
}
void get_param(conf_in *p) //Modifica los parametros internos del programa
{
int valor_ok;
FILE *fp;
printf("\nModificacion Parametros Compensacion\n\n");
fp=fopen("fichcon","wt"); //Se introducen todos los parametros en el fich
printf("Tensión alimentación Vcc (V) "); //Preguntas
scanf("%f",&p->Vcc);
printf("Tensión de offset (mV) ");
scanf("%f",&p->Voff);
printf("Ganancia LM35 T¦ ");
scanf("%f",&p->gao);
printf("Ganancia Termopar V ");
scanf("%f",&p->gai);
fprintf (fp,"%E ",p->Vcc);
//Guarda fichero
fprintf (fp,"%E ",p->Voff);
fprintf (fp,"%E ",p->gao);
fprintf (fp,"%E\n",p->gai);
fclose(fp);
}
int manual (char ter)
ANEXO 3: LISTADO DE PROGRAMAS Pag 43
TERMOPAR
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
{
float ta,mV; //Tª ambiente, Tensión del termopar
double t,V; //V(ta), t(mV)
int pos_err; //error
printf("\nCalculo Temperatura Termopar a partir de las mediciones\n\n");
printf("Temperatura ambiente (ºC) "); //Ta
scanf("%f",&ta);
printf("Tensión producida por el termopar (mV) "); //E
scanf("%f",&mV);
V=EmV(ta,ter); //Aplicacion formula compensacion
t=T90(mV+V,ter);
pos_err=!((V==-1.0)||(t==-1.0)); //Resultado de posible error
printf("La temperatura del termopar es %f ºC\n",t); //Muestra T
return(pos_err);
}
int analisis (int c,char **v,int *comando,int *com,char *ter)
{ //Interpreta la linea de comandos
int error=0; //Linea correcta
int n;
int p_com,p_ter,p_fil;
*com=1; *ter='k'; //Valores por defecto
if ((c>=2)) //Una cadena en la linea
{
if (*v[1]=='c') //Compensacion
*comando=1;
else
if (*v[1]=='t') //Transmision
*comando=3;
else
if (*v[1]=='p') //Configuracion
*comando=5;
else
if (*v[1]=='m') //Manual
*comando=6;
else error=1;
p_com=p_ter=p_fil=0;
for (n=2;(n<c)&&(!error);n++)
{
p_com=(!p_com)&&(*v[n]=='/')&&(*(v[n]+1)=='c')&&(*(v[n]+2)=='o')&&(*(v[n]+3)=='m')&&(*(v[n]+4)=='
=');
p_ter=(!p_ter)&&(*v[n]=='/')&&(*(v[n]+1)=='t')&&(*(v[n]+2)=='e')&&(*(v[n]+3)=='r')&&(*(v[n]+4)=='=');
p_fil=(!p_fil)&&(*v[n]=='/')&&(*(v[n]+1)=='f')&&(*(v[n]+2)=='i')&&(*(v[n]+3)=='l');
if (p_com) //com=n
{
*com=(int) *(v[n]+5)-48; //ASCII a numero
error=(*com<1)||(*com>4); //Puerto serie real
}
else
if (p_ter) //ter=n
{
*ter=*(v[n]+5); //Termopar permitido
ANEXO 3: LISTADO DE PROGRAMAS Pag 44
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
error=!((*ter=='b')||(*ter=='e')||(*ter=='j')||(*ter=='k')||(*ter=='n')||(*ter=='r')||(*ter=='s')||(*ter=='t')
);
}
else
if ((p_fil)&&((*comando==1)||(*comando==3))) //fil y c o t
{
*comando=*comando+1;
}
else error=1; //Parametro desconocido o repetido
}
}
else error=1; //No comando
if (error==1) //Muestra ayuda
{
printf("\nUso: TERMO <comando> [/com=n] [/ter=n] [/fil]\n\n<Comandos>\n");
printf("c Compensación termopar\n");
printf("t Transmisión configuración data logger\n");
printf("p Modificación/Creación par metros internos\n");
printf("m Compensación indicando tensión producida y temperatura ambiente\n\n");
printf("Parámetros\n");
printf("/com=n indica el puerto serie usado n=1|2|3|4 , por defecto n=1\n");
printf("/ter=n indica el tipo de termopar usado n=b|e|j|k|n|r|s|t , por defecto n=k\n");
printf("/fil indica si se utilizara fichero interno, por defecto no se utiliza\n");
printf("Nota este par metro no será válido para los comandos p o m\n");
}
return (error);
}
int main(int argc,char *argv[])
{
char termo='k';
int opcion=0; //Opcion del programa escogida
int port=1;
//Puerto serie
conf_in param; //Parametros internos de compensacion
//Si la opcion se ha introducido correctamente sigue sino acaba
if (analisis(argc,argv,&opcion,&port,&termo)) return(1);
//opcion=2;port=1;
switch (opcion)//Sigue segun la opcion elegida
{
case 1:
//Compensacion datos procedentes puerto serie
if (get_paramf(&param))
//Si los parametros internos son correctos
{
adq(termo,port,&param); //Compensa los datos que vengan de alli
}
else return(1);
break;
case 2:
//Compensacion datos extraidos desde un fichero
if (get_paramf(&param))
{
adqf(termo,&param); //Compensa
}
else return(1);
break;
case 3:
//Transmite configuracion especifica al data logger
ANEXO 3: LISTADO DE PROGRAMAS Pag 45
PROYECTO
DATA
LOGGER
PARA
get_data(port);
break;
case 4:
//Transmite configuracion habitual al data logger
get_dataf(port);
break;
case 5:
//Modifica los parametros internos
get_param(&param);
break;
case 6:
//Modifica los parametros internos
manual(termo);
break;
}
return(0);
}
ANEXO 3: LISTADO DE PROGRAMAS Pag 46
TERMOPAR
DATALOGER PARA TERMOPAR
(PERFIL DE TEMPERATURA DE UN HORNO DE CINTA CON COMPENSACIÓN DE UNIÓN FRÍA)
ANEXO 4: COEFICIENTES TERMOPAR
AUTOR: Jesús Pablo Parrado Guardia.
DIRECTOR: Xavier Vilanova.
FECHA: Junio / 2003.
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
************************************
* This section contains coefficients for type B thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
0.000 to 630.615
*
630.615 to 1820.000
************************************
name: reference function on ITS-90
type: B
temperature units: °C
emf units: mV
range: 0.000, 630.615, 6
0.000000000000E+00
-0.246508183460E-03
0.590404211710E-05
-0.132579316360E-08
0.156682919010E-11
-0.169445292400E-14
0.629903470940E-18
range: 630.615, 1820.000, 8
-0.389381686210E+01
0.285717474700E-01
-0.848851047850E-04
0.157852801640E-06
-0.168353448640E-09
0.111097940130E-12
-0.445154310330E-16
0.989756408210E-20
-0.937913302890E-24
************************************
* This section contains coefficients of approximate inverse
* functions for type B thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
*
250. to 700.
0.291 to 2.431
-0.02 to 0.03
*
700. to 1800.
2.431 to 13.820
-0.01 to 0.02
********************************************************
Inverse coefficients for type B:
Temperature
Range:
250.
700.
700.
1820.
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 2
PROYECTO
Voltage
Range:
DATA
0.291
2.431
9.8423321E+01
6.9971500E+02
-8.4765304E+02
1.0052644E+03
-8.3345952E+02
4.5508542E+02
-1.5523037E+02
2.9886750E+01
-2.4742860E+00
Error
Range:
-0.02
0.03
LOGGER
PARA
TERMOPAR
2.431
13.820
2.1315071E+02
2.8510504E+02
-5.2742887E+01
9.9160804E+00
-1.2965303E+00
1.1195870E-01
-6.0625199E-03
1.8661696E-04
-2.4878585E-06
-0.01
0.02
************************************
* This section contains coefficients for type E thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 to 1000.000
************************************
name: reference function on ITS-90
type: E
temperature units: °C
emf units: mV
range: -270.000, 0.000, 13
0.000000000000E+00
0.586655087080E-01
0.454109771240E-04
-0.779980486860E-06
-0.258001608430E-07
-0.594525830570E-09
-0.932140586670E-11
-0.102876055340E-12
-0.803701236210E-15
-0.439794973910E-17
-0.164147763550E-19
-0.396736195160E-22
-0.558273287210E-25
-0.346578420130E-28
range: 0.000, 1000.000, 10
0.000000000000E+00
0.586655087100E-01
0.450322755820E-04
0.289084072120E-07
-0.330568966520E-09
0.650244032700E-12
-0.191974955040E-15
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 3
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
-0.125366004970E-17
0.214892175690E-20
-0.143880417820E-23
0.359608994810E-27
************************************
* This section contains coefficients of approximate inverse
* functions for type E thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
Range
range
range
*
(°C)
(mV)
(° C)
*
-200. to 0.
-8.825 to 0.000
-0.01 to 0.03
*
0. to 1000.
0.000 to 76.373
-0.02 to 0.02
********************************************************
Inverse coefficients for type E:
Temperature
Range:
-200.
0.
0.
1000.
-8.825
0.000
0.000
76.373
0.0000000E+00
1.6977288E+01
-4.3514970E-01
-1.5859697E-01
-9.2502871E-02
-2.6084314E-02
-4.1360199E-03
-3.4034030E-04
-1.1564890E-05
0.0000000E+00
0.0000000E+00
1.7057035E+01
-2.3301759E-01
6.5435585E-03
-7.3562749E-05
-1.7896001E-06
8.4036165E-08
-1.3735879E-09
1.0629823E-11
-3.2447087E-14
Voltage
Range:
Error
Range:
-0.01
0.03
-0.02
0.02
************************************
* This section contains coefficients for type J thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order.
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
The equation is of the form
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 4
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
*
-210.000 to 760.000
*
760.000 to 1200.000
************************************
name: reference function on ITS-90
type: J
temperature units: °C
emf units: mV
range: -210.000, 760.000, 8
0.000000000000E+00
0.503811878150E-01
0.304758369300E-04
-0.856810657200E-07
0.132281952950E-09
-0.170529583370E-12
0.209480906970E-15
-0.125383953360E-18
0.156317256970E-22
range: 760.000, 1200.000, 5
0.296456256810E+03
-0.149761277860E+01
0.317871039240E-02
-0.318476867010E-05
0.157208190040E-08
-0.306913690560E-12
************************************
* This section contains coefficients of approximate inverse
* functions for type J thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
*
-210. to 0.
-8.095 to 0.000
-0.05 to 0.03
*
0. to 760.
0.000 to 42.919
-0.04 to 0.04
*
760. to 1200
42.919 to 69.553 -0.04 to 0.03
********************************************************
Inverse coefficients for type J:
Temperature
Range:
Voltage
Range:
-210.
0.
0.
760.
760.
1200.
-8.095
0.000
0.000
42.919
42.919
69.553
0.0000000E+00 0.000000E+00 -3.11358187E+03
1.9528268E+01 1.978425E+01 3.00543684E+02
-1.2286185E+00 -2.001204E-01 -9.94773230E+00
-1.0752178E+00 1.036969E-02 1.70276630E-01
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 5
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
-5.9086933E-01 -2.549687E-04 -1.43033468E-03
-1.7256713E-01 3.585153E-06 4.73886084E-06
-2.8131513E-02 -5.344285E-08 0.00000000E+00
-2.3963370E-03 5.099890E-10 0.00000000E+00
-8.3823321E-05 0.000000E+00 0.00000000E+00
Error
Range:
-0.05
0.03
-0.04
0.04
-0.04
0.03
************************************
* This section contains coefficients for type K thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation below 0 °C is of the form
* E = sum(i=0 to n) c_i t^i.
*
* The equation above 0 °C is of the form
* E = sum(i=0 to n) c_i t^i + a0 exp(a1 (t - a2)^2).
*
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 to 1372.000
************************************
name: reference function on ITS-90
type: K
temperature units: °C
emf units: mV
range: -270.000, 0.000, 10
0.000000000000E+00
0.394501280250E-01
0.236223735980E-04
-0.328589067840E-06
-0.499048287770E-08
-0.675090591730E-10
-0.574103274280E-12
-0.310888728940E-14
-0.104516093650E-16
-0.198892668780E-19
-0.163226974860E-22
range: 0.000, 1372.000, 9
-0.176004136860E-01
0.389212049750E-01
0.185587700320E-04
-0.994575928740E-07
0.318409457190E-09
-0.560728448890E-12
0.560750590590E-15
-0.320207200030E-18
0.971511471520E-22
-0.121047212750E-25
exponential:
a0 = 0.118597600000E+00
a1 = -0.118343200000E-03
a2 = 0.126968600000E+03
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 6
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
************************************
* This section contains coefficients of approximate inverse
* functions for type K thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
*
-200. to 0.
-5.891 to 0.000
-0.02 to 0.04
*
0. to 500.
0.000 to 20.644
-0.05 to 0.04
*
500. to 1372.
20.644 to 54.886
-0.05 to 0.06
********************************************************
Inverse coefficients for type K:
Temperature
Range:
Voltage
Range:
-200.
0.
0.
500.
500.
1372.
-5.891
0.000
0.000
20.644
20.644
54.886
0.0000000E+00
2.5173462E+01
-1.1662878E+00
-1.0833638E+00
-8.9773540E-01
-3.7342377E-01
-8.6632643E-02
-1.0450598E-02
-5.1920577E-04
0.0000000E+00
Error
Range:
-0.02
0.04
0.000000E+00
2.508355E+01
7.860106E-02
-2.503131E-01
8.315270E-02
-1.228034E-02
9.804036E-04
-4.413030E-05
1.057734E-06
-1.052755E-08
-0.05
0.04
-1.318058E+02
4.830222E+01
-1.646031E+00
5.464731E-02
-9.650715E-04
8.802193E-06
-3.110810E-08
0.000000E+00
0.000000E+00
0.000000E+00
-0.05
0.06
************************************
* This section contains coefficients for type N thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 to 1300.000
************************************
name: reference function on ITS-90
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 7
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
type: N
temperature units: °C
emf units: mV
range: -270.000, 0.000, 8
0.000000000000E+00
0.261591059620E-01
0.109574842280E-04
-0.938411115540E-07
-0.464120397590E-10
-0.263033577160E-11
-0.226534380030E-13
-0.760893007910E-16
-0.934196678350E-19
range: 0., 1300., 10
0.000000000000E+00
0.259293946010E-01
0.157101418800E-04
0.438256272370E-07
-0.252611697940E-09
0.643118193390E-12
-0.100634715190E-14
0.997453389920E-18
-0.608632456070E-21
0.208492293390E-24
-0.306821961510E-28
************************************
* This section contains coefficients of approximate inverse
* functions for type N thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
*
-200. to 0.
-3.990 to 0.000
-0.02 to 0.03
*
0. to 600.
0.000 to 20.613
-0.02 to 0.03
*
600. to 1300.
20.613 to 47.513
-0.04 to 0.02
********************************************************
Inverse coefficients for type N:
Temperature
Range:
Voltage
Range:
-200.
0.
0.
600.
600.
1300.
-3.990
0.000
0.000
20.613
20.613
47.513
0.0000000E+00 0.00000E+00 1.972485E+01
3.8436847E+01 3.86896E+01 3.300943E+01
1.1010485E+00 -1.08267E+00 -3.915159E-01
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 8
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
5.2229312E+00 4.70205E-02 9.855391E-03
7.2060525E+00 -2.12169E-06 -1.274371E-04
5.8488586E+00 -1.17272E-04 7.767022E-07
2.7754916E+00 5.39280E-06 0.000000E+00
7.7075166E-01 -7.98156E-08 0.000000E+00
1.1582665E-01 0.00000E+00 0.000000E+00
7.3138868E-03 0.00000E+00 0.000000E+00
Error
Range:
-0.02
0.03
-0.02
0.03
-0.04
0.02
************************************
* This section contains coefficients for type R thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-50.000 to 1064.180
*
1064.180 to 1664.500
*
1664.500 to 1768.100
************************************
name: reference function on ITS-90
type: R
temperature units: °C
emf units: mV
range: -50.000, 1064.180, 9
0.000000000000E+00
0.528961729765E-02
0.139166589782E-04
-0.238855693017E-07
0.356916001063E-10
-0.462347666298E-13
0.500777441034E-16
-0.373105886191E-19
0.157716482367E-22
-0.281038625251E-26
range: 1064.180, 1664.500, 5
0.295157925316E+01
-0.252061251332E-02
0.159564501865E-04
-0.764085947576E-08
0.205305291024E-11
-0.293359668173E-15
range: 1664.5, 1768.1, 4
0.152232118209E+03
-0.268819888545E+00
0.171280280471E-03
-0.345895706453E-07
-0.934633971046E-14
************************************
* This section contains coefficients of approximate inverse
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 9
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
* functions for type R thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
*
-50. to 250.
-0.226 to 1.923
-0.02 to 0.02
*
250. to 1200.
1.923 to 13.228
-0.005 to 0.005
*
1064. to 1664.5
11.361 to 19.739
-0.0005 to 0.001
*
1664.5 to 1768.1
19.739 to 21.103
-0.001 to 0.002
********************************************************
Inverse coefficients for type R:
Temperature
Range:
Voltage
Range:
-50.
250.
250.
1200.
-0.226
1.923
1.923
13.228
0.0000000E+00
1.8891380E+02
-9.3835290E+01
1.3068619E+02
-2.2703580E+02
3.5145659E+02
-3.8953900E+02
2.8239471E+02
-1.2607281E+02
3.1353611E+01
-3.3187769E+00
Error
Range:
-0.02
0.02
1064.
1664.5
11.361
19.739
1664.5
1768.1
19.739
21.103
1.334584505E+01 -8.199599416E+01 3.406177836E+04
1.472644573E+02 1.553962042E+02 -7.023729171E+03
-1.844024844E+01 -8.342197663E+00 5.582903813E+02
4.031129726E+00 4.279433549E-01 -1.952394635E+01
-6.249428360E-01 -1.191577910E-02 2.560740231E-01
6.468412046E-02 1.492290091E-04 0.000000000E+00
-4.458750426E-03 0.000000000E+00 0.000000000E+00
1.994710149E-04 0.000000000E+00 0.000000000E+00
-5.313401790E-06 0.000000000E+00 0.000000000E+00
6.481976217E-08 0.000000000E+00 0.000000000E+00
0.000000000E+00 0.000000000E+00 0.000000000E+00
-0.005
0.005
-0.0005
0.001
-0.001
0.002
************************************
* This section contains coefficients for type S thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order. The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-50.000 to 1064.180
*
1064.180 to 1664.500
*
1664.500 to 1768.100
************************************
name: reference function on ITS-90
type: S
temperature units: °C
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 10
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
emf units: mV
range: -50.000, 1064.180, 8
0.000000000000E+00
0.540313308631E-02
0.125934289740E-04
-0.232477968689E-07
0.322028823036E-10
-0.331465196389E-13
0.255744251786E-16
-0.125068871393E-19
0.271443176145E-23
range: 1064.180, 1664.500, 4
0.132900444085E+01
0.334509311344E-02
0.654805192818E-05
-0.164856259209E-08
0.129989605174E-13
range: 1664.5, 1768.1, 4
0.146628232636E+03
-0.258430516752E+00
0.163693574641E-03
-0.330439046987E-07
-0.943223690612E-14
************************************
* This section contains coefficients of approximate inverse
* functions for type S thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
*
-50. to 250.
-0.235 to 1.874
-0.02 to 0.02
*
250. to 1200.
1.874 to 11.950
-0.01 to 0.01
*
1064. to 1664.5
10.332 to 17.536
-0.0002 to 0.0002
*
1664.5 to 1768.1
17.536 to 18.693
-0.002 to 0.002
********************************************************
Inverse coefficients for type S:
Temperature
Range:
Voltage
Range:
-50.
250.
250.
1200.
-0.235
1.874
1.874
11.950
1064.
1664.5
10.332
17.536
1664.5
1768.1
17.536
18.693
0.00000000E+00 1.291507177E+01 -8.087801117E+01 5.333875126E+04
1.84949460E+02 1.466298863E+02 1.621573104E+02 -1.235892298E+04
-8.00504062E+01 -1.534713402E+01 -8.536869453E+00 1.092657613E+03
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 11
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
1.02237430E+02 3.145945973E+00 4.719686976E-01 -4.265693686E+01
-1.52248592E+02 -4.163257839E-01 -1.441693666E-02 6.247205420E-01
1.88821343E+02 3.187963771E-02 2.081618890E-04 0.000000000E+00
-1.59085941E+02 -1.291637500E-03 0.000000000E+00 0.000000000E+00
8.23027880E+01 2.183475087E-05 0.000000000E+00 0.000000000E+00
-2.34181944E+01 -1.447379511E-07 0.000000000E+00 0.000000000E+00
2.79786260E+00 8.211272125E-09 0.000000000E+00 0.000000000E+00
Error
Range:
-0.02
0.02
-0.01
0.01
-0.0002
0.0002
-0.002
0.002
************************************
* This section contains coefficients for type T thermocouples for
* the two subranges of temperature listed below. The coefficients
* are in units of °C and mV and are listed in the order of constant
* term up to the highest order.
The equation is of the form
* E = sum(i=0 to n) c_i t^i.
*
*
Temperature Range (°C)
*
-270.000 to 0.000
*
0.000 °C to 400.000
************************************
name: reference function on ITS-90
type: T
temperature units: °C
emf units: mV
range: -270.000, 0.000, 14
0.000000000000E+00
0.387481063640E-01
0.441944343470E-04
0.118443231050E-06
0.200329735540E-07
0.901380195590E-09
0.226511565930E-10
0.360711542050E-12
0.384939398830E-14
0.282135219250E-16
0.142515947790E-18
0.487686622860E-21
0.107955392700E-23
0.139450270620E-26
0.797951539270E-30
range: 0.000, 400.000, 8
0.000000000000E+00
0.387481063640E-01
0.332922278800E-04
0.206182434040E-06
-0.218822568460E-08
0.109968809280E-10
-0.308157587720E-13
0.454791352900E-16
-0.275129016730E-19
************************************
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 12
PROYECTO
DATA
LOGGER
PARA
TERMOPAR
* This section contains coefficients of approximate inverse
* functions for type T thermocouples for the subranges of
* temperature and voltage listed below. The range of errors of
* the approximate inverse function for each subrange is also given.
* The coefficients are in units of °C and mV and are listed in
* the order of constant term up to the highest order.
* The equation is of the form t_90 = d_0 + d_1*E + d_2*E^2 + ...
*
+ d_n*E^n,
* where E is in mV and t_90 is in °C.
*
*
Temperature
Voltage
Error
*
range
range
range
*
(°C)
(mV)
(° C)
*
-200. to 0.
-5.603 to 0.000
-0.02 to 0.04
*
.0 to 400.
0.000 to 20.872
-0.03 to 0.03
********************************************************
Inverse coefficients for type T:
Temperature
Range:
Voltage
Range:
-200.
0.
0.
400.
-5.603
0.000
0.000
20.872
0.0000000E+00 0.000000E+00
2.5949192E+01 2.592800E+01
-2.1316967E-01 -7.602961E-01
7.9018692E-01 4.637791E-02
4.2527777E-01 -2.165394E-03
1.3304473E-01 6.048144E-05
2.0241446E-02 -7.293422E-07
1.2668171E-03 0.000000E+00
Error
Range:
-0.02
0.04
-0.03
0.03
ANEXO 4: COEFICIENTES POLINÓMICOS DE LOS TERMOPARES Pag 13
Descargar