sistema de adquisición y transmisión de datos mediante el...
TRANSCRIPT
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.
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.
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.
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.
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.
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.
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.
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