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