UNIVERSIDAD DE MAGALLANES FACULTAD DE INGENIERÍA
DEPARTAMENTO DE ELECTRICIDAD
SISTEMA DE MONITOREO Y GESTIÓN DE VARIABLES INDUSTRIALES UTILIZANDO dsPIC y LABVIEW
HEBERT CRISTOBAL RUIZ SALDIVIA
-2011-
UNIVERSIDAD DE MAGALLANES FACULTAD DE INGENIERÍA
DEPARTAMENTO DE ELECTRICIDAD
SISTEMA DE MONITOREO Y GESTIÓN DE VARIABLES
INDUSTRIALES UTILIZANDO dsPIC y LABVIEW
“Trabajo de titulación presentado en conformidad a los requisitos para obtener el título de Ingeniero en Electricidad mención Electrónica Industrial”
PROFESOR GUIA: IVAN ANDRADE AGUERO
HEBERT CRISTOBAL RUIZ SALDIVIA
-2011-
AGRADECIMIENTOS i
AGRADECIMIENTOS
Me gustaría primero que nada agradecer a mi familia, mis padres y mi
hermana por su incondicional apoyo en todo momento.
Al personal del Departamento de Electricidad, administrativos, encargados de
laboratorio y profesores por todas sus enseñanzas brindadas en estos años de
estudio y al profesor Iván Andrade Agüero por toda su paciencia y disposición a
lo largo de este trabajo de título.
A mis amigos y compañeros de la carrera Murdo Águila, Juan Pablo Cuitiño,
Ramón Pérez, Carlos Lecaros, Rodrigo Henriquez y Jorge Barra, porque todos
de alguna forma ayudaron en la conclusión de esta etapa de mi vida.
A mis amigos Sebastián Toledo, Felipe Castillo, Sergio Roa, Jose Gallardo,
Andrés Gallardo y Claudio Paradis por los grandes momentos vividos en esta
etapa universitaria y por estar conmigo en todo momento.
ii
RESUMEN
El objetivo de este trabajo de título es crear un sistema de monitoreo gestión y
almacenamiento de datos obtenidos por sensores (4-20mA). Para esto se
utilizará un microcontrolador diseñado por la empresa MICROCHIP (dsPIC
30F6013A), además del software LABVIEW de la empresa National Instruments
El propósito del dsPIC es realizar el tratamiento y procesamiento de la señal
enviada por los sensores. Además el dsPIC será el encargado de transmitir los
datos adquiridos a través del puerto serial hacia un computador. En este último
el programa LABVIEW será el encargado de procesar los datos obtenidos y
además traducirlos a valores requeridos por el usuario, almacenándolos
también para su posterior análisis.
A grandes rasgos este trabajo se divide en dos partes. En la primera se
aborda el diseño del programa necesario para capturar los datos de los
sensores (todo esto dentro del dsPIC) y su posterior transmisión al puerto serial
hacia un computador.
En la tercera etapa se aborda el diseño del programa necesario para la
captura procesamiento y almacenamiento de los datos enviados por el dsPIC
mediante el uso del software LABVIEW. Con ésto una interfaz gráfica sencilla
con la que el usuario u operador puede interactuar de manera visual e instintiva
con los datos obtenidos.
ÍNDICE iii
ÍNDICE
Capítulo I Introducción 1
1.1 Introducción General 1
1.2 Objetivo del trabajo de título 2
1.3 Estructuración del trabajo de título 2
Capítulo II Controlador Digital de Señales 4
2.1 Introducción 4
2.2 Microcontroladores 5
2.3 Microcontroladores y DSP 6
2.4 DSP y DSC 8
Capítulo III Entorno Labview 13
3.1 Introducción 13
3.2 Descripción Software Labview 14
3.3 Labview en Sistema Modelado 20
Capítulo IV Sistema Experimental 28
4.1 Introducción 28
4.2 Hardware Implementado 29
4.3 Modelación de Programa Implementado en dsPIC30F6013A 33
4.4 Modelación de Programa Implementado en Labview 37
ÍNDICE iv
Capítulo V Pruebas y Aplicación Práctica 40
5.1 Introducción 40
5.2 Aplicación Gráfica para Propósitos Generales 41
5.3 Descripción General Sistema de Bombeo 47
5.4 Panel Frontal Específico Sistema de Bombeo 50
Capítulo VI Conclusiones 59
6.1 Conclusión General 59
Referencias Bibliográficas 61
Anexos Parte 1 CÓDIGOS DE PROGRAMAS 62
Anexos Parte 2 HARDWARE IMPLEMENTADO 90
CAPÍTULO I
INTRODUCCIÓN
Capítulo Primero Introducción 1
1. INTRODUCCIÓN
1.1 Introducción general.
Los sistemas de adquisición de datos se utilizan cada vez más en laboratorios,
industria y educación para la visualización de las variables físicas (presión,
nivel, temperatura y flujo por ejemplo). Muchos procesos industriales se
monitorean con tarjetas de adquisición de datos y una computadora, además de
graficadores y registradores.
Se denomina sistema de adquisición de datos al conjunto de elementos
empleados para medir y procesar una o varias señales análogas y/o digitales.
Las etapas de un sistema de adquisición y procesamiento de datos son:
Transductores y sensores.
Acondicionamiento de señal.
Módulo de adquisición de datos.
Acción a realizar con los datos obtenidos (gráficos, almacenado, control
etc.)
La implementación del trabajo de título se centra en el controlador digital de
señales (DSC) dsPIC30F6013A de la empresa MICROCHIP, el que trabajará en
conjunto con el software de la empresa National Instruments llamado Labview
en su versión Estudiantil.
Capítulo Primero Introducción 2
1.2 Objetivo del trabajo de título.
El objetivo principal de este trabajo de título es construir un sistema
compatible con sensores 4-20mA. El sistema deberá estar preparado para
poder adecuarse y calibrarse cada vez que un nuevo sensor se acople a la
tarjeta, esto para ofrecer una gran versatilidad y por lo mismo una mayor
cantidad de aplicaciones posibles.
Además de ello es necesario que el sistema interactúe con el usuario final de
manera fácil e intuitiva, por lo que la interfaz gráfica deberá adecuarse a estos
requerimientos sin restar rendimiento al sistema.
1.3 Estructuración del trabajo de título.
El presente trabajo de título consta de seis capítulos, los que se describirán
brevemente a continuación:
En el capitulo segundo se explicará el funcionamiento del dispositivo físico
principal necesario para la implementación del sistema que, en este caso
corresponde en el controlador digital de señales (DSC), dsPIC30F6013A. Las
propiedades que posee.
El capítulo tercero describe el programa utilizado como interfaz gráfica. Se
explicarán las ventajas que posee y se mostrarán las funciones que se utilizaron
en el desarrollo de la aplicación práctica.
En el cuarto capítulo se hará una descripción del hardware necesario para
realizar la tarea requerida, se analizarán los componentes utilizados y se
explicaran sus respectivas tareas. Además se explicará la construcción de los
programas requeridos para el sistema realizado. Se mostrarán las rutinas más
importantes implementadas las cuales son la base para el correcto
funcionamiento del sistema realizado.
Capítulo Primero Introducción 3
En el quinto capítulo se podrán ver los resultados experimentales del sistema
funcionando en conjunto. Se mostrarán las opciones disponibles desde el
punto de vista del usuario y además se presentarán los resultados obtenidos en
una aplicación práctica real.
En el sexto y último capítulo se presentarán las conclusiones generales de
este trabajo de título.
CAPÍTULO II
CONTROLADOR DIGITAL DE SEÑALES
Capítulo Segundo Controlador Digital de Señales 4
2. CONTROLADOR DIGITAL DE SEÑALES
2.1 Introducción
Este capítulo explicará la utilización de una clase específica de
microcontrolador y su utilización en el procesamiento de señales análogas. Se
hablará del concepto de Controlador Digital de Señales (DSC), sus aplicaciones
en el campo del procesamiento digital de señales. Con esto se justificará su
utilización en este trabajo de título. Para ello es necesario conocer las
principales características de los microcontroladores especializados en el área
del procesamiento de señales.
El papel que juega el dsPIC en el sistema final implementado es fundamental
puesto que es la unidad central del sistema, será la encargada del muestreo de
señales análogas y hacer los cálculos requeridos con ellas todo esto en un
tiempo muy reducido lo cual permitirá una correcta gestión de las variables
industriales medidas.
Capítulo Segundo Controlador Digital de Señales 5
2.2 Microcontroladores
Los microcontroladores son computadores digitales integrados en un chip que
cuentan con un microprocesador o unidad de procesamiento central (CPU), una
memoria para almacenar el programa, una memoria para almacenar datos y
puertos de entrada salida.
Un microcontrolador es un solo circuito integrado que contiene todos los
elementos electrónicos que se utilizan para hacer funcionar un sistema basado
en un microprocesador, es decir contiene en un solo integrado la Unidad de
Procesos, la memoria Ram, memoria Rom, puertos de entrada, puertos de
salidas y otros periféricos. A diferencia de un microprocesador que necesita de
sus periféricos en forma externa para su correcta operación.
El funcionamiento de los microcontroladores está determinado por el programa
almacenado en su memoria. Este puede escribirse en distintos lenguajes de
programación. Además, la mayoría de los microcontroladores actuales pueden
reprogramarse repetidas veces.
Por las características mencionadas y su alta flexibilidad, los
microcontroladores son ampliamente utilizados como la unidad central de una
gran variedad de sistemas integrados que controlan máquinas, componentes de
sistemas complejos, como aplicaciones industriales de automatización y
robótica, domótica, equipos médicos, sistemas aeroespaciales, e incluso
dispositivos de la vida diaria como automóviles, hornos de microondas,
teléfonos y televisores.
Los microcontroladores son conocidos generalmente con el nombre de MCU
(Microcontroller Unit) y sus principales características se presentan a
continuación:
-Unidad de Procesamiento Central (CPU): Típicamente de 16 bits, pero también
las hay de 32 y hasta 64 bits con arquitectura Harvard, con memoria/bus de
datos separada de la memoria/bus de instrucciones de programa.
Capítulo Segundo Controlador Digital de Señales 6
-Memoria de Programa: Es una memoria ROM (Read-Only Memory), EPROM
(Electrically Programable ROM), EEPROM (Electrically Erasable/Programable
ROM) o Flash que almacena el código del programa que típicamente puede ser
desde 1 KB a varios MB.
-Memoria de Datos: Es una memoria RAM (Random Access Memory) que
puede ser de 1, 2 4, 8, 16, 32 kilobytes.
-Generador del Reloj: Un cristal de cuarzo de frecuencias que genera una señal
oscilatoria de entre 1 a 40 MHz.
-Interfaz de Entrada/Salida: Puertos paralelos, seriales (UARTs, Universal
Asynchronous Receiver/Transmitter), I2C (Inter-Integrated Circuit), interfases de
periféricos Seriales (SPI), Red de Área de Controladores (CAN), USB (Universal
Serial Bus).
-Otras opciones: Conversores A/D (ADC), Moduladores por ancho de pulso
(PWM).
2.3 Microcontroladores y DSP.
Se denomina DSP (procesador digital de señales) a un circuito integrado que
contiene un procesador digital y un conjunto de recursos complementarios con
los cuales es capaz de manejar digitalmente las señales análogas que nos
rodean.
Los DSP pueden asemejarse a los microcontroladores tradicionales, pero
utilizando arquitecturas y recursos que optimizan los y algoritmos manejados
en el procesamiento digital de señales. Algunas de las características
principales de los DSP se presentan a continuación.
-Los DSP son generalmente RISC, esto quiere decir que poseen un reducido
juego de instrucciones que se ejecutan en un sólo ciclo.
Capítulo Segundo Controlador Digital de Señales 7
-Utilizan arquitectura Harvard, esto quiere decir que poseen dos memorias
independientes. Una para los datos y la otra dedicada a contener las
instrucciones. Esto posibilita un acceso simultaneo a ambas, también cabe
destacar que la memoria de datos se divide en dos espacios independientes
que aportan el acceso paralelo (Figura 2.1).
-El repertorio de instrucciones contienen algunas específicas para resolver los
algoritmos habituales en el procesamiento de señales.
-Disponen de un conjunto muy amplio y veloz de interrupciones con niveles de
prioridad.
-El DSP integra numerosos recursos y periféricos que minimizan el tamaño y
simplifican el diseño del sistema.
-Poseen módulos para la optimización y control de la energía.
Figura 2.1 Arquitectura Harvard.
Los DSP son básicamente microcontroladores dotados de los recursos físicos
y lógicos necesarios para soportar las aplicaciones específicas del
procesamiento digital de señales.
Las instrucciones aritméticas complejas se ejecutan en varios ciclos en los
MCU, mientras que en los DSP solo precisan de uno. En los DSP siempre se
dispone de conversores A/D rápidos y precisos. Dado el carácter
marcadamente matemático de los DSP, estos están preparados para ser
programados por lenguajes de alto nivel como el C. Las velocidades y
rendimientos de los DSP son generalmente muy superiores a la gran mayoría
Capítulo Segundo Controlador Digital de Señales 8
de los MCU. Otra de las diferencias claves entre los MCU y los DSP es que el
comportamiento del programa en un MCU (MICROCHIP) es claramente
secuencial y se espera que funcione tal y como uno lo especifique en el
programa. En los DSP en gran parte de sus aplicaciones su comportamiento
será directa consecuencia inmediata del flujo de datos que suministra la señal
muestreada y la ejecución es dependiente de los datos obtenidos en tiempo
real.
2.4 DSP Y DSC.
La empresa MICROCHIP se ha desempeñado principalmente en el campo de
los microcontroladores de 16bit. Estos modelos son conocidos popularmente
con el nombre de PIC. Debido al aumento de aplicaciones en las cuales es
necesario el procesamiento digital de señales Microchip ha decidido lanzarse al
mercado de los DSP con un modelo hibrido MCU/DSP, cuyo manejo es similar
al de los MCU pero que incluye las principales prestaciones de los DSP. Así
nace el controlador digital de señales (DSC), el cual reúne las características de
los microcontroladores de 16 bits junto con las de los DSP de gama baja.
Dada la similitud del DSC con los MCU en cuanto arquitectura y repertorio de
instrucciones, los usuarios de las familias de microcontroladores PIC no
encuentran dificultades para introducirse en el campo del procesamiento digital
de señales utilizando dsPIC.
Capítulo Segundo Controlador Digital de Señales 9
Los dsPIC se pueden agrupar en dos grandes familias:
-dsPIC30F
-dsPIC33F
En este trabajo de título se utilizó un dsPIC de la primera familia, por lo que a
continuación se presentan las principales características de los dsPIC30F:
Recurso Rango de valores.
Memoria de programa FLASH 12Kb-144Kb
Memoria de datos RAM 512bytes-8Kb
Memoria de datos EEPROM 1Kb-4Kb
Pastillaje encapsulado 18-80 pines
Temporizador de 16 bit Hasta 5
Modulo de captura Hasta 8 entradas
Módulo comparador/PWM Hasta 8 salidas
Modulo PWM de control de motores De 6 a 8
Conversor A/D de 10 bits 500kbps, hasta 16 canales
Conversor A/D de 12 bits 100kps, hasta 16 canales
UART 1-2
(8-16 bits) 1-2
1 Módulo
QEI 1
Interfaz CODEC 1
CAN 1-2
Tabla 1 Características de dsPIC familia de los 30F
La tensión de alimentación admite un rango comprendido entre 2,5 y 5,5 VDC.
Se tolera una temperatura interna entre -40° y 85° C y una externa entre -40° y
125° C. El rendimiento alcanza los 30 MIPS cuando la tensión de alimentación
tiene un valor entre 4,5 y 5,5 VDC. En cuanto a la arquitectura de la CPU los
dsPIC30F se sustentan en un núcleo RISC con arquitectura Harvard mejorada.
Actuando como soporte central de información existe un banco de 16 registros
de 16 bits cada uno; se dispone de un bus de datos de 16 líneas y otro de
Capítulo Segundo Controlador Digital de Señales 10
instrucciones de 24. Para potenciar la velocidad de las operaciones aritméticas
complejas existe un “Motor DSP” que contiene un multiplicador hardware rápido
de 17 X 17 bits, dos acumuladores de 40 bits y un robusto registro de
desplazamiento. La memoria de programa, tipo FLASH, puede alcanzar un
tamaño de 4 MB instrucciones de 24 bits cada una, aunque actualmente sólo
hay modelos con una capacidad máxima de 256 KB. La memoria de datos
SRAM puede alcanzar 32K posiciones de 16 bits, aunque en los modelos
actuales sólo se llega a la mitad.
Toda esta estructura admite operaciones MCU y operaciones DSP con un
repertorio de 84 instrucciones. Las secciones MCU y DSP cooperan en el
funcionamiento general y comparten el flujo de instrucciones de los DSC. Para
reducir el tiempo de ejecución de algunas instrucciones DSP la memoria de
datos SRAM se divide en dos espacios X e Y que pueden ser accedidos a la
vez. Otra característica importante en los dsPIC30F es la de admitir hasta 45
fuentes distintas de petición de interrupción con 7 niveles de prioridad, de las
cuales 5 son externas. Hay modelos de dsPIC30F que disponen de hasta 54
pines de E/S programables y con otras funciones multiplexadas con un
consumo de 25 mA cada una. Los dispositivos dsPIC33F como disponen de
más periféricos también admiten más fuentes de interrupción. Se puede
encontrar una gran variedad de periféricos en la familia dsPIC30F como
temporizadores, conversores AD, módulos de captura y comparación, módulos
PWM para el control de motores, módulos de comunicación PC, SPI, CAN,
UART, DCI, etc.
Según MICROCHIP los 19 modelos que contiene la familia dsPIC30F se
pueden separar en tres grupos dependiendo de su aplicación:
-dsPIC30F de propósito general.
-dsPIC30F para control de sensores.
-dsPIC30F para control de motores y sistemas de alimentación.
El modelo utilizado en este trabajo de título (dsPIC30F6013A) cabe en la
categoría de propósito general, en la aplicación específica de este trabajo de
título destaca la utilización de tres periféricos. A continuación se dará una breve
explicación de ellos (la configuración individual de éstos se detallaran en los
anexos parte 1).
Capítulo Segundo Controlador Digital de Señales 11
Conversor Análogo Digital (ADC): El dsPIC permite hacer una rápida y
fiable conversión análoga/digital, para ello cuenta con un ADC de 12 bits de
precisión.
La conversión se realiza en tres etapas: muestreo de la señal, cuantificación
de la señal que consiste en llevar el valor análogo a un valor de
combinaciones y la cuantificación de la señal que consiste en agregarle los
ceros y unos a la señal convertida. El módulo ADC del dsPIC posee las
siguientes características.
-Tiempo de muestreo de 154ns.
-Conversión de aproximaciones sucesivas.
-Velocidad de conversión de hasta 500Ksps.
-Modo automático de exploración de canal.
-La tensión analógica de referencia puede ser seleccionada por software.
Módulo UART: Este módulo permite la comunicación Universal Serial
Asíncrona full dúplex o serial asíncrono con computadores, con interfases RS
232 y RS 485, entre sus principales características destacan:
-La transmisión de datos es de 8 o de 9 bits.
- Paridad impar, par o sin paridad.
- Uno o dos bits de parada.
-Tiene un generador de baudios con preescalador de 16 bits que se encarga de
dar la frecuencia de trabajo al modulo.
Módulo Temporizador: El dsPIC30F6013A cuenta con 5 temporizadores,
cada uno de 16 bits. Este módulo es utilizado para dar una base de tiempo con
la se generarán interrupciones asociadas.
En este trabajo de titulo el dsPIC se utiliza para el muestreo de señales, su
conversión análoga digital, cálculo de las variables medidas por los sensores y
por último en la comunicación con el software Labview.
Capítulo Segundo Controlador Digital de Señales 12
Figura 2.2 Procesamiento realizado en dsPIC.
La comunicación con el software Labview se hace mediante envío y
recepción de datos utilizando el módulo UART disponible en el dsPIC. El rol que
cumple Labview en el sistema final implementado se explicará en el tercer
capítulo de este trabajo de título.
CAPÍTULO III
ENTORNO LABVIEW
Capítulo Tercero Entorno Labview 13
3. Entorno Labview
3.1 Introducción
Para la interfaz gráfica se utilizó el software Labview en su versión estudiantil.
Esto pues permitirá una fácil interacción con el sistema desarrollado, un eficaz
tratamiento de datos enviados a través del dsPIC, además de brindar
estabilidad al sistema.
Labview es un entorno de programación destinado al desarrollo de
aplicaciones similar a los sistemas de desarrollo comerciales que utilizan el
lenguaje C o BASIC. Sin embargo se diferencia de dichos programas en un
importante aspecto: los citados lenguajes de programación se basan en líneas
de texto para crear el código fuente del programa, mientras que Labview
emplea programación gráfica o lenguaje G para crear programas basados en
diagramas de bloques, lo que facilita tanto su aprendizaje como la creación de
rutinas propias.
Capítulo Tercero Entorno Labview 14
3.2 Descripción Software Labview.
Labview es una herramienta de programación gráfica para aplicaciones que
involucren adquisición, control, análisis y presentación de datos. Las ventajas
que proporciona el empleo de Labview se resumen en las siguientes:
-Se reduce el tiempo de desarrollo de las aplicaciones al menos de 4 a 10
veces, ya que es muy intuitivo y fácil de aprender.
-Dota de gran flexibilidad al sistema, permitiendo cambios y actualizaciones
tanto del hardware como del software
-Da la posibilidad a los usuarios de crear soluciones completas y complejas.
- Con un único sistema de desarrollo se integran las funciones de adquisición,
análisis y presentación de datos.
-El sistema está dotado de un compilador gráfico para lograr la máxima
velocidad de ejecución posible.
-Tiene la posibilidad de incorporar aplicaciones escritas en otros lenguajes.
Labview posee extensas librerías de funciones y subrutinas. Además de las
funciones básicas de todo lenguaje de programación, incluye librerías
específicas para la adquisición de datos, control de instrumentación VXI, GPIB y
comunicación serie, análisis, presentación y almacenamiento de datos.
Labview también proporciona potentes herramientas que facilitan la
depuración de los programas.
Los programas desarrollados mediante Labview se denominan Instrumentos
Virtuales (VIs), porque su apariencia y funcionamiento imitan los de un
instrumento real. Sin embargo son análogos a las funciones creadas con los
lenguajes de programación convencionales. Los VIs tienen una parte interactiva
con el usuario y otra parte de código fuente, y aceptan parámetros procedentes
Capítulo Tercero Entorno Labview 15
de otros VIs. Todos los VIs tienen un panel frontal y un diagrama de bloques.
Las paletas contienen las opciones que se emplean para crear y modificar los
VIs. A continuación se procederá a realizar una breve descripción de estos
conceptos.
Panel Frontal: Es la interfaz gráfica que simula el panel de un instrumento real.
Permite la entrada y salida de datos, puede contener pulsadores, perillas,
botones, gráficos y en general controles e indicadores.
Los controles son objetos que sirven para ingresar datos al programa y
pueden ser manipulados por el usuario. Los controles son variables de
entradas.
Los indicadores sirven para presentar los resultados entregados por el
programa y no pueden ser manipulados por el usuario. Los indicadores son
variables de salida.
Figura 3.1 Panel frontal Labview operando en cierta aplicación.
Capítulo Tercero Entorno Labview 16
Diagrama de Bloques: El diagrama de bloques contiene el código fuente
gráfico del VI, posee funciones y estructuras que relacionan las entradas con
las salidas creadas en el panel frontal.
En un diagrama se distinguen: Terminales, que representan los controles e
indicadores del panel. Funciones y SubVIs, que realizan tareas específicas.
Estructuras y Cables que determinan el flujo de los datos en el programa. En
general, cualquiera de estas partes del diagrama de un VI se denomina NOD.
El diagrama de bloques de la figura 3.2 muestra el código fuente
correspondiente al panel de la figura 3.1
Figura 3.2 Diagrama de bloques de aplicación.
Paleta de herramientas: Contiene las herramientas necesarias para editar y
depurar los objetos tanto del panel frontal como del diagrama de bloques.
Figura 3.3 Paleta herramientas.
Capítulo Tercero Entorno Labview 17
Icono Herramienta Función
Operación
Asigna valores a los controles del panel frontal, se
encuentra disponible cuando se corre y edita la
aplicación.
Desplazamiento
Mueve todos los objetos dentro de la ventana activa.
Posición
Selecciona, mueve y redimensiona objetos. La herramienta
cambia el icono del puntero cuando pasa por encima de
objetos que pueden modificar su tamaño.
Etiquetado
Se utiliza para generar la estructura lógica de eventos
mediante la conexión de los terminales de cada objeto. Los
cables determinan el flujo de los datos.
Menú
desplegable
Permite obtener el menú de opciones de un objeto. Esta
misma función se puede realizar haciendo un clic derecho
del ratón sobre el objeto.
Punto de
quiebre
Detiene la ejecución del programa en el punto del diagrama
donde se ponga. Se utiliza con fines de depuración.
Punto de prueba
Se pone sobre algún cable de conexión para verificar de
forma temporal el valor que fluye a través de éste.
Capturar color Obtiene el color del objeto que se señale.
Colorear Cambia los colores de objetos y fondos.
Tabla 2 Íconos y sus Funciones en paleta de Herramientas
Capítulo Tercero Entorno Labview 18
Paleta de controles: Se utiliza únicamente en el panel frontal y contiene los
objetos necesarios para crear una interfase de entrada y salida de datos
(controles e indicadores).
Figura 3.4 Paleta de controles
Existen submenús correspondientes a toolkits que sólo aparecen cuando se
han instalado. Los toolkits son herramientas adicionales de software con fines
específicos y especializados que se suministran como productos por separado.
Cada submenú de la paleta contiene controles e indicadores respectivos de
una clase de objetos. En las siguientes figuras se ven algunos de los submenús
más importantes.
Capítulo Tercero Entorno Labview 19
Figura 3.5 Controles e indicadores numéricos y booleanos.
Paleta de funciones: Se usa únicamente en el diagrama de bloques y
contiene todos los objetos para crear y editar el código fuente .En la siguiente
figura se ven algunas de las funciones más utilizadas.
Figura 3.6 Paletas de funciones de cadenas, arreglos y numéricas
Capítulo Tercero Entorno Labview 20
3.3 Labview en Sistema Modelado
El software Labview en el sistema implementado estará encargado de
establecer comunicación con el dsPIC tanto para envío como para recepción de
datos. Una vez recibido la cadena de caracteres correspondiente Labview las
separará para su tratamiento individual ya sea de almacenamiento,
visualización e interacción con el usuario.
Figura 3.7 Papel que juega Labview en sistema implementado
Para establecer la comunicación con el dsPIC Labview nos brinda el driver
NI VISA, con el cual se podrá establecer comunicación serial con el dsPIC tanto
de recepción como de envío de datos. Las funciones utilizadas para este fin son
las siguientes:
Capítulo Tercero Entorno Labview 21
1. VISA Configurate Serial Port: Sirve para configurar el puerto serie con los
siguientes parámetros: velocidad, protocolo, paridad, bits de datos, habilitar
carácter de terminación. En VISA Resource Name se indica cuales son los
puertos disponibles para la transmisión.
Figura 3.8 Visa Configurate Serial Port
2. Visa Write: Bloque encargado de leer un número especifico de bytes desde
el buffer, suele utilizarse a continuación del bloque VISA Configurate Serial Port.
Figura 3.9 Visa Write
3. Visa Read: Cumple la función contraria al bloque anterior indicarle el
numero de bytes que debe leer desde el buffer. Para darle un valor a este
parámetro suele usarse la salida de la propiedad VISA Bytes at Serial Port.
Figura 3.10 Visa Read
Capítulo Tercero Entorno Labview 22
4. Visa Close: Cierra una sesión VISA. Se puede cerrar automáticamente en
el menú Tools.
Figura 3.11 Visa Close.
5. VISA Bytes at Serial Port: Es una propiedad del driver VISA, que dá el
número de bytes que están en el buffer esperando para ser leídos. Aparte de
esta propiedad hay otras que pueden cambiar la configuración del puerto.
Figura 3.12 Bytes at Serial Port.
Una vez establecida la comunicación entre el dsPIC y Labview, es necesario
interpretar y separar en datos individuales la cadena recibida para el caso de
recepción de datos en Labview se utilizaron las siguientes funciones:
6. Search/Split String Function y Match True/False String Function: Con
estas funciones se procede a separar los identificadores de la cadena recibida.
Esto para ser tratados en procedimientos posteriores de manera individual.
Figura 3.13 Funciones Search/Split String y Match True/False String.
Capítulo Tercero Entorno Labview 23
7. Fract/Exp String To Number Function: Función encargada de convertir la
cadena de caracteres que ha sido separada con la función anterior a un número
real. Con esta función se puede definir la cantidad de decimales de precisión
que se requieran.
Figura 3.14 Función Fract/Exp String To Number
8. In Range and Coerce Function: Esta función será la encargada de ver si el
número convertido anteriormente está en el rango que se desea. Se utilizará
para establecer indicadores de alarma cuando el número no se encuentre en el
rango adecuado.
Figura 3.15 Función In Range and Coerce
9. Set Dynamic Data Attributes: Este bloque se utiliza para poner nombre a
los datos anteriormente separados y analizados. Este nombre se visualizará
posteriormente en la planilla Excel donde se almacenen los datos. También se
establecerá la hora y fecha en las que fueron tomadas estas mediciones.
Figura 3.16 Bloque Set Dynamic Data Attributes
Capítulo Tercero Entorno Labview 24
10. Merge Signals Function: Una vez recibido los datos y mostrados en
pantalla se unen utilizando esta función para ser tratados nuevamente como
una cadena y ser almacenados en Excel.
Figura 3.17 Función Merge Signals.
11. Write To Measurement File: Funcion encargada de almacenar los datos
enviados por la función anteriormente descrita. Los datos serán almacenados
con su respectivo nombre y en columnas diferentes además indicando la fecha
y hora en que fueron adquiridos.
Figura 3.18 Write To Measurement File
Para el caso de envío de datos hacia el dsPIC, hay que tener en cuenta que
se enviaran doce cadenas diferentes, cada una con su respectivo identificador
primario y carácter de finalización que en este caso es igual para todos. Se
establecen estos caracteres para una correcta identificación por parte del dsPIC
de las variables enviadas desde Labview, para ello se utilizaron las siguientes
funciones.
Capítulo Tercero Entorno Labview 25
12. Format Into String Function: Esta función será encargada de concatenar
el número que desee enviar el usuario para la calibración del canal con el
identificador primario.
Figura 3.19 Función Format Into String
13. Build Array Function: Función encargada de construir un arreglo con las
doce cadenas nombradas en la función anterior, se utilizara para que después
en el paso posterior a este, el usuario pueda seleccionar la cadena a enviar.
Figura 3.20 Función Build Array
14. Index Array Function: Función en la cual llega el arreglo construido
anteriormente. A esta función se le añade un menú tipo ring para seleccionar la
cadena desde el panel frontal.
Figura 3.21 Index Array
Capítulo Tercero Entorno Labview 26
15. Ring Menú: Control que se encuentra en el panel frontal, en el que se
seleccionará la cadena a enviar.
Figura 3.22 Menú tipo Ring
16. Concatenate Strings: Función encargada de concatenar la cadena
seleccionada en el paso anterior con el carácter de terminación. Con la
utilización de todas estas funciones se asegurará que la cadena de caracteres
enviada por Labview sea válida y por lo tanto utilizable por el dsPIC.
Figura 3.23 Función Concatenate Strings.
Además de las funciones utilizadas en lectura y escritura en el puerto serial se
ocuparon otras de propósito general.
17. Feedback Node: Corresponden a los ciclos de iteración del sistema. En
este caso se utilizaron los ciclos “While” y “Case”.
Figura 3.24 Ciclos While y Case.
Capítulo Tercero Entorno Labview 27
18. Shift Register: Se utiliza para comparación entre los valores en cada
iteración de una variable requerida.
Figura 3.25 Shift Register.
19. Wait (ms) y Elapsed Time: Establecen bases de tiempo con las que se
controlan diversas rutinas dentro del programa principal.
Figura 3.26 Funciones Wait (ms) y Elapsed Time
.
CAPÍTULO IV
SISTEMA EXPERIMENTAL
Capítulo Cuarto Sistema Experimental 28
4. Sistema Experimental.
4.1 Introducción
En el presente capítulo se explicará la implementación del hardware necesario
para realizar el sistema requerido basándose especialmente en el
procesamiento de la señal de entrada en la tarjeta dsPIC.
Los datasheet correspondientes junto con el modelo esquemático de la tarjeta
dsPIC se mostrarán en los anexos parte 2.
Además se explicará la implementación del software necesario para realizar la
aplicación. Para ello se utilizará el método de diagrama de flujo, esto porque
permite una visualización gráfica de las rutinas más importantes que luego
fueron traspasadas tanto a lenguaje C (para programar el dsPIC) como a
lenguaje G (utilizado en Labview).
Se mostrarán dos diagramas de flujo: uno para la programación del dsPIC y el
otro para la programación gráfica mediante Labview. Esto para que no haya
confusión en las variables a utilizar, pero no hay que olvidar que estos
programas funcionan conjuntamente.
Los diagramas de flujo mostrados a continuación son meramente a modo de
explicación de las rutinas necesarias para desarrollar la aplicación, además se
explicarán solamente los procesos más importantes de ambos programas. Esto
para hacer más comprensible los respectivos diagramas.
Los códigos reales de ambos programas podrán ser vistos en los Anexos
Parte 1.
Capítulo Cuarto Sistema Experimental 29
4.2 Hardware implementado
La unidad física principal del sistema corresponde a la tarjeta dsPIC, en ella se
alojarán los conectores necesarios para interactuar tanto con los sensores
como con el computador, además será donde se encuentre físicamente la
unidad central del sistema dsPIC30F6013A.
La tarjeta dsPIC fue diseñada y montada por el profesor guía de este trabajo
de título Don Iván Andrade Agüero.
Figura 4.1 Tarjeta dsPIC
Principales características:
-Seis entradas 4-20mA, para lo cual es necesario el integrado RCV420(Anexos
parte 2).
-Cuatro salidas 4-20mA, para lo cual es necesario el integrado AD694 (Anexos
parte 2).
-Diez entradas 0-10V.
-Cuatro salidas 0-5V.
-Dos puertos RS-232, utilizados para comunicación serial, para lo que es
necesario un MAX232 (Anexos parte 2).
Capítulo Cuarto Sistema Experimental 30
-Dos puertos RS-485, para comunicación serial y otros, para lo que es
necesario el integrado SN75176BD (Anexos parte 2).
-Pines habilitados para conexión directa con LCD Lumex S02004 (Anexos parte
2).
-Banco de memorias externas 24LC512 (Anexos parte 2).
En este trabajo de título se utilizaron las entradas 4-20mA, en la cuales se
ingresarán corrientes que serán enviadas por los sensores, cada una por su
respectivo canal. Para una correcta recepción por parte del dsPIC la señal debe
seguir los siguientes pasos.
Figura 4.2 Tratamiento de señal de instrumentación.
Capítulo Cuarto Sistema Experimental 31
Conversión a tensión legible por ADC: Se utiliza el integrado RCV420 para
hacer la conversión corriente-tensión necesaria. En su configuración básica el
RCV420 hace la conversión 4-20mA a 0-5V. Se cambió esta configuración para
aumentar el rango de entrada a 0-20mA, esto para hacer posible la detección
del cero real (circuito abierto) e implementar rutinas para este caso.
Figura 4.3 Configuración 0-20mA de entrada para integrado RCV420
Filtrado de señal: Para ello se utilizó el integrado MCP6231 (anexos parte 2),
debido a su baja tensión de alimentación. Corresponde a un amplificador
operacional, se empleó como filtro de segundo orden de Butterworth con
frecuencia de corte de 100 Hz y ganancia unitaria.
Figura 4.4 Filtro Pasa Bajos Implementado
Capítulo Cuarto Sistema Experimental 32
Conversión A/D: Luego del filtrado de la señal, ésta llegara en forma de
tensión al conversor análogo digital encargado de digitalizarla. Para ello realiza
muestras utilizando el sistema de captura y mantenimiento (Sample and Hold).
Cada cierto tiempo toma una muestra de la señal ingresada y mantiene este
valor en un condensador (circuito interno del dsPIC). Este proceso convierte la
señal ingresada en un número que en este caso variará de 0 a 4096 (ya que el
conversor análogo digital es de 12 bits) número que corresponde
proporcionalmente a la tensión ingresada al ADC.
Comunicación Serial: Para intercambio de datos entre el computador y el
dsPIC se estableció comunicación serial entre ambos. Para esto es necesario
utilizar el integrado MAX232 .
Figura 4.5 Comunicación serial dsPIC-PC
El dsPIC posee dos módulos UART disponibles, los que permiten dos
comunicaciones simultáneas e independientes full-duplex. En este trabajo de
título se utilizó solamente la UART1 tal y como se ve en la figura 4.5, la UART2
quedará disponible para comunicaciones futuras.
Capítulo Cuarto Sistema Experimental 33
4.3 Modelación de programa implementado en dsPIC30F6013A
Para la elaboración del programa implementado el en dsPIC se utilizó el
compilador proporcionado por la empresa MICROCHIP para estos fines.
El programa se realizó en torno al programa MPLAB, que en conjunto con el
compilador C30 permite realizar el programa en un leguaje de alto nivel como
el “C”. Para cargar el programa diseñado se utiliza el programador ICD 2(In-
Circuit Debugger), el cual es un dispositivo que permite programar y depurar
una gran cantidad de dispositivos fabricados por MICROCHIP. Su función
principal utilizándolo como programador es tomar el código ensamblado y
cargarlo en el dispositivo que se desee programar.
Figura 4.6 Programador ICD 2
Capítulo Cuarto Sistema Experimental 34
A continuación se explicara de forma general la modelación del programa en
el dsPIC, utilizando para ello el diagrama de flujo.
A grandes rasgos el programa se dividirá en cuatro partes fundamentales
como se ve en la siguiente figura.
Figura 4.7 Diagrama general Programa dsPIC
Capítulo Cuarto Sistema Experimental 35
Adquisición de datos: Este proceso será el encargado de recibir los datos
necesarios para hacer los cálculos de los parámetros leídos. Estos datos serán
adquiridos por el puerto ADC del dsPIC, y mediante Labview. Los datos
adquiridos por el puerto ADC corresponden a las corrientes ingresadas a la
tarjeta dsPIC. Los datos adquiridos a través de Labview corresponden a los
parámetros de calibración de los sensores y serán ingresados a través del
computador.
Almacenamiento en memoria: Proceso encargado de almacenar los datos
obtenidos a través de Labview. Para que la calibración quede almacenada y no
sea necesario cada vez que se inicia el sistema volver a enviar los datos de los
sensores.
Cálculo de los parámetros: Proceso que realizará todos los cálculos
necesarios para obtener valores reales de los parámetros leídos. Será el
encargado de traducir los valores obtenidos mediante el ADC a corrientes y en
conjunto con los datos obtenidos a través de Labview obtener el valor real de la
medición.
Envío de datos: Una vez calculados los parámetros serán enviados mediante
puerto serial, de una forma que posibilite la correcta comunicación entre
Labview y el dsPIC.
Con lo antes señalado el diagrama de flujo se puede visualizar en la figura 4.3.
Capítulo Cuarto Sistema Experimental 36
Figura 4.8 Diagrama flujo Programa dsPIC
Capítulo Cuarto Sistema Experimental 37
4.3 Modelación de programa implementado en Labview.
Para la modelación del programa en Labview es necesario conocer las tareas
que dicho programa debe realizar, estas tareas se pueden visualizar en la
siguiente figura.
Figura 4.9 Diagrama general programa en Labview
Capítulo Cuarto Sistema Experimental 38
Envío de datos al dsPIC: Proceso encargado de enviar los valores con los
que serán calibrados los sensores. Estos valores los elegirá el usuario y con
ellos el dsPIC hará el cálculo para obtener los valores reales de los parámetros
medidos por los sensores.
Recepción de datos del dsPIC: Una vez el dsPIC haya recibido los datos
enviados por Labview junto con los valores obtenidos por los respectivos
puertos ADC, hará el cálculo de los valores medidos por los sensores y los
enviará al Labview nuevamente. Luego esta trama de caracteres será
interpretada y separada por Labview para su tratamiento posterior.
Visualización de los valores reales en pantalla: Luego de la interpretación y
separación de los caracteres obtenidos mediante puerto serial, el programa
Labview mostrará y/o graficará los valores reales que están midiendo los
sensores.
Almacenado de datos: Este proceso le permite elegir al usuario el tiempo de
exportación a Excel, con esto se ofrece la capacidad de almacenamiento de
datos incluyendo fecha y hora de cuando se obtuvieron para un posterior
análisis.
Con esto el diagrama de flujo del programa realizado en Labview se puede
ver en la figura 4.10.
Capítulo Cuarto Sistema Experimental 39
Figura 4.10 Diagrama flujo programa implementado en Labview.
CAPÍTULO V
PRUEBAS Y APLICACIÓN PRÁCTICA
Capítulo Quinto Pruebas y Aplicación Práctica 40
5. Pruebas y Aplicación Práctica.
5.1 Introducción
En este capítulo se detallará el funcionamiento de la aplicación gráfica
realizada. Se explicarán las posibilidades que permite el programa realizado en
Labview, y se mostrarán los resultados obtenidos en aplicaciones
experimentales y prácticas
La aplicación gráfica realizada tiene la capacidad de poder adaptar su
funcionamiento a las necesidades que el usuario presente. Esto porque permite
la interacción con el dsPIC para ajustes según el sensor que se acople a la
tarjeta dsPIC. Además de ello los indicadores se pueden cambiar para una
mejor para que su aspecto sea el acorde a la variable medida.
Junto con poder visualizar el estado y valor medido por los sensores en el
software Labview, se ofrece la alternativa de ver esto mismo en una pantalla
LCD la cual mostrará los mismos valores que en Labview, además de los
respectivos indicadores de estado.
Para la implementación práctica del sistema se diseñó un panel frontal
específico para la aplicación. A modo de prueba se eligió el sistema de bombeo
que se encuentra en el Laboratorio de Electricidad “Juan Friedli Thomi”. Este
sistema de bombeo cuenta con tres sensores 4-20mA, encargados de hacer
mediciones de presión, nivel y temperatura. Estos sensores fueron conectados
a la tarjeta junto con su respectiva alimentación para así completar el lazo de
corriente y realizar la medición correspondiente.
Capítulo Quinto Pruebas y Aplicación Práctica 41
5.2 Aplicación gráfica para propósitos generales
El software desarrollado en Labview permite al usuario la interacción en
tiempo real con el sistema realizado para ello a continuación se describirán las
posibilidades existentes en la aplicación grafica implementada.
Figura 5.1 Aspecto general aplicación grafica.
En la figura anterior se ve una captura que muestra el funcionamiento en una
aplicación experimental. Como se puede ver se tiene un canal con ingreso de
corriente. Este canal fue configurado para que su indicador fuera una gráfica en
tiempo real del valor ingresado pero, como se ve en la figura 5.1, el sistema
permite que los indicadores sean cambiados por el usuario a voluntad.
Capítulo Quinto Pruebas y Aplicación Práctica 42
Figura 5.2 Captura Canal 1 funcionando.
En la figura 5.2 se muestra una aproximación al modo de funcionamiento del
Canal 1. La explicación de éste se extrapolará al resto de los canales puesto
que funcionan de similar manera. En la figura anterior se pueden visualizar una
serie de indicadores y controles que se explicarán a continuación.
Canal 1: Corresponde a un indicador numérico en el cual se visualizará el
valor del parámetro leído. Es importante señalar que solamente cambiará
cuando haya valores correctamente ingresados, en caso contrario indicará cero.
Status: Indicador de caracteres. Podrá tener dos estados”Ok” y “Falla”. Éstos
estados cambiaran dependiendo si se están ingresando valores válidos al canal
uno del sistema. Por ejemplo si no hay sensor conectado en este canal este
indicador cambiara a “Falla”, y como se puede ver en la figura para valores
validos muestra el mensaje “Ok”.
Capítulo Quinto Pruebas y Aplicación Práctica 43
Menú tipo “Ring”: En la figura 5.3 se visualiza con el nombre “Gráfica” y con
ello el indicador seleccionado será una gráfica, pero puede ser cambiado por
cinco valores diferentes con ello el usuario podrá elegir el indicador que le
parezca más adecuado para sus necesidades.
Figura 5.3 Menú Ring desplegado
Figura 5.4 Variedad de indicadores desplegables
Es importante decir que las escalas de los indicadores de Temperatura,
Presión. Nivel y Flujo son ajustables por el usuario al momento que corre el
programa situándose con el cursor sobre el valor que desea editar. La escala
del gráfico se ajustará automáticamente.
Máximo Canal 1 y Mínimo Canal 1: Controles numéricos en los que el
usuario deberá indicar los valores máximo y mínimo del sensor conectado en el
canal 1 de la tarjeta. Por ejemplo, tiene un sensor conectado de rango 0ºC a
50ºC entonces deberá cambiar el control numérico (Máximo Canal 1) a 50, tras
ello deberá seleccionar este mismo parámetro para enviar este valor al dsPIC y
tras ello hacer click en el botón “Calibrar”. Estos indicadores están configurados
para tener los valores 100 y 0 respectivamente por defecto, el usuario los podrá
cambiar a voluntad posteriormente.
Capítulo Quinto Pruebas y Aplicación Práctica 44
Figura 5.5 Menú desplegable para seleccionar parámetro a calibrar
El sistema implementado posee además la capacidad de exportar los datos
obtenidos a una planilla Excel separados por columnas cada canal
correspondiente. Para ello se establece el control mediante las opciones que
muestra la siguiente figura.
Figura 5.6 Configuración para Exportación a Excel
Seg Exportación: Control numérico en el que el usuario establecerá cada
cuanto tiempo (en segundos) desea que se realice la exportación.
Seg Transcurridos: Indicador numérico en el que se muestran los segundos
que han pasado desde la ultima exportación. Este indicador se reiniciará cada
vez que se realice una nueva exportación. El dibujo inferior de la figura
parpadeará cada vez que haya una exportación. Los datos se exportarán en la
dirección mostrada en la figura 5.6.
Capítulo Quinto Pruebas y Aplicación Práctica 45
Además el sistema cuenta con un botón para detener el sistema y un menú
tipo Ring en el cual el usuario seleccionará la puerta serial disponible en su
computador para establecer la comunicación con el dsPIC.
Figura 5.7 Menú puerta serial y botón de detención.
En la aplicación realizada una vez detenido el programa se pueden visualizar
los datos exportados en la dirección antes descrita. Para la interacción entre
Labview y Excel se utilizó el complemento “tdm_excel_add-in_2010”,
proporcionado por National Instrument y es necesario para realizar esta tarea.
Además posee la facultad de exportar a archivos “.txt” (block de notas), pero se
eligió Excel por la facilidad de manipulación de columnas y filas que este último
ofrece. En la siguiente figura se puede ver una captura de la tabla obtenida al
hacer la exportación.
Figura 5.8 Captura tabla Excel obtenida tras exportación.
Capítulo Quinto Pruebas y Aplicación Práctica 46
La figura 5.8 muestra un ejemplo de las tablas obtenidas en Excel tras la
exportación hecha por Labview. Hay que señalar que para este caso los datos
fueron enviados cada cinco segundos y solo en el canal 1 de la tarjeta dsPIC
había ingreso de corriente, por lo que es el único que ofrece valores validos
para exportar, los canales dos y tres estaban sin conexión pero calibrados y los
canales cuatro cinco y seis estaban sin calibración y sin conexión por ello se
visualizan valores nulos.
Además de la posibilidad de ver los datos obtenidos a través del software
Labview, el sistema implementado posee un LCD marca LUMEX S02004 D en
el que también se podrán ir visualizando en tiempo real los valores de las
variables medidas. La pantalla se irá actualizando cada segundo, y cada vez
que se actualice se podrán mensajes como el de la figura 5.9.
Figura 5.9 Captura mensaje LCD.
Tal y como se ve en la figura anterior el LCD ofrece una alternativa de
visualización de los parámetros. Para el caso de la figura 5.9 sólo se tuvo el
canal 1 de la tarjeta dsPIC con ingreso de corriente, es por ello que se visualiza
el estado “Ok”. En los canales restantes no hubo corriente ingresada y por lo
tanto se visualiza el estado “Falla”.
Capítulo Quinto Pruebas y Aplicación Práctica 47
5.3 Descripción general sistema de bombeo
El sistema de bombeo consta de dos estanques por donde circulará el agua.
Ésta es transportada por una bomba hacia el tanque superior, además consta
de una válvula para vaciar el contenido del tanque superior hacia el inferior
mediante gravedad.
Al encender la bomba el agua del tanque inferior es transportada hacia el
superior, con ello cambiará la lectura del sensor de nivel instalado en el tanque
inferior, además aumentará la presión del sensor instalado. El cambio del valor
de temperatura se registra con un sensor tipo PT-100 y su respectivo
transmisor.
Figura 5.10 Sistema de bombeo
En la Figura 5.11 se puede ver una imagen del transmisor de temperatura
utilizado en la medición de este parámetro. Corresponde al modelo 3144 de la
marca Rosemount. Está calibrado para registrar valores comprendidos entre -
10ºC y 150ºC, con una corriente de salida entre 4 y 20mA para el mínimo y
Capítulo Quinto Pruebas y Aplicación Práctica 48
máximo respectivamente. Su alimentación está en el rango de 12 y 42.4 VDC.
Se utilizó 24VDC.
Figura 5.11 Transmisor de temperatura.
Para la medición de nivel se utilizó un transductor de nivel de la empresa
Rosemount modelo 3051 de 60 ( ), de 4-20mA. Para convertir la
medición presión en nivel se utiliza la siguiente relación.
Donde P es la presión, es la densidad del liquido a medir y h corresponde a
la altura, como “ρ” y “g” corresponden a variables conocidas y “P” es la variable
medida se despeja “h” que corresponderá a la altura del liquido medido. El
sensor y transmisor están calibrados para medir alturas que están en el rango
de 0 a 40 cm para 4 y 20mA respectivamente.
Figura 5.12 Transmisor Rosemount modelo 3051
Capítulo Quinto Pruebas y Aplicación Práctica 49
Para la medición de presión se utilizó un transductor marca Industrie
Messtechnik modelo 3249. Para mediciones de presión en el rango de 0 a 4
bares, con salida 4-20mA respectivamente, además el sistema de bombeo
cuenta con un manómetro con fondo de escala de 25 que se utilizará
para la verificación de resultados.
Figura 5.13 Transductor de presión.
Utilizando los tres transmisores descritos el circuito quedaría como se ve en la
Figura 5.14, donde se utilizan tres de los seis canales disponibles en la tarjeta
dsPIC.
Figura 5.14 Conexión sistema de Bombeo tarjeta dsPIC.
Capítulo Quinto Pruebas y Aplicación Práctica 50
5.4 Panel frontal especifico para sistema de bombeo.
Los tres sensores disponibles en el sistema de bombeo fueron conectados a
las entradas de corriente disponibles en la tarjeta dsPIC, junto con los valores
entregados por los transmisores y la calibración necesaria hecha a través del
software Labview obtendremos mediciones precisas de las variables reales
medidas por los sensores
Figura 5.15 Sistema de Bombeo, en sistema implementado
Capítulo Quinto Pruebas y Aplicación Práctica 51
Para la aplicación en el sistema de bombeo se diseñó un panel frontal que se
adapte a esta necesidad. Para las pruebas realizadas en el sistema de bombeo
se utilizaron los canales uno, dos y tres para mediciones temperatura, nivel y
presión respectivamente, además se añadieron una serie de indicadores y
controles que se pueden ver en la Figura 5.16.
Figura 5.16 Panel frontal para sistema de bombeo
El funcionamiento de este nuevo panel frontal es similar al mostrado
anteriormente, además se incluyeron una serie de indicadores de estado para
los sensores utilizados en esta aplicación. También se añadieron opciones para
controles auxiliares con lo que se ofrece la posibilidad de utilizar o no los tres
canales restantes disponibles en la tarjeta. Para utilizar estos tres canales
restantes se implementó un control del tipo booleano con el que el usuario
puede seleccionar o no el despliegue de indicadores para los canales restantes
Capítulo Quinto Pruebas y Aplicación Práctica 52
En la Figura 5.17 se puede ver el nuevo panel frontal totalmente desplegado.
Cabe destacar que en las pruebas realizadas estos canales no fueron
conectados ni calibrados ya que no se disponían de más sensores 4-20mA.
Figura 5.17 Panel frontal sistema de bombeo totalmente desplegado
Los tres canales adicionales desplegados ofrecen la posibilidad de cambiar los
indicadores dependiendo de la necesidad tal y como sucede en el panel frontal
de propósitos generales.
Capítulo Quinto Pruebas y Aplicación Práctica 53
En la figura 5.18 se muestra la exportación obtenida en una prueba realizada
con el sistema de bombeo conectado a la tarjeta dsPIC.
Figura 5.18 Captura obtenida tras prueba en sistema de bombeo.
Los canales cuatro cinco y seis no fueron utilizados en esta prueba por lo que
se visualizan nulos en esta captura. La prueba consistió en vaciar el contenido
del tanque superior de agua hacia el inferior. Una vez vacío el tanque superior
se procedió a encender la bomba para llevar el agua de regreso al tanque
superior y como se ve, produce un aumento en la presión medida por el
transductor. La temperatura es prácticamente inherente a estos cambios y se
mantiene en un valor relativamente constante. Los valores obtenidos fueron
verificados con el indicador que posee el transmisor de temperatura, la escala
al costado del tanque inferior y el manómetro de presión instalado y con ello se
pudo comprobar que la obtención de los parámetros medidos fue realizada
satisfactoriamente.
Capítulo Quinto Pruebas y Aplicación Práctica 54
En la figura 5.19 se muestra una grafica de los datos de la captura vista en la
figura 5.18, en la gráfica se visualiza el aumento de presión al encender la
bomba. Se multiplicaron los valores de presión por diez para así facilitar la
visualización de sus valores.
Figura 5.19 Gráfica valores obtenidos por sistema implementado
CAPÍTULO VI
CONCLUSIONES
Capitulo Sexto Conclusiones 55
6. Conclusión General
La correcta obtención de las variables físicas sensadas en un proceso es de
vital importancia para el ambiente industrial, puesto que permite una correcta
manipulación de dichos procesos, establecer parámetros de seguridad y la
posibilidad de almacenamiento en el tiempo para su posterior análisis
En general las posibilidades de aplicaciones utilizando un microcontrolador
como unidad central del sistema están dadas por las necesidades del usuario.
Para el caso presentado en este trabajo de título la utilización de un dsPIC
como unidad central de un sistema de monitoreo y gestión de variables
industriales es muy satisfactoria y brinda una gran cantidad de opciones en
aplicaciones futuras.
Durante el tiempo invertido en el desarrollo de este trabajo de título se logró
adquirir valiosos conocimientos en el ámbito de controladores digitales de
señales y sus numerosos campos de aplicación no sólo en la industria sino que
en la vida diaria.
La interfaz gráfica realizada en el software Labview se hizo con el fin de
establecer una comunicación amigable entre un hipotético operador del sistema
con el proceso sensado. Esto conllevó a conocer una de las múltiples
aplicaciones del software Labview en el ámbito de la ingeniería eléctrica.
La comunicación establecida entre el dsPIC y Labview mediante puerto serie
fue realizada con éxito y estabilidad en el tiempo, lo que hace que el sistema
implementado sea confiable y de rápida actualización.
Las características de la tesis realizada tanto en la utilización del dsPIC como
Labview permiten que en el futuro sean utilizados más de los recursos
disponibles en ambos casos para necesidades más diversas y complejas.
Capitulo Sexto Conclusiones 56
El principal aprendizaje que se obtuvo realizando este trabajo de título fue el
conocimiento adquirido de programación en dos lenguajes de alto nivel como lo
son, lenguaje G (Labview) y lenguaje C (dsPIC), a pesar de la gran dificultad
que se presentó al principio del desarrollo de este trabajo de título se logró
adquirir invaluable conocimiento en ambos casos que a su vez se pretende ir
mejorando en el futuro.
A pesar de que los códigos implementados en ambos casos son bastante
largos y de mediana complejidad se hicieron con el fin de poder ser modificados
y optimizados para así añadir múltiples aplicaciones futuras. Esto porque los
recursos disponibles tanto en la tarjeta dsPIC, la comunicación con el software
Labview y la aplicación gráfica realizada en este último permite que este
sistema utilizado en conjunto ofrezca un control además del monitoreo en una
gran variedad de procesos industriales.
Referencias Bibliográficas 57
[1] dsPIC Family Reference Manual. Documento MICROCHIP.
[2] dsPIC30F6011A/6012A/6013A/6014A .Datasheet MICROCHIP.
[3] dsPIC Language Tools Libraries. Documento MICROCHIP.
[4] Historia, Manejo y Aplicaciones de los Controladores Digitales de
Señales dsPIC, Cintya Carolina Pavón, Oscar Alejandro Cruz.
[5] dsPIC Diseño Práctico de Aplicaciones, José María Angulo, Aritza
Etxebarria Ruiz, Ignacio Angulo Martínez, Ivan Trueda Parra.
[6] Introducción a Labview Curso de Seis-Horas. Documento NATIONAL
INSTRUMENTS.
[7] Labview, Entorno Gráfico de Programación, José Rafael Lajara Vizcaíno,
José Pelegrí Sebastiá,
[8] Control y Supervisión de Motores Comandados desde un MCC. Tesis
Cristian Monroy Arteaga
ANEXOS PARTE 1:
CÓDIGOS DE PROGRAMAS
Anexos Parte 1 57
Anexos Parte 1
Descripción de periféricos y registros asociados utilizados
Para un correcto funcionamiento del dsPIC se deben configurar mediante
software tanto los periféricos y sus registros asociados como la asignación de
pines con la que contaremos en nuestro sistema. En nuestro caso utilizaremos
una serie de módulos disponibles en el dsPIC, los cuales explicaremos a
continuación.
Todos los puertos del dsPIC tienen asociados directamente tres registros de
control: TRIS, PORT y LAT.
Registros TRIS: Con este registro de control configuramos los pines de los
puertos si son entradas o salidas. Por defecto cada vez que hay un reset en el
DSPIC este configura al puerto como entrada.
Registros PORT: En este registro se encuentra el valor actual de entrada o
salida del DSPIC.
Registro LAT: Con los registros LAT escribimos o leemos desde el registro
cerrojo del DSPIC y no desde los pines físicos del mismo.
Conversor Análogo Digital (ADC): El dsPIC nos permite hacer una rápida y
fiable conversión análoga/digital, para ello cuenta con un ADC de 12 bits de
precisión.
La conversión se realiza en tres etapas: muestreo de la señal, cuantificación
de la señal que consiste en llevar el valor análogo a un valor de
combinaciones y la cuantificación de la señal que consiste en agregarle los
ceros y unos a la señal convertida, el modulo ADC del dsPIC posee las
siguientes características.
-Tiempo de muestreo de 154ns.
-Conversión de aproximaciones sucesivas.
-Velocidad de conversión de hasta 500Ksps.
-Modo automático de exploración de canal.
-La tensión analógica de referencia puede ser seleccionada por software.
Anexos Parte 1 58
Para la configuración del módulo ADC debemos configurar a seis registros de
control y de estado: ADCON1, ADCON2, ADCON3, ADCHS, ADPCFG,
ADCSSL.
ADCON1: Sirve para controlar el funcionamiento del conversor, el
funcionamiento en modo IDLE (desocupado), formato de salida del conversor,
para indicar el inicio y secuencia de la conversión. En la siguiente figura
veremos los bits encargados para realizar lo antes señalado.
Configuración registro ADCON1.
ADCON2: Sirve para seleccionar la tensión de referencia positiva o negativa
del ADC, además nos indica que canales están siendo seleccionados en la
conversión, para configurar el buffer de salida de conversión.
Configuración registro ADCON2.
Anexos Parte 1 59
ADCON3: Para seleccionar el tiempo de conversión TAD, el tiempo de
muestreo, para seleccionar la fuente del reloj de conversión y las treinta dos
posibilidades del tiempo del reloj de conversión.
Configuración registro ADCON3.
ADCHS: Es el encargado de seleccionar las entradas que van ha ser
conectados a los amplificadores de muestreo y retención, además sirve para
seleccionar a que entrada positiva o negativa de los amplificadores conectamos
las entradas y esto lo hacemos gracias a un MUX A y MUX B y los bits 15,..,8
configuran al MUXB y los bits 7,…,0 configuran al MUX A.
Configuración registro ADCHS.
ADPCFG: Este registro me indica cuales son los pines del dsPIC que
trabajaran como I/O digital, si colocamos un `1´ será para que sean entradas
digitales, si las queremos análogas debemos colocar un `0´ en este registro.
Anexos Parte 1 60
Configuración registro ADPCFG.
ADCSSL: Con este registro podemos seleccionar el orden en que estas
entradas serán seleccionadas, al igual que el registro anterior utiliza todos sus
bits para realizar esta función.
Configuración registro ADCSSL.
Modulo UART: Este módulo permite la comunicación Universal Serial
Asíncrona full dúplex o serial asíncrono con ordenadores, con interfaces RS 232
y RS 485, entre las principales características son:
-La transmisión de datos es de 8 o de 9 bits.
- Trabajar con paridad impar, par o sin paridad.
-Uno o dos bits de parada.
-Tiene un generador de baudios con preescalador de 16 bits que se encarga de
dar la frecuencia de trabajo al modulo.
-Los buffers de transmisión y recepción son de máximo cuatro caracteres.
Anexos Parte 1 61
Para el correcto funcionamiento del modulo UART debemos configurar
algunos registros para el bloque generador, transmisor y receptor.
UxSTA: Este registro produce una interrupción cuando enviamos un bit para el
registro de desplazamiento TSR, podemos habilitar o deshabilitar la trasmisión,
bits de error para saber si hay error en la transmisión o recepción.
Configuración registro UxSTA
UxBRG: Registro encargado de dar el valor del Baudrate a utilizar.
Configuración registro UxBRG
UxMODE: Registro encargado de dar modo a la UART.
Configuración registro UxMODE.
Anexos Parte 1 62
UxSTA: Registro de estado de la UART, encargado de configurar transmisión
y recepción.
Configuración registro UxSTA.
Modulo Temporizador: El dsPIC30F6013A cuenta con 5 temporizadores,
cada uno de 16 bits, para controlar el comportamiento de los temporizadores
cada uno cuenta con tres registros asociados de 16 bits cada uno, los que
señalare a continuación.
TMRx: Registro encargado de guardar el valor que establece el tiempo a
controlar.
PRx: Registro de periodo asociado al temporizador.
TxCON: Registro de control.
Configuración registros temporizador
Los temporizadores pueden solicitar interrupción al producirse su
desbordamiento, que se regulan con los siguientes registros.
TxIE: Registro que contiene los bits de permiso para las diversas
interrupciones de los temporizadores.
TxIF: Sus bits actúan como señalizadores del desbordamiento de los
temporizadores.
TxIP: Son tres bits dedicados a cada temporizador que establecen el nivel de
prioridad de la interrupción correspondiente.
Anexos Parte 1 63
Código de programa dsPIC30f6013A
//Programa realizado para funcionamiento dsPIC proyecto de titulo //Realizado por Hebert Ruiz e Ivan Andrade //Apadtado para trabajar con Labview v2009 //Utiliza entradas de corriente disponibles en tarjeta dsPIC //Comunicacion serial utilizando UART1 para transmision y recepcion #include <p30f6013A.h> #include <stdlib.h> #include <stdio.h> #include <reset.h> #include <string.h> #include <uart.h> #include <math.h> #include "eeprom.h" #include "reset.h" #include "lcd.h" //declaracion de fusibles _FOSC(CSW_FSCM_OFF & XT_PLL8); //con XTAL de 7.3728Mhz PLLx8 se tienen Fclock=58.9824MHz ==> 14.7456MIPS _FWDT(WDT_OFF); _FBORPOR(PBOR_OFF & BORV_20 & PWRT_16 & MCLR_EN); _FGS(CODE_PROT_OFF); #define FCY 14745600 // 16MIPS (nseg) #define BaudRated 57600 // Velocidad de transferencia #define EEPROM_0 0xF800 // 2k de la 7FF800 a la 7FFFFE //DECLARACION DE VARIABLES GLOBALES DEL PROGRAMA float ADCvalue2=0; float ADCvalue3=0; float ADCvalue4=0; float ADCvalue5=0; float ADCvalue0=0; float ADCvalue1=0; unsigned int valor0[5]; unsigned int valor1[5]; unsigned int valor2[5]; unsigned int valor3[5]; unsigned int valor4[5]; unsigned int valor5[5]; int i=1; int cont=0; int cont2=0; int cont_valve=0; int espera_valvula=0; volatile unsigned char rtc_lcd_update; unsigned char DISPLAY=0; unsigned char contador_display=0; unsigned char limpia_display=1; char ADC_1[5]; char ADC_2[5]; char ADC_3[5]; char ADC_4[5]; char ADC_5[5]; char ADC_6[5]; float adc_volt0; float adc_volt1; float adc_volt2; float adc_volt3; float adc_volt4; float adc_volt5; unsigned char buffer_uart[32]; unsigned char capture_uart[32]; static int buf_ptr; static char got_char; char *prueba;
Anexos Parte 1 64
unsigned char prueba2[32]; unsigned char identificador[32]; float enviar1; float enviar2; float enviar3; float enviar4; float enviar5; float enviar6; float enviar1_lcd; float enviar2_lcd; float enviar3_lcd; float enviar4_lcd; float enviar5_lcd; float enviar6_lcd; //Declaracion funciones void lectura (void); void lcd_putc(const char *s); void lcd_gotoxy(char x, char y); void lcd_send_byte(char address, char n); void init_adc(void); void init_uart1(void); void __attribute__((__interrupt__,no_auto_psv)) _T3Interrupt(void); void __attribute__((__interrupt__,no_auto_psv)) _T2Interrupt(void); void __attribute__((__interrupt__,no_auto_psv)) _T1Interrupt(void); void __attribute__((__interrupt__,no_auto_psv)) _U1RXInterrupt(void); void init_ports(void); void init_timer1(); void init_timer2(void); void init_timer3(void); char alarma_enviar1[10]; char alarma1f[]="Falla"; char alarma1ok[]="Ok"; char alarma_enviar2[10]; char alarma2f[]="Falla"; char alarma2ok[]="Ok"; char alarma_enviar3[10]; char alarma3f[]="Falla"; char alarma3ok[]="Ok"; char alarma_enviar4[10]; char alarma4f[]="Falla"; char alarma4ok[]="Ok"; char alarma_enviar5[10]; char alarma5f[]="Falla"; char alarma5ok[]="Ok"; char alarma_enviar6[10]; char alarma6f[]="Falla"; char alarma6ok[]="Ok";
Anexos Parte 1 65
//Macros para ajuste de sensores: #define Lmbyteptr(var32) ((unsigned char*)(&var32)) #define LMbyteptr(var32) ((unsigned char*)(&var32)+1) #define Hmbyteptr(var32) ((unsigned char*)(&var32)+2) #define HMbyteptr(var32) ((unsigned char*)(&var32)+3) //desarma el float #define getLmbyte(var32) ((unsigned char)(*Lmbyteptr(var32))) // #define getLMbyte(var32) ((unsigned char)(*LMbyteptr(var32))) // #define getHmbyte(var32) ((unsigned char)(*Hmbyteptr(var32))) // #define getHMbyte(var32) ((unsigned char)(*HMbyteptr(var32))) // //arma float #define setLmbyte(var32,var8) {(unsigned char)(*Lmbyteptr(var32)=var8);} // #define setLMbyte(var32,var8) {(unsigned char)(*LMbyteptr(var32)=var8);} // #define setHmbyte(var32,var8) {(unsigned char)(*Hmbyteptr(var32)=var8);} // #define setHMbyte(var32,var8) {(unsigned char)(*HMbyteptr(var32)=var8);} // //Declaracion variables y funciones para ajuste de sensores float labview1,labview2,labview3,labview4,labview5,labview6; float m0=0; float m1=0; float m2=0; float m3=0; float m4=0; float m5=0; float b0=0; float b1=0; float b2=0; float b3=0; float b4=0; float b5=0; float adc_bar; float adc_temp1; float adc_fl; float adc_temp2; float adc_temp3; float adc_temp4; float def; float var1,var2;var3;var4;var5;var6;var7;var8;var9;var10;var11;var12; void cargar_parametros(void); void guardar_m0(void); void guardar_b0(void); void guardar_m1(void); void guardar_b1(void); void guardar_m2(void); void guardar_b2(void); void guardar_m3(void); void guardar_b3(void); void guardar_m4(void); void guardar_b4(void); void guardar_m5(void); void guardar_b5(void); char dummy1, dummy2, dummy3, dummy4;
Anexos Parte 1 66
void __attribute__((__interrupt__,no_auto_psv)) _T1Interrupt(void) { IFS0bits.T1IF=0; // borra la bandera de interrupcion por Timer2 if(cont_valve == 1){ //rutina de tiempo de demora de la valvula espera_valvula+=1; } rtc_lcd_update = 1; cont++; return; } void __attribute__((__interrupt__,no_auto_psv)) _T2Interrupt(void) { PORTGbits.RG13=1; IFS0bits.T2IF=0; // borra la bandera de interrupcion por Timer2 ClrWdt();
Anexos Parte 1 67
//CANALES CON ENTRADA DE CORRIENTE SE HARAN LOS ESCALAMIENTOS Y CALCULOS //PERTINENTES //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ADCHSbits.CH0SA = 0;//selecciona el canal0 ADCON1bits.DONE=0; ADCON1bits.SAMP = 1; // start sampling then after while (!ADCON1bits.DONE); // conversion finalizada? ADCvalue0 = (float)ADCBUF0; // yes then get ADC value valor0[i] = ADCBUF0; // yes then get ADC value adc_volt0=((4.93*ADCvalue0)/4095); adc_temp4=(((adc_volt0*125.14)/4.93)-25.14); labview6=((adc_volt0*0.02)/4.93); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ADCHSbits.CH0SA = 1; //selecciona el canal1 ADCON1bits.DONE=0;
ADCON1bits.SAMP = 1; //start sampling while (!ADCON1bits.DONE); // conversion finalizada? ADCvalue1 = (float)ADCBUF0; // yes then get ADC value valor1[i] = ADCBUF0; // yes then get ADC value adc_volt1=((4.93*ADCvalue1)/4095); adc_temp3=(((adc_volt1*125.14)/4.93)-25.14); labview5=((adc_volt1*0.02)/4.93); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ADCHSbits.CH0SA = 2; //selecciona el canal 2 ADCON1bits.DONE=0; ADCON1bits.SAMP = 1; // start sampling while (!ADCON1bits.DONE); // conversion finalizada? ADCvalue2 = (float)ADCBUF0; // yes then get ADC value valor2[i] = ADCBUF0; // yes then get ADC value adc_volt2=((4.93*ADCvalue2)/4095); adc_temp2=(((adc_volt2*75.09)/4.93)-25.034); labview4=((adc_volt2*0.02)/4.93); //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ADCHSbits.CH0SA = 3; //selecciona el canal 3 ADCON1bits.DONE=0; ADCON1bits.SAMP = 1; // start sampling while (!ADCON1bits.DONE); // conversion finalizada? ADCvalue3 = (float)ADCBUF0; // yes then get ADC value valor3[i] = ADCBUF0; // yes then get ADC value adc_volt3=((4.93*ADCvalue3)/4095); adc_fl=(((adc_volt3*125.14)/4.93)-25.14); labview3=((adc_volt3*0.02)/4.93); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ADCHSbits.CH0SA = 4; //selecciona el canal4 ADCON1bits.DONE=0; ADCON1bits.SAMP = 1; // start sampling while (!ADCON1bits.DONE); // conversion finalizada? ADCvalue4 = (float)ADCBUF0; // yes then get ADC value valor4[i] = ADCBUF0; // yes then get ADC value adc_volt4=((4.93*ADCvalue4)/4095); adc_temp1=(((adc_volt4*125.14)/4.93)-25.14); labview2=((adc_volt4*0.02)/4.93); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ADCHSbits.CH0SA = 5; //selecciona el canal5 ADCON1bits.DONE=0; ADCON1bits.SAMP = 1; // start sampling while (!ADCON1bits.DONE); // conversion finalizada? ADCvalue5 = (float)ADCBUF0; // yes then get ADC value valor5[i] = ADCBUF0; // yes then get ADC value adc_volt5=((4.93*ADCvalue5)/4095); adc_bar=(((adc_volt5*31.28)/4.93)-6.28); labview1=((adc_volt5*0.02)/4.93);
Anexos Parte 1 68
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //Datos Para enviar a labview y lcd // Calculos hechos con datos enviados desde labview y adquiridos por ADC enviar1=(((m0-b0)*1.25*labview1)/0.02)+(((m0-b0)*1.25-m0)*-1); enviar2=(((m1-b1)*1.25*labview2)/0.02)+(((m1-b1)*1.25-m1)*-1); enviar3=(((m2-b2)*1.25*labview3)/0.02)+(((m2-b2)*1.25-m2)*-1); enviar4=(((m3-b3)*1.25*labview4)/0.02)+(((m3-b3)*1.25-m3)*-1); enviar5=(((m4-b4)*1.25*labview5)/0.02)+(((m4-b4)*1.25-m4)*-1); enviar6=(((m5-b5)*1.25*labview6)/0.02)+(((m5-b5)*1.25-m5)*-1); // Rutinas alarmas lcd enviar1_lcd=enviar1;if(enviar1<b0){enviar1_lcd=0;} enviar2_lcd=enviar2;if(enviar2<b1){enviar2_lcd=0;} enviar3_lcd=enviar3;if(enviar3<b2){enviar3_lcd=0;} enviar4_lcd=enviar4;if(enviar4<b3){enviar4_lcd=0;} enviar5_lcd=enviar5;if(enviar5<b4){enviar5_lcd=0;} enviar6_lcd=enviar6;if(enviar6<b5){enviar6_lcd=0;} if(enviar1<b0){strcpy (alarma_enviar1,alarma1f);} if(enviar1>b0){strcpy (alarma_enviar1,alarma1ok);} if(enviar2<b1){strcpy (alarma_enviar2,alarma2f);} if(enviar2>b1){strcpy (alarma_enviar2,alarma2ok);} if(enviar3<b2){strcpy (alarma_enviar3,alarma3f);} if(enviar3>b2){strcpy (alarma_enviar3,alarma3ok);} if(enviar4<b3){strcpy (alarma_enviar4,alarma4f);} if(enviar4>b3){strcpy (alarma_enviar4,alarma4ok);} if(enviar5<b4){strcpy (alarma_enviar5,alarma5f);} if(enviar5>b4){strcpy (alarma_enviar5,alarma5ok);} if(enviar6<b5){strcpy (alarma_enviar6,alarma6f);} if(enviar6>b5){strcpy (alarma_enviar6,alarma6ok);} PORTGbits.RG13=0; return; } void __attribute__((__interrupt__,no_auto_psv)) _T3Interrupt(void) { PORTGbits.RG13=1; IFS0bits.T3IF=0; ClrWdt(); if(contador_display==2){ contador_display=0; DISPLAY++; limpia_display=1; } contador_display++; if(DISPLAY==4){ DISPLAY=0; } PORTGbits.RG13=0; return; }
Anexos Parte 1 69
// Rutina interrupcion por recepcion de caracteres desde labview void __attribute__((__interrupt__,no_auto_psv)) _U1RXInterrupt(void) { PORTGbits.RG12=1; IFS0bits.U1RXIF = 0; //borramos flag de interrupcion if (DataRdyUART1()) // Verifica si hay datos para leer { buffer_uart[buf_ptr] = ReadUART1(); // Guarda en buffer if (buffer_uart[buf_ptr]== 'p') // Caracter 'p' es recibido?? { buffer_uart[buf_ptr] = '\0'; // Reemplaza por caracter nulo got_char=1; } if (buffer_uart[buf_ptr]== '\r') // Retorno de carro es recibido?? { buffer_uart[buf_ptr] = '\0'; // Reemplaza por caracter nulo got_char=1; } // Verifica si es desbordado el buffer de recepcion if (buf_ptr==31) { buffer_uart[31] = '\0'; got_char=1; } buf_ptr++; } if(got_char) // Si el buffer esta listo ingresa a la rutina { buf_ptr=0; got_char=0; capture_uart[0]='\0'; // Limpia buffer prueba=buffer_uart+3; strcpy (prueba2,prueba); strncpy (capture_uart,buffer_uart,3); strcpy (identificador,capture_uart); // Dependiendo de la trama de caracteres recibidas por labview son almacenadas en diferentes variables if(strcmp(identificador,"a1=")==0){var1=atof(prueba2);m0=var1;guardar_m0();} if(strcmp(identificador,"b1=")==0){var1=atof(prueba2);b0=var1;guardar_b0();} if(strcmp(identificador,"a2=")==0){var1=atof(prueba2);m1=var1;guardar_m1();} if(strcmp(identificador,"b2=")==0){var1=atof(prueba2);b1=var1;guardar_b1();} if(strcmp(identificador,"a3=")==0){var1=atof(prueba2);m2=var1;guardar_m2();} if(strcmp(identificador,"b3=")==0){var1=atof(prueba2);b2=var1;guardar_b2();} if(strcmp(identificador,"a4=")==0){var1=atof(prueba2);m3=var1;guardar_m3();} if(strcmp(identificador,"b4=")==0){var1=atof(prueba2);b3=var1;guardar_b3();} if(strcmp(identificador,"a5=")==0){var1=atof(prueba2);m4=var1;guardar_m4();} if(strcmp(identificador,"b5=")==0){var1=atof(prueba2);b4=var1;guardar_b4();} if(strcmp(identificador,"a6=")==0){var1=atof(prueba2);m5=var1;guardar_m5();} if(strcmp(identificador,"b6=")==0){var1=atof(prueba2);b5=var1;guardar_b5();} buffer_uart[0]='\0'; // Limpia buffer de recepcion para estar listo para la proxima recepcion } PORTGbits.RG12=0; return; }
Anexos Parte 1 70
int main (void) { cargar_parametros(); lcd_init(); init_ports(); init_adc(); init_timer1(); init_timer2(); init_timer3(); init_uart1(); lcd_putc("\f"); while(1){ if(DISPLAY==0){ if(limpia_display==1){lcd_putc("\f");limpia_display=0;} lcd_gotoxy(1,1); lcd_putc("Canales"); lcd_gotoxy(15,1); lcd_putc("Estado"); lcd_gotoxy(1,2); lcd_putc("Canal1="); sprintf(ADC_1,"%1.2f",enviar1_lcd); //Convierte flotante en string lcd_gotoxy(8,2); lcd_putc(ADC_1); //envia valor del canal al LCD lcd_gotoxy(15,2); lcd_putc(alarma_enviar1); lcd_gotoxy(1,3); lcd_putc("Canal2="); sprintf(ADC_2,"%1.2f",enviar2_lcd); //Convierte flotante en string lcd_gotoxy(8,3); lcd_putc(ADC_2); //envia valor del canal al LCD lcd_gotoxy(15,3); lcd_putc(alarma_enviar2); lcd_gotoxy(1,4); lcd_putc("Canal3="); sprintf(ADC_3,"%1.2f",enviar3_lcd); //Convierte flotante en string lcd_gotoxy(8,4); lcd_putc(ADC_3); //envia valor del canal al LCD lcd_gotoxy(15,4); lcd_putc(alarma_enviar3); } if(DISPLAY==1){ if(limpia_display==1){lcd_putc("\f");limpia_display=0;} lcd_gotoxy(1,1); lcd_gotoxy(1,1); lcd_putc("Canales"); lcd_gotoxy(15,1); lcd_putc("Estado"); PORTGbits.RG2=0; lcd_gotoxy(1,2); lcd_putc("Canal4="); sprintf(ADC_4,"%1.2f",enviar4_lcd); //Convierte flotante en string lcd_gotoxy(8,2); lcd_putc(ADC_4); //envia valor del canal al LCD lcd_gotoxy(15,2); lcd_putc(alarma_enviar4); lcd_gotoxy(1,3);
Anexos Parte 1 71
lcd_putc("Canal5="); sprintf(ADC_5,"%1.2f",enviar5_lcd); //Convierte flotante en string lcd_gotoxy(8,3); lcd_putc(ADC_5); //envia valor del canal al LCD lcd_gotoxy(15,3); lcd_putc(alarma_enviar5); lcd_gotoxy(1,4); lcd_putc("Canal6="); sprintf(ADC_6,"%1.2f",enviar6_lcd); //Convierte flotante en string lcd_gotoxy(8,4); lcd_putc(ADC_6); //envia valor del canal al LCD lcd_gotoxy(15,4); lcd_putc(alarma_enviar6); } if(DISPLAY==2){ if(limpia_display==1){lcd_putc("\f");limpia_display=0;} lcd_gotoxy(1,1); lcd_putc(" Departamento"); lcd_gotoxy(1,2); lcd_putc(" de"); lcd_gotoxy(1,3); lcd_putc(" Electricidad"); lcd_gotoxy(1,4); lcd_putc("***** UMAG *****"); } if(rtc_lcd_update == 1){ // la cadena de caracteres es enviada con "/" entre medio para que labview sea //capaz de ir verificando uno a uno su correcta recepcion // El salto de linea agregado al final sirve para verificar es enviada completamente hacia labview printf("%1.2f/%1.2f/%1.2f/%1.2f/%1.2f/%1.2f\n",enviar1,enviar2,enviar3,enviar4,enviar5,enviar6); rtc_lcd_update = 0; } } //fin while(1) WDTSWDisable; }//fin main
Anexos Parte 1 72
//configuracion del modulo A/D de 12bits (4096) para muestreo a aprox 200ksps void init_adc(void){ ADPCFG=0x0000; //configura todas como entradas analogas de RB0 a RB15 ADCON1=0x04E0 ADCON2=0x0000; //0400 Scan inputs 0000 No Scan ADCON3=0x1F01; //31TAD para conversion (TADmin 334nseg), ADCSSL=0x0000; //muetreo secuancial OFF ADCON1bits.ADON = 1; //ADC ON return; } void init_uart1(void) //funcion para inicializar la UART1 para comunicacion RS232 { U1BRG =FCY/16/BaudRated-1; //Configurar BaudRate a 9600 UXBRG=((Fcy/(16*BaudRated))-1) U1MODE = 0x8000; // Activar UART U1STA = 0x0400; //Activar transmisión y recepcion IFS0bits.U1RXIF = 0; // borramos flag interrupcion IPC2bits.U1RXIP = 4; // establecmos prioridad de la interrupcion IEC0bits.U1RXIE = 1; //interrupcion recepcion activada 1, desactivada 0 return; } void init_timer1() //TIMER1 configurado para reloj exterior de tiempo real de 1 segundo { T1CON = 0x0000; /* se asegura que el Timer1 esta en reset state */ TMR1=0; PR1 =32760; //set Timer 1 period register */ IFS0bits.T1IF = 0; //Borra bandera de interrupcion del Timer1 IPC0bits.T1IP = 7; //set Timer1 interrupt priority level to 7 T1CONbits.TCS = 1; //selecciona el external timer clock */ IEC0bits.T1IE = 1; //Habilita interrupcion por Timer1 /* disable interrupts for unlock sequence below */ //SET_AND_SAVE_CPU_IPL(current_cpu_ipl, 7); char a, b, c, *p; a = 2;b = 0x46;c = 0x57;p = (char *)&OSCCON; /* Habilita aqui el oscilador de 32KHz low byte unlock sequence and enable LP Oscillator */ asm volatile ("mov.b %1,[%0] \n" "mov.b %2,[%0] \n" "mov.b %3,[%0] \n" : /* no outputs */ : "r"(p), "r"(b), "r"(c), "r"(a)); /* restore CPU IPL value after executing unlock sequence */ // RESTORE_CPU_IPL(current_cpu_ipl); T1CONbits.TON = 1; ///Habilita el Timer1 }
Anexos Parte 1 73
//+++++++++Configuracion del Timer2 para ser usado en Interrupcion de configurable entre 10ms y //1000ms +++++ void init_timer2(void) { // Modo operación TIMER2 T2CON=0x0030; // Modo operación TIMER2: reloj interno, escala 1:256 para (67,81ns x 256 = 1.736us), TMR2=0; // Empieza cuenta en 0 PR2=57600; // Cuenta 57600 ciclos para (1.736us x 57600 = 1000ms) // Interrupciones TIMER2 IFS0bits.T2IF=0; // Borra Interrupt Flag IPC1bits.T2IP = 6; //IPC1bits. = 6; //set Timer1 interrupt priority level to 7 IEC0bits.T2IE=1; // Habilita Interrupción T2CONbits.TON=1; // Arranca TIMER2 return; } void init_timer3(void) //+++++++++Configuracion del Timer3 para ser usado en Interrupcion de configurable //entre 10ms y 1000ms +++++ { // Modo operación TIMER3 T3CON=0x0030; // Modo operación TIMER3: reloj interno, escala 1:256 para (67,81ns x 256 = 1.736us), TMR3=0; // Empieza cuenta en 0 PR3=57600; // Cuenta 57600 ciclos para (1.736us x 57600 = 1000ms) // Interrupciones TIMER3 IFS0bits.T3IF=0; // Borra Interrupt Flag IPC2bits.ADIP = 5; IEC0bits.T3IE=1; // Habilita Interrupción T3CONbits.TON=1; // Arranca TIMER2 return; } void init_ports(void) { //Configuracion de puertos y pines //LATG=0XFFFF; //inicializa los pines del puerto G en cero //TRISG=0X0000; //configura puerta G como salidas TRISGbits.TRISG15=0; //PIN G15 SALIDA TRISGbits.TRISG12=0; //PIN G12 SALIDA TRISGbits.TRISG13=0; //PIN G13 SALIDA TRISGbits.TRISG1=0; //PIN G1 SALIDA TRISGbits.TRISG0=0; //PIN G0 SALIDA TRISFbits.TRISF0=0; //PIN F0 SALIDA TRISFbits.TRISF1=0; //PIN F1 SALIDA TRISBbits.TRISB0=1; //PIN B2 Entrada, despues de configura como entrada analoga TRISBbits.TRISB1=1; //PIN B3 Entrada, despues de configura como entrada analoga TRISBbits.TRISB2=1; //PIN B2 Entrada, despues de configura como entrada analoga TRISBbits.TRISB3=1; //PIN B3 Entrada, despues de configura como entrada analoga TRISBbits.TRISB4=1; //PIN B4 Entrada, despues de configura como entrada analoga TRISBbits.TRISB5=1; //PIN B5 Entrada, despues de configura como entrada analoga TRISGbits.TRISG2 = 1; TRISGbits.TRISG3 = 1; //INICIALIZACIONES DE PUERTOS apagados 0 PORTGbits.RG15=0; PORTGbits.RG13=0; PORTGbits.RG12=0; PORTGbits.RG1=0; //pines de control del rele PORTGbits.RG0=0; //pines de control del rele PORTFbits.RF0=1; PORTFbits.RF1=1; }
Anexos Parte 1 74
// Macros utilizados para desarmar y armar flotantes para su almacenamiento en eeprom interna void cargar_parametros() { //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF820)); dummy2=(unsigned char)(EepromRead2(0xF822)); dummy3=(unsigned char)(EepromRead2(0xF824)); dummy4=(unsigned char)(EepromRead2(0xF826)); //armar float setLmbyte(m0,dummy1); setLMbyte(m0,dummy2); setHmbyte(m0,dummy3); setHMbyte(m0,dummy4); //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF828)); dummy2=(unsigned char)(EepromRead2(0xF82A)); dummy3=(unsigned char)(EepromRead2(0xF82C)); dummy4=(unsigned char)(EepromRead2(0xF82E)); //armar float setLmbyte(b0,dummy1); setLMbyte(b0,dummy2); setHmbyte(b0,dummy3); setHMbyte(b0,dummy4); //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF830)); dummy2=(unsigned char)(EepromRead2(0xF832)); dummy3=(unsigned char)(EepromRead2(0xF834)); dummy4=(unsigned char)(EepromRead2(0xF836)); //armar float setLmbyte(m1,dummy1); setLMbyte(m1,dummy2); setHmbyte(m1,dummy3); setHMbyte(m1,dummy4); //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF838)); dummy2=(unsigned char)(EepromRead2(0xF83A)); dummy3=(unsigned char)(EepromRead2(0xF83C)); dummy4=(unsigned char)(EepromRead2(0xF83E)); //armar float setLmbyte(b1,dummy1); setLMbyte(b1,dummy2); setHmbyte(b1,dummy3); setHMbyte(b1,dummy4); //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF840)); dummy2=(unsigned char)(EepromRead2(0xF842)); dummy3=(unsigned char)(EepromRead2(0xF844)); dummy4=(unsigned char)(EepromRead2(0xF846)); //armar float setLmbyte(m2,dummy1); setLMbyte(m2,dummy2); setHmbyte(m2,dummy3); setHMbyte(m2,dummy4); //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF848)); dummy2=(unsigned char)(EepromRead2(0xF84A)); dummy3=(unsigned char)(EepromRead2(0xF84C)); dummy4=(unsigned char)(EepromRead2(0xF84E)); //armar float setLmbyte(b2,dummy1); setLMbyte(b2,dummy2); setHmbyte(b2,dummy3); setHMbyte(b2,dummy4);
Anexos Parte 1 75
//Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF850)); dummy2=(unsigned char)(EepromRead2(0xF852)); dummy3=(unsigned char)(EepromRead2(0xF854)); dummy4=(unsigned char)(EepromRead2(0xF856)); //armar float setLmbyte(m3,dummy1); setLMbyte(m3,dummy2); setHmbyte(m3,dummy3); setHMbyte(m3,dummy4); //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF858)); dummy2=(unsigned char)(EepromRead2(0xF85A)); dummy3=(unsigned char)(EepromRead2(0xF85C)); dummy4=(unsigned char)(EepromRead2(0xF85E)); //armar float setLmbyte(b3,dummy1); setLMbyte(b3,dummy2); setHmbyte(b3,dummy3); setHMbyte(b3,dummy4); //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF860)); dummy2=(unsigned char)(EepromRead2(0xF862)); dummy3=(unsigned char)(EepromRead2(0xF864)); dummy4=(unsigned char)(EepromRead2(0xF866)); //armar float setLmbyte(m4,dummy1); setLMbyte(m4,dummy2); setHmbyte(m4,dummy3); setHMbyte(m4,dummy4); //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF868)); dummy2=(unsigned char)(EepromRead2(0xF86A)); dummy3=(unsigned char)(EepromRead2(0xF86C)); dummy4=(unsigned char)(EepromRead2(0xF86E)); //armar float setLmbyte(b4,dummy1); setLMbyte(b4,dummy2); setHmbyte(b4,dummy3); setHMbyte(b4,dummy4); //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF870)); dummy2=(unsigned char)(EepromRead2(0xF872)); dummy3=(unsigned char)(EepromRead2(0xF874)); dummy4=(unsigned char)(EepromRead2(0xF876)); //armar float setLmbyte(m5,dummy1); setLMbyte(m5,dummy2); setHmbyte(m5,dummy3); setHMbyte(m5,dummy4); //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF878)); dummy2=(unsigned char)(EepromRead2(0xF87A)); dummy3=(unsigned char)(EepromRead2(0xF87C)); dummy4=(unsigned char)(EepromRead2(0xF87E)); //armar float setLmbyte(b5,dummy1); setLMbyte(b5,dummy2); setHmbyte(b5,dummy3); setHMbyte(b5,dummy4); }
Anexos Parte 1 76
void guardar_m0(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(m0); dummy2=getLMbyte(m0); dummy3=getHmbyte(m0); dummy4=getHMbyte(m0); //guarda el float EepromWrite(0xF820,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF822,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF824,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF826,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF820)); dummy2=(unsigned char)(EepromRead2(0xF822)); dummy3=(unsigned char)(EepromRead2(0xF824)); dummy4=(unsigned char)(EepromRead2(0xF826)); //armar float setLmbyte(m0,dummy1); setLMbyte(m0,dummy2); setHmbyte(m0,dummy3); setHMbyte(m0,dummy4); } void guardar_b0(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(b0); dummy2=getLMbyte(b0); dummy3=getHmbyte(b0); dummy4=getHMbyte(b0); //guarda el float EepromWrite(0xF828,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF82A,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF82C,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF82E,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF828)); dummy2=(unsigned char)(EepromRead2(0xF82A)); dummy3=(unsigned char)(EepromRead2(0xF82C)); dummy4=(unsigned char)(EepromRead2(0xF82E)); //armar float setLmbyte(b0,dummy1); setLMbyte(b0,dummy2); setHmbyte(b0,dummy3); setHMbyte(b0,dummy4); } void guardar_m1(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(m1); dummy2=getLMbyte(m1); dummy3=getHmbyte(m1); dummy4=getHMbyte(m1);
Anexos Parte 1 77
//guarda el float EepromWrite(0xF830,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF832,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF834,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF836,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF830)); dummy2=(unsigned char)(EepromRead2(0xF832)); dummy3=(unsigned char)(EepromRead2(0xF834)); dummy4=(unsigned char)(EepromRead2(0xF836)); //armar float setLmbyte(m1,dummy1); setLMbyte(m1,dummy2); setHmbyte(m1,dummy3); setHMbyte(m1,dummy4); } void guardar_b1(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(b1); dummy2=getLMbyte(b1); dummy3=getHmbyte(b1); dummy4=getHMbyte(b1); //guarda el float HL EepromWrite(0xF838,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF83A,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF83C,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF83E,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF838)); dummy2=(unsigned char)(EepromRead2(0xF83A)); dummy3=(unsigned char)(EepromRead2(0xF83C)); dummy4=(unsigned char)(EepromRead2(0xF83E)); //armar float setLmbyte(b1,dummy1); setLMbyte(b1,dummy2); setHmbyte(b1,dummy3); setHMbyte(b1,dummy4); } void guardar_m2(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(m2); dummy2=getLMbyte(m2); dummy3=getHmbyte(m2); dummy4=getHMbyte(m2); //guarda el float HL EepromWrite(0xF840,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF842,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF844,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF846,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF840)); dummy2=(unsigned char)(EepromRead2(0xF842)); dummy3=(unsigned char)(EepromRead2(0xF844)); dummy4=(unsigned char)(EepromRead2(0xF846));
Anexos Parte 1 78
//armar float setLmbyte(m2,dummy1); setLMbyte(m2,dummy2); setHmbyte(m2,dummy3); setHMbyte(m2,dummy4); } void guardar_b2(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(b2); dummy2=getLMbyte(b2); dummy3=getHmbyte(b2); dummy4=getHMbyte(b2); //guarda el float HL EepromWrite(0xF848,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF84A,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF84C,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF84E,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF848)); dummy2=(unsigned char)(EepromRead2(0xF84A)); dummy3=(unsigned char)(EepromRead2(0xF84C)); dummy4=(unsigned char)(EepromRead2(0xF84E)); //armar float setLmbyte(b2,dummy1); setLMbyte(b2,dummy2); setHmbyte(b2,dummy3); setHMbyte(b2,dummy4); } void guardar_m3(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(m3); dummy2=getLMbyte(m3); dummy3=getHmbyte(m3); dummy4=getHMbyte(m3); //guarda el float HL EepromWrite(0xF850,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF852,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF854,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF856,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF850)); dummy2=(unsigned char)(EepromRead2(0xF852)); dummy3=(unsigned char)(EepromRead2(0xF854)); dummy4=(unsigned char)(EepromRead2(0xF856)); //armar float setLmbyte(m3,dummy1); setLMbyte(m3,dummy2); setHmbyte(m3,dummy3); setHMbyte(m3,dummy4); }
Anexos Parte 1 79
void guardar_b3(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(b3); dummy2=getLMbyte(b3); dummy3=getHmbyte(b3); dummy4=getHMbyte(b3); //guarda el float HL EepromWrite(0xF858,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF85A,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF85C,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF85E,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF858)); dummy2=(unsigned char)(EepromRead2(0xF85A)); dummy3=(unsigned char)(EepromRead2(0xF85C)); dummy4=(unsigned char)(EepromRead2(0xF85E)); //armar float setLmbyte(b3,dummy1); setLMbyte(b3,dummy2); setHmbyte(b3,dummy3); setHMbyte(b3,dummy4); } void guardar_m4(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(m4); dummy2=getLMbyte(m4); dummy3=getHmbyte(m4); dummy4=getHMbyte(m4); //guarda el float HL EepromWrite(0xF860,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF862,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF864,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF866,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF860)); dummy2=(unsigned char)(EepromRead2(0xF862)); dummy3=(unsigned char)(EepromRead2(0xF864)); dummy4=(unsigned char)(EepromRead2(0xF866)); //armar float setLmbyte(m4,dummy1); setLMbyte(m4,dummy2); setHmbyte(m4,dummy3); setHMbyte(m4,dummy4); } void guardar_b4(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(b4); dummy2=getLMbyte(b4); dummy3=getHmbyte(b4); dummy4=getHMbyte(b4); //guarda el float HL EepromWrite(0xF868,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF86A,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF86C,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF86E,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM
Anexos Parte 1 80
//Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF868)); dummy2=(unsigned char)(EepromRead2(0xF86A)); dummy3=(unsigned char)(EepromRead2(0xF86C)); dummy4=(unsigned char)(EepromRead2(0xF86E)); //armar float setLmbyte(b4,dummy1); setLMbyte(b4,dummy2); setHmbyte(b4,dummy3); setHMbyte(b4,dummy4); } void guardar_m5(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(m5); dummy2=getLMbyte(m5); dummy3=getHmbyte(m5); dummy4=getHMbyte(m5); //guarda el float HL EepromWrite(0xF870,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF872,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF874,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF876,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF870)); dummy2=(unsigned char)(EepromRead2(0xF872)); dummy3=(unsigned char)(EepromRead2(0xF874)); dummy4=(unsigned char)(EepromRead2(0xF876)); //armar float setLmbyte(m5,dummy1); setLMbyte(m5,dummy2); setHmbyte(m5,dummy3); setHMbyte(m5,dummy4); } void guardar_b5(void){ //desarmar float Kcte para guardarlo dummy1=getLmbyte(b5); dummy2=getLMbyte(b5); dummy3=getHmbyte(b5); dummy4=getHMbyte(b5); //guarda el float HL EepromWrite(0xF878,(unsigned int)dummy1); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF87A,(unsigned int)dummy2); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF87C,(unsigned int)dummy3); //PAGINA + 0xfc00 = empieza EPROM EepromWrite(0xF87E,(unsigned int)dummy4); //PAGINA + 0xfc00 = empieza EPROM //Lee float guardado dummy1=(unsigned char)(EepromRead2(0xF878)); dummy2=(unsigned char)(EepromRead2(0xF87A)); dummy3=(unsigned char)(EepromRead2(0xF87C)); dummy4=(unsigned char)(EepromRead2(0xF87E)); //armar float setLmbyte(b5,dummy1); setLMbyte(b5,dummy2); setHmbyte(b5,dummy3); setHMbyte(b5,dummy4); }
Anexos Parte 1 81
Código grafico de programa implementado en Labview
Parte 1 Código Implementado en Labview
Anexos Parte 1 82
Parte 2 Código Implementado en Labview
Anexos Parte 1 83
Parte 3 Código Implementado en Labview
Anexos Parte 1 84
Parte 4 Código Implementado en Labview
ANEXOS PARTE 2:
HARDWARE IMPLEMENTADO
Anexos Parte 2 85
Anexos Parte 2
Modelo Esquemático Tarjeta dsPIC.
Esquemático Parte 1
Anexos Parte 2 86
Esquemático Parte 2
Anexos Parte 2 87
dsPIC30F6013A Datasheet
Anexos Parte 2 88
Anexos Parte 2 89
Anexos Parte 2 90
Anexos Parte 2 91
RCV420 Datasheet
Anexos Parte 2 92
Anexos Parte 2 93
AD694 Datasheet
Anexos Parte 2 94
Anexos Parte 2 95
Anexos Parte 2 96
MAX232 Datasheet
Anexos Parte 2 97
Anexos Parte 2 98
Anexos Parte 2 99
Anexos Parte 2 100
Anexos Parte 2 101
SN75176BD Datasheet
Anexos Parte 2 102
Anexos Parte 2 103
Anexos Parte 2 104
Anexos Parte 2 105
LCD S02004DSF Datasheet
HEBERT CRISTOBAL RUIZ SALDIVIA-2011-
UNIVERSIDAD DE MAGALLANESFACULTAD DE INGENIERÍA
DEPARTAMENTO DE ELECTRICIDAD
Objetivos.
Introducción.
Controlador Digital de Señales (DSC).
Entorno Labview.
Sistema Experimental.
Pruebas y Aplicación Práctica.
Conclusiones.
Contenidos
-Conocer una de las posibles aplicaciones en el ámbito de la ingenieríaeléctrica, tanto del microcontrolador utilizado como del softwareLabview.
-Construir un sistema compatible con sensores 4-20mA , donde losvalores de corrientes serán transformados a las variables reales medidas.
-Elaborar una interfaz gráfica amigable con el usuario, en la cual éstepueda establecer parámetros de configuración que darán al sistema unamayor versatilidad.
Los sistemas de adquisición de datos se utilizan cada vez más enlaboratorios, industria y educación para la visualización de las variablesfísicas (temperatura, flujo, presión, nivel etc.)
Las etapas de un sistema de adquisición y procesamiento de datos son:-Transductores y sensores.-Acondicionamiento de señal.-Módulo de adquisición de datos.-Acción a realizar con los datos obtenidos (gráficos, almacenado, control etc.)
Para este trabajo de título se utilizó el controlador digital de señales (DSC)de la empresa MICROCHIP dsPIC30F6013A, el que trabajará en conjuntocon el software de la empresa National Instruments Labview.
Los microcontroladores son computadores digitales integrados en unchip que cuentan con un microprocesador o unidad de procesamientocentral (CPU), una memoria para almacenar el programa, unamemoria para almacenar datos y puertos de entrada/salida.
La gran diferencia que posee con un microprocesador es que éstenecesita de sus periféricos externos para funcionar correctamente.
En otras palabras un microcontrolador es un circuito integradoque en sus interior cuenta con un microprocesador , además debuses de datos, memoria RAM, ROM y periféricos de entrada y/osalida .
Se denomina DSP (Digital Signal Processor) a un circuito integrado quecontiene un procesador digital y un conjunto de recursos complementarioscon los cuales es capaz de manejar digitalmente las señales análogas quenos rodean. Algunas de sus mas importantes características se nombran acontinuación.
-Disponen de conversores A/D rápidos y precisos.
-Ofrecen un amplio repertorio de interrupciones con niveles de prioridad.
-En su repertorio de instrucciones contienen algunas especificas pararesolver los algoritmos habituales en el procesamiento de señales.
- En gran parte de sus aplicaciones su comportamiento será directaconsecuencia del flujo de datos de la señal muestreada.
La empresa MICROCHIP se ha desempeñado principalmente en elcampo de los microcontroladores de 16 bit. Estos modelos son conocidospopularmente con el nombre de PIC. Debido al aumento de aplicacionesen las cuales es necesario el procesamiento digital de señales Microchip hadecidido lanzarse al mercado de los DSP con un modelo hibridoMCU/DSP, cuyo manejo es similar al de los MCU pero que incluye algunasde las principales prestaciones de los DSP . Así nace el controlador digitalde señales (DSC), el cual reúne las características de losmicrocontroladores de 16 bits junto con las de los DSP de gama baja.
Dada la similitud del DSC con los MCU (PIC) en cuanto arquitectura yrepertorio de instrucciones, los usuarios de las familias demicrocontroladores PIC no encuentran dificultades para introducirse en elcampo del procesamiento digital de señales utilizando dsPIC.
Los dsPIC se pueden agrupar en dos grandes familias:
-dsPIC30F
-dsPIC33F
En este trabajo de título se utilizó un dsPIC de la primera familia, por lo que a continuación se presentan las principales características de los dsPIC30F:
Recurso Rango de valores.
Memoria de programa FLASH 12Kb-144Kb
Memoria de datos RAM 512bytes-8Kb
Memoria de datos EEPROM 1Kb-4Kb
Pastillaje encapsulado 18-80 pines
Temporizador de 16 bit Hasta 5
Modulo de captura Hasta 8 entradas
Módulo comparador/PWM Hasta 8 salidas
Modulo PWM de control de motores De 6 a 8
Conversor A/D de 10 bits 500kbps, hasta 16 canales
Conversor A/D de 12 bits 100kps, hasta 16 canales
UART 1-2
SPI(8-16 bits) 1-2
I²C 1 Módulo
QEI 1
Interfaz CODEC 1
CAN 1-2
Según MICROCHIP los 19 modelos que contiene la familia dsPIC30F sepueden separar en tres grupos dependiendo de su aplicación:
-dsPIC30F de propósito general.-dsPIC30F para control de sensores.-dsPIC30F para control de motores y sistemas de alimentación.
El modelo utilizado en este trabajo de título (dsPIC30F6013A) cabe en lacategoría de propósito general, en la aplicación específica de este trabajo detítulo destaca la utilización de tres periféricos. A continuación se dará unabreve explicación de ellos.
Conversor Análogo Digital (ADC): El dsPIC permite hacer una rápida yfiable conversión análoga/digital, para ello cuenta con un ADC de 12 bits deprecisión.
La conversión se realiza en tres etapas: muestreo de la señal, cuantificación dela señal que consiste en llevar el valor análogo a un valor de combinaciones yla cuantificación de la señal que consiste en agregarle los ceros y unos a la señalconvertida. El módulo ADC del dsPIC posee las siguientes características.
-Tiempo de muestreo de 154ns.-Conversión de aproximaciones sucesivas.-Velocidad de conversión de hasta 500Ksps.-Modo automático de exploración de canal.-La tensión analógica de referencia puede ser seleccionada por software.
Módulo UART: Este módulo permite la comunicación Universal SerialAsíncrona full dúplex o serial asíncrono con computadores, con interfases RS232 y RS 485, entre sus principales características destacan:
-La transmisión de datos es de 8 o de 9 bits.- Paridad impar, par o sin paridad.- Uno o dos bits de parada.-Tiene un generador de baudios con preescalador de 16 bits que se encarga dedar la frecuencia de trabajo al módulo.
Módulo Temporizador: El dsPIC30F6013A cuenta con 5 temporizadores,cada uno de 16 bits. Este módulo es utilizado para dar una base de tiempo conla se generarán interrupciones asociadas.
En este trabajo de titulo el dsPIC se utiliza para el muestreo de señales, suconversión análoga digital, cálculo de las variables medidas por los sensores ypor último en la comunicación con el software Labview.
Muestreo de señal análoga.
Conversión análoga digital.
Calculo de variables
reales medidas.
Envío deparámetros por puerto
serial
Comunicación con software Labview
Proceso realizado en dsPIC30f6013A
Labview es una herramienta de programación gráfica para aplicaciones queinvolucren adquisición, control, análisis y presentación de datos. Las ventajasque proporciona el empleo de Labview se resumen en las siguientes:
-Se reduce el tiempo de desarrollo de las aplicaciones al menos de 4 a 10 veces,ya que es muy intuitivo y fácil de aprender.
-Dota de gran flexibilidad al sistema, permitiendo cambios y actualizaciones tanto del hardware como del software
-Da la posibilidad a los usuarios de crear soluciones completas y complejas.
- Con un único sistema de desarrollo se integran las funciones de adquisición, análisis y presentación de datos.
-El sistema está dotado de un compilador gráfico para lograr la máximavelocidad de ejecución posible.
-Tiene la posibilidad de incorporar aplicaciones escritas en otros lenguajes.
Los programas desarrollados mediante Labview se denominan InstrumentosVirtuales (VIs), porque su apariencia y funcionamiento imitan los de uninstrumento real. Sin embargo son análogos a las funciones creadas con loslenguajes de programación convencionales. Los VIs tienen una parteinteractiva con el usuario y otra parte de código fuente, y aceptan parámetrosprocedentes de otros VIs. Todos los VIs tienen un panel frontal y un diagramade bloques.
Ejemplo aplicación realizada en Labview
Proceso realizado en Labview
dsPIC Intercambio de datos
LabviewTratamiento
individual de datos
Visualización y almacenado de
parámetros reales.
Tarjeta dsPIC RS232 PC
La unidad física principal del sistema corresponde a la tarjeta dsPIC, en ella sealojarán los conectores necesarios para interactuar tanto con los sensores comocon el computador, además será donde se encuentre físicamente la unidadcentral del sistema dsPIC30F6013A.
Características tarjeta dsPIC:
-Seis entradas 4-20mA.
-Cuatro salidas 4-20mA
-Diez entradas 0-10V.
-Cuatro salidas 0-5V.
-Dos puertos RS-232.
-Dos puertos RS-485.
- Conexión directa con LCD Lumex S02004.
-Banco de memorias externas
Señal de instrumentación
4-20mA.
Conversión a tensión legible
por ADC
Filtrado de señal
Conversión
A/D
Comunicación
serial.
Inicio
Inicialización de variables
Han llegado datos a través de la puerta
serialHa pasado 1 segundo??
Adquirir datos por puertos ADC
Asignar datos obtenidos a variables para cálculo
Se ha presionado “ENTER”?
Almacenar variables en memoria
Asignar datos obtenidos a variables para cálculo
Asignar datos obtenidos a variables para calculo
Ha pasado 1 segundo??
Enviar valores a LCD
Enviar valores a puerto serie
No Si
No
Si
No
Si
No Si
Inicio
Inicialización de variables
Hay datos para enviar al dsPIC?
Almacenamiento de datos en formato Excel
Recepción de datos enviados por dsPICEnvío de datos al dsPIC
Visualización de parámetros en
pantalla
NoSi
Se desarrollaron dos aplicaciones gráficas para este trabajo de título:
-Aplicación para propósitos generales .
-Aplicación específica sistema de bombeo.
Aplicación para propósitos generales.
Aplicación gráfica para sistema de bombeo.
Transmisor Rosemount modelo 3144Transmisor Rosemount modelo 3051
Industrie Messtechnik modelo 3249
Aplicación gráfica para sistema de bombeo.
Canal 2 Nivel
Canal 1Temperatura
Canal 3Presión
Canal 4Auxiliar
Canal 5Auxiliar
Canal 6Auxiliar
Comunicación Serial
dsPIC30F6013A Software Labview
Aplicación para propósitos generales.
Aplicación para propósitos generales.
Aplicación para propósitos generales.
En general las posibilidades de aplicaciones utilizando unmicrocontrolador como unidad central del sistema están dadas por lasnecesidades del usuario.
La interfaz gráfica realizada en el software Labview se hizo con el fin deestablecer una comunicación amigable entre un hipotético operador delsistema con el proceso sensado. Esto conllevó a conocer una de las múltiplesaplicaciones del software Labview en el ámbito de la ingeniería eléctrica.
La comunicación establecida entre el dsPIC y Labview mediante puertoserie fue realizada con éxito y estabilidad en el tiempo, lo que hace que elsistema implementado sea confiable y de rápida actualización.
Los códigos de ambos programas se hicieron con el fin de ser modificados yoptimizados en el futuro para así añadir recursos al sistema utilizado enconjunto.