Sistema de adquisición y transmisión de datos mediante el...

156
Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti. TITULACIÓ: Ingeniero Técnico Industrial esp. Electrónica Industrial AUTOR: Jordi Ruiz Baeza. DIRECTORES: Jose Luis Ramírez Falo, Eduard Llobet Valero. FECHA: Junio/2006.

Transcript of Sistema de adquisición y transmisión de datos mediante el...

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

TITULACIÓ: Ingeniero Técnico Industrial esp. Electrónica Industrial

AUTOR: Jordi Ruiz Baeza.

DIRECTORES: Jose Luis Ramírez Falo, Eduard Llobet Valero.

FECHA: Junio/2006.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

2

1 INDICE

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

3

2.-MEMORIA DESCRIPTIVA 6 2.1.-Introducción 7

2.2.-Objetivos 7

2.3.-Posibles soluciones y soluciones adoptadas. 9

2.3.1.-Hardware 9

2.3.1.1.-Comunicación con el PC 9

2.3.1.1.1.-La transmisión asíncrona 9

2.3.1.2.-transmisión de datos 10

2.3.1.3.-Introducción al MSP430 11

2.3.1.3.1.-Diferencias con otros Microcontroladores. 12

2.3.1.4.- Calefactor de platino 13

2.3.1.4.1.-Coeficiente de temperatura del platino 13

2.3.1.4.2.-Medición de la temperatura del Pt 15

2.3.1.5.-Circuito de potencia 17

2.3.1.5.1.-Filtro activo Paso-Bajo 18

2.3.1.5.2.-Diseño Filtro paso_bajo activo integrador. 18

2.3.1.5.3.-Fuente Howland 20

2.3.1.5.4.-Amplificador Inversor. 24

2.3.1.5.5.-Control de temperatura del Calefactor de Pt 24

2.3.1.5.5.1.-Implementación del algoritmo de Control PI 25

2.3.2.-Software 28

2.3.2.1.-Comunicación por el puerto serie bajo Windows 28

2.3.2.1.1.-Acceso a los puertos 28

2.3.2.1.2.-Gestión de errores. 29

2.3.2.2.-Trabajar en MULTITAREA 29

2.3.2.3.- La clase Tthread. 29

2.3.2.4.-Generación de gráficos con Teechart 30

2.4.-Descripción general de las soluciones adoptadas 31

2.4.1.-Hardware 31

2.4.1.1.-Características físicas del RS232 31

2.4.1.2.-El microcontrolador MSP430F169 32

2.4.1.2.1.-Modulo del Reloj 33

2.4.1.2.2.-Modulo comunicación: USART. 35

2.4.1.2.2.1.-Introducción 35

2.4.1.2.2.2.-USART recepción 35

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

4

2.4.1.2.2.3.-USART transmisión 36

2.4.1.2.2.4.-Interrupciones de la USART 36

2.4.1.2.2.5.-Detección automática de errores. 37

2.4.1.2.26.-.Generación del Baud Rate 38

2.4.1.2.3.-Modulo Conversor A/D de 12bits 40

2.4.1.2.3.1.-Introducción 40

2.4.1.2.3.2.-Bloques del conversor A/D 41

2.4.1.2.3.3.-Reloj del conversor A/D 42

2.4.1.2.3.4.-Voltajes de referencia 42

2.4.1.2.3.5.-Bloque de los canales 42

2.4.1.2.3.6.-Muestreo y tiempos de conversión 43

2.4.1.2.3.7.-Tiempos mínimos de muestreo y conversión. 45

2.4.1.2.3.8.-Operación del ADC12 46

2.4.1.3.-Temporizadores. 47

2.4.1.3.1.-Introducción 47

2.4.1.3.2.- Modo PWM del Timer_A. 47

2.4.1.3.2.1.-La Señal PWM 48

2.4.1.3.3.-Timer_B 49

2.4.2.-Software. 51

2.4.2.1.-Funciones de E/S 51

3.-MEMORIA DE CALCULO 57

3.1.-Algoritmo de control PI 58

3.2.-Flujogramas 59

3.2.1.-PORT V1.0 60

3.2.1.1.-Rutina control Puerto serie 61

3.2.1.2.-Comunicación de la aplicación Port V1.0 con el MSP430F169. 63

3.2.1.3.Rutina Muestreo A/D 65

3.2.1.4.-Rutina control PI 71

3.2.2.-Programa principal del MSP430F169 74

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

5

4.-PLANOS 79

4.1.-Esquema eléctrico 80 4.2.-Mascara del C.I. 81 4.2.1.-Situación de los componentes 81 4.2.2.-Mascara de la cara de los componentes 82 4.2.3.-Cara de la soldadura de los componentes 83

5.-PRESUPUESTO 84

5.1.-Introducción 85 5.2.-Mediciones 85 5.3.-Cuadro de precios 92 5.6.-Aplicación del precio 98 5.7.-Resumen del presupuesto 104

6.-BIBLIOGRAFIA 105

6.1.-Libros consultados 106 6.2.-Paginas Web consultadas 107

7.-ANEXOS 108

7.1.-Manual de usuario Port V1.0 109 7.2.-Código Fuente Port V1.0 114 7.2.1.-Unit1.Cpp 114 7.2.2.-Unit1.h 139 7.2.3.-Thread unit2.cpp 143 7.2.4.-Unit2.h 145

7.3.-Código fuente MSP430F169 146

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

6

2 MEMORIA DESCRIPTIVA

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

7

2.1 Introducción

En este proyecto se pretende crear una aplicación, bajo Windows, que será capaz de adquirir y transmitir información al MSP430F169. Esta aplicación, será utilizada para la comunicación del MSP430F269 que gobierna el lector de una tarjeta flexible que se comunica por RFID y forma parte del proyecto “Good Food”.

Paralelamente, se realiza el lazo de control que regula de forma automática la temperatura de un calefactor de platino. Este calefactor es utilizado por el grupo de investigación de sensores de gases y nariz electrónica del departamento DEEEA.

2.2 Objetivos

Hay tres objetivos a cumplir: El primero es crear la comunicación del PC con el MSP430F169. El segundo objetivo del proyecto es el diseño e implementación de un modulo de control de temperatura de un calefactor de platino, la temperatura será controlada por el microcontrolador MSP430F169, para ello se implementa un algoritmo de control tipo Proporcional Integral (PI). Y el Tercer objetivo es el estudio de las herramientas del microcontrolador MSP430F169 fabricado por Texas Instrument

Para los dos primeros objetivos, se diseña como interfaz entre el usuario y el MSP430F169 una aplicación multitarea compatible con Windows 98/Me/2000/Xp que llamamos PortV1.0. El lenguaje de programación utilizado es el lenguaje de programación C++ y como herramienta de desarrollo utilizamos el programa Borlan C++ Builder 6.0 Enterprise Trial.

¿Porque no se ha elegido Visual C++ 6.0 como herramienta de desarrollo?

Las dos herramientas (Visual C++ y Borland C++) son muy potentes, y proporcionan al programador un entorno consistente para la programación pero Builder C++ ofrece unas librerías más preparadas para el diseño de interficíes de usuario amigables y usables. Tampoco se considero la opción de utilizar Visual C++ 6.0 por el hecho de que no dispone de una versión Trial y Borlan C++ Builder 6.0 Enterprise si que dispone de ella.

Esta versión se puede descargar de la pagina Web oficial de Borland www.borland.com/downloads/download_cbuilder.html.

En la aplicación Port V1.0, el usuario podrá elegir el puerto serie que desea utilizar en la comunicación serie del PC con el MSP430F169, enviar y recibir tramas y también podrá seleccionar el modo de trabajo con el que quiere trabajar. Los dos modos de trabajo son los siguientes:

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

8

§ Modo “Muestreo A/D”. En este modo de trabajo, el usuario trabajará con el microcontrolador MSP430F169 en modo muestreo. Es decir, el usuario indicara el numero de muestras y periodo de muestreo que quiere que aplique el MSP430F169 en la conversión de la señal aplicada en el Pin 61 del microcontrolador. Una vez el microcontrolador tenga las muestras, estas serán enviadas a la aplicación Port V1.0, donde el usuario, de forma gráfica (teechart) y visual (memo), dispondrá de las muestras adquiridas por el conversor ADC12 del microcontrolador MSP430F169.

§ Modo “Control PI”. En este modo, el microcontrolador MSP430F169 trabaja en modo control de temperatura del calefactor de platino. El usuario tendrá la posibilidad de introducir la temperatura de consigna modificar las constantes aplicadas en el algoritmo de control PI esatas son: La constante de proporcionalidad e integral, temperatura de consigna y el tiempo de muestreo del sistema. Una vez configurado el control, el usuario visualizará de forma gráfica la temperatura que tiene el calefactor de platino en todo momento y el error (diferencia entre la temperatura de consigna y la temperatura del calefactor)

En la figura 1 se muestra el esquema básico del sistema:

Figura 1Esquema general

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

9

2.3 Posibles soluciones y soluciones adoptadas.

2.3.1 Hardware

2.3.1.1 Comunicación con el PC

La comunicación del PC con el microcontrolador MSP430F169 se realiza por el puerto serie del PC. Nos encontramos con dos modos de transmisión serie, que son: la síncrona y la asíncrona. Elegimos para la comunicación, la transmisión asíncrona por la razón de que no necesitamos velocidades de transmisión elevadas y la ventaja de utilizar esta técnica es su fácil implementación. Por el contrario, en cada byte que transmitimos estamos enviando tres bits de señalización que no son utilizados como información, esto nos ocasiona que despreciemos un 27% del tiempo de transmisión.

2.3.1.1.1 La transmisión asíncrona

En la comunicación serie asíncrona “a cada byte de información a transmitir se le añade una serie de bits fijos de señalización para marcar el comienzo (bit de arranque o START) y el final de cada byte (bits de parada o STOP). El transmisor y el receptor utilizan bases de tiempos diferentes que se mantienen sincronizados mediante el bit de START de cada byte”.

Formato de los caracteres:

Figura 2. Transmisión asíncrona

STàBit de start o arranque, le indicamos el comienzo de la trama.

D0..D6 ó D7 àBits de datos.

PAà Bit de paridad, que nos permite detectar los errores de transmisión.

SPà Bits de stop, indica el fin de la información. Pueden ser entre 1 y 3.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

10

2.3.1.2 Transmisión de datos

La velocidad de modulación “es el numero de veces por segundo que puede cambiar el estado de señalización de la línea” .

1mV

t= (1)

t à Es el tiempo de duración en segundos del intervalo mínimo significativo.

La velocidad de transmisión se mide en bits/s, “es el numero de bits que se pueden transmitir por segundo”.

2logt mV V n= ⋅ (2)

Vmà Es la velocidad de modulación.

n à Es el numero de estados significativos.

Lo que realmente nos interesa es el concepto de la cantidad de información que se puede transmitir por segundo. Este concepto es la velocidad de transferencia de datos “la velocidad de transferencia considerara, solo aquellos bits de información que lleguen al ordenador, es decir, descontando aquellos que se utilizan como bits de start, stop, sincronismo, etc.”

La trama enviada tiene 11 bits (1 bit satrt + 8 bits datos + 2 bits de stop):

89600 6981,81

11tdV = ⋅ = [bits/s]

En conclusión tenemos una Velocidad de modulación estándar que será de 9600

baudios y una velocidad de transferencia de datos aproximada de 6981,81 bits/s.

La Velocidad de transmisión entre el PCßàMSP430F169 elegida será un valor estándar de 9600 bits/s, sabiendo este dato, calculamos el tiempo que empleara el microcontrolador en enviar un byte, mas los bits de start y de stop. Utilizando la formula (1) obtenemos el tiempo mínimo significativo del intervalo:

411.04 10

9600t −= = ⋅

4min 1,04 10 11 1,14t x ms−= ⋅ =

En conclusión tenemos que el microcontrolador MSP430F169 y el PC tardaran en enviar 1 byte aproximadamente 1,14 ms.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

11

2.3.1.3 Introducción al MSP430

Los microcontroladores MSP430 de Texas Instrument tienen un conjunto de características que marcan la diferencia con otros micros. Alguna de estas características son las siguientes:

- Arquitectura RISC de 16 bits y un diseño optimizado para la programación en alto nivel.

- Muy bajo consumo.

- Periféricos analógicos.

- Una muy amplia variedad de periféricos digitales.

- Programación y simulación In-Circuit a trabes de un interfaz JTAG.

El MSP430 utiliza una arquitectura RISC (Conjunto de Instrucciones Reducido) del tipo Von-Neumann (tiene el mismo espacio de direcciones para los datos y las instrucciones). La arquitectura RISC cuenta con 27 instrucciones y siete modos de direccionamiento que se pueden emplear con cualquiera de los 16 registros de 16 bits de la CPU, que son: R0 (contador del programa), R1(Stack pointer), R2(Status register) R3(generador de constantes) y R4..R12 son registros de uso general. El tratamiento que se hace de ellos, es ortogonal : todas las instrucciones funcionan con todos los modos de direccionamiento.

El MSP430 de Texas Instruments es un micro especialmente diseñado para aplicaciones que requieren un muy bajo consumo de energía, tales como dispositivos portátiles. Se ve reflejado en los distintos modos de operación que tiene en bajo consumo:

- Modo Activo: En este modo el consumo a 3V es de 250 µA por cada millón de instrucciones por segundo.

- Modo Standby: en este modo se mantiene funcionando el reloj del micro, que es capaz de despertar a la CPU a intervalos de tiempo programados. El consumo de este modo es de 0.8 µA

- Modo OFF: Este modo es el de menor consumo. En este modo no funciona el reloj ni ninguno de los periféricos. Solo queda activo la capacidad interrupciones y se mantiene el contenido de la RAM. El consumo en este modo es de 0.01 µA

La gran variedad de periféricos, disponibles en los distintos modelos, son los siguientes:

- Watchdog Timer.

- Entradas y salidas digitales, hasta 6 puertos de 8 bits cada uno.

- Timers de 16 Bits, con posibilidad de usar distintas fuentes y varios modos de funcionamiento incluyendo Comparar, Capture y PWM.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

12

- Conversor A/D de 12 Bits, con una velocidad máxima de 200Ksample/segundo.

- Conversor D/A de 12 Bits, para la generación de señales analógicas..

- Comparador de tensión, para la generación de rampas, supervisión de tensión de alimentación.

- Controlador de DMA, que permite transferencias entre posiciones de memoria o memoria y periféricos, sin necesidad de utilizar la CPU.

- Multiplicador por hardware, es capaz de multiplicar dos números de 16 Bits, con o sin signo.

- SCAN IF, para el censado de desplazamientos y rotaciones, ideal para la medición de flujos.

- E-Meter, diseñado especialmente para aplicaciones de medición de energía eléctrica.

- Amplificador operacional. Este modulo, que puede estar repetido hasta tres veces en algunos modelos, permite el procesamiento de señales analógicas, ya sea previo a su entrada al conversor A/D (filtro anti-aliasing, amplificador de instrumentación) o a la salida del conversor D/A (suavizado de la señal). Las entradas de los amplificadores, su ganancia, así como el de realimentación son programables, lo que tiene una gran variedad de configuraciones.

La herramienta de desarrollo del microcontrolador MSP430 cuentan con una interfaz JTAG que permite acceder al procesador para ubicar puntos de ruptura (Breakpoints), analizar los valores de las variables y ejecutar el programa paso a paso (instrucción a instrucción). El interface JTAG puede conectarse al PC por medio del puerto serie, paralelo o USB.

Para el desarrollo del software utilizaremos el programa “Kickstart development tool” de IAR. Este incluye un editor de código en C ó ASM (ensamblador). Nos da la posibilidad de simular ó ensamblar en la memoria flash del microcontrolador MSP430F169 a través del interfaz JTAG.

2.3.1.3.1 Diferencias con otros Microcontroladores.

La gran diferencia con los demás micros es el bajo consumo y el poseer una arquitectura ortogonal, esto nos facilita mucho las cosas para realizar el proyecto, ya que tiene: un set reducido de instrucciones, instrucciones fáciles de aprender, no tiene instrucciones especiales y tiene un código compacto y eficiente

Las posibles aplicaciones del MSP430 pueden ser diversas pero el fabricante nos recomienda utilizar el micro para lo siguientes sistemas: Sistemas alimentados con batería (low power), sistemas de procesamiento de señales, sistemas de tamaño limitado, sistemas de control en general y sistemas de control numérico. Nuestro sistema encaja perfectamente con el sistema de procesamiento de señales y el sistema de control.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

13

2.3.1.4 Calefactor de platino

El calefactor esta formado por una resitencia de platino que toma un valor de temperatura dependiente de la tensión media que se le aplica.

Figura 2.Calefactor de platino.

Una resitencia de platino presenta la peculiaridad de variar linealmente con la temperatura.

Para calcular la resistencia del platino, utilizamos la siguiente formula:

2.3.1.4.1 Coeficiente de temperatura del platino

El coeficiente de temperatura de la resistencia eléctrica varia según aleaciones utilizadas como material resistivo. Para saber con exactitud el coeficiente de temperatura de nuestro calefactor de platino, lo que realizamos será tomar la medida de: R0 (Resistencia del platino en temperatura ambiente), T0 (Temperatura ambiente), T(temperatura del platino) y la R (resistencia del platino) con estos datos y utilizando la formula (3) podemos calcular el valor de α.

Lo primero que hacemos es medir el valor de R0 y T0 del calefactor, en reposo (sin tensión de alimentación)

( )0 01Rpt R T Tα= ⋅ + ⋅ − (3)

α Coeficiente de la temperatura.

Rpt Resistencia actual del platino.

R0 Resistencia a temperatura ambiente.

T Temperatura actual.

T0 Temperatura ambiente

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

14

En nuestro calefactor de platino obtenemos que a una temperatura ambiente de 25ºC su resistencia es de 11 Ω. Estos valores pueden variar ±1 Ω según el calefactor de platino que se esté utilizando.

Una vez ya tenemos los valores de R0 y T0. Procedemos a aplicar una tensión de unos 200 mV en continua al calefactor de platino, esperamos un tiempo prudente de medio segundo se estabilice la temperatura, y medimos la temperatura del platino. Para medir la temperatura utilizamos un termómetro pirométrico. También tomaremos el valor de la corriente que circula por el platino, de esta forma sabremos que resistencia tiene el

platino200

PtPt

mVR

I= . Repetimos este procedimiento, aumentando la tensión de

alimentación del platino hasta llegar a los 3V.

Una vez tenemos todos los valores, utilizando la formula (3) podemos calcular el valor del coeficiente de temperatura para cada uno de las variaciones de 200mV de la tensión de alimentación.

Para temperaturas pequeñas [25ºC..30ºC] del calefactor de platino el coeficiente de temperatura calculado será despreciado ya que tiene un error de casi el 50% como vaya aumentando la temperatura, el error del coeficiente de platino será menor.

Tª(ºC) Rpt(Ω) α (Coef. Pt)

25 11 Temp. ambiente

29 11,1 0,00227273

30 11,2 0,00363636

31 11,3 0,00454545

31 11,4 0,00606061

33 11,5 0,00568182

35 11,6 0,00545455

36 11,7 0,00578512

37 11,8 0,00606061

39 11,9 0,00584416

39 12 0,00649351

41 12,1 0,00625

42 12,2 0,00641711

45 12,3 0,00590909

49 12,4 0,00530303

48 12,5 0,00592885

49 12,6 0,00606061

51 12,7 0,00594406

52 12,8 0,00606061

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

15

56 12,9 0,00557185

60 13 0,00519481

61 13,1 0,00530303

61 13,2 0,00555556

64 13,3 0,00536131

64 13,4 0,00559441

65 13,5 0,00568182

Tabla 1. Calculo coef. de tª

Procedemos a sumar todos los coeficientes de platino (no se consideran los que están en rojo) y hacemos la media. De esta forma obtendremos el valor del coeficiente de temperatura de la resistencia de nuestro calefactor de platino que será el que utilizaremos para calcular la temperatura y la resistencia, es el siguiente valor de α:

0,00528248α =

2.3.1.4.2 Medición de la temperatura del Pt

Se propuso medir la temperatura del calefactor de platino sin la necesidad de utilizar un sensor de temperatura. Para lograrlo, se decidió proceder a medir la variación de la resistencia del platino que es lineal con la temperatura. Utilizando la formula (3) y sabiendo los valores: de la resistencia en temperatura ambiente, coeficiente de la resistencia, la temperatura ambiente y el valor de la Resistencia del platino podemos saber la temperatura que tiene el platino.

¿Cómo podemos medir la resistencia?

Se barajaron dos posibilidades para proder medir la resistencia del platino. El primer método conocido como el método de medición potenciométrico o por medición de tensión: consiste en introducir una resistencia con valor estándar conocida y proceder a la medición de las tensiones V1 y V2. Aplicando la formula (4) podemos calcular la resistencia del platino. En la figura 3 se muestra el esquema del método potenciométrico.

Figura 3. Método potenciométrico.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

16

Para calcular la resistencia del platino solo tenemos que aplicar la siguiente formula:

2

1

( )R V

R PtV⋅

= (4)

La ventaja de utilizar este método de medición de la resistencia del platino, es su simplicidad pero los inconvenientes son mayores. Tenemos el inconveniente de utilizar una resistencia mucho mas pequeña (≈1Ω) que la resistencia que tiene el platino en temperatura ambiente (≈11 Ω a una temperatura ambiente de 25 ºC) También tenemos el problema, de que el valor tomado en el muestreo de la señal V2 puede ser conflictivo, ya que V2 sufrirá unas variaciones de tensión muy pequeñas del orden de 1 mV respecto la variación de la resistencia del Pt puede varia 1Ω. Esto nos ocasiona una incertidumbre elevada en el calculo de la resistencia del platino ya que el conversor A/D puede tomar el valor de V2 con un error de unos ±5mV, necesitamos una precision elevada de conversión.

También tenemos el inconveniente de que el microcontrolador MSP430F169 no puede proporcionar la corriente que necesita el calefactor de platino. La corriente media que precisara el calefactor de platino es elevada, esto hace que necesitemos diseñar un circuito de potencia que pueda suministrar la corriente que precisa el calefactor de platino.

De este modo se llego a la conclusión del segundo método de medición de la resistencia del platino. Este método consiste en utilizar una fuente Howland, que nos suministrara una corriente de salida conocida controlada por la tensión de entrada a la fuente Howland.

La corriente de salida (Iout) es conocida en todo momento utilizando la formula (5) podremos saber la corriente suministrada por la fuente Howland. La resistencia del platino la podemos saber utilizando la formula (6) En la Figura 4 se muestra el esquema de conexión de la fuente Howland.

Figura 4 Método de la Fuente Howland

Para calcular la resistencia del platino solo tenemos que aplicar las formulas siguientes:

VinIout

Rc= (5)

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

17

( )Vout

R PtIout

= (6)

Las ventajas de utilizar este método en la medición de la resistencia del platino, son las siguientes: nos proporciona la corriente que precisa el calefactor, no necesitamos una mayor precisión de muestreo con el conversor A/D del MSP430F169, sabemos en todo momento la corriente aplicada al calefactor. Por el contrario tenemos los siguientes inconvenientes: la corriente de salida esta limitada por la corriente máxima que puede proporcionar el amplificador operacional y tenemos una mayor complejidad de implementación.

El mayor inconveniente que tenemos es la limitación de la corriente de salida. El margen de trabajo de la corriente de salida estará marcada por el limite de trabajo de la temperatura del platino. Los limites de la temperatura que tendrá el platino será de 25º a 70 ºC teniendo en cuenta que la temperatura máxima que llegara el platino es de 70 ºC y que necesita consumir una corriente de 191 mA para esta temperatura (ver tabla 1), se ha elegido un amplificador de potencia capaz de suministrar los 191 mA. El operacional elegido es el OPA547FT que puede suministrar una corriente de salida máxima de 0,5A.

En conclusión tenemos, que para determinar la temperatura del platino sólo es necesario saber la resistencia que tiene este y para saber la resistencia que tiene el platino sólo necesitamos utilizar la formula (6) Con lo que necesitamos saber: la tensión media aplicada en el calefactor (Vout), la corriente media suministrada (Iout) y la tensión media suministrada a la fuente Howland (Vin) Los valores de la tensión Vout y Vin de la fuente Howland serán adquiridas por el conversor A/D de 12bits del microcontrolador MSP430F169, internamente realizara los cálculos utilizando las formulas (5) y (6) para saber exactamente el valor de la resistencia del platino.

2.3.2 Circuito de potencia

El circuito de potencia proporciona la corriente que necesita el calefactor de platino dependiendo de la tensión media de la señal PWM aplicada por el microcontrolador MSP430F169. También transforma la señal PWM en una señal continua para que las señales Vout y Vin puedan ser muestreadas con el conversor A/D de 12bits del microcontrolador MSP430F169. En la figura 4 se muestra el esquema en bloques del circuito de potencia.

Figura 4. Esquema circuito de potencia

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

18

2.3.2.1 Filtro activo Paso-Bajo

El filtrado de la señal PWM se realiza con un filtro activo paso bajo integrador. Nos interesa filtrar la señal PWM para poder hacer un muestreo de la tensión media aplicada a la fuente Howland y la tensión media del calefactor de platino con el conversor A/D del microcontrolador MSP430F169. Si la señal PWM no se filtrara no la podríamos muestrear ya que tomaríamos los valores Vmax (2,87V) y Vmin(0V) alternados, no se tomaría el valor de la tensión media, que es lo que realmente necesitamos medir.

Figura 5. Filtro paso_bajo activo

No se utiliza la ganancia del filtro. La ganancia de nuestro filtro activo será de uno (G = 1), ya que tenemos suficiente con la tensión que aplica el microcontrolador con un dutycycle=100% tenemos una Vsalida = 2,87V.

2.3.2.1.1 Diseño Filtro paso_bajo activo integrador.

El Filtro paso_bajo integrador es un filtro paso bajo de primer orden donde conseguiremos una atenuación de –20 db/dec, también queremos que la frecuencia de corte sea pequeña para poder eliminar las perturbaciones y así tener una señal continua relativamente limpia.

Ecuaciones del Filtro activo paso_bajo integrador:

12

2

1

1

in outV VR R

Cs

RCs

−=

⋅ +

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

19

2

12

1

1in

out

RV Cs VR R

Cs

⋅ ⋅ = − +

2 2

1

2

1

( )1

R C RH s

R sC R

⋅ = − ⋅ + ⋅

2

1 2

1( )

1R

H sR R C s

= − ⋅ + ⋅ ⋅

(7)

Tenemos una ganancia en H(0)

2

1

(0)R

HR

= − (8)

Tendremos un polo en ω=2

1R C

−⋅

, a continuación se muestra el diagrama de polos y

ceros.

Figura 6. diagrama de polos y ceros

La ganancia del filtro paso_bajo activo será de 1 (G = 1) por lo tanto –(R2/R1) = 1 R1 = R2, elegimos una resistencia de 6K8.

La frecuencia de la señal PWM es de 10KHz fijando la señal de corte 100 veces inferior tenemos una frecuencia de corte de 100Hz:

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

20

2

2

9

2 1001

2 100

6 8

234,0 10

R CR K

C

ω

= ⋅ Π ⋅

⋅ Π ⋅ =⋅

= Ω

= ⋅

Elegimos un condensador que se pueda encontrar en el mercado C = 220 nF. La nueva frecuencia de corte con un condensador de 220 nF será de 106 Hz.

Respuesta frecuencial del filtro paso_bajo activo integrador.

Figura 6. Respuesta en frecuencia

2.3.2.1.2 Fuente Howland

La fuente de corriente es la que proporciona la intensidad que pasa por el calefactor de platino. La corriente, será la que actuará directamente sobre la temperatura del calefactor.

Figura 7. Fuente Howland

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

21

La relación entre la intensidad de salida y el voltaje de entrada viene determinado por los siguientes cálculos:

Nodo A:

1 202

1 202

1 2 2

in

in

I IV Va Va V

R RV Va Va V

R R R

=− −

=

−− = −

Nodo B:

( )

( )

3 402

3 4

4 102

44 34

01 021 2 2

01 2 2 1 02 1

1 2 02 1 01 2

02 1 01 21 2

1 2 02 1 01 2

02 1 01 21 2

Pt

Pt

PtPt

Pt

I I ILV Vb Vb Vb

R R R

R RVb V

R RR R RR R

V Va Va VR R R

V R Va R Va R V R

Va R R V R V R

V R V RVa

R R

Va R R V R V R

V R V RVa

R R

= +−

= +

⋅= ⋅ ⋅

⋅+ ++

−− = −

⋅ − ⋅ − ⋅ = − ⋅

⋅ + = ⋅ + ⋅

⋅ + ⋅=

+

⋅ + = ⋅ + ⋅

⋅ + ⋅=

+

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

22

Como Va = Vb, substituimos:

( ) ( ) ( )

402 1 01 2 102

41 2 4 34

4 402 1 01 202

1 2 4 3 4 3 4

02 1 3 4 3 4 01 2 3 4 3 4 02 4 1 2

02 1 3 4 3

Pt

PtPt

Pt

Pt Pt

Pt Pt Pt

Pt Pt Pt Pt Pt

P

R RV R V RV

R RR R R R RR R

R R R RV R V RV

R R R R R R R R R R

V R R R R R R R V R R R R R R R V R R R R

V R R R R R

⋅⋅ + ⋅= ⋅ ⋅

⋅+ + ++

⋅ +⋅ + ⋅= ⋅ ⋅

+ + ⋅ + ⋅ + ⋅

⋅ ⋅ ⋅ + ⋅ + ⋅ + ⋅ ⋅ ⋅ + ⋅ + ⋅ = ⋅ ⋅ ⋅ +

⋅ ⋅ + ⋅( ) ( ) ( )

( )( ) ( )

4 4 1 2 01 2 3 4 3 4

2 3 4 3 402 01

4 1 2 1 3 4 3 4

t Pt Pt Pt Pt

Pt Pt

Pt Pt Pt

R R R R R R V R R R R R R R

R R R R R R RV V

R R R R R R R R R R R

+ ⋅ − ⋅ ⋅ + = − ⋅ ⋅ ⋅ + ⋅ + ⋅

⋅ ⋅ + ⋅ + ⋅= ⋅

⋅ ⋅ + − ⋅ ⋅ + ⋅ + ⋅

V01=Vin

( )( ) ( ) ( )

( ) ( )

2 3 4 3 4 44 1 2 1 3 4 3 4 3 4 3 4

2 44 1 2 1 3 4 3 4

2 44 2 1 3 4 3 1

2

Pt Pt IN PtOut

Pt Pt Pt Pt Pt Pt Pt

INOut

Pt Pt Pt

INOut

Pt Pt

Out

R R R R R R R V R RVbI

R R R R R R R R R R R R R R R R R R R

R R VI

R R R R R R R R R R R

R R VI

R R R R R R R R R

RI

⋅ ⋅ + ⋅ + ⋅ ⋅= = ⋅ ⋅

⋅ ⋅ + − ⋅ ⋅ + ⋅ + ⋅ ⋅ + ⋅ + ⋅

⋅ ⋅=

⋅ ⋅ + − ⋅ ⋅ + ⋅ + ⋅

⋅ ⋅=

⋅ ⋅ − ⋅ ⋅ − ⋅ ⋅

⋅=

( )4

4 2 1 3 3 4 1IN

Pt

R VR R R R R R R R

⋅⋅ ⋅ − ⋅ − ⋅ ⋅

Teniendo en cuenta que R1*R3 = R2*R4

1 3 2 4 2 4 1 3 0R R R R R R R R⋅ = ⋅ − − > ⋅ − ⋅ =

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

23

Por lo tanto:

( )2 4

4 2 1 3 1 3 4 4IN IN

OutPT

R R V VI

R R R R R R R R R⋅ ⋅

= =⋅ ⋅ − ⋅ − ⋅ ⋅ −

(9)

Tenemos que con un duty cycle del 100% aplicamos una tensión media Vin = 2,87 V (varia en función de la tensión de alimentación del microcontrolador MSP430F169) como queremos que el calefactor llegue como máximo a los 70 ºC, mirando la tabla 1 tiene una corriente de salida Iout = 191 mA.

Queremos que la fuente de corriente proporcione una corriente máxima de salida de Iout = 191 mA cuando el duty cylce sea del 100% Vin = 2.87V

Utilizamos la formula (9) para obtener el valor de la resistencia R4 (Resistencia de control):

3

42.87

191 104

4 15,02

INPt

VI

R

RR

=−

−⋅ =

= Ω

Se elige una resistencia que se encuentre en el mercado, esta será de 15 Ω.

Con la relación que se ha conseguido de la corriente de salida con la tensión de entrada, encontramos el resto de valores de las resistencias:

3

2 31 4

2 15100 10 15

R RR R

R

=

Ω=

⋅ Ω

Suponemos una R1 = 100 kΩ entonces R2 = 100 kΩ.

¿Qué Potencia elegimos para las resistencias?

La resistencia que tiene que soportar mas corriente es la resistencia R3, la corriente que circula por la resistencia es la suma de la corriente que circula por el resitor de platino Rpt mas la corriente que circula por la Resistencia de control R4.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

24

La corriente máxima que puede suministrar la fuente de corriente al calefactor de platino se encuentra limitada por el operacional AOP547FT que es de 500 mA, sabiendo este dato, realizamos los siguientes cálculos para saber la potencia consumida en la resistencia de control:

33

3

3

500 10 15

7.5

11 500 10 3,75

R

R

V

V V

P W

= ⋅ ⋅=

= ⋅ ⋅ =

Sé a elegido una resistencia cerámica de 4 W para futuras aplicaciones que necesiten aplicar la máxima corriente del operacional OPA547FT = 0,5A.

2.3.2.1.3 Amplificador Inversor.

La tensión aplicada a la fuente Howland es la tensión aplicada por el filtro activo integrador siendo esta negativa. Como queremos muestrear la tensión Vin con el conversor A/D del microcontrolador MSP430F169 la señal Vin no puede ser negativa, el modulo conversor A/D tiene como tensión de referencia negativa Avss (Vref-=0) es decir si la tensión muestreada es menor que cero el conversor A/D la considerara 0 (Nadc=0). Para poder muestrear la señal Vin utilizamos un amplificador inversor con ganancia de uno.

La ganancia del amplificador operación será de uno y las resistencias elegidas son:

R1=R2=47KΩ.

2.3.2.1.4 Control de temperatura del Calefactor de Pt

El control de la temperatura del calefactor de platino se lleva a cabo por el microcontrolador MSP430F169. La aplicación Port V1.0 mandara por el puerto serie, previamente abierto por el usuario, la temperatura de consigna del calefactor, las constantes de proporcionalidad e integral y el periodo de muestreo del sistema.

Nuestro sistema de control es del tiempo muestreado. Es decir, a intervalos regulares se observara el valor de la resistencia del calefactor de platino y aplicamos las correcciones oportunas a la salida para que la temperatura del calefactor se sitúe a la temperatura de consigna.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

25

2.3.2.1.4.1 Implementación del algoritmo de Control PI

Para introducirnos en el campo de control es importante definir que es un sistema de control en lazo cerrado.

Lazo cerrado: En el sistema de lazo cerrado o retroalimentado, la señal de salida tiene efecto directo sobre la acción de control, ya que es retroalimentado y comparado con una entrada de referencia, con lo que permite rectificar las modificaciones que se producen en todas las entradas del proceso y así controlar el valor de salida. En este sistema es el que normalmente se usa en el control industrial.

Figura 8 Diagrama de bloque de un sistema de control cerrado.

La función de transferencia es uno de los conceptos más importantes, ya que define las características del estado estacionario y dinámico del sistema y sus términos determinan si el sistema es estable o no y si su respuesta a una entrada no oscilatoria es oscilatoria.

La función de transferencia de lazo cerrado que expresa la relación entre la señal de salida o variable controlada y la señal de entrada o valor deseado es:

De la ecuación, si el polinomio del denominador se hace cero, se obtiene la ecuación

característica:

Esta ecuación suministra información acerca de la estabilidad del sistema. Una de las características mas importantes que debe cumplir un buen sistema de control, es su estabilidad, aun cuando este sujeto a cambios bruscos en la señal de entrada. Se dice que un sistema es estable cuando su salida se mantiene o finita para cualquier entrada acotada.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

26

El algoritmo de control PI se basa en un control proporcional integrador. La acción proporcional tiende a reducir la inestabilidad producida por la acción integral, ya que nos proporciona un camino directo en el lazo.

La parte proporcional da lugar a un cero en la transferencia del controlador PI cuyo efecto es el de neutralizar la inestabilidad que produce el polo en el origen, que este es introducido por la acción integral.

Figura 9. Controlador PI

La representación de un control PI es la siguiente:

1( ) ( ) ( )PU t K e t e t

Ti = ⋅ + ∫ (10)

Siendo U(t) la variable de control duty cycle de la señal PWM, e(t) es la diferencia entre la referencia y la salida, Kp es la constante de proporcionalidad, y Ti el tiempo integral.

Realizamos la discretización de la ecuación y nos quedamos con la siguiente ecuación:

0

k

k p k jj

tU K e e

Ti =

∆= ⋅ + ⋅

∑ (11)

No queremos que cada vez se calcule un nuevo duty cycle en cada muestreo, esto nos hace que el control sea muy sensible a posibles errores en la lectura del error. Por esta razón, implementamos un algoritmo de control incremental. Esto quiere decir, que en cada nuevo muestreo se evaluará el incremento a aplicar a la salida. Para lograrlo tenemos que derivar la ecuación (12) respecto al tiempo.

( ) ( ) ( )P

i

dc t e t e tK

t t Tδ δ

δ δ

= ⋅ +

(12 )

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

27

Discretizamos la ecuación (13) y tenemos:

( ) ( 1) ( )Pt

dc K e n e n e nTi∆ ∆ = ⋅ − − + ⋅

(13)

1

2

( ) ( 1) ( )

( ) ( ) ( ) ( 1)

1

P P P

P P P

P

P

tdc K e n K e n K e n

Ti

tdc n K e n K e n K e n

Ti

tK K

Ti

K K

∆∆ = ⋅ − ⋅ − + ⋅ ⋅

∆∆ = ⋅ + ⋅ ⋅ − ⋅ −

∆ = ⋅ +

= −

1( ) ( ) ( 1) Pdc n e n K e n K∆ + = ⋅ − − ⋅ (14)

La Ecuación (14) será la ecuación que programaremos en el microcontrolador MSP430F169. Las constantes K1 y K2 dependen de los parámetros Kp y Ti introducidos por el usuario en el programa Port V1.0. Para ahorrar tiempo de computo las constante K1 se calculara una sola vez por el PC.

∆t es el periodo con el que muestrearemos la temperatura del calefactor de platino, a partir de ahora y en adelante la llamaremos Ts.

Figura 10.Diagrama general de control

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

28

2.3.3 Software

2.3.3.1 Comunicación por el puerto serie bajo Windows

2.3.3.1.1 Acceso a los puertos Las aplicaciones de Windows se comunican con los dispositivos a través de las

funciones del API. Estas funciones acceden a los puertos mediante el controlador, que es una capa intermedia de software entre el hardware y el sistema operativo. El correspondiente controlador para el puerto serie es por defecto comm.drv.

Hay varias soluciones para tener acceso a los puertos, que son las siguientes:

ü Utilizando las APIà Esta técnica es la más aconsejable si deseamos que los programas sean estables y portables.

ü Acceso directo al hardwareà Permite adaptar rápidamente los programas desarrollados bajo DOS. No funciona en el entorno Windows NT. Hay que desarrollar las funciones inpotb( ) y outportb( ), para ello hay que escribir en código ensamblador.

ü Acceso mediante controladorà Requiere el desarrollo de un controlador de dispositivo. Hay que crear un controlador en formato DLL.

Se ha creído más conveniente utilizar la técnica de acceso a los puertos de E/S utilizando las funciones del API de Windows, ya que trabajar con el puerto serie se asemeja mucha al trabajo con ficheros. Esta técnica es la mas aconsejable por el hecho de que el programa será mucho más portable y estable.

Para trabajar con el puerto utilizando las funciones del API, se distinguen cuatro fases, que son:

1. Operación de apertura: se obtiene un manejador o handle y se comprueba si el sistema operativo puede obtener el puerto.

2. Configuración: establecemos los parámetros de comunicación.

3. Acceso al puerto: Accedemos al puerto para poder leer o escribir en el.

4. Cierre del puerto Para que otras aplicaciones puedan hacer uso del puerto.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

29

2.3.3.1.2 Gestión de errores.

Todas las funciones del API utilizadas tiene como argumento de salida un parámetro tipo bool, que nos indica si la función se ejecutó correctamente o no.

Si la función no se ejecutó correctamente se muestra un aviso de error por la pantalla.

2.3.3.2 Trabajar en MULTITAREA

Windows tiene la propiedad de realizar múltiples tareas a la vez, con esta característica se pueden crear subprocesos que trabajen de forma independiente. En Port V1.0 es de gran utilidad trabajar con subprocesos. Si no trabajamos en multitarea Port V1.0 estaría en un bucle infinito de recepción de datos, que causaría el bloqueo del programa.

¿Cómo crear un subproceso o Thread?

C++Builder trae incorporado un objeto del tipo concurrente llamado Thread object, que pertenece a la clase Tthread, donde creamos el subproceso, hilo o Thread.

A continuación creamos un objeto thread con File-New-ThreadObject como nombre de la clase utilizamos hilo, al aceptar se creará la unidad UNIT2 en esta unidad se declara (UNIT2.H) y define (UNIT2.CPP)

El constructor hilo::hilo(bool CreateSuspended)crea inicialmente el hilo en

estado “suspendido”, es decir, no comienza inmediatamente su ejecución. Antes de lanzarlo, asigna True a la propiedad FreeOnTerminate, para que la memoria del objeto TSPThread sea liberada al finalizar la ejecución del hilo. Lo que haga el hilo estará determinado por el contenido del método Execute ( ). Al observar el cuerpo de este método se puede pensar que la aplicación se quedara colgada al ser un bucle infinito, esto sucedería si el código del hilo se ejecutara en el proceso principal de la aplicación. Como se encuentra en un subproceso el código se esta ejecutando en paralelo con el código del programa principal

Cuando queramos que el método Execute( ) procese cualquier elemento o componente visual, haremos una llamada a un segundo método que si podrá manipular directamente el elemento. La llamada de Execute( ) al segundo método debe ser dentro de un método especial de Execute(), llamado Synchronize(segundo método)

2.3.3.3 La clase Tthread.

El API WIN32 dispone de una variedad de funciones que manejan los subprocesos. C++ Builder facilita el uso de los subprocesos mediante la clase TThread, a continuación se explica un resumen del interface de la clase TThread.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

30

Execute ( ) à Zona donde se coloca el código que queremos que se ejecute como si fuese una aplicación independiente. El constructor de la clase TThread( ) llama de forma automática a este método.

TThread( )à Constructor de la clase, indicamos si queremos que el subproceso se encuentre activo o suspendido una vez ya se ha creado.

TThread (true) à El subproceso se crea, pero se encuentra en suspensión. Si se quiere que se encuentre activo indicar false.

Suspend ( )à Suspendemos de forma temporal la ejecución de un subproceso. No hacemos ningún uso de la CPU.

Resume ( )àReiniciamos la ejecución de un subproceso que se encuentra en suspensión.

Terminate ( )àTermina el subproceso y libera de forma automática todos los recursos que tenga asignados. Si cerramos Port V1.0 y no se ha terminado el subproceso, este termina automáticamente.

2.3.3.4 Generación de gráficos con Teechart

Teechart es una aplicación de Borland C++ builder que permite el diseño de lo que en ejecución serán nuestros gráficos.

¿Cómo crear un grafico Teechart?

Seleccionamos el componente TChart desde la paleta Addicional ajustando el

tamaño en el formulario. A partir de aquí, es prácticamente igual utilizar el Inspector de Objetos para conseguir las características deseadas o el Edit Chart, pulsando el botón secundario del ratón.

Para añadir una serie seleccionamos Edit Chart, que va a ser nuestra herramienta de

trabajo, y se añade una serie pulsando el botón Add. Una vez que hemos pulsado, nos aparecerá la Galería con la posibilidad de utilizar el tipo de Series (Line, Fast line, bar, horiz. Bar, Area, Point, Pie, Arrow,etc.) El tipo de serie que queremos para nuestra grafica es el del tipo line que tendrá dos variables (X, Y). La herramienta de trabajo Edit Chart ofrece una gran variedad de posibilidades de diseño, en la mayoría de los casos su utilidad es muy evidente o intuitiva como para detallarlas. Ya diseñado el objeto Teechar, solo falta que el proceso pueda introducir los valores de las coordenadas (X,Y) y verlos de forma grafica. Para ello, utilizamos la función Addxy(valor_X,valor_Y,texto,color). Con la función Addxy( ) daremos valores a las coordenadas X e Y, el Valor de X será el tiempo y el Valor de Y será la temperatura del

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

31

calefactor de platino. Como trabajamos con varias series en la misma grafica, utilizamos un puntero que llamara a la serie a modificar. Ejemplo. Serie1->Addxy(Periodo,Ta,clRed); en este ejemplo, seleccionamos la serie1 (Grafica de la temperatura), añadimos un nuevo valor en la coordenada X (Valor del periodo) y en la coordenada Y (el nuevo valor de la Temperatura del calefactor de platino) también le indicamos que el color de la grafica será el rojo.

2.4 Descripción general de las soluciones adoptadas

2.4.1 Hardware

2.4.1.1 Características físicas del RS232

La conexión del PC con el microcontrolador MSP430F169 no puede ser directa ya que las señales eléctricas utilizadas para la transmisión de información por parte del PC es de +5 y + 12 voltios para el estado activo y entre –5 y –12 voltios para estado no activo. Para establecer la comunicación entre el PC y el microcontrolador se utiliza el chip MAX232 que tendrá la función de adaptar las señales eléctricas del PC al microcontrolador MSP430F169 y viceversa.

En la Figura 11 se muestra el modo de conexión del MAX232.

Figura 11. Conexión MAX232

Los condensadores utilizados son condensadores electrolíticos de 1 µF.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

32

2.4.1.2 El microcontrolador MSP430F169

La memoria del micro MSP430F169 esta limitada a 64KB ya que el direccionamiento de memoria es de 16 bits. El mapa de memoria se divide en la memoria flash: 60KB(se encuentra el código del usuario y los vectores de interrupción) + 256B (memoria de información) y 2KB de la memoria RAM.

La diferencia entre el sector donde se encuentra el código y el sector de la memoria de información es que el primero se puede borrar en bloques de 512 bytes, en tanto el segundo se puede borrar en bloques de 128 bytes (2 bloques en total), lo que lo hace más indicado para almacenar información de usuario, pero esto no impide que se pueda utilizar la sección de código no utilizada para almacenar información.

Características del microcontrolador MSP430F169:

- Rango de alimentación 1.8-3.6V. - Consumo, en modo bajo consumo:

§ Modo activo: 330 µA alimentada a 2.2V § Modo Standby: 1.1 µA § Modo Off: 0.2 µA

- Cinco modos de operación, uno activo (AM), y 4 de bajo consumo (LPMn) - Tres canales de DMA internos. - Conversor A/D de 12 bits, con tensiones de referencia internas. - Conversor D/A de 12 bits. - Dos Timers de 16 bits, Timer_A y el Timer_B se puede configurar el tamaño

del registro del temporizador, varios modos de funcionamiento. - On-Chip Comparador. - Dispone de dos USART (USART0 y USART1), para comunicaciones serie,

configurable como UART, SPI o I2C. En la Figura 12 se muestra el diagrama de bloques del microcontrolador MSP430F169:

Figura 12. Diagrama de bloques MSP430F169

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

33

Cada bit del puerto se puede manejar de forma independiente. El control y acceso a los puertos se realiza mediante 4 registros por cada uno de los n puertos, que son: los que almacenan los datos de entrada PnIN, de salida PnOUT, el sentido de entrada o salida de cada pin PnDIR y la función como puerto de entrada / salida o como periférico PnSEL.

Los dos primeros puertos tienen capacidad de generar interrupciones en cada uno de sus 8 bits. El registro de habilitación de interrupciones PnIE define que patilla del puerto genera interrupciones, en el registro de selección PnIES selecciona la transición que generará interrupciones (flanco de bajada o de subida), y el registro que contiene los flags de interrupción PnIFG indica qué patilla generó la interrupción. Cada puerto lleva a un solo vector de interrupciones por lo que la rutina de atención de interrupciones debe verificar el estado del registro PnIFG para saber qué pin del microcontrolador generó la interrupción.

Pines que se han utilizado en el microcontrolador MSP430F169, que son los siguientes:

P1.7/TA2 (Pin 19) à Etapa 2 del Timer A, por este pin generamos la señal PWM. P6.2/A2 (Pin 61) à Canal 2 del conversor A/D de 12bits, por este pin muestreamos la

señal Vin (Tensión de entrada de la fuente Howland). P6.3/A3 (Pin2) à Canal 3 del conversor A/D de 12bits, por este pin muestreamos la

tensión Vout (Tensión aplicada en el calefactor de platino). P3.4/UTXD0 (Pin32) à Salida Tx del modulo USART0. P3.5/URXD0 (Pin33) à Entrada Rx del modulo USART0.

2.4.1.2.1 Modulo del Reloj.

Utilizamos como fuente de reloj el oscilador interno controlado digitalmente (DCO) del tipo RC. A partir de este módulo están disponibles tres señales de reloj:

• ACLK: reloj auxiliar, utiliza como fuente a LFXT1CLK, divisible por 1, 2, 4 u 8 (seleccionable por software para periféricos)

• MCLK: reloj maestro, usado por la CPU y el sistema; es posible seleccionar entre LFXT1CLK y DCOCLK como fuente para MCLK, divisible por 1, 2, 4 u 8.

• SMCLK: reloj de sub-sistema; es posible seleccionar entre LFXT1CLK y DCOCLK como fuente para SMCLK, divisible por 1, 2, 4 u 8 (seleccionable por software para periféricos).

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

34

¿Cómo podemos Configurar el módulo de reloj (DCO)?

La fuente de las señales de reloj MCLK y SMCLK es por defecto DCOCLK a aproximadamente 800 kHz.

Esto es configurable a través del manejo de los registros DCOCTL, BCSCTL1 y BCSCTL2.

Ajuste de la frecuencia de DCO

El ajuste se realiza a través de los bits RSELx, DCOx y MODx , de los registros BCSCTL1 y DCOCTL, respectivamente.

Los dos primeros permiten realizar un ajuste entre los 64 niveles disponibles:

Figura 13. Frecuencia de DC: Rango de DCOx y niveles RSELx .

Inicialmente el microcontrolador tiene predefinidos los valore de RSELx = 4 y DCOx = 3. Nuestro deseo es trabajar con una la frecuencia máximo que permite el modulo de reloj DCO, esta es de 4.7Mhz. Utilizando la grafica de la figura 13 podemos saber los valores de Rsel y DCO, que serán los siguientes:

Rsel = 7 y DCO = 7

Los cinco bits MODx permiten realizar un ajuste fino de la frecuencia seleccionada.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

35

2.4.1.2.2 Modulo comunicación: USART.

2.4.1.2.2.1 Introducción

La palabra USART significa “Receptor / Transmisor Sincrónico / Asincrónico Universal”. El microcontrolador MSP430F169, dispone de dos módulos USART, los módulos USART0 y USART1.

Utilizaremos el modulo USART0 en modo asincrónico. Para seleccionar el modo asincrónico se pone el bit SYNC = 0, que se encuentra en el registro U0CTL.

Características de la USART0:

- Los Buffers de transmisión y recepción están separados.

- Registro de desplazamiento de recepción y transmisión independientes.

- Los datos pueden ser de 7 ó 8 bits.

- El bit menos significativo es el primero que se transmite y el primero en recibirse.

- Tiene la capacidad de salir del modo dormido a través del cambio de estado.

- Baudios de transmisión programables.

- Interrupciones independientes para la transmisión y la recepción.

- Pueden conectarse dos dispositivos usando el protocolo idle line.

- Para conectar tres o mas dispositivos se puede utilizar el protocolo idle line o el protocolo adress bit.

- Detección automática de errores.

2.4.1.2.2.2 USART recepción En la figura 14 se muestra el diagrama de estados de la recepción de datos.

Figura 14. USART recepción

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

36

El bit URXE0 deshabilita o habilita la recepción de los datos que son guardados en el buffer de recepción RXBUF0.

Para poder transmitir la información recibida al buffer hay que esperar a que URXIFG0 = 1, esto nos indica que esta listo para recibir la información.

2.4.1.2.2.3 USART transmisión

En la figura 15 se muestra el diagrama de estados de la transmisión de datos.

Figura 15. USART Transmisión

El bit UTXE0 es el encargado de habilitar o deshabilitar la transmisión de los datos. El inicio de la transmisión se realiza escribiendo un dato en el buffer TXBUF0.

Se inicia la transmisión escribiendo datos en el buffer de transmisión TXBUF0. Cuando se escriban datos en el buffer TX se activara el bit UTXEX=1 y cuando el buffer este listo se activara el bit UTXIFG=1.

Cuando el bit TXEPT=1 nos indicara que la transmisión activa (la del momento) se ha completado.

2.4.1.2.2.4 Interrupciones de la USART

Disponemos de un vector de interrupciones para transmisión y otro para recepción

Transmisión.

Cuando el buffer esta listo para transmitir el flag UTXIFGX=1 (interruption flag) Cuando ya ha transmitido este se resetea automáticamente.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

37

Recepción

Cuando un carácter ha sido recibido y cargado en el buffer, el flag URXIFGX=1 (interruption flag). Se resetea cuando el buffer ha sido leído o la interrupción ha sido servida (URXSE=0)

¿Esta preparado el MSP430 para transmitir o recibir datos?

Para comprobar si el microcontrolador MSP430F169 esta preparado para transmitir ó recibir testeamos el flag URXIFG0 o UTXIFG0 del registro IFG1, en modo encuesta testeamos si URXIFG0=1 (preparado par recibir) o UTXIFG0 (preparado para transmitir), no llamamos a ninguna rutina especial para atender la interrupción. Una vez se ha leído el buffer Rx o escrito en el buffer Tx los flags URXIFG0 / UTXIFG0 se resetearan automáticamente.

2.4.1.2.2.5 Detección automática de errores.

Los errores que detecta las USART0 de forma automática, son: Error de Frame, Error de Paridad, Error de Overrun y Erro de Break.

Error de Frame

Este error se activa (FE = 1) cuando se ha detectado que el bit de stop es un cero, siempre y cuando se haya configurado la USART para utilizar dos bits de stop. Solo comprueba el primer bit de stop.

Error de Paridad

El error de paridad se activa (PE =1) cuando se ha detectado que la paridad no es la que corresponde.

Error de Overrun

Ocurre cuando se carga el carácter en el buffer antes de que el primer dato sea leído por el software. Se activa el bit OE.

Error de Break

El error de break se activa Brk =1, cuando se detecta que en el pin URDXD se han recibo diez o mas bits después de una parada. El error break también puede activar el flag de la interrupción URXIFG0

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

38

2.4.1.2.2.6 Generación del Baud Rate

La velocidad de transferencia del PC con el MSP430F169 tiene un valor estándar de 9600 baudios. Para lograr que el microcontrolador tenga un Baud Rate de 9600 baudios igual que el PC, se tiene que configurar los registros UBR0, UBR1 y UNCTL de la USART0.

UBR0 (USART Baud Rate control regsiter 0) Registro donde se indica el valor de la parte baja del factor de división.

UBR1 (USART Baud Rate control regsiter 1) Registro donde se indica el valor de la parte alta del factor de división.

UNCTL (USART modulation register) Registro donde indicamos la modulación de la señal a transmitir.

Para calcular el factor de división, se divide la frecuencia del reloj fuente de la USART0 por el Baud Rate. Para seleccionar la fuente del reloj que utilizara la USART0, se configura los bits SSLEx del registro U0TCTL SSLE0à’11’ MCLK .

BRCLKN

BaudRate= (15)

BRCLK à Frecuencia de la fuente de reloj utilizada

Nà Factor de división.

Ahora lo que queremos es calcular el factor de división. Tenemos que la fuente del reloj de la USART0 es la misma fuente que la que utiliza

el Master clock (MCLK) y el SubMaster clock (SMCLK) siendo esta de 4.7Mhz, el valor del registro UNCTL=0.

MCLK à 4.7MHz. Baud Rate à9600 UMCTL à no modulamos la señal. m0=0, m1=0, m2=0, m3=0, m4=0, m5=0 y

m7=0. (UMCTL = 0). Usando la Formula (15) calculamos el factor de división.

64.7 10489,58

9600N

⋅= =

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

39

El valor real del factor de división es de 489,58 pero el registro UBRX es entero. Aproximadamente tenemos un factor de división N=489 en hexadecimal N=0x01E9, cargaremos en el registro UBR0 la parte baja (UBR0=0xE9h) y la parte alta en el registro (UBR1 = 0x01h.). Esta aproximación del factor de división nos ocasiona un error en la señal Tx.

Para Calcular el error de transmisión, utilizaremos la formula (16) :

( ) ( )1

0

[%] 1 1 100%n

ii

BaudrateError x j xUxBR m j x

BRCLK

=

= + + − +

∑ (16)

j à j = 0 para la posición 0 que es el bit de start y j = 1 para el D0, j = 2 para D1... Para tener una idea del error que se comete al redondear el factor de división, valor

de N=489,58 (real) y el valor de N=489 (redondeado), en la figura 16 se muestra dos cronogramas del frame que transmite el microcontrolador MSP430F169.

El primero es el que corresponde al real sin truncar el intervalo mínimo significativo y el segundo con el intervalo mínimo significativo truncado.

Figura 16. Cronogramas Transmisión.

¿Porqué la señal Tx no se modula?

La señal a transmitir no será modulada por que la frecuencia del MCLK es muy elevada y no es necesario modular la señal ya que el error cometido en la transmisión de la trama es muy pequeño.

Calculamos el error cometido por el truncamiento del factor de división. Utilizando la formula (16)

UBR0 = 0xE9h, UBR1 = 0x01h, UNCTL=0x00h, utilizamos 8 bits de datos

D0..D7, un bit de start y dos bits de stop.

Error bit Stop(%) = ( )6

960011 1 489 0 12 100 1, 42%

4.7 10x x x + + − = − ⋅

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

40

En conclusión, tenemos un error máximo de –1.429 % en la transmisión. Si este error fuera mas elevado, se podría reducir modulando la señal a transmitir, es decir, que en vez de que cada intervalo significativo tenga el valor 489 se puede ir alternando el valor 489 con el valor 490, de esta forma reduciríamos el error.

2.4.1.2.3 Modulo Conversor A/D de 12bits

2.4.1.2.3.1 Introducción El microcontrolador MSP430F169 dispone de un conversor A/D, con las siguientes

características:

- 12 bits de conversión.

- Tasa de muestreo programables, con un máximo de 200k muestras / segundo.

- Periodos de muestreo programables, pueden ser controlados por software o por las etapas de salida del Tiemr_a y del Timer_b

- Al finalizar cada conversión genera interrupción.

- Referencias de tensión configurables por software.

- Vref + y Vref- pueden ser internas o externas.

- 8 canales de entrada, configurables independientemente.

- Cuatro señales internas: sensor de temperatura interna y niveles de voltajes de referencia.

- 4 modos de adquisición.

- 16 registros para almacenar los resultados obtenidos en la conversión.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

41

2.4.1.2.3.2 Bloques del conversor A/D

En la figura 17 se muestra el diagrama de bloques del conversor A/D.

Figura 17. Diagrama conversor A/D

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

42

2.4.1.2.3.3 Reloj del conversor A/D

ADC12CLK es el reloj utilizado para la conversión, con el registro ADC12SSElx se selecciona la fuente del reloj, que pueden ser SMCLK, MCLK, ACLK y el propio oscilador interno del conversor ADC12OSC. El reloj interno del módulo se encuentra en el rango de 5 Mhz, este valor es teórico ya que varia según el microcontrolador, voltaje de alimentación y la temperatura. El reloj utilizado para la conversión puede ser dividido por 1,2,4 ó 8 configurando los bits del registro ADCDIVx.

Se utiliza como fuente de reloj la fuente interna (ADC12OSC) del conversor A/D, de esta forma: reducimos la complejidad de configuración del conversor, el tamaño del código fuente será menor y el rango de la fuente es superior a la frecuencia del MCLK=4.7Mhz.

El factor de división elegido es de 1, entonces tendremos un ciclo de trabajo de conversión aproximadamente de 0,2 µs.

Ciclo conversor = 6

10.2

5 10s

Hzµ=

⋅ (17)

2.4.1.2.3.4 Voltajes de referencia.

Existen varias fuentes disponibles para los voltajes de referencia que ocupa el conversor.

Existe la opción de utilizar voltajes de referencia internos del módulo, que pueden

ser 1.5 ó 2.5V. Se puede utilizar también un voltaje de referencia externa que se aplica al pin Veref+ del puerto 6. Por último, se puede utilizar el voltaje de alimentación del microcontrolador. Para Vref- se puede elegir Vss o introducir un voltaje de referencia por el pin Veref- . La tensión aplicada en los pines Vref+ y Vref- del puerto 6 no pueden ser superior a la tensión Vcc ni inferior a la Vss del microcontrolador MSP430F169.

En conclusión, utilizaremos como tensión de referencia positiva la tensión de

alimentación del micro, siendo esta de 2.87V y como tensión de referencia negativa la Avss del micro (0V). Elegimos como tensión de referencia la Avss y Avcc del microcontrolador por que será la forma de poder muestrear tensiones con un valor 0<Vin<2.87V.

2.4.1.2.3.5 Bloque de los canales La elección del canal que se convierte se realiza mediante un multiplexor analógico

(interno del microcontrolador), diseñado para minimizar el crosstalk y el ruido. Los canales que no se están convirtiendo quedan puestos a tierra para evitar aún más el ruido. Los canales externos de entrada corresponden a los pines del puerto 6 del microcontrolador, por

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

43

lo que configuramos como entradas y en modo entrada / salida para eliminar el buffer que podría crear problemas con corrientes parásitas.

2.4.1.2.4 Muestreo y tiempos de conversión

Una conversión completa implica dos fases que se corresponde a la fase de muestreo y la fase de conversión.

La fase de captura o muestreo se inicia con el flanco de subida de la señal SHI cuando se ha finalizado esta fase se inicia la fase de conversión, que tardara 13 ciclos del conversor (ADC12CLK)

Como sabemos la fuente de reloj del conversor A/D es el oscilador interno del conversor (5Mhz) Tenemos que un ciclo de reloj es de 0,2 µs y la conversión tarda 13 ciclos, por lo tanto una conversión tendrá una duración aproximada de unos 2.6 µs.

En la Figura 18 se muestra los bloques destinados para controlar y configurar la señal Sampcon.

Figura 18. Bloques señal SAMPCON

La señal SHP nos determina dos modos distintos de captura:

1. Captura extendida (SHP = 0)

En este modo la señal SHI controla directamente la señal SAMPCON, definiendo directamente el periodo de muestreo samplet . En el flanco de bajada

de la señal SHI y SAMPCON existe un tiempo synct hasta el primer flanco de subida de la señal ADC12CLK, iniciando la conversión.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

44

Figura 19. Captura extendida

2. Captura por pulso ( SHP = 1 )

En el flanco de subida de la señal SHI determina la subida de la señal SAMPCON, el tiempo samplet se configura utilizando los bits SHT0x y SHT1x. Con la configuración de los campos SHTx configuramos el numero de ciclos de reloj de samplet .

Después del Flanco de subida de la señal SHI, se tiene un tiempo de sincronismo con el primer flanco de subida de la señal ADC12CLK y luego permanece en alto la señal SAMPCON durante samplet .

Tendremos un periodo de muestreo que corresponderá a samplet + synct .

El inicio de la conversión será inmediatamente después del flanco de bajada de la señal SAMPCON.

En la Figura 20 se puede observar el cronograma de la señal en el modo captura por pulso.

Figura 20. Captura por pulso

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

45

2.4.1.2.5 Tiempos mínimos de muestreo y conversión.

Una consideración importante que debe realizarse al convertir es la característica de filtro paso bajo que tiene el canal durante la fase de muestreo. El conversor A/D toma el valor de Vc, por esta razón hay que esperar un tiempo prudencial para que Vc = Vs.

Figura 21. Filtro paso bajo

Vs = voltaje señal a muestrear.

Rs = Resistencia externa.

Vi = Tensión el pin del canal

Ri=Resistencia interna del multiplexor.

Vc = Voltaje del condensador.

Ci = Condensador de captura.

Dado que el valor que se convierte es VC, se debe esperar un tiempo prudente para

que este valor sea igual a Vs. La relación entre el tiempo de captura y estas variables responde al tiempo de carga del condensador:

13( ) ln(2 )sample S i it R R C> + ⋅ ⋅ (18)

Los valores típicos de la resistencia y condensador internos de los canales del modulo conversor A/D del microcontrolador MSP430F169 son de Ri = 10 kΩ y Ci = 40 pF.

El Valor de Rs que tendremos, será la resistencia del platino en paralelo con la resistencia de control de la fuente Howland. La resistencia máxima que tendrá el calefactor de platino es de 13,5Ω (resistencia a los 70ºC) y el valor de la resistencia de control que es de 15Ω Utilizando la formula (18) obtendremos la tsample mínimo (tiempo mínimo de captura)

3 13(7.1 10 10 ) ln(2 ) 40 3.6samplet pF sµ> + ⋅ ⋅ ⋅ =

El tsample mínimo es de 3.6 µs. Para tener un tsample prudente tiene que ser superior a 3.6 µs.

El modo que utilizamos de captura, es el modo de captura por pulso. Configurando SHTx con el valor 0001 b (tsample = 8 ADC12CLK ciclos) con lo que tendremos un tiempo de captura máximo: tsyncmax = 0.2 µs, tsample=8x0.2µs=1.6µs; tiempo máximo captura = 0.2µs+1.6µs = 1.8 µs.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

46

Tiempo máximo que tarda el conversor en tener una conversión completa:

tconv max = 1.8µs + (13 cilcos x 0.2µs) = 4.4µs

Ver Figura 22 se muestra el cronograma de tiempo del conversor A/D.

Figura 22. Cronograma de tiempos

2.4.1.2.6 Operación del ADC12

Hacemos un muestreo de la señale del canal A2 y del canal A3 del conversor A/D, el resultado obtenido se guarda en los memory registers ADC12MEM0 (valor obtenido por el canal A2) y el ADC12MEM1 (valor del canal A3) donde de forma secuencial se guardan los valores convertidos. El valor de conversión queda dado por la formula (19):

4095 in RADC

R R

V VN

V V−

+ −

−= ⋅

− (19)

Nadc es la salida digital, que toma el valor 0xFFF si la señal de entrada Vin es mayor o igual a Vref+ ( 2.87V ) y Nadc toma el valor 0x000 si la señal de entrada es menor o igual Vr- ( 0V )

Con los datos de diseño (Vr+=2,87//Vr-=0) sustituimos en la formula (19) obtenemos la formula (20), donde podemos calcular la tensión muestreada en el canal A2.

Cuando el usuario deseé trabajar con el microcontrolador MSP430F169 en modo muestreo A/D, el micro mandara por la USART0 el valor del registro ADC12MEM0. El PC obtendrá este valor del buffer Rx, utilizando la formula (20) calculara el valor de Vin y mostrara por la grafica la tensión muestreada en el canal A2.

1427ADC

in

NV = (20)

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

47

2.4.1.3 Temporizadores.

En este apartado se explica el funcionamiento de trabajo y las soluciones adoptadas en el diseño del timer_A en el modo PWM y la configuración y diseño de la etapa cero del timer_B para crear un segundo timer decremental.

2.4.1.3.1 Introducción

Características del Timer A y Timer B:

- Timer/contador de 16 bit.

- Fuente de reloj seleccionable y configurable.

- Se puede pre-escalar la entrada de reloj en 1, 2, 4 u 8.

- Registros configurables para captura o comparación.

- Salidas configurables con capacidad PWM.

- Registro del vector de interrupciones para decodificación rápida de todas las interrupciones de los Timers

Principales diferencias entre los dos timers:

- El registro de cuenta puede ser configurable de 8, 10, 12 o 16 bits, sólo implementado en el timer B. En el Timer A es fijo de 16 bits.

- Timer_B tiene 7 registro de captura / comparación, mientras que Timer_A solo tiene 3 registros.

- Los registros TBCCRx del timer B tienen buffer dobles y pueden ser agrupados. No esta implementado en el Timer A ambas características.

- Todas las salidas del Timer B pueden ser llevadas a un estado de alta impedancia.

2.4.1.3.2 Modo PWM del Timer_A.

Configuramos el Timer_A en el modo UP/DOWN, de esta forma obtenemos pulsos simétricos. El timer cuenta repetitivamente hasta el valor TACCR0 y luego decremento el valor hasta cero.

El timer_A cuenta con tres bloques de captura y comparación, cada bloque cuenta con una unidad de salida y cada señal de salida tiene ocho modos de operación configurables en el registro TACCTLX. Utilizamos la unidad de salida TA2 que se encuentra en el Pin 19 del MSP430F169, por este pin tendremos la señal PWM calculada previamente por el algoritmo de control.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

48

Para generar la señal PWM se escoge el modo de operación de la etapa de salida TA2 Toggle/Set donde se describe que la señal de salida cambia su estado ( de cero a uno si estaba en cero y de uno a cero si estaba en uno) cuando la cuenta del timer llega al valor de TACCR2. La salida de la etapa 2 (TA2) es puesta a ‘1’ cuando la cuenta del temporizador llega al valor TACCR0.

2.4.1.3.3 La Señal PWM

La señal PWM generada por la etapa dos del Timer A tendrá una frecuencia de 10Khz. Para tener una mayo o menor frecuencia del PWM se tiene que calcular el valor del registro TACCR0.

Para calcular el periodo de la señal PWM utilizamos la formula (21)

6

12 0

4,7 10PWMT TACCR

= ⋅ ⋅ ⋅ (21)

Tpwmà Periodo de la señal PWM. Despegando TACCR0:

704, 25 10

PWMTTACCR =

⋅ (22)

El periodo de la señal PWM es 41 10PWMT −= ⋅ , sustituimos los valores para calcular el valor de TACCR0.

4

7

1 100 235.29

4,25 10TACCR

⋅= =

Como TACCR0 es un entero, a TACCR0 le sumaremos 0,5 para reducir el error a la mitad, en total tendremos que TACCR0 = 235.

Con el valor de TACCR2 calcularemos el duty cylce de la señal PWM, utilizando la siguiente ecuación podremos saber el valor de TACCR2 a utilizar según el duty cycle que deseemos.

2 0 ( 0 )TACCR TACCR TACCR xDutycicle= − (23)

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

49

Por ejemplo. Si queremos un duty cycle del 50 % y la señal PWM tiene una frecuencia de 10Khz (TACCR0 = 235) Utilizando la Formula (23) sabremos el valor de TACCR2.

2 235 (235 0,5) 117.5TACCR x= − =

Los registro TACCR0, TACCR1 son valores enteros, para reducir el error a la mitad, sumaremos 0,5 a TACCR2 117,5 +0,5 = 118.

En la figura 23 se muestra el cronograma de la señal PWM.

Figura 23. Señal PWM

2.4.1.3.4 Timer_B

Nuestro sistema de control es del tiempo muestreado. Es decir, a intervalos regulares se observa el calefactor de platino y aplicamos las correcciones oportunas a la salida para que la temperatura del calefactor se situe a la temperatura de consigna. El periodo de muestreo de la planta varia en función de la temperatura. Es decir, si se quiere que el calefactor de platino trabaje en un margen de temperatura pequeñas de 25ºC a 35ºC el periodo de muestreo es de 100ms, si se trabaja con temperaturas elevadas de 35º a 70ºC el periodo de muestreo del calefactor es de 700ms. Esto es debido a que el calefactor de platino consigue llegar a las temperaturas de 25ºC a 35ºC mas rápidamente que a temperaturas elevadas. Por lo tanto Trabajamos con un periodo de muestreo menor que el periodo de muestreo del calefactor siendo este del orden de los 20 ms a 150 ms, estos valores no son determinantes pueden ser menores o mayores.

El Timer B es un contador de 16 bits. El modo de trabajo del timer b es en modo UP mode (Modo incrementado)El Timer cuenta repetitivamente hasta el valor indicado por el registro de comparación TBCCR0, una vez que se ha alcanzado el valor máximo TBCCR0 empieza la cuenta nuevamente desde cero. El flag de interrupción se activa cuando el timer alcanza el valor de TBCCR0.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

50

El periodo máximo del timer b con el valor máximo del contador TBCCR0=65535,

será de 6

165535 139.4

4.7 10tic ms= ⋅ =

⋅. Si queremos trabajar con un periodo de muestreo

mayor, no podemos. Para solucionar este problema se ha diseñado un segundo timer que dependerá del Timer B. Se ha querido que el timer b proporcione una interrupción cada 10ms, es un tiempo menor que el periodo de muestreo de la planta y tampoco queremos que el microcontrolador se este todo el tiempo interrumpiéndose para atender la interrupción ocasionada por el timer B. En la rutina de interrupción del timer b se diseña un contador decremental donde el valor del contador se ira decrementando cada 10 ms, cuando llegue el contador a cero, se iniciara la conversión de los canales 2 y 3 del conversor A/D.

Figura 24. Segundo Timer.

Calculamos el valor de TBCCR0 que introducimos en el contador del timer b para conseguir los 10 ms:

60 10 4.7 10 47000TBCCR ms= ⋅ ⋅ = .

Para calcular el valor del nuevo tic (timer decremental) Utilizamos la siguiente formula:

1100

(100 ) 0,5

Tic contador

Valorcontador Tic

= ⋅

= ⋅ +(24)

Le sumaremos 0,5 al resultado final para reducir el error un 50%, ya que valor contador es un entero.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

51

2.4.2 Software.

2.4.2.1 Funciones de E/S

Función para abrir el puerto.

Para abrir el puerto se utiliza la función CreateFile() esta función es una función genérica que permite acceder a diversos recursos: Puertos de comunicación, Ficheros, discos...

HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess,

DWORD dwShareMode, LPSECURITY_ATTRIBUTE lpSecurityAttribute

DWORD dwcreationDistribution, DWORD dwFlagsAndAttributes,

HANDLE htemplateFile );

Argumentos de Salida.

CreateFile nos devuelve un manejador o Handle del puerto. Este puntero es necesario para el acceso del puerto. En nuestro caso se guardara en hcomPort.

Argumentos de Entrada

LpFileNameà Indicamos el nombre del puerto a abrir. En nuestro programa se lo indicamos por el RadioButton que asigna a com el nombre del puerto que queremos abrir, si nuestro deseo es abrir el puerto COM2 picamos el RadioButton Com2 y com tendrá el valor “Com2”.

DwDesiredAccessà Se indica el tipo de acceso, nosotros tenemos asignado el modo de acceso GENERIC_READ|GENERIC_WRITE.

DwShareModeà Modo para compartir el puerto, tiene que ser ‘0’ ya que el puerto serie no será compartido por dos aplicaciones simultáneamente.

LpSecurityAttributeà Descriptor de seguridad, se recomida que sea ‘0’

DwcreationDistributionà Especificamos que acción se realizara si el fichero existe o si no existe, ya que en nuestro caso el puerto siempre tiene que existe utilizaremos OPEN_EXISTING.

DwFlagsAndAttributesà Especifica el tipo de atributo del fichero, para el puerto debe ser FILE_ATRIBUTE_NORMAL.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

52

HtemplateFileà NULL

Función para Cerrar el Puerto

Cuando ya se ha terminado el trabajo con el puerto, este se tiene que cerrar, cerrando el manejador y así el sistema operativo libera los recursos que estamos ocupando. La función utilizada es CloseHandle( ). Hay que tener muy en cuenta que no se tiene que tratar un manejador no válido, es decir un manejador no inicializado correctamente por CreateFile( ).

BOOL CloseHandle(HANDLE hObject)

Argumentos de entrada

HObjectà manejador obtenido por CreateFile

Argumento de salida

BOOLà si es TRUE nos indica que la función se ejecuto correctamente.

Función para configurar el Puerto.

Para leer y escribir la configuración del puerto se utilizan las funciones GetCommState ( ) y SetCommState ( ), ambas funciones utilizan como argumento una estructura de tipo DCB, donde los miembros de la estructura DCB se encuentran los campos a configurar. En nuestro caso solo configuramos los siguientes campos:

sComCfg.BaudRate=CBR_9600à Indicamos el Baud Rate de 9600

sComCfg.ByteSize=8 à Determinamos el numero de bits de datos ‘8’

sComCfg.Parity=NOPARITYà No queremos el bit de Paridad.

sComCfg.StopBits=ONESTOPBITà Un solo bit de STOP

Para el Control del Flujo.

sComCfg.fRtsControl=RTS_CONTROL_ENABLEà Habilitamos la línea RTS

sComCfg.fDtrControl=DTR_CONTROL_ENABLEà Habilitamos la línea DTR

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

53

Función donde leeremos la configuración actual del puerto.

En esta función se leerá la configuración actual del Puerto, previamente abierto.

BOOL GetCommState ( HANDLE hFile, LPDCB lpDCB )

Argumentos de entrada.

HFileà Manejador del puerto devuelto por CreateFile( ).

LpDCBà Puntero a la estructura de tipo DCB donde se recibirá la configuración actual del puerto.

Argumentos de salida.

BOOLà TRUE si la función se ejecutó correctamente.

Función de configurar del puerto.

Con esta función podremos configurar el puerto que previamente se ha abierto.

BOOL SetCommState ( HANDLE hFile, LPDCB lpDCB )

Argumentos de entrada.

HFileà Manejador del puerto devuelto por CreateFile( ).

LpDCBà Puntero a una estructura de tipo DCB donde se usara para configurar el puerto.

Argumentos de salida.

BOOL à TRUE si la función se ejecutó correctamente.

Función para la configuración y control de los tiempos de lectura y escritura.

Las funciones SetCommTimeouts( ) permiten configurar como se realizará las operaciones de lectura y escritura.

Trabaja sobre una estructura COMMTIMEOUTS que define el tiempo máximo (TIMEOUT) que durara una operación de lectura o escritura. En nuestro caso configuramos los siguientes campos:

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

54

sTimOut.ReadIntervalTimeout=0à Tiempo máximo de esperas (ms) entre dos bytes recibidos

sTimOut.ReadTotalTimeoutMultiplier=0à Multiplicador (ms) para calcular el TIMEOUT total en operaciones de lectura.

sTimOut.ReadTotalTimeoutConstant=0à Constante (ms) para calcular el TIMEOUT total en operaciones de lectura.

sTimOut.WriteTotalTimeoutMultiplier=0à Multiplicador (ms) para calcular el TIMEOUT total en operaciones de escritura.

sTimOut.WriteTotalTimeoutConstant=0à Constante (ms) para calcular el TIMEOUT total en operaciones de escritura.

Ponemos todos los campos a cero para que las operaciones de lectura no finalicen hasta que no se lean todos los bytes que se piden.

Función de leer y escribir en el Puerto.

Para leer y escribir en el puerto se utilizan las funciones genéricas ReadFile( ) y WriteFile( ), ambas son funciones genéricas que permiten leer o escribir en ficheros, puerto, etc. En nuestro caso nos permitirán leer o escribir en el puerto serie abierto.

Función ReadFile.

BOOL ReadFile( HANDLE hFile, LPVOID IpBuffer,

DWORD nNumberOfBytesToRead, LPDWORD lpNumberofBytesRead,

LPOVERLAPPED lpoverlapped )

Argumentos de entrada:

hFile à Manejador del puerto devuelto por CreateFile( ).

IpBufferà Puntero al buffer donde la función depositara los datos leídos.

NnumberOfByteReadà Numero de bytes que se desean leer.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

55

IpNumberOfByteReadà Puntero a una DWORD donde la función indicara los datos que realmente se han leído.

IpOverlappedà Puntero a una estructura OVERLAPPED para acceso especial a puerto. No lo utilizo ya que es un modo especial de acceso.

Argumento de salida

BOOLà True si la función se ejecuto correctamente.

Función WriteFile.

BOOL WriteFile( HANDLE hFile, LPVOID IpBuffer,

DWORD nNumberOfBytesToWrite, LPDWORD lpNumberofBytesWrite,

LPOVERLAPPED lpoverlapped)

Argumentos de entrada:

HFileà Manejador del puerto devuelto por CreateFile( ).

IpBufferà Puntero al buffer donde la función leerá los datos que escribirá en el puerto.

NnumberOfByteReadà Numero de bytes que se escribirán en el puerto

IpNumberOfByteReadà Puntero a una DWORD donde la función indicara los datos que realmente se han escrito.

IpOverlappedà Puntero a una estructura OVERLAPPED para acceso especial a puerto. No lo utilizo ya que es un modo especial de acceso.

Argumento de salida

BOOLà True si la función se ejecuto correctamente.

Buffer del transmisor y del receptor.

Todas las comunicaciones mediante el API de WINDOWS se realizan a través del BUFFER tanto para la transmisión como para la recepción. Una vez que el puerto ha sido abierto y configurado cualquier carácter que llegue al puerto será almacenado en el buffer del receptor de forma automática por el sistema operativo. Del mismo modo, cuando escribamos en el puerto se hará a través del BUFFER del transmisor, el programa escribirá en él y el sistema operativo ira enviando los datos de forma totalmente automática.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

56

Función SetupComm( ).

Esta función configura el tamaño de los buffer de entrada y salida

BOOL SetupComm( HANDLE hFile, DWORD dwInQueue,

DWORD dwOutQueue)

Argumentos de entrada:

HFileà Manejador del puerto devuelto por CreateFile( ).

DwInQueueà Tamaño que se desea para el BUFFER del receptor.

DwOutQueueà Tamaño que se desea para el BUFFER del transmisor.

Argumento de salida

BOOLà True si la función se ejecuto correctamente.

Limpiar el Buffer Rx y Tx

Si queremos vaciar el BUFFER del transmisor o receptor utilizaremos la función PurgeCommr( ) o si lo que queremos es vaciar el Buffer del transmisor, pero garantizar que se transmite todo su contenido deberemos usar la función FlushFileBuffers( )

Función PurgeCommr()

BOOL PurgeCommr(HANDLE hfile, DWORD dwFlags);

Argumentos de entrada:

HFileà Manejador del puerto devuelto por CreateFile( )

DwFlags à Es uno o combinación de los siguientes valores:

PURGE_TXABORT O PURGE_TXCLEAR

Para limpiar el BUFFER del transmisor.

PURGE_RXABORT O PURGE_RXCLEAR

Para limpiar el BUFFER del receptor.

Argumento de salida

BOOLà True si la función se ejecuto correctamente.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

57

3 MEMORIA DE CALCULO

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

58

3.1 Algoritmo de control PI

El algoritmo de control PI es el encargado de calcular el valor del duty cycle de la señal PWM que se aplica al calefactor de platino.

El algoritmo que se implementa en lenguaje ensamblador es el siguiente:

1

2

( ) ( 1) ( )

( ) ( ) ( ) ( 1)

1

P P P

P P P

P

P

tdc K e n K e n K e n

Tit

dc n K e n K e n K e nTi

tK K

TiK K

∆∆ = ⋅ − ⋅ − + ⋅ ⋅

∆∆ = ⋅ + ⋅ ⋅ − ⋅ −

∆ = ⋅ +

= −

1( ) ( ) ( 1) Pdc n e n K e n K∆ + = ⋅ − − ⋅

El tiempo de muestreo (ts) como anteriormente se ha explicado será de 150 ms (ver apartado 2.4.1.3.4 Time_B) Falta por conocer los valores de las constantes del algoritmo de control PI, Kp y Ti. Para ello utilizamos la regla para sintonizar controladores PI de Ziegler-Nichols. Consiste en ver la respuesta de la planta a una entrada escalón, para elllo excitamos al calefactor de platino con una tensión media de 2,87V (duty cycle 100%) y hacemos un muestreo de la temperatura cada 150 ms. En la siguiente figura se muestra la respuesta de la planta a una excitación escalón.

Figura 25. Respuesta de la planta a una excitación escalón. (grafico PortV1.0)

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

59

En la figura (26) se hace un zoom de la parte que realmente es de nuestro interés. Como vemos en la grafica el calefactor de platino alcanza el 63% de la temperatura final con un tiempo de crecimiento de 11.3ms (T) y 2.7ms el tiempo de retardo (S).

Figura 26. Zoom de la figura 25(grafico PortV1.0)

Calculamos el valor de la constante de proporcionalidad de la planta Kp:

0.9

11.30.9 3,76

2.7

p

P

TK

L

K

= ⋅

= ⋅ = (25)

Calculo de la constante integral:

0,32,7

90,3

LTi

Ti

=

= = (26)

3.2 Flujogramas

En este apartado se explica el funcionamiento general del programa Port V1.0 y el programa principal del microcontrolador MSP430F169. Para ello se explica el flujograma de cada una de las rutinas. El código completo de los programas se pueden consultar en el apartado de anexos.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

60

3.2.1 PORT V1.0

El programa Port V1.0 se divide en tres apartados: Conexión de la aplicación con el microcontrolador MSP430F169, control del puerto serie del PC, modo de trabajo en muestreo y modo de trabajo control de temperatura del calefactor de platino.

3.2.1.1 Rutina control Puerto serie

El programa Port V1.0 tiene la posibilidad de abrir los puertos serie COM1 hasta el COM6. El control del puerto serie se basa en tres funciones: abrir el puerto serie, cerrar el puerto serie y envia trama al microcontrolador MSP430F169.

Diagrama de flujo de control del puerto serie.

Función Button1Click( ): Con esta función abrimos y configuramos el puerto serie seleccionado en el RadioButton.

No

Si

Si

Si

Button1Clik( )

hcomportßHANDLE

Abrimos puerto COM, elegido.

Puerto abierto

Hcomport==NULL?

No se puede abrir el puerto

Leer confg. Puerto

Escribir nueva conf.

Error de lectura confg?

Error de escritura confg.?

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

61

No

Si

No

Si

No

Función Button2click( ): Esta función cierra el puerto serie si previamente el puerto serie se encuentra abierto. Sabemos si el puerto serie se encuentra abierto si tenemos un HANDLE valido. También terminamos con la ejecución del subproceso, si este se encuentra creado.

La función Button2click( ), comprueba si el PC se encuentra conectado con el microcontrolador MSP430F169, si se encuentra conectado el PC con el microcontrolador se manda la siguiente trama ‘01000000’para indicar al micro que se puede desconectar.

Escribir nueva confg. tiempos

Configurar Tiempos

Mostrar mensaje error!

Error de escritura confg.?

Limpiar Buffers RX y TX

Error de limpiar buffers?

Crear Hilo(suspendido)

Fin Función

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

62

Flujograma Button2clik( ):

No

Si

Si

No

Si

No

Si

No

Button2Clik( )

Limpiar Buffers RX y TX

Error limpiar

Buffers?

Hcomport==VALID?

Estamos conectados a MSP430?

Cerrar puerto

hcomport=NULL

Fin Función

Mostrar mensaje error

Enviar Trama

Temporización 10ms

MSP430 desconecta

do?

Mostrar mensaje error

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

63

Función Button3click( ): Con esta función enviamos la trama escrita en el edit (Edit1) al microcontrolador MSP430F169, en código ASCII.

Si

No

3.2.1.2 Comunicación de la aplicación Port V1.0 con el MSP430F169.

La comunicación del PC con el microcontrolador MSP430F169 se realiza por encuesta. Es decir, el PC manda la trama ‘00011111’ al micro (¿estas conectado?) Y si el microcontrolador MSP430F169 se encuentra conectado, este mandara dos tramas al PC ‘01001111’ y ‘01001011’ indicando que se encuentra disponible en el puerto serie (estoy conectado) Si el microcontrolador no le responde en un tiempo prudente de 100 ms, el programa Port V1.0 indica en el memo2 que no se ha producido ninguna conexión con el microcontrolador MSP430F169 (MSP430 no conectado).

La función Iniciar1Click ( ): Será la encargada de verificar que el microcontrolador MSP430F169 se encuentra conectado con el PC a través del puerto serie. También en el inicio de la función, se hace un clear( ) de todos los edit y de la grafica del programa.

Si el microcontrolador se encuentra con conexión, habilitamos los modos de trabajo muestreo A/D y modo de trabajo control de temperatura del calefactor de platino.

Button3Click( )

Copiar escrito en Edit1 en cadena de bytes

Error enviar

cadena?

Calcular numero de bytes de la cadena

Enviar cadena de bytes

Limpiar cadena

Fin Función

Mostrar aviso error

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

64

Si

No

Si

No

Si

No

No

Si

Iniciar1click( )

Error limpiar buffers?

Clear () Edits

Error enviar trama?

Clear ( ) Series

Limpiar Buffer Rx y TX

Enviar trama ‘00011111’

Temporización 100ms

Error leer puerto ?

Leer Puerto serie

Puerto NO conectado

Trama correcta?

Mensaje de error

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

65

3.2.1.3 Rutina Muestreo A/D

Este modo de trabajo como anteriormente se ha explicado trata de ver un numero de muestras muestreadas por el conversor A/D del microcontrolador MSP430F169 con un periodo de muestreo determinado. El usuario indicara en los Labelededit del programa Port V1.0 el numero de muestras que quiere hacer en el muestreo y el periodo de muestreo que aplicara el conversor A/D.

Antes de iniciar la función para ver las muestras, se tiene que configurar el microcontrolador con el periodo de muestreo que aplicara y el numero de muestras que se quiere tener. Todas esto lo hace la función Button6Click( )

Función Button6Click( ): La función Button6click será la encargada de avisar al microcontrolador que se va ha proceder a configurar el conversor A/D e indicarle el numero de muestras que tiene que muestrear del canal A2. Para ello se manda la siguiente trama ‘00110010’, el microcontrolador interpretara que se va ha iniciar la configuración del conversor A/D, el MSP430F169 mandara al PC las siguientes dos tramas ‘01001111’ y ‘01001011’indicando que el proceso de configuración ya se puede iniciar. Una vez recibidas las dos tramas la función Button6Click() iniciara el envió de los datos escritos en el LabeledEfit1 (numero de muestras) y LabeledEfit2 (periodo de muestreo)

El numero de muestras no podrá ser superior a 1000, se encuentra limitado por la capacidad de la RAM del microcontrolador MSP430F169 que es de 2000 bytes, si se tiene en cuenta que cada muestra es de 2 bytes, la RAM solo podrá almacenar 1000 muestras.

El microcontrolador una vez tenga todas las muestras almacenadas en la RAM procedera al inicio del envió de cada una de las muestras almacenadas en la RAM.

El numero de muestras y el periodo de muestreo son datos de 16bits, como el envió de cada trama es de 8bits. Lo primero que se realiza es la división del dato (16bits) en tramas de 8bits. Tendremos una parte alta que serán los ocho bits mas significativos y la parte baja que serán los ocho bits menos significativos.

Fin función

Puerto conectado

Habilitar ControlPI

Habilitar Iniciar A/D

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

66

Lo primero que mandara la función Button6Click( ) por el puerto serie será la parte alta del byte una vez enviada esperamos un tiempo prudente de 10 ms (tiempo que tarda en enviar un byte 2,4ms) y seguidamente mandamos la parte baja del byte y esperamos otros 10ms.

Solo falta mandar al microcontrolador el periodo de muestreo que aplicara el converso A/D del microcontrolador MSP430F169.Como se ha explicado, Utilizamos como Timer el contador utilizado en el algoritmo de control pero esta vez el tic del Timer B no será 10ms sino de 500 µs, de esta forma podremos muestrear con una periodo menor.

El valor del contador que enviara el programa Port V1.0 al microcontrolador se

calcula de la siguiente ecuación: 500

tictContador

sµ= .

Tenemos un valor máximo de tic cuando el valor del contador(16bits) tiene el valor 65535 y un tic mínimo cuando contador(16bits) es 1, es decir:

6max 65535 500 10 32,767Tic s−= ⋅ ⋅ = y un Tmin de 6

max 1 500 10 500Tic sµ−= ⋅ ⋅ = .

Para demostrar que efectivamente el periodo de muestreo del conversor A/D es el

indicado por el usuario, hacemos el ensayo de poner una señal con frecuencia de 1Hz en el canal A2 del conversor A/D del microcontrolador MSP430F169 y configuramos el conversor A/D con un periodo de 1ms y queremos muestrear 1000 muestras. Si el conversor A/D muestrea a una frecuencia de 1 ms tenemos que ver en la grafica del programa Port V1.0 un periodo de la señal excitación del canal2.

/

11

11 1000 1

Señal

A D

T sHz

T ms s

= =

= ⋅ =

Excitando con una señal cuadrada de frecuencia 1Hz, tiempo de muestreo 1ms y

1000 muestras, obtenemos la siguiente grafica con el programa Port V1.0.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

67

Figura 27. Grafica muestreo A/D (grafica de Port V1.0)

Excitando con una señal triangular de 1Hz de frecuencia, un tiempo de muestreo de 1ms y 1000 muestras:

Figura 28. Grafica muestras tomadas por el conversor A/D

En las dos graficas se puede observar como efectivamente tenemos un periodo de la señal excitación del canal 2. En el eje (X) tenemos el tiempo 1s y en el eje (Y) la amplitud de la señal 2,18V.

Una vez configurado el conversor A/D del microcontrolador se llama a la función VerMuestras1Click( )

Función VerMuestras1Click ( ): La función VerMuestras1Click es la que indica al microcontrolador MSP430F169 que queremos ver las muestras almacenadas en la RAM. Indicamos al MSP430F169 que queremos ver la muestras mandando la trama ‘00110100’ al microcontrolador. Si el microcontrolador en un tiempo prudente de 100ms no ha enviado ninguna trama, se mostrara el mensaje de error “no hay ninguna muestra en el buffer Rx”.

Una vez el microcontrolador reciba la trama (Ya puede iniciar el envio de las muestras), manda por el puerto serie el valor de las muestras tomadas Nadc guardadadas en la RAM (Nadc es el valor de conversión de la muestra tomada en el canal A2 del ADC12). El tamaño de las muestras es de 16 bits, aunque los 4 bits mas significativos son cero porque la conversión de la muestra es de 12bits. Por lo tanto el microcontrolador tendrá que mandar dos tramas de 8 bits cada una, la primera trama que se manda son los 8

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

68

bits de la parte alta y la segunda trama enviada son los 8 bits de la parte baja. La función VerMuestras1Click lee del buffer Rx de dos bytes en dos bytes de esta forma ahorramos tiempo de lectura, ya que no leeremos un solo byte sino dos bytes del buffer Rx del PC, leemos las dos tramas de 8 bits enviadas por el MSP430F169 y hace la unión de los dos bytes en un Word, convertimos el valor Nadc en tensión utilizando la formula (20) El valor de la tensión será el dato que mostramos de forma grafica y en el memo2.

Flujograma Función Button6Click( ):

Si

No

No

Si

Si

No

No

Si

Button6Click( )

Iniciar variables

Error envio de trama?

MSP430 preparado

OK?

Enviar trama al MSP430 ‘00110010’

Muestra=LabeledEdit1

Periodo=LabeledEdit2

Muestra >1000?

65s>Periodo>1ms?

Mostrar mensaje error limite

Mostrar mensaje error limite

Baja =Muestra&00FFh

Alta =Muestra>>8

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

69

Si

No

Si

No

Si

No

Error envio de

parte Alta?

Enviar parte Alta

Temporización 10ms

Enviar parte Baja

Enviar parte Alta

Error envio de

parte Baja?

Temporización 10ms

Tic=Periodo/500e-3

Temporización 10ms

Enviar parte Baja

Baja =Periodo&00FFh

Alta =Periodo>>8

Enviar parte Alta

Error envio de

parte Alta?

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

70

Si

No

Flujograma función VerMuestras1Clik( ):

Si

No

No

Si

Enviar parte Baja

Error envio de

parte Baja?

Temporización 10ms

Vermuestras1Click() Mostrar mensaje error

Fin función

Leer 2 bytes buffer Rx

MSP430 Preparado?

Temporización 100ms

VerMuestrasClick( )

Iniciar variables

Enviar trama ‘110011’

Error envio de Trama?

A=acBufRX[0]<<8

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

71

G = Vin (Conversión del valor Nadc)

No

Si

3.2.1.4 Rutina control PI

En este modo de trabajo el programa Port V1.0 trabaja con el proceso principal Form1 y el subproceso que es el encargado de adquirir de forma independiente el valor de la resistencia que tiene en todo momento el calefactor de platino. Tambien transforma la resistividad del platino en temperatura, muestra en la grafica el valor de la temperatura y el error (diferencia de la salida respecto la consigna)

La función Button9Click( ): Esta función es la encargada de avisar al microcontrolador del inicio del modo de trabajo control PI. Para indicar al microcontrolador que se va ha iniciar la configuración de los parámetros del algoritmo de control, manda la trama ‘00110100’ (iniciar configuración), espera un tiempo de 100ms ¿el microcontrolador esta conectado? Si se encuentra con conexión le mandamos las constantes Kp, K1, Ts y Rta.

La temperatura de consigna Ta la convierte en resistencia Rta (se manda el valor Rta) Como anteriormente se ha explicado, trabajamos con la resistencia que va adquiriendo el platino, que es lineal a la temperatura.

Como el microcontrolador no puede trabajar con números decimales sino que trabaja con números enteros, las variables Kp, K1 y Rta se multiplicaran por 10 y a las constantes K1 y Rta se suma 0,5.

La función Button9Click( ) También es la encargada de activar el subproceso, ya que este se encuentra creado pero en suspensión. El subproceso se suspenderá si paramos el control PI para parar el control hacemos un clic en el botton stop control que ejecutara la función Button11Click( ). También el subproceso se destruirá si el HANDLE del puerto serie se cierra o se cierra el programa Port V1.0.

B=acBufRX[1] | A;

G=B/1426;

Mostramos G de forma grafica y en el memo2

Fin de muestras?

Deshabilitar (Iniciar AD e iniciar control) Mostrar mensaje error

Fin función

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

72

Flujograma función Button9Click( ):

Si

No

Si

No

Si

No

Si

No

Button9Click( )

Iniciar variables

Rta=(110*(1+0.00535(Ta-25))+0.5);

Kp2=Edit1*10

Ta=Edit3

Kp<0,1?

70<Ta<25 Mostrar mensaje error

limite

Mostrar mensaje error limite

Enviar Trama ‘00110100’

Ticlo=Ts/10

K1=((Kp*(1+(Ts/Ti)))*10)

Ts=Edit4

655<Ts<10 Mostrar mensaje error

limite

Ti=Edit3;

Error envio trama?

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

73

No

Si

Si

No

Subproceso o Thread:

Flujograma del método Execute ( ):

Si

No

MSP430 preparado?

Enviar constantes K1, Ts,Rta y Kp

Error envio constantes?

Activar subproceso o Thread

Deshabilitar (iniciar AD e iniciar control ) Mostrar mensaje error

Fin función

Execute( )

Iniciar variables

Thread=

Terminate?

Leer 2bytes buffer RX

TaßRta

Synchonize(mostrar)

Fin Thread

Error=Tconsigna-Ta

Liberar espacio memoria

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

74

Synchronize(mostrar) permite hacer que se muestre la temperatura y el error en la pantalla a través del grafico Teechart.

3.2.2 Programa principal del MSP430F169

El programa ensamblado en el microcontrolador MSP430F169 tiene que ser capaz de hacer lo que le indique el usuario por el programa Port v1.0. El microcontrolador sabrá que tarea tiene que llevar a cabo según la trama enviada por el programa Port V1.0.

El programa del microcontrolador MSP430F169 se puede dividir en cuatro rutinas, que son: programa principal, rutina de control, rutina del temporizador y la rutina de conversión A/D.

Diagrama de flujo del programa principal.

ORG 04000h

SPß0A00h

Stop Watch dog

Confg. DCO

Confg.Timer_B

Confg.USART

Confg.ADC12

Confg.PORT

R4=@01102h

Limpiar registros

CCR2=235 dutycycle=0%

Control errores Rx

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

75

No

Si

No

Si

No

No Si Si

Si No No No

Si

Si

No

Si Si

No

No

No Si

Si Si

No No

Si Si

No

Si

IFG1=1

RXUBUF0=0x40h

R5=0?

R5=3?

RXBUF0=31h?

IFG1=1

Call OK

R5=1

RXBUF0=34h?

R5=3

(@R13)->Tx

R13--

R6--

R6=0?

R5=2?

RXBUF0=32h?

R5=2

Recibir trama

Preparado RX?

R6=Nºmuestras

Preparado Rx?

@1102ßKp

Preparado Rx?

@1104ßK1

Preparado Rx?

@1108ßRta

Preparado Rx?

@03100ßcontador

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

76

No

Si No

Si No

Si

No

Si No

Si

No

Si

No

Si

Rutina Conversor Analógico digital.

Si

No

Recibir trama

Esta preparado RX?

@03100<-Valor cont.

RXBUF0=33h?

R8=0?

IFG1=1

(@R13)->Tx

R13--

R6--

R6=0?

Tic timerB=500us

Tic TimerB=10ms

IFG1=1

RXUBUF0=0x40h

ADC12 ISR

ADC12MEM0à@R13

R5=3?

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

77

Si No

No Si

Rutina Control:

En la rutina de control se implementa el algoritmo 1( ) ( ) ( 1) Pdc n e n K e n K∆ + = ⋅ − − ⋅ ver apartado 3.1

Si

No

Si

No

ADC12MEM1àR7

R13=R13+2

R8--

R8=0?

Fin rutina

R13--

Stop Timer_B

R12=ADC12MEM0/15

R12=(ADCMEM1*10)/R12

R12à@01108h

Preparado Tx?

Enviar R12àPc

Call Control

Control

Determinar error

Implementar algoritmo control

Calcular nuevo duty cycle

Error n_1=Error

dc>100

Dc<0

Dutycycle=0%

Dutycycle=100%

Fin control

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

78

Temporización:

Si

No

Ini. IRQ TimerB

Decrementa contador

Contador=0?

Reiniciar valor contador

Iniciar conversión A/D

Fin temporización

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

79

4 PLANOS

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

80

4.1 Esquema eléctrico

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

81

4.2 Mascaras del C.I.

4.2.1 Situación de los componentes

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

82

4.2.2 Mascara de la cara de los componentes

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

83

4.2.3 Cara de la soldadura de los componentes

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

84

5 PRESUPUESTO

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

85

5.1 Introducción

En este apartado se pretende determinar con exactitud, el coste total que se requiere para implementar el modulo de control de temperatura del calefactor de platino y diseño de la parte de software.

El coste de diseño de la parte de software, vendrá determinado por las horas empleadas en la implementación.

El coste de la parte hardware, vendrá determinado por el precio de la compra de los componentes necesarios. Estos componentes tendrán un precio mayor al no comprar grandes tiradas de componentes.

Para tener una visión mas clara del coste que implica cada parte del proyecto, este se divide por capítulos.

De esta manera cada capitulo estudia el coste de los determinados elementos que intervienen en el. Los capítulos son los siguientes:

§ Capitulo 1: Horas de diseño.

§ Capitulo 2: componentes electrónicos.

§ Capitulo 3: Placas de Circuito impreso.

§ Capitulo 4: Cables y componentes.

§ Capitulo 5: Varios.

5.2 Mediciones

El propósito es detallar la cantidad de componentes que forma el proyecto así como el numero de ellos que se requiere en cada capitulo implicado.

A continuación se muestra una tabla resumen de cada capitulo, detallando la designación de los componentes que se utilizan y el numero de ellos.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

86

Capitulo 1: Horas de diseño.

Nº Ud. Descripción NºPartes Subtotal TOTAL

1.1 H Horas de diseño y de desarrollo del 500 500 500

Prototipo

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

87

Capitulo 2: Componentes electrónicos.

Nº Ud. Descripción NºPartes Subtotal TOTAL

2.1 U MSP-TS430PM64 MSP430-FET140 1 1 1

Tarjeta con socket para chips MSP64PM

diseñada por Texas Instrument

2.2 U Microcontrolador MSP430F169 1 1 1

2.3 U AOP547FT 1 1 1

Operacional de potencia, con una

Corriente máxima de salida de 0,5A

2.4 U Operacional OP741 1 1 1

2.5 U MAX232 1 1 1

Circuito integrado MAX232 Transmisión

Y recepción de señales TTL del RS232

2.6 U Condensadores Electrolíticos 5 5 5

Capacidad condensador 1µF

2.7 U Condensador MKT 1 1 1

Capacidad condensador 220nF

2.8 U Resistencia 15Ω 2 2 2 Potencia 4W

2.9 U Resistencia 100KΩ 2 2 2 Potencia 0,5W

Tolerancia ±5%

2.10 U Resistencia 6K8Ω 2 2 2 Potencia 0,5W

Tolerancia ±5%

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

88

2.11 U Resistencia 47KΩ 2 2 2 Potencia 0,5W

Tolerancia ±5%

2.12 U Disipador de calor 1 1 1 Resistencia térmica 30º/W

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

89

Capitulo 3: Placa de circuito impreso.

Nº Ud. Descripción NºPartes Subtotal TOTAL

3.1 U Circuito impreso fotosensible 1 1 1

Placa Circuito impreso doble cara

Medidas de la placa 180mmx100mm

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

90

Capitulo 4: Conectores y cables

Nº Ud. Descripción NºPartes Subtotal TOTAL

4.1 U Conector DB9 Hembra 1 1 1 Conector DB9 acodado

4.2 U Conector DB9 Hembra 1 1 1

4.3 U Conector DB9 Macho 1 1 1

4.4 U Regleta 2 2 2 Regleta para dos conexiones

4.5 U Vías de 16 macho 4 4 4

4.6 U Vías de 3 hembra 2 2 2

4.7 U Banana color negro 3 3 3

4.8 U Banana color rojo 3 3 3

4.9 m Cable color rojo 1 1 1 Diámetro 0,5mm

4.10 m Cable color negro 1 1 1

Diámetro 0,5mm

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

91

Capitulo 5: Varios.

Nº Ud. Descripción NºPartes Subtotal TOTAL

5.1 U Separadores 4 4 4

Separadores para C.I con cabeza hexag.

5.2 U Tornillo 1 1 1

Cabeza hexagonal ∅0.25

5.3 U Tuerca 5 5 5

Para tornillo de ∅0.25

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

92

5.3 Cuadro de precios

A continuación se detalla el precio unitario.

Capitulo 1: Horas de diseño.

Nº Ud. Descripción Precio(€)

1.1 H Horas de diseño y de desarrollo del 37,5 Treinta siete Euros

Prototipo con cinco céntimos

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

93

Capitulo 2: Componentes electrónicos.

Nº Ud. Descripción Precio(€)

2.1 U MSP-TS430PM64 MSP430-FET140 47,8 Cuarenta siete Euros

Tarjeta con socket para chips MSP64PM con ocho céntimos

diseñada por Texas Instrument

2.2 U Microcontrolador MSP430F169 12,5 Doce Euros con

cinco céntimos

2.3 U AOP547FT 12 Doce Euros .

Operacional de potencia, con una

Corriente máxima de salida de 0,5A

2.4 U Operacional OP741 0,50 Cincuenta céntimos

de Euro.

2.5 U MAX232 1 Un Euro.

Circuito integrado MAX232 Transmisión

Y recepción de señales TTL del RS232

2.6 U Condensadores Electrolíticos 0,25 Veinticinco

Capacidad condensador 1µF céntimos de Euro.

2.7 U Condensador MKT 0,20 Veinte céntimos

Capacidad condensador 220nF de Euro.

2.8 U Resistencia 15Ω 0,51 Cincuenta y un Potencia 4W céntimo de Euro.

2.9 U Resistencia 100KΩ 0,12 Doce céntimos Potencia 0,5W de Euro.

Tolerancia ±5%

2.10 U Resistencia 6K8Ω 0,10 Diez céntimos Potencia 0,5W de Euro.

Tolerancia ±5%

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

94

2.11 U Resistencia 47KΩ 0,11 Once céntimos Potencia 0,5W de Euro.

Tolerancia ±5%

2.12 U Disipador de calor 1,25 Un Euro con Resistencia térmica 30º/W Veinticinco.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

95

Capitulo 3: Placa de circuito impreso.

Nº Ud. Descripción Precio(€)

3.1 U Circuito impreso fotosensible 5,10 Cinco Euros con Placa Circuito impreso doble cara diez céntimos.

Medidas de la placa 180mmx100mm

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

96

Capitulo 4: Conectores y cables

Nº Ud. Descripción Precio(€)

4.1 U Conector DB9 Hembra 0,68 Sesenta y ocho Conector DB9 acodado céntimos de Euro.

4.2 U Conector DB9 Hembra 0,68 Sesenta y ocho

céntimos de Euro

4.3 U Conector DB9 Macho 0,68 Sesenta y ocho

céntimos de Euro

4.4 U Regleta 0,35 Treinta y cinco Regleta para dos conexiones céntimos de Euro

4.5 U Vías de 16 Vías macho 0,78 setenta y ocho

céntimos de Euro

4.6 U Vías de 3 Vías hembra 0,25 Veinticinco

céntimo de Euro.

4.7 U Banana de color negro 1 Un Euro.

4.8 U Banana de color rojo 1 Un Euro.

4.9 m Cable color rojo 0,50 Cincuenta

Diámetro 0,5mm céntimos de Euro.

4.10 m Cable color negro 0,5 Cincuenta

Diámetro 0,5mm Céntimos de Euro.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

97

Capitulo 5: Varios.

Nº Ud. Descripción Precio(€)

5.1 U Separadores 0,95 Novena y cinco

Separadores para C.I con cabeza hexag. céntimos de Euro.

5.2 U Tornillo 0,10 Diez céntimos

Cabeza hexagonal ∅0.25 de Euro.

5.3 U Tuerca 0,05 Cinco céntimos

Para tornillo de ∅0.25 de Euro.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

98

5.4 Aplicación del precio.

Capitulo 1: Horas de diseño.

Nº Ud. Descripción Ct. Precio (€) TOTAL (€)

1.1 H Horas de diseño y de desarrollo del 400 37,5 15000

Prototipo

TOTAL CAPITULO 1...............................................................................15000 €

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

99

Capitulo 2: Componentes electrónicos.

Nº Ud. Descripción Ct. Precio (€) TOTAL (€)

2.1 U MSP-TS430PM64 MSP430-FET140 1 47,8 47,8

Tarjeta con socket para chips MSP64PM

diseñada por Texas Instrument

2.2 U Microcontrolador MSP430F169 1 12,5 12,5

2.3 U AOP547FT 1 12 12

Operacional de potencia, con una

Corriente máxima de salida de 0,5A

2.4 U Operacional OP741 3 0,50 1,5

2.5 U MAX232 1 1 1

Circuito integrado MAX232 Transmisión

Y recepción de señales TTL del RS232

2.6 U Condensadores Electrolíticos 5 0,25 1,25

Capacidad condensador 1µF

2.7 U Condensador MKT 1 0,20 0,20

Capacidad condensador 220nF

2.8 U Resistencia 15Ω 2 0,51 1,02 Potencia 4W

2.9 U Resistencia 100KΩ 2 0,12 0,24 Potencia 0,5W

Tolerancia ±5%

2.10 U Resistencia 6K8Ω 2 0,10 0,20 Potencia 0,5W

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

100

Tolerancia ±5%

2.11 U Resistencia 47KΩ 2 0,11 0,22 Potencia 0,5W Tolerancia ±5%

2.12 U Disipador de calor 1 1,25 1,25 Resistencia térmica 30º/W

TOTAL CAPITULO 2......................................................................................... 79,18 €

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

101

Capitulo 3: Placa de circuito impreso.

Nº Ud. Descripción Ct. Precio (€) TOTAL (€)

3.1 U Circuito impreso fotosensible 1 5,10 5,10 Placa Circuito impreso doble cara

Medidas de la placa 180mmx100mm

TOTAL CAPITULO 3......................................................................................... 5,10 €

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

102

Capitulo 4: Conectores y cables

Nº Ud. Descripción Ct. Precio (€) TOTAL (€)

4.1 U Conector DB9 Hembra 1 0,68 0,68 Conector DB9 acodado

4.2 U Conector DB9 Hembra 1 0,68 0,68

4.3 U Conector DB9 Macho 1 0,68 0,68

4.4 U Regleta 2 0,35 0,70 Regleta para dos conexiones

4.5 U Vías de 16 Vías macho 4 0,78 3,12

4.6 U Vías de 3 Vías hembra 2 0,25 0,50

4.7 U Banana de color negro 1 1 1

4.8 U Banana de color rojo 1 1 1

4.9 m Cable color rojo 1 0,5 0,5

Diámetro 0,5mm

4.10 m Cable color negro 1 0,5 0,5

Diámetro 0,5mm

TOTAL CAPITULO 4......................................................................................... 9,36 €

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

103

Capitulo 5: Varios.

Nº Ud. Descripción Ct. Precio (€) TOTAL (€)

5.1 U Separadores 4 0,95 3,80

Separadores para C.I con cabeza hexag.

5.2 U Tornillo 1 0,1 0,10

Cabeza hexagonal ∅0.25

5.3 U Tuerca 4 0,05 0,20

Para tornillo de ∅0.25

TOTAL CAPITULO 5......................................................................................... 4,10 €

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

104

5.5 Resumen del presupuesto

Para la implementación y desarrollo del prototipo se necesita utilizar los siguientes equipos electrónicos:

ü PC.

ü Fuente de alimentación de ±5V y ±15V.

ü JTAG de Texas Instrument (necesario para programar el MSP430F169)

Para el desarrollo del Software es necesario utilizar los siguientes programas:

ü IAR Systems (Version Free)

ü Borland C++ Builder 6.0 (version trial de 90 días)

Hacemos la amortización de los equipos electrónicos a cinco años.

Equipo electrónico

Precio

( € )

Precio por mes amortizado a 5

años ( € )

Mes de utilización

Coste de amortización

( € )

PC 800 13.33 6 80

Fuente de alimentación

300 5 6 30

JTAG 110 1,83 6 11

Tenemos una amortización total de 121€, por los seis meses de utilización del material.

Precio final de ejecución por material:

Total capitulo1.......................................................................... 15000 €

Total capitulo2.......................................................................... 79,18 €

Total capitulo3.......................................................................... 5,10 €

Total capitulo4.......................................................................... 9,36 €

Total capitulo5.......................................................................... 4,10 €

Amortización material............................................................. 121 €

TOTAL..................................................................................... 15218,74 €

QUINCEMIL DOSCIENTOS DIECIOCHO EUROS CON SETENTA Y CUATRO CENTIMOS

Castellón de la Plana, Junio 2006

Jordi Ruiz Baeza

Ingeniero Técnico esp. Electrónica Industrial

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

105

6 BIBLIOGRAFIA

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

106

6.1 Libros consultados

[1] Chris Nagy “Embedded Systems Design using the TI MSP430 Series”

Editorial, Elsevier Science 2003 ISNB: 0-7506-7623-X.

[2] Luecke, Jerry “Analog and digital circuits for electronic control system applications using the TI MSP430 microcontroller”

Editoria, Elsevier Science 2005 ISNB: 0-7506-7810-0.

[3] Buchanan, William, “PC interfacing, Comunications and Windows Programing”.

Editorial Addison-Wesley, 1999 ISBN: 0-201-17818-4

[4] Ian Marteens “La cara oculta de C++ Builder” Junio 1999

[5] Esteban del Castillo Pérez “Implementación de una plataforma hardware/Software para la experimentación en control digital directo: controladores PID y FUZZY”

Universitat Rovira y Virgili, DEEA, 2003, ISBN:84-8424-041-X

[6] PFC: “Gestión Basada en microcontrolador de un tablero de ajedrez adaptado para ciegos” Autor: Carlos Vidal García, Director: Jose Luis Ramírez Falo.

[7] PFC: “Desarrollo de aplicación con MSP430F169 de TI” Septiembre 2005

Autora: Roser Inglés Bort, Director: Jose Luis Ramírez Falo.

[8] Guia de programación: “MSP430 ASSEMBLER, LINKER, AND LIBRARIAN” © Copyright 1996 IAR Systems.

[9] Guia de usuario: “MSP430 C-SPY WINDOWS WORKBENCH VERSION”

© Copyright 1991–1996 IAR Systems. [10] Guia de interface: “MSP430 WINDOWS WORKBENCH”

© Copyright 1991–1996 IAR Systems. [11] Datasheet: MSP430F169. [12] Guia de usuario: MSP430X1XX. [13] Guia de usuario: “MSP-FET430 FLASH Emulation Tool (FET)”

Copyright © 2001, Texas Instruments Incorporated

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

107

6.2 Paginas Webs consultadas (Enero 2006)

[14] http://www.zator.com [programación orientadas a objetos con builder C++, te enseña a utilizar constructores y destructores en el manejo de excepciones]

[15] http://www.msp430.com [pagina oficial de Texas Instrument dedicada exclusivamente al microcontrolador MSP430, donde te puedes bajar los datasheet de familia MSP430, el programa IAR System de forma gratuita]

[16] http://www.borland.com [pagina oficial de borland, se puede encontrar FAQ´S, y se puede descargar el programa Builder C++ 6.0 versión trial (90días) en el siguiente link www.borland.com/downloads/download_cbuilder.html]

[17] http://elvex.ugr.es/decsai/builder/threads/index.html [se encuentra información de cómo controlar los threads]

[18] http://www.amidata.es [pagina oficial de RS Amidata, se puede consultar precios y características de componentes electrónicos]

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

108

7 ANEXOS

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

109

7.1 Manual de usuario Port V1.0

El programa port V1.0 se divide en cinco zonas: la zona donde podemos habilitar o deshabilitar el puerto serie seleccionado en los RadioButton [Com1..Com6] también zona para enviar tramas, la zona de muestreo A/D donde indicaremos el número de muestras y periodo de muestreo que aplicará el converso A/D del microcontrolador MSP430F169, la zona de control PI donde se puede configurar las constantes del algoritmo de control Kp, Ti, Ts y la temperatura de consigna también se veran en dos edits la temperatura que tiene el calefactor de platino y el error de la salida respecto la consigna, la zona de grafica donde se visualizan tres series (Ta, Error, Tconsigna) y por ultimo la zona de los memos donde se informa de los eventos que se van produciendo.

A continuación se muestra el aspecto del programa Port V1.0 solo mas ejecutarse.

Para ejecutar el programa Port V1.0 hacer doble clic en el siguiente icono “port.exe”:

Antes de todo hay que abrir el puerto serie que se quiere utilizar en la comunicación. Para ello se tiene que seleccionar el puerto COM que se quiere abrir, una vez seleccionado el Puerto Com, hacer un clic en el boton abrir puerto. Si el puerto seleccionado no se encuentra ocupado y esta físicamente, el programa Port V1.0 mostrará un mensaje en el memo1 indicando “Puerto abierto”. Lo contrario sucede si el puerto serie no se encuentra disponible, aparece un mensaje en el memo1 indicando que el puerto serie no se ha podido abrir “No se puede abrir el puerto COMX”.

Para cerrar el puerto, hacer un clic en el botón Cerrar Puerto. Este botón solo se encontrara habilitado si previamente el puerto serie se encontraba abierto. Cuando el puerto serie se cierra se muestra por el memo1 el mensaje “Puerto cerrado”, de esta forma sabemos que el puerto serie se encuentra liberado.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

110

Una vez se tiene el puerto serie abierto, falta tener la comunicación del PC con el microcontrolador MSP430F169. Para ello seleccionar del menú Inicio-Conectar, Ver figura 1.

Figura 1

Figura 2

Si la conexión se ha producido, se muestra por el memo1 el mensaje “MSP430 conectado” y por el memo2 “MSP430: OK” . Tener en cuenta, que se tiene que observar en el memo2 “OK” ya que este monosílabo es la trama del microcontrolador enviada al PC. Sino fuera “OK” nos indica que hay un error en la transmisión de la trama “OK” esto puede ser causa de la alimentación al chip MAX232 o error en la trama enviada por el MSP430F169.

Observar que si la conexión se ha realizado correctamente el led amarillo del Puerto P1.1 de la tarjeta socket se encontrara encendido.

Cuando ya se tiene conexión con el microcontrolador MSP430F169, se habilitan los submenús A/D-Iniciar A/D y Control- Inicio control.

Seleccionar el submenú Iniciar A/Dà Hacer un clic, se habilitan los botones Aceptar y cancela del grupbox Muestreo A/D, tambien se muestra el mensaje “< Muestreo Seleccionado >” por el memo2 indicando que esta todo correcto. Ahora ya podemos indicar el periodo de muestreo que queremos que aplique el microcontrolador MSP430F169 y el numero de muestras. El numero de muestras no podrá ser superíor a 1000 y el periodo de muestreo tendrá que estar comprendido en el siguiente margen [500µs..327s]

Cuando ya se tienen todos los valores definidos, hacer un clic en el botón aceptar. Se mostrara el mensaje en el memo1 “< Esperando Muestras MSP430 >” indicando que se esta eperando la primera muestra, cuando ya se reciban las muestras se mostrar el siguiente mensaje “< Ver Muestras MSP430 >” en este momento de forma automatica se veran las tensiónes muestreadas del canal 2 del microcontrolador de dos forma diferentes: De forma gráfica y, seleccionando el memo2 moviéndote con la flechas, se puede ver el valor de las muestras adquiridas.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

111

figura 3. Modo muestreo A/D

Si se quiere parar el proceso de muestreo, se tiene que hacer un clic en el botón cancelar, de esta forma se cancela el proceso de muestreo. En el memo2 se mostrara el mensaje “< Muestreo cancelado >”

Seleccionando el submenú Inicio Contro, se inicia el modo de trabajo Control PI

En el GrupBox Control PI se puede configurar los valores de las constantes: Kp (constante de proporcionalidad), Ti (constante integral) se tiene que indicar en ms, Ts (Periodo de muestreo) también se tiene que indicar en ms y Ta (temperatura de consigan) se indica en grados Celsius. Ta se tiene que encontrar en los márgenes 70ºC>Ta >25ºC, si no se encuentra en estos márgenes, se mostrara un aviso de error “márgenes incorrectos”. El margen de trabajo de Ts es de 655s>TS>10ms. Si Kp<0,1 y Ti<0,1 se consideraran como 0. una vez se tienen todos los valor hacer un clic en el botón aceptar. Se mostrara un mensaje en el memo2 indicando que se inicia el control “< Iniciando control >”.

En el GrupBox también se puede ver la temperatura actual del calefactor de platino y el error cometido (Tª PtàTemperatura del platino y Error_1 diferencia de la tensión de consigna con la temperatura del platino)

Una vez iniciado el control PI se mostrará de forma grafica el valor de la temperatura que tiene el calefactor de platino, el error cometido y la temperatura de consigna.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

112

En la grafica se podrán ver tres series: Temperatura, consigna y error.

Figura 4. Leyendas grafica control PI

Modo control PI:

Figura 5. Modo control PI

El subproceso y el control PI se pueden parar de tres formas diferentes: haciendo un clic en el botón Stop Control, Haciendo un clic en el botón stop del memo 2 o cerrando el puerto serie.

El aspecto de la grafica se puede modificar, para ello seleccionar el menú grafica. Nos encontramos con las siguiente opciones.

ü Grafica-Grid on/off: activa o desactiva el grid de la grafica

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

113

ü Grafica-ejeX-Automatico/Manual: Podrá ver el eje X de la grafica que sea fijo [0..70] o automático.

ü Grafica-ejeY-Automatico/Manual: Podrá ver el eje Y de la grafica que sea fijo [0..5] o automático

ü Grafica-Series-Ta/Error/consigna: Indicar que series quire que se muestre en la grafica.

Acerca de....

Figura 6. Form Acerca de...

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

114

7.2 Código Fuente Port V1.0

7.2.1 Unit1.Cpp

//-----------------------------------------------------------------------

// Programa: Port V1.0

// Autor: Jordi Ruiz Baeza.

// Fecha: Castelló de la Plana, 25 de mayo del 2006

// Descrepción: Sistema de adquisición y transmisión de datos mediante // el MSP430F169 de Ti. Comunicación del PC Con el MSP430F169 por

// medio del puerto serie.

//-----------------------------------------------------------------------

#include <vcl.h>

#include <stdio.h>

#include <conio.h>

#include <iostream.h>

#pragma hdrstop

#include "Unit1.h"

HANDLE hcomPort = NULL; /*manejador del puerto*/

//-----------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//-----------------------------------------------------------------------

//Constructor del Form1

//-----------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

Memo1->Clear(); /*Limpiamos los memos*/

Memo2->Clear();

//-----------------------------------------------------------------------

//boton click abrir puerto

//-----------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)

// Abrir puerto

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

115

hcomPort=CreateFile(com, GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL, 0); /*abrir puerto, hcomport<-puntero dl puerto*/

// error al abrir el puerto

if( hcomPort==INVALID_HANDLE_VALUE) /* si Handle invalido mostrar que puerto serie no se puede abrir*/

if(RadioButton1->Checked) Memo1->Lines->Add("No se puede abrir el puerto COM1.");

else if(RadioButton2->Checked) Memo1->Lines->Add("No se puede abrir el puerto COM2.");

else if(RadioButton3->Checked) Memo1->Lines->Add("No se puede abrir el puerto COM3.");

else if(RadioButton4->Checked) Memo1->Lines->Add("No se puede abrir el puerto COM4.");

else if(RadioButton5->Checked) Memo1->Lines->Add("No se puede abrir el puerto COM5.");

else if(RadioButton6->Checked) Memo1->Lines->Add("No se puede abrir el puerto COM6.");

else /* si Handled=true*/

Memo1->Lines->Add("Puerto Abierto.");

Button3->Enabled=true; /*habilitar boton cerrar puerto*/

Button1->Enabled=false; /*deshabilitamos el boton abrir puerto*/

/*hacemos un checked del radiobutton del puerto abierto, para poder deshabilitar los de mas radiobuttons*/

if(RadioButton1->Checked)

RadioButton2->Enabled=false;

RadioButton3->Enabled=false;

RadioButton4->Enabled=false;

RadioButton5->Enabled=false;

RadioButton6->Enabled=false;

else if(RadioButton2->Checked)

RadioButton1->Enabled=false;

RadioButton3->Enabled=false;

RadioButton4->Enabled=false;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

116

RadioButton5->Enabled=false;

RadioButton6->Enabled=false;

else if(RadioButton3->Checked)

RadioButton2->Enabled=false;

RadioButton1->Enabled=false;

RadioButton4->Enabled=false;

RadioButton5->Enabled=false;

RadioButton6->Enabled=false;

else if(RadioButton4->Checked)

RadioButton2->Enabled=false;

RadioButton3->Enabled=false;

RadioButton1->Enabled=false;

RadioButton5->Enabled=false;

RadioButton6->Enabled=false;

else if(RadioButton5->Checked)

RadioButton2->Enabled=false;

RadioButton3->Enabled=false;

RadioButton4->Enabled=false;

RadioButton1->Enabled=false;

RadioButton6->Enabled=false;

// leer configuracion del puerto

if(!GetCommState(hcomPort, &sComCfg))

/*si no podemos leer la configuración del puerto mostrar mensaje de erro*/

Txt="No se puede leer Configuración Puerto";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

// cambiar conf. Del puerto serie a 9600-N-8-1

sComCfg.BaudRate=CBR_9600;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

117

sComCfg.ByteSize=8;

sComCfg.Parity=NOPARITY;

sComCfg.StopBits=ONESTOPBIT;

sComCfg.fRtsControl=RTS_CONTROL_DISABLE;

sComCfg.fDtrControl=DTR_CONTROL_DISABLE;

// escribir la nueva configuracio

if(!SetCommState(hcomPort, &sComCfg))

/*si no podemos escribir la nueva configuración del puerto mostrar mensaje de erro*/

Txt="No se puede escribir configuración";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

/*Configuramos la capacidad de los buffer RX=2048Bytes y TX=1024Bytes*/

if(!SetupComm(hcomPort,2048,1024))

Txt="No se puede configurar el BUFFER";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

// configurar Tiempos

sTimOut.ReadIntervalTimeout=MAXDWORD;

sTimOut.ReadTotalTimeoutMultiplier=0;

sTimOut.ReadTotalTimeoutConstant=0;

sTimOut.WriteTotalTimeoutMultiplier=0;

sTimOut.WriteTotalTimeoutConstant=0;

// escribir la nueva configuracion

if(!SetCommTimeouts(hcomPort, &sTimOut))

/*si no se puede escribir la nueva configuración de tiempos en el puerto mostrar mensaje de erro*/

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

118

Txt="No se puede escribir conf. TimOut";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

/*Limpiamos los Buffers Rx y Tx*/

if(!PurgeComm(hcomPort, PURGE_TXCLEAR|PURGE_RXCLEAR))

/*si no podemos limpiar los Buffers Rx y Tx mostrar mensaje de erro*/

Txt="No se puede limpiar los buffers RX/TX";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Hilo=new lolo(true); /*creamos un thread o hilo*/

//-----------------------------------------------------------------------

// Boton Cerrar Puerto

//-----------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

BYTE Dato;

Dato=0x40;

if(hcomPort!=INVALID_HANDLE_VALUE) /* si el pùerto no se pudo abrir no cerrar el Handled*/

Hilo->Terminate(); //eliminar thread

if(IniciarAD1->Enabled)

/*enviamos el dato 40 al MSP430F169 inicie desconexión*/

if(!TransmitCommChar(hcomPort,Dato))

Txt="Error al cerrar puerto";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

119

Memo2->Lines->Add("< MSP430 desconectado >");

CloseHandle(hcomPort); /*cerrar puerto*/

Memo1->Lines->Add("Puerto Cerrado."); /*mostrar mensaje puerto cerrado*/

Button1->Enabled=true; //habilitar abrir puerto

Button3->Enabled=false;//deshabilitar enviar trama

//habilitar todo los radiobutton COM1..6

RadioButton1->Enabled=true;

RadioButton2->Enabled=true;

RadioButton3->Enabled=true;

RadioButton4->Enabled=true;

RadioButton5->Enabled=true;

RadioButton6->Enabled=true;

//deshabilitar Modo de trabajo Muestreo A/D y Control PI

IniciarAD1->Enabled=false;

Iniciocontrol1->Enabled=false;

//-----------------------------------------------------------------------

//Boton click enviar trama

//-----------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)

strcpy(acBuf,Edit1->Text.c_str()); /*copiamos lo escrito en el editor*/

dwlen=strlen(acBuf); /*calculamos el numero de bytes*/

//escribir la cadena a enviar

if(!WriteFile(hcomPort, acBuf, dwlen, &dwBytWri, 0))

Txt="No se puede Escribir en el puerto";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

120

// mostrar cadena

sprintf(acmsg,"Tx..:%s",acBuf);

Memo1->Lines->Add(acmsg);

strcpy(acBuf,""); /*limpiamos el bufer*/

Edit1->Clear();

//leer bytes del puerto

//-----------------------------------------------------------------------

// Radibutton para elegir el puerto que queremos abrir

//Radiobutton click COM1

//-----------------------------------------------------------------------

void __fastcall TForm1::RadioButton1Click(TObject *Sender)

sprintf(com,"COM1"); //com=’COM1’

//-----------------------------------------------------------------------

//Radiobutton click COM2

//-----------------------------------------------------------------------

void __fastcall TForm1::RadioButton2Click(TObject *Sender)

sprintf(com,"COM2");

//-----------------------------------------------------------------------

//Radiobutton click COM3

//-----------------------------------------------------------------------

void __fastcall TForm1::RadioButton3Click(TObject *Sender)

sprintf(com,"COM3");

//-----------------------------------------------------------------------

//Radiobutton click COM4

//-----------------------------------------------------------------------

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

121

void __fastcall TForm1::RadioButton4Click(TObject *Sender)

sprintf(com,"COM4");

//-----------------------------------------------------------------------

//Radiobutton click COM5

//-----------------------------------------------------------------------

void __fastcall TForm1::RadioButton5Click(TObject *Sender)

sprintf(com,"COM5");

//-----------------------------------------------------------------------

//Radiobutton click COM6

//-----------------------------------------------------------------------

void __fastcall TForm1::RadioButton6Click(TObject *Sender)

sprintf(com,"COM6");

//-----------------------------------------------------------------------

// boton click Limpiar

//-----------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)

Memo1->Clear(); /*limpiar memo1*/

//-----------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)

Memo2->Clear(); /*Limpiar memo2*/

//-----------------------------------------------------------------------

// Menu Inicio->Conectar (click)

//-----------------------------------------------------------------------

void __fastcall TForm1::Iniciar1Click(TObject *Sender)

BYTE Dato;

Edit8->Clear(); //Limpiamos Error_1

Edit6->Clear(); //limpiamos Ta Pt

Memo2->Clear(); //Limpiamos memo2

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

122

//Limpiamos posibles series en la sgrafica

Form1->Series1->Clear();

Form1->Series2->Clear();

Form1->Series3->Clear();

if(!PurgeComm(hcomPort, PURGE_RXCLEAR|PURGE_TXCLEAR))

Txt="No se puede limpiar los buffers RX/TX";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Dato=0x31;

//enviamos dato 31 al MSP430F169 comprovando conexión

if(!TransmitCommChar(hcomPort,Dato))

Txt="No se puede Inicia conexion MSP430";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sleep(100); //esperamos 100ms

if(!IniciarAD1->Enabled) //ya esta conectado?

if(ReadFile(hcomPort, acBufRx, 2, &dwBytRea,NULL))/*se han recibido datos en el buffer Rx?*/

if(dwBytRea)//si tenemos datos en el buffer Rx

sprintf(acmsg,"MSP430: %s",acBufRx);

Memo2->Lines->Add(acmsg);

Memo1->Lines->Add("MSP430 conectado.");

//habilitar modos de trabajo

IniciarAD1->Enabled=true;

Iniciocontrol1->Enabled=true;

//no hay datos en el buffer Rx

else Memo1->Lines->Add("MSP430 no conectado.");

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

123

else //m

Memo1->Lines->Add("MSP430 no conectado.");

//MSP430F169 ya se encuentra con conexión

else Memo1->Lines->Add("MSP430 conectado.");

Memo2->Lines->Add("< MSP430 con conexión >");

//-----------------------------------------------------------------------

//Menu Iniciar->Salir (click)

//-----------------------------------------------------------------------

void __fastcall TForm1::Salir1Click(TObject *Sender)

BYTE Dato;

Byte loop;

Dato=0x40;

/*enviamos el dato 40 al MSP430F169 indicando fin de conexión

if(!Button1->Enabled)

TransmitCommChar(hcomPort,Dato);

Sleep(10);

Close();//Cerramos la aplicación

//-----------------------------------------------------------------------

//Menu A/D->Ver Muestras

//-----------------------------------------------------------------------

void __fastcall TForm1::VerMuestras1Click(TObject *Sender)

/*Variables de la funcion VerMuestras1Click()

WORD a,b;

unsigned short int h;

float g,Periodo2;

BYTE Dato;

//inicializacion de las variables

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

124

Periodo2=0;

cnt=1;

a=0;

b=0;

h=1426;

Dato=0x33;

// limpiamos la grafica

Form1->Series1->Clear();

Form1->Series2->Clear();

Form1->Series3->Clear();

//enviamos dato 33 al MSP430F169 inicio ver muestras

if(!TransmitCommChar(hcomPort,Dato))

Txt="No se puede Iniciar ver muestras";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sleep(100);

// MSP430F169 envia las muestras?

if(ReadFile(hcomPort, acBufRx, 2, &dwBytRea,NULL))//lee dos bytes

//Si, recibimos las muestras

if(dwBytRea)

Periodo2=cnt*Periodo;

//pasamos los dos bytes a un word

a = acBufRx[0]<<8; //1er byte parte alta

b = acBufRx[1]|a; //2º byte parte baja

g =(float)b/(float)h;//calculamos la Vin

//mostramos la Vin (muestra9 por el memo2

sprintf(acmsg,"Muestra nº.: %d",cnt);

/*configuramos como queremos ver el float (el numero de decimales a mostrar*/

Memo2->Lines->Add(acmsg+String(FormatFloat(" ##0.000 ", g)));

cnt++; //incrementa nºmuestras

//mostramos Vin de forma grafica

Series1->AddXY(Periodo2,g,"",clWhite);

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

125

else //no se han recibido las muestras

Txt="No hay muestras en el buffer Rx";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

//ya sabemos que el MSP430F169 esta enviando las muestras

//hacemos un bluqe para leer todas las muestras que enviara el MSP430

while(ReadFile(hcomPort, acBufRx, 2, &dwBytRea,NULL))

if(dwBytRea)

Periodo2=cnt*Periodo;

a = acBufRx[0]<<8;

b = acBufRx[1]|a;

g =(float)b/(float)h;

sprintf(acmsg,"Muestra nº.: %d",cnt);

Memo2->Lines->Add(acmsg+String(FormatFloat(" ##0.000 ", g)));

cnt++;

Series1->AddXY(Periodo2,g,"",clWhite);

else break;

Sleep(5); /*esperamos un tiempo minimo de envio de datos por parte del MSP430*/

VerMuestras1->Enabled=false;

IniciarAD1->Enabled=false;

Iniciocontrol1->Enabled=false;

//-----------------------------------------------------------------------

// Boton Aceptar grupbox Muestreo A/D

//-----------------------------------------------------------------------

void __fastcall TForm1::Button6Click(TObject *Sender)

WORD Muestra,Tic;

unsigned short int Alta,Baja;

int j;

BYTE Dato;

Dato=0x32;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

126

//comprobamos limites del numero de muestras y periodo de muestreo

if(LabeledEdit1->Text=="")

Txt="Introducir nº de Muestras";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

else if(LabeledEdit1->Text>1000)

Txt="Nº de Muestras mayor de 1000";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

LabeledEdit1->Text=1000;

else if(LabeledEdit2->Text=="")

Txt="Introducir Periodo de Muestreo";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

else if(LabeledEdit2->Text>32)

Txt="Periodo de muestreo mayor a 32s";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

LabeledEdit2->Text=32;

else if(LabeledEdit2->Text<500e-3)

Txt="Periodo de muestreo menor que 500us";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

LabeledEdit2->Text=500e-3;

else //datos introducidos correctos

//iniciamos configuracion MSP430 enviando el dato 32

if(!TransmitCommChar(hcomPort,Dato))

Txt="Error Configuracion A/D";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sleep(10); //esperamos 10ms para que MSP430 se encuentre en el modo

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

127

//configuracion conversor A/D

Muestra = LabeledEdit1->Text.ToInt(); //guardamos numero de muestras

Baja = Muestra & 0x00FF; //pasamos muestras (1Word) a 2 bytes

Alta = Muestra>>8;

//enviamos la parte alta

if(!TransmitCommChar(hcomPort,Alta))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sleep(10);

//enviamos la parte baja

if(!TransmitCommChar(hcomPort,Baja))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Periodo = LabeledEdit2->Text.ToDouble(); //guardamos el periodo

//calculamos el valor del contador

Tic = ((Periodo)/0.5e-3);

Baja = Tic & 0x00FF;

Alta = Tic>>8;

if(!TransmitCommChar(hcomPort,Alta))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sleep(10);

if(!TransmitCommChar(hcomPort,Baja))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

LabeledEdit1->Clear(); //limpiamos muestras

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

128

LabeledEdit2->Clear(); //limpiamos periodo

//esperamos las muestras

Memo1->Lines->Add("< Esperando Muestras MSP430 >");

//calculamos el tiempo de espera

j=(int)(Muestra*Periodo*1000*2);

Sleep(j);

Memo1->Lines->Add("< Ver Muestras MSP430 >");

//ya podemos iniciar ver muestras

VerMuestras1->Enabled=true;

VerMuestras1Click(Sender); //llamamos a la funcion Vermuestras1Click

Automatic1->Enabled=false;

Manual1->Enabled=true;

Button6->Enabled=false;

Button7->Enabled=false;

//-----------------------------------------------------------------------

void __fastcall TForm1::BucleMuestras1Click(TObject *Sender)

Button6->Enabled=false;

Button8->Enabled=true;

BYTE Dato;

Dato=0x34;

if(!TransmitCommChar(hcomPort,Dato))

Txt="No se puede iniciar bucle de muestreo";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sleep(10);

Hilo->Resume();

Button9->Enabled = false;

//-----------------------------------------------------------------------

//deshabilitamos las letras del teclado solo se puede pulsar numeros

//-----------------------------------------------------------------------

void __fastcall TForm1::LabeledEdit1KeyPress(TObject *Sender, char &Key)

if (Key==8) return;

if (Key==44) return;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

129

if (Key==69) return;

if (Key==101) return;

if (Key<48||Key>57)Key=0;

//-----------------------------------------------------------------------

void __fastcall TForm1::LabeledEdit2KeyPress(TObject *Sender, char &Key)

if (Key==8) return;

if (Key==44) return;

if (Key==69) return;

if (Key==101) return;

if(Key == VK_RETURN)

Button6Click(Sender);

if (Key<48||Key>57)Key=0;

//-----------------------------------------------------------------------

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)

if(Key == VK_RETURN)

Button3Click(Sender);

//-----------------------------------------------------------------------

void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)

if (Key==8) return;

if (Key==44) return;

if (Key==69) return;

if (Key==101) return;

if (Key<48||Key>57)Key=0;

//-----------------------------------------------------------------------

void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)

if (Key==8) return;

if (Key==44) return;

if (Key==69) return;

if (Key==101) return;

if (Key<48||Key>57)Key=0;

//-----------------------------------------------------------------------void __fastcall TForm1::Edit4KeyPress(TObject *Sender, char &Key)

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

130

if (Key==8) return;

if (Key<48||Key>57)Key=0;

//-----------------------------------------------------------------------

void __fastcall TForm1::Edit7KeyPress(TObject *Sender, char &Key)

if (Key==8) return;

if(Key == VK_RETURN)

Button9Click(Sender);

if (Key<48||Key>57)Key=0;

//-----------------------------------------------------------------------

// boton Stop

//-----------------------------------------------------------------------

void __fastcall TForm1::Button8Click(TObject *Sender)

Button11Click(Sender);

//-----------------------------------------------------------------------

// Menu Control PI->Inicio control (clic)

//-----------------------------------------------------------------------

void __fastcall TForm1::Iniciocontrol1Click(TObject *Sender)

Button9->Enabled =true;

Button10->Enabled =true;

Button6->Enabled=false;

Button7->Enabled=false;

Memo2->Lines->Add("< Control Seleccionado >");

//-----------------------------------------------------------------------

// boton aceptar grupobox control PI

//-----------------------------------------------------------------------

void __fastcall TForm1::Button9Click(TObject *Sender)

BYTE Dato;

Dato=0x34;

unsigned short int Alta,Baja;

//guardamos los valores

Kp=Edit2->Text.ToDouble();

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

131

Ti=Edit3->Text.ToDouble();

Ts=Edit4->Text.ToInt();

Ta=Edit7->Text.ToInt();

//comprobamos que todos los valores se encuentran en los limites

//establecidos

if(Edit2->Text=="")

Txt="Introducir el valor de Kp";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

else if(Kp<0.1)

Txt="Error Kp<0.1 ";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

Edit2->Text=0;

else if(Edit3->Text=="")

Txt="Introducir el valor de Ti";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

else if(Ti<0.1)

Txt="Error Ti<0.1";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

Edit3->Text=0;

else if(Edit4->Text=="")

Txt="Introducir el valor de Ts";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

else if(Ts<10)

Txt="Error Ts inferiror a 10ms";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

Edit4->Text=10;

else if(Ts>655000)

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

132

Txt="Error Ts superior a 655s";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

Edit4->Text=655000;

else if(Ta>70)

Txt="Tª de consigna mayor de 70ºC";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

Edit7->Text=70;

else if(Ta<25)

Txt="Tª de consigna menor de 25ºC";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

Edit7->Text=25;

else if(Edit7->Text=="")

Txt="Introducir el valor de la consigna";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

else

//estamos en los limites establecidos

if(!TransmitCommChar(hcomPort,Dato)) //enviamos trama micro inicio

//control

Txt="No se puede iniciar bucle de muestreo";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Kp2=int(Kp*10);

Baja = Kp2 & 0x00FF;

Alta = Kp2>>8;

if(!TransmitCommChar(hcomPort,Baja))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

133

return;

Sleep(20);

if(!TransmitCommChar(hcomPort,Alta))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sleep(20);

// calculamos el valor del contador

Periodo=(double)Ts/1000;

//calculoamos el valor de la constante K1

K1=((Kp*(1+(Ts/Ti))))*10;

Baja = K1 & 0x00FF;

Alta = K1>>8;

if(!TransmitCommChar(hcomPort,Baja))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sleep(20);

if(!TransmitCommChar(hcomPort,Alta))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sleep(20);

//convertimos el valor dela tª de consigna a resistencia

Rta=(110*(1+0.00528248*(Ta-25))+0.5);

Baja = Rta & 0x00FF;

Alta = Rta>>8;

if(!TransmitCommChar(hcomPort,Baja))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

134

return;

Sleep(20);

if(!TransmitCommChar(hcomPort,Alta))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Ticlo = Ts/10;

Baja = Ticlo & 0x00FF;

Alta = Ticlo>>8;

if(!TransmitCommChar(hcomPort,Alta))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sleep(20);

if(!TransmitCommChar(hcomPort,Baja))

Txt="No se puede enviar dato";

Application->MessageBox(Txt.c_str(),"Aviso Port",MB_ICONWARNING);

return;

Sleep(20);

Edit2->Enabled=false;

Edit3->Enabled=false;

Edit4->Enabled=false;

Edit7->Enabled=false;

Button9->Enabled=false;

Button10->Enabled=false;

Button11->Enabled =true;

Button8->Enabled =true;

Hilo->Resume(); //activamos el thread inciialmente en suspensión

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

135

//-----------------------------------------------------------------------

//boton cancelar grupbox Control PI

//-----------------------------------------------------------------------

void __fastcall TForm1::Button10Click(TObject *Sender)

Edit2->Clear();

Edit3->Clear();

Edit4->Clear();

Edit7->Clear();

Button9->Enabled=false;

Button10->Enabled=false;

Memo2->Lines->Add("< Control cancelado >");

//-----------------------------------------------------------------------

//boton Stop Control grupbox Control PI

//-----------------------------------------------------------------------

void __fastcall TForm1::Button11Click(TObject *Sender)

Edit2->Enabled=true;

Edit3->Enabled=true;

Edit4->Enabled=true;

Edit7->Enabled=true;

Button11->Enabled=false;

Button8->Enabled=false;

BYTE Dato;

Dato=0x36;

//envio trama MSP430F169 parar control

TransmitCommChar(hcomPort,Dato);

Memo2->Lines->Add("< Control Parado >");

IniciarAD1->Enabled=false;

Iniciocontrol1->Enabled=false;

Hilo->Suspend(); //suspender Thread

cnt=0;

//-----------------------------------------------------------------------

// menu A/D->Iniciar A/D

//-----------------------------------------------------------------------

void __fastcall TForm1::IniciarAD1Click(TObject *Sender)

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

136

Button6->Enabled=true;

Button7->Enabled=true;

Button9->Enabled=false;

Button10->Enabled=false;

Memo2->Lines->Add("< Muestreo Seleccionado >");

//-----------------------------------------------------------------------

// Creamos nuevos FORMS Form3àAyuda de la grafica

// Form4àAcerca de..

//-----------------------------------------------------------------------

void __fastcall TForm1::grafica1Click(TObject *Sender)

Form3 = new TForm3(Application); //creamos un nuevo form

Form3->ShowModal(); //cuando cerremos el form3 volvemos aqui

delete Form3; //destruimos Form3

//-----------------------------------------------------------------------

void __fastcall TForm1::Versin1Click(TObject *Sender)

Form5 = new TForm5(Application);

Form5->ShowModal();

delete Form5;

//-----------------------------------------------------------------------

void __fastcall TForm1::Button7Click(TObject *Sender)

Button6->Enabled=false;

Button7->Enabled=false;

LabeledEdit1->Clear();

LabeledEdit2->Clear();

Memo2->Lines->Add("< Muestreo cancelado >");

//-----------------------------------------------------------------------

// cuando cerremos la aplicación enviamos la trama indicando al

// MSP430F169 que se reinicie

//-----------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)

BYTE Dato;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

137

Byte loop;

Dato=0x40;

if(!Button1->Enabled)

TransmitCommChar(hcomPort,Dato);

Sleep(10);

//-----------------------------------------------------------------------

// menu donde personilizaremos la grafica ( eje X automatio o manula, eje

// Y automatico o manual, Grid off o on.

//-----------------------------------------------------------------------

void __fastcall TForm1::Automatic1Click(TObject *Sender)

Chart1->BottomAxis->Automatic=true;

Automatic1->Enabled=false;

Manual1->Enabled=true;

//-----------------------------------------------------------------------

void __fastcall TForm1::Automatico1Click(TObject *Sender)

Chart1->LeftAxis->Automatic=true;

Automatico1->Enabled=false;

Manual2->Enabled=true;

//-----------------------------------------------------------------------

void __fastcall TForm1::Manual1Click(TObject *Sender)

Chart1->BottomAxis->Automatic=false;

Chart1->BottomAxis->Maximum=5;

Chart1->BottomAxis->Minimum=0;

Automatic1->Enabled=true;

Manual1->Enabled=false;

//-----------------------------------------------------------------------

void __fastcall TForm1::Manual2Click(TObject *Sender)

Chart1->LeftAxis->Automatic=false;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

138

Chart1->LeftAxis->Maximum=70;

Chart1->LeftAxis->Minimum=0;

Manual2->Enabled=false;

Automatico1->Enabled=true;

//-----------------------------------------------------------------------

void __fastcall TForm1::on1Click(TObject *Sender)

Chart1->LeftAxis->Grid->Visible=true;

Chart1->BottomAxis->Grid->Visible=true;

on1->Enabled=false;

off1->Enabled=true;

//-----------------------------------------------------------------------

void __fastcall TForm1::off1Click(TObject *Sender)

Chart1->LeftAxis->Grid->Visible=false;

Chart1->BottomAxis->Grid->Visible=false;

off1->Enabled=false;

on1->Enabled=true;

//-----------------------------------------------------------------------

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

139

7.2.2 Unit1.h

//-----------------------------------------------------------------------

#ifndef Unit1H

#define Unit1H

//-----------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ExtCtrls.hpp>

#include "Unit2.h"

#include "Unit3.h"

#include "Unit5.h"

#include <Chart.hpp>

#include <Series.hpp>

#include <TeEngine.hpp>

#include <TeeProcs.hpp>

#include <Menus.hpp>

#include <ComCtrls.hpp>

#include <Graphics.hpp>

//-----------------------------------------------------------------------class TForm1 : public TForm

__published: // IDE-managed Components

TMemo *Memo1;

TMemo *Memo2;

TRadioGroup *RadioGroup1;

TRadioButton *RadioButton1;

TRadioButton *RadioButton2;

TButton *Button4;

TButton *Button5;

TGroupBox *GroupBox1;

TGroupBox *GroupBox2;

TRadioButton *RadioButton3;

TRadioButton *RadioButton4;

TRadioButton *RadioButton5;

TMainMenu *MainMenu1;

TMenuItem *Configuracion1;

TMenuItem *Iniciar1;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

140

TMenuItem *Salir1;

TGroupBox *GroupBox3;

TButton *Button1;

TButton *Button2;

TLabeledEdit *LabeledEdit1;

TLabeledEdit *LabeledEdit2;

TButton *Button6;

TRadioButton *RadioButton6;

TEdit *Edit1;

TButton *Button3;

TButton *Button7;

TButton *Button8;

TGroupBox *GroupBox4;

TChart *Chart1;

TFastLineSeries *Series1;

TLabel *Label1;

TLabel *Label2;

TButton *Button10;

TLabel *Label3;

TEdit *Edit6;

TLabel *Label6;

TLabel *Label7;

TFastLineSeries *Series2;

TButton *Button9;

TButton *Button11;

TFastLineSeries *Series3;

TEdit *Edit2;

TEdit *Edit3;

TEdit *Edit4;

TEdit *Edit7;

TMenuItem *AD1;

TMenuItem *VerMuestras1;

TMenuItem *BucleMuestras1;

TMenuItem *ControlPI1;

TMenuItem *Iniciocontrol1;

TMenuItem *Ayuda1;

TMenuItem *IniciarAD1;

TLabel *Label4;

TEdit *Edit8;

TMenuItem *grafica1;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

141

TMenuItem *Versin1;

TMenuItem *Grafica2;

TMenuItem *Grid1;

TMenuItem *on1;

TMenuItem *off1;

TMenuItem *Axis1;

TMenuItem *AxisY1;

TMenuItem *Automatic1;

TMenuItem *Manual1;

TMenuItem *Automatico1;

TMenuItem *Manual2;

TMenuItem *N101;

TMenuItem *N201;

TMenuItem *N1001;

TMenuItem *N1501;

TMenuItem *N102;

TMenuItem *N501;

TMenuItem *N1002;

TMenuItem *N1502;

void __fastcall Button1Click(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

void __fastcall Button3Click(TObject *Sender);

void __fastcall RadioButton1Click(TObject *Sender);

void __fastcall RadioButton2Click(TObject *Sender);

void __fastcall Button4Click(TObject *Sender);

void __fastcall Button5Click(TObject *Sender);

void __fastcall RadioButton3Click(TObject *Sender);

void __fastcall RadioButton4Click(TObject *Sender);

void __fastcall RadioButton5Click(TObject *Sender);

void __fastcall Iniciar1Click(TObject *Sender);

void __fastcall Salir1Click(TObject *Sender);

void __fastcall VerMuestras1Click(TObject *Sender);

void __fastcall Button6Click(TObject *Sender);

void __fastcall BucleMuestras1Click(TObject *Sender);

void __fastcall LabeledEdit1KeyPress(TObject *Sender, char &Key);

void __fastcall LabeledEdit2KeyPress(TObject *Sender, char &Key);

void __fastcall Edit1KeyPress(TObject *Sender, char &Key);

void __fastcall Button8Click(TObject *Sender);

void __fastcall RadioButton6Click(TObject *Sender);

void __fastcall Button9Click(TObject *Sender);

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

142

void __fastcall Button10Click(TObject *Sender);

void __fastcall Button11Click(TObject *Sender);

void __fastcall Edit2KeyPress(TObject *Sender, char &Key);

void __fastcall Edit3KeyPress(TObject *Sender, char &Key);

void __fastcall Edit4KeyPress(TObject *Sender, char &Key);

void __fastcall Edit7KeyPress(TObject *Sender, char &Key);

void __fastcall Iniciocontrol1Click(TObject *Sender);

void __fastcall IniciarAD1Click(TObject *Sender);

void __fastcall grafica1Click(TObject *Sender);

void __fastcall Versin1Click(TObject *Sender);

void __fastcall Button7Click(TObject *Sender);

void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

void __fastcall Automatic1Click(TObject *Sender);

void __fastcall Automatico1Click(TObject *Sender);

void __fastcall Manual1Click(TObject *Sender);

void __fastcall Manual2Click(TObject *Sender);

void __fastcall on1Click(TObject *Sender);

void __fastcall off1Click(TObject *Sender);

private: // User declarations

lolo *Hilo;

public: // User declarations

double Periodo;

DCB sComCfg; //Estructura DCB, configuracion del puerto

COMMPROP sComPro; //Estructura de propiedades

COMSTAT sComSta; //Estado del Puerto

// estrudtura control de errores

COMMTIMEOUTS sTimOut; //estructura COMMTIMEOUTS

BYTE acBuf[32]; // buffer

BYTE acBufRx[1024]; // buffer lectura

char acmsg[32];

char com[5];

DWORD dwlen; // numero de bytes

DWORD dwBytWri; // bytes escritos

DWORD dwBytRea;

bool Error;

unsigned short int Muestras,Ta,Ts,Rta,K1,Kp2;

int cnt,Ticlo;

AnsiString Txt;

double Kp,Coef,Ti;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

143

__fastcall TForm1(TComponent* Owner);

;

//-----------------------------------------------------------------------extern PACKAGE TForm1 *Form1;

//-----------------------------------------------------------------------

#endif

7.2.3 Thread unit2.cpp

//-----------------------------------------------------------------------

#include <vcl.h>

#include <stdio.h>

#include <conio.h>

#include <iostream.h>

#pragma hdrstop

extern HANDLE hcomPort,dwlen;

char acBufRx[100];

#include "Unit1.h"

#pragma package(smart_init)

DWORD dwEvtMasck;

//-----------------------------------------------------------------------// Constructor del Thread

//-----------------------------------------------------------------------

__fastcall lolo::lolo(bool CreateSuspended)

: TThread(CreateSuspended)

//inicialización variables

a=0;

b=0;

c=0;

Periode=0;

cnt=1;

Error_1 = 0;

FreeOnTerminate=true; //liberar memoria una vez terminado thread

//-----------------------------------------------------------------------

// Rutina de ejecución del Thread

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

144

//-----------------------------------------------------------------------

void __fastcall lolo::Execute()

while(!Terminated) //bucle hasta fin Thread

//leemos dos bytes del buffer Rx

ReadFile(hcomPort, acBuf, 2, &dwBytRea,NULL);

if(dwBytRea) //se ha leeido algun byte?

a = acBuf[1]<<8;

b = acBuf[0]|a;

//el MSP430F169 enviara el valor de la //resistencia del calefactor la //pasamos a temperatura

g =(float)b/10;

g =(int)((g-9.547318)/0.05810728);

if(g<=0) g=0;

//calculamos el error

Error_1 = (float)Form1->Ta - g;

Form1->cnt++;

Periode=Form1->Periodo*Form1->cnt;

Synchronize(mostrar);

//-----------------------------------------------------------------------

void __fastcall lolo::mostrar()

// si queremos ver la temperatura en el memo2

// Form1->Memo2->Lines->Add(FormatFloat(" ##0º", g));

// mostramos la temperatur y el error en edit8 (tª) y edit9(error

Form1->Edit8->Text = FormatFloat(" ##0º.0",g);

Form1->Edit6->Text = FormatFloat(" ##0º.0",Error_1);

//mostramos valores Tª, Tªconsigna y error en la grafica

Form1->Series1->AddXY(Periode,g,"",clWhite);

Form1->Series2->AddXY(Periode,Error_1,"",clWhite);

Form1->Series3->AddXY(Periode,Form1->Ta,"",clWhite);

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

145

7.2.4 Unit2.h

//-----------------------------------------------------------------------

#ifndef Unit2H

#define Unit2H

//-----------------------------------------------------------------------

#include <Classes.hpp>

//-----------------------------------------------------------------------

class lolo : public TThread

private:

protected:

void __fastcall Execute();

void __fastcall lolo::mostrar(void);

DWORD dwBytRea; // bytes leidos

public:

__fastcall lolo(bool CreateSuspended);

float g,Error_1,c;

char acmsg[32];

WORD a,b;

int cnt;

float Periode;

unsigned short int h;

BYTE acBuf[1024];

;

//-----------------------------------------------------------------------

#endif

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

146

7.3 Codigo fuente MSP430F169

#include <msp430x16x.h>

;------------------------------------------------------------------------

ORG 04000h

;------------------------------------------------------------------------

Inicio mov.w #0A00h,SP ; Iniciar Stack Pointer @0A00

mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop Watchdog

mov.b #087h,BCSCTL1 ;Rsel = 7

mov.b #0E0h,DCOCTL ;DCO = 7//fClk=4.604Mhz (osciloscopio P1.4)

mov.w #TBSSEL_2,&TBCTL ; SMCLK, upmode

mov.w #CCIE,&TBCCTL0 ;

mov.w #SHT0_8+MSC+ADC12ON,&ADC12CTL0 ; AVcc ref.

mov.w #SHP+CONSEQ_1,&ADC12CTL1 ; Enable sample timer

mov.b #INCH_2,&ADC12MCTL0 ; A10, internal reference

mov.b #INCH_3+EOS,&ADC12MCTL1

mov #BIT1,&ADC12IE ; Enable interrupt

mov.w #235,&CCR0 ; PWM 100Hz

mov.w #OUTMOD_6,&CCTL2 ; CCR1 toggle/set

mov.w #235,&CCR2 ; CCR1 PWM Duty Cycle

SetupTA mov.w #TASSEL_2+MC_3,&TACTL ; SMCLK, updown mode

mov.b #CHAR,&UCTL0 ; D7 es 8º bit de informacion

mov.b #SSEL0+SSEL1,&UTCTL0 ; SSELx '11' Fuente del reloj MCLK

mov.b #0,&URCTL0 ;

mov.b #0E9h,&UBR00 ; Parte baja

mov.b #001h,&UBR10 ; Parte Alta

mov.b #000h,&UMCTL0 ; Modulación

bis.b #030h,&P3SEL ; SELECC. P3.4,P3.5 = USART0 TXD/RXD

bis.b #010h,&P3DIR ;

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

147

mov.b #0FFh,&P6SEL ; SELECC. P6.2, P6.3 = A2/A1

and.b #000h,&P6DIR

bis.b #080h,&P1SEL ;SELECC. P1.1àout (led)

bis.b #081h,&P1DIR ;

bis.b #UTXE0+URXE0,&ME1 ; Habilitación USART0 TXD/RXD

loopin mov.w #01102h,R4 ;R4=@01102 memoria RAM

clr R6 ;limpiar Registros

clr R5

clr R10

clr R11

clr R13

clr R14

mov.w #235,&CCR2 ;Duty cycle = 0%

bic.b #001h,P1OUT ;Led =off

loopin2 bit.b #RXERR,&URCTL0; Control de errores

jz RX;

bic.b #FE+PE+OE+BRK+RXERR,&URCTL0;

jmp TX;

RX bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz loopin2 ; Salta si no esta preparado para recibir informacion

cmp.b #040h,&RXBUF0 ;RxBUF0=0x40

jz loopin ;si es salta a loopin

tst R5 ;testeamos R5=0

jnz RX8

cmp.b #031h,&RXBUF0 ;RxBUF0=0x31

jnz loopin2 ;sino es salta

mov.b #001h,R5 ;R5=1

call #ok ;saltar rutina OK

nop ;necesario por el programa IAR

jmp loopin2 ;salta loopin2

RX8 cmp.b #003h,R5

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

148

jz TX

cmp.b #034h,&RXBUF0

jnz RX2

mov.b #003h,R5

jmp TX3

RX2 cmp.b #002h,R5

jz RX3

cmp.b #032h,&RXBUF0

jnz loopin2

mov.b #002h,R5

//-------------------------------------------------------------------

// guardamos los datos recibidos por el puerto serie

//-------------------------------------------------------------------

RX5 bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz RX5

mov.b &RXBUF0,R8 ;lo recibido lo guardamos en R8

SWPB R8 ;mover recibido a la parte alta

RX4 bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz RX4

mov.b &RXBUF0,R7

add.w R7,R8 ; unimos la parte baja con la alta

mov.w R8,R6 ; R6 = numero de muestras

RLA R6 ;R6=R6*2

RX6 bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz RX6

mov.b &RXBUF0,R9

SWPB R9;

RX7 bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz RX7

mov.b &RXBUF0,R7

add.w R7,R9 ;R9 = Valor del contador

mov.w #01102h,R13 ;R13=@0x01102

mov.w #03100h,R4 ;R4=@0x03100

mov.w R9,0(R4) ;guardar R9 en la @0x03100

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

149

incd R4 ;R4=@0x03102

mov.w R9,0(R4) ;guardar R9 en la @0x03102

mov.w #2350,&TBCCR0 ;cargar contador TBCCR0 (500us)

bis #MC0,&TBCTL ;activar Timerb en modo upmode

eint ;habilitar interrupciones

jmp loopin2

RX3 cmp.b #033h,&RXBUF0 ;Ver muestras

jz TX2

BR #loopin2

TX2 tst R8 ;tenemos todas las muestras si R8=0

jnz TX2

; si ya se ha terminado enviar

TX bit.b #UTXIFG0,&IFG1 ;Esta listo para transmitir nueva informacio?

jz TX

mov.b 0(R13),&TXBUF0 ;(@0x1102)àTX

DEC R13 ;R13--

dec R6 ;R6--

jz loopin ; ya se ha terminado? Si salta, no continua

jmp TX

//--------------------------------------------------------------------

// configuración valores control PI

//---------------------------------------------------------------------

TX3 bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz TX3

mov.b &RXBUF0,0(R4) ;guardamos @0x01102 parte baja Kp

inc R4;

PI bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz PI

mov.b &RXBUF0,0(R4) ;Guardamos @0x01103 parte alta Kp

inc R4

PI2 bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz PI2

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

150

mov.b &RXBUF0,0(R4) ;guardamos @0x01104 parte baja K1

inc R4

PI3 bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz PI3

mov.b &RXBUF0,0(R4) ;guardamos @0x01105 parte alta K1

inc R4

PI4 bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz PI4

mov.b &RXBUF0,0(R4); ;guardamos @0x01106 parte baja Ra

inc R4

PI5 bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz PI5

mov.b &RXBUF0,0(R4) ;guardamos @0x01107 parte alta Ra

inc R4 ;R4=@0x01108

PI6 bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz PI6

mov.b &RXBUF0,R12

SWPB R12;

PI7 bit.b #URXIFG0,&IFG1 ;Esta listo para recibir nueva informacio?

jz PI7

mov.b &RXBUF0,R7

add.w R7,R12 ;R12=valor del contador

mov.w #46900,&TBCCR0 ; Tic contador TimerB=10ms

mov.w #03100h,R4

mov.w R12,0(R4)

incd R4

mov.w R12,0(R4)

mov.w #01108h,R4

bis #MC0,&TBCTL

eint

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

151

;------------------------------------------------------------------------; Si recibimos trama fin control PI

;------------------------------------------------------------------------

lolo bit.b #URXIFG0,&IFG1 ;

jz lolo

bic #MC0,&TBCTL ;stop Timer B

jmp loopin

;------------------------------------------------------------------------

; Subrutina envio de trama

;------------------------------------------------------------------------

ok bit.b #UTXIFG0,&IFG1 ;Esta listo para transmitir nueva informacio?

jz ok

mov.b #04fh,&TXBUF0 ;enviar trama

ok2 bit.b #UTXIFG0,&IFG1 ;Esta listo para transmitir nueva informacio?

jz ok2

mov.b #04bh,&TXBUF0 ;enviar segunda trama

bis.b #001h,P1OUT

RET

;------------------------------ DIVISION---------------------------------

div clr R12

cmp.w #0,R6

jeq fin1

cmp.w #0,R7

jeq fin1

cmp.w R7,R6

jeq fin3

jlo fin1

cmp.b #01,R7

jeq fin2

div2 sub.w R7,R6

inc R12

cmp.w R7,R6

jlo fin

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

152

jmp div2

fin1 mov.b #0,R12

ret

fin2 mov.w R6,R12

ret

fin3 mov.b #1,R12

fin ret

;------------------------------MULTIPLICACION----------------------------

mult cmp.w #0,R9

jeq por

cmp.w #0,R8

jeq por

mov.w R8,R13

mult2 dec R9

tst R9

jz final

add.w R13,R8

jmp mult2

final ret

por mov.w #0,R8

ret

;------------------------------------------------------------------------

; Rutina a la interrupcion A/D

;------------------------------------------------------------------------

ADC12_ISR //xor.b #001h,&P1OUT

cmp.b #003h,R5 ; en que modo de trabajo nos encontramos

jz Mem2 ;salta si modo de trabajo Muestreo A/D

mov.w &ADC12MEM0,0(R13) ;guardar muestra en RAM

mov.w &ADC12MEM1,R7 ;necesario para iniciar flag interrp.

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

153

incd R13 ;R13=@R13+2

dec R8 ;decrementamos muestras tomadas

jz Mem ; salta si muestras=0 (R8=0)

reti

Mem dec R13

bic #MC0,&TBCTL ;stop TimerB

reti

Mem2 mov.w &ADC12MEM0,R6 ;R6=Nadc(A2)

mov.b #15,R7 ;R7=15

call #div ;R12=Nadc/15 tenemos la corriente que circula por el platino

nop

mov.w R12,0(R4) ;R12à@0x1108

mov.w &ADC12MEM1,R8 ;R8=Nadc(A3)

mov.b #10,R9 ;R9=10

call #mult ;R8=R8*10

nop

mov.w R8,R6

mov.w 0(R4),R7

call #div ;R12=(NadcA3*10)/(@01108) àResistencia del platino

nop

mov.w R12,0(R4) ;Rptà@0x1108

;------------------------------------------------------------------------; Transmitimos el valor actual de la resistencia del platino

;------------------------------------------------------------------------

Mem3 bit.b #UTXIFG0,&IFG1 ;Esta listo para transmitir nueva informacio?

jz Mem3

mov.b 0(R4),&TXBUF0

TX5 bit.b #UTXIFG0,&IFG1 ;Esta listo para transmitir nueva informacio?

jz TX5

inc R4

mov.b 0(R4),&TXBUF0

dec R4

// mov.w #0,&CCR2

//si queremos hacer un lazo abierto alimentado al calefactor de platino //con un duty cycle del 100% para ello habilitar la linea

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

154

// mov.w y deshabilitar la linea de llamada al control

call #control ;llamamos a la rutina de control

nop

reti ; Fin rutina

;---------------------------------CONTROL PI-----------------------------

control decd R4

mov.w 0(R4),R10

incd R4

sub.w 0(R4),R10 ;error=Raconsigna-Rpt

mov.w R10,R8 ;R10=error

mov.w #01104h,R4

mov.w 0(R4),R9

call #mult

nop

mov.w R8,R15 ;R15=error*K1

mov.w #01102h,R4

mov.w R11,R8

mov.w 0(R4),R9

call #mult ;R8=Error(n-1)*Kp

nop

sub.w R8,R15 ;R15=((error*K1)-(Error-1*Kp))

add.w R15,R14 ;R14+=R15

mov.w R10,R11 ;error_n-1=Error

cmp.w #100,R14 ;R14>100 limitar R14=100

jge sup

cmp.w #0,R14 ;R14<=0 limitar a R14=0

jl inf

jeq inf

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

155

;---------------------------------------------------------------------

; Calculamos el nuevo Duty cycle

;---------------------------------------------------------------------

mov.w #235,R8

mov.w R14,R9

call #mult ;R8=R6*R9

nop

mov.w R8,R6

mov.w #100,R7

call #div ;R12=R8/100

nop

mov.w #235,R8

sub.w R12,R8 ;R8=235-R12

mov.w R8,&CCR2 ;CCR2=nuevo duty Cycle

mov.w #01108h,R4 ;R4=@0x01108

ret

sup mov.w #0,&CCR2 ; CCR1 PWM Duty Cycle

mov.w #100,R14

mov.w #01108h,R4

ret

inf mov.w #125,&CCR2 ; CCR1 PWM Duty Cycle

mov.w #0,R14

mov.w #01108h,R4

ret

;----------------------------------TIMER B-------------------------------

TB0_ISR mov.w #03100h,R4

mov.w 0(R4),R12 ;(@3100)->R12

dec R12 ;R12--

cmp.w #0,R12 ;si R12!=0 salta

jnz fin33

incd R4 ;R4=@0x31002

Sistema de adquisición y transmisión de datos mediante el MSP430F169 de Ti.

156

mov.w 0(R4),R12

decd R4

mov.w R12,0(R4)

mov.w #01108h,R4

bis.w #ENC+ADC12SC,&ADC12CTL0 ;iniciamos una nueva combersión

reti

fin33 mov.w R12,0(R4)

reti

;------------------------------------------------------------------------

; Interrupciones Vector

;------------------------------------------------------------------------

ORG 0FFFEh ; MSP430 RESET Vector

DW Inicio ;

ORG 0FFEEh ; ADC12 Vector

DW ADC12_ISR ;

ORG 0FFFAh ; Timer_B0 Vector

DW TB0_ISR ;

END