177
1 ETSE PROYECTO PARA EL DESARROLLO DE UN GENERADOR DE FUNCIONES DE M.B.F IMPLEMENTADO POR PC Parte I AUTOR: SIGFRIDO BERGA PONENTE: ESTEBAN DEL CASTILLO

UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

  • Upload
    vudien

  • View
    221

  • Download
    5

Embed Size (px)

Citation preview

Page 1: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

1

ETSE

PROYECTO PARA EL DESARROLLO DE

UNGENERADOR

DEFUNCIONES DE

M.B.FIMPLEMENTADO

PORPC

Parte I

AUTOR: SIGFRIDO BERGAPONENTE: ESTEBAN DEL CASTILLO

Page 2: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

2

INDICE

Parte I

MEMORIA DESCRIPTIVA

Generalidades

1.1.0 Objetivos del alcance del proyecto................................. ..................................... ….51.2.0 Características Externas del generador de funciones .......................................…...6

1.2.1 Cuadro de Especificaciones principales.......................................................61.3.0 Los Generadores de funciones(Generalidades) ........................................................71.4.0 Generalidades del proyecto........................................................................................81.5.0 Limitaciones del proyecto.........................................................................................101.6.0 Tarjeta de adquisición de datos...............................................................................101.6.1 Descripción de la tarjeta..........................................................................................101.6.2 El Entorno del programa.........................................................................................121.7.0 El Programa de control......................................................................................... .121.7.1 Función del programa..................................................... ........................................121.7.2 Estructura global del programa...............................................................................131.8.0 Estructura l del programa........................................................................................131.8.1 Descripción de uso del programa........................................................... .................15

MEMORIA TECNICA

Diseño del Hardware

2.0.1.- El acondicionador de señal ...............................................................…........292.0.2.- Los circuitos de la placa PCL812.............................................................…29

2.1.0 .- Los circuitos a desarrollar................................................................................ ...…302.1.1.- El regulador de tensión de referencia.....................................................…..302.1.2.- El acondicionador de señal de la salida general....................................…..312.1.3.-La etapa de entrada de señal..................................................................… 312.1.4.-El amplificador inversor..........................................................................… .332.1.5-El sumador............................................................................................... .…..332.1.6- El buffer.................................................................................................. .......342.1.7-La fuente de alimentación................................ ....................................... ..... .36

Diseño del software

3.0.0 Introducción...…...................................................................................................…...383.1.0 Generalidades del programa.................................................................................…...383.2.0 Fundamentos teóricos del programa...................................................................…...383.3.0.- Estructura del programa ...........................................................................................40 3.3.1.-Diagrama de flujo de llamadas de los módulos.......................................…… .42 3.3.2 –Diagrama de flujo de los módulos.............................................................. ......43 3.3.3-Diagrama de flujo funcional del programa...................................................…...76PLIEGO DE CONDICIONES

Page 3: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

3

4.0.0 –Condiciones generales.......................................................................................…..77 4.1.0.- Condiciones económicas....................................................................................…..79 4.2.0.- Condiciones Facultativas....................................................................................….81

MEDICIONES Y PRESUPUESTO

5.0.0.-Presupuesto.........................................................................................................…...835.1.01.-Presupuesto materia..........................................................................................…...835.2.0.- Presupuesto mano de obra.................................................................................…...845.3.0.-Presupuesto de diseño del proyecto....................................................................…...865.4.0 Presupuesto total..................................................................................................…...87

Parte II

PLANOS

6.0.0.-Esquema eléctrico6.1.0.-Cara de soldaduras -6.2.0.-- Cara dé componentes.

6.3.0.- Serigrafía.

CODIGO FUENTE

7.0.0.-Codigo fuente

Page 4: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

4

Bibliografía. -

Programación con DelphiFrancisco Charte

Apuntes Informática Industrial (ETSET)Esteban del castillo

Programación gráfica para PCPedro Antón

Printed circuit Handbook(third edition)Clyde F.Coombs

Amplificadores operacionales y circuitos Integrados linealesRobert F.Coughlin.

Manual del usuario de la PC:Labcard 812

Burr Brown Handbook C.I

Oficina técnica(teoría de proyectos )Turón Rodríguez/Luis Massages

Page 5: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

5

MEMORIA DESCRIPTIVA

1.1.0.- OBJETIVOS Y ALCANCE DEL PROYECTO:

El objetivo del presente proyecto es el diseño del software y hardware necesario para conseguir que,

aprovechando los recursos de un ordenador personal del tipo PC/XT/AT, éste pueda hacer las veces

de un generador de funciones de muy baja frecuencia.

Para realizar este proyecto emplearemos los recursos disponibles en un ordenador PC y la placa de

adquisición de datos la PCL 812 de Advantech.

Se diseña el hardware y software necesarios poder funcionar en cualquier ordenador PC/XT/AT

que disponga de bus ISA .

Los objetivos fundamentales que se pretenden conseguir en el presente proyecto son;

• Facilidad de manejo de todas sus opciones.

• Cobertura básica de las señales Sinusoidal, Triangular, Diente de Sierra y Cuadrada.

• Precisión en las señales generadas similar a los generadores de funciones existentesen el mercado .

• Entorno gráfico de usuario

• Capacidad de captura de la forma del periodo la función generada para su posteriorprocesado en otras aplicaciones .

Page 6: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

6

1.2.0-CARACTERÍSTICAS EXTERNAS DEL GENERADOR DE FUNCIONES

El menú general de gestión del Generador de funciones

Dispone de capacidad para la selección del rango de frecuencias de trabajo.

Capacidad de selección de la forma de onda que queremos sacar por la salida general.

Capacidad para copiar valores de amplitud del periodo de la función generada.

Mando de control de la frecuencia

Mando de control de la tensión de offset

Mando de control de amplitud de señal

Mando de control del Duty-Cicle de la señal en forma de onda cuadrada

Display de visualización de la frecuencia

Display de visualización de la tensión de offset

Display de visualización del tipo de señal seleccionada

Display de visualización de la amplitud seleccionada

Opciones especiales del menú:

Menú de la generación de la función por puntos

Menú de gestión del programa

Menú de gestión i configuración de las características del generador de funciones

Menú de gestión de los registros de la base de datos de la sesión de trabajo

El hardware del acondicionador de señal:

El conexionado de las entradas es a través de un conector compatible con las salidas de latarjeta PCL-812 y la salida de señal del acondicionador será del tipo BNC socket.

La comunicación entre el ordenador y la placa de acondicionador de señal se establecemediante conectores din de 20 patillas .

1.2.1.-CUADRO ESPECIFICACIONES PRINCIPALES

Especificaciones TécnicasFrecuenciaRango de frecuencias: 0.001-10hzRango de 0.001-1Hz: error ?0.1%Rango de 1-10 Hz : error ?1%Resolución:0.001 Hz; entre(0.001-0.1Hz);Resolución:0.01Hz; entre(0.1-1 Hz)Resolución:0.1 Hz ;entre(1-10 Hz);SalidaTipo de conexión: BNC SocketImpedancia: 50 ohmiosFormas de onda: Sinusoidal, Triangular, Diente de Sierra, Cuadrada, Por puntosAmplitud 10Vpp en circuito abierto Error 1% VfeAmplitud 10 Vpp con una carga de 50 ohms Error 3% VfeResolución:100mVOffset DC Variable 0-5V a intervalos de 50mVTension de salida sin recortar: Voffset+Vp= ±5V

Page 7: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

7

1.3.0 LOS GENERADORES DE FUNCIONES.(GENERALIDADES)

Se denomina generador a toda fuente de señal calibrada y estable.

Sus aplicaciones habituales están en el campo del test y el mantenimiento. También son necesarios

para el funcionamiento de algunos dispositivos que convierten una señal eléctrica en una señal

distinta (eléctrica o de otra forma física)

El esquema de bloques elemental de un generador de señal consiste en un oscilador o generador

propiamente dicho, con posibilidad de seleccionar su frecuencia de trabajo; una etapa que determina

la forma de onda de la señal; y una etapa donde se ajustan la amplitud y nivel de continua a la salida

(offset).

De acuerdo con esto, dos criterios básicos para clasificar los generadores son la banda de frecuencias

que cubre, y las formas de onda que permite obtener.

Según las frecuencias, los términos empleados para la designación de los instrumentos no se refieren

a la denominación de la banda, sino al tipo de técnica de generación empleada. Los principales

grupos son: generadores de audiofrecuencia (AF): desde menos de 0,01 a 1 o 10MHz; generadores

de radiofrecuencia (RF): 1 a 10kHz a 520 a 1000MHz; y generadores de señales de microondas: 1 a

40GHz (no en un único instrumento).

Según la forma de onda de la salida se habla de generadores de funciones (triangular, cuadrada,

senoidal); generadores de señales (senoide con modulación), osciladores (senoide con amplitud y/o

frecuencias fijas) y generadores de barrido (modulación FM lenta y cíclica); generadores de pulsos

(pulsos, cuadrada); generadores de miras TV; generadores de formas de onda arbitrarias:

etc.

El método de generación también permite distinguir unos generadores de otros. Hasta el presente, la

mayoría se han basado en osciladores de frecuencia variable, pero cada vez hay más modelos

basados en la síntesis de frecuencias.

El tipo más común de generadores de señal son los llamados generadores de "funciones", los cuales

reciben este nombre debido a que producen señales que pueden describirse mediante fórmulas

matemáticas simples

las formas de onda obtenidas son: la triangular, que se emplea para medidas de nivel de disparo,

estudios de linealidad, etc.; la cuadrada, que se aplica, entre otras, al análisis de la respuesta

transitoria; y la senoidal, que es adecuada para la obtención de la respuesta frecuencia.

Page 8: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

8

Esquema de un generador de funciones

Otro tipo de generador seria el generador de pulsos que ofrece pulsos o trenes de pulsos de tensión o

de corriente (para transformadores de pulsos y otros circuitos magnéticos) no como salida secundaria

como en otros generadores, sino corno salida fundamental, y a veces única.

1.4.0 GENERALIDADES DEL PROYECTO

El principio de creación de las señales del generador de funciones está basado en la generación de la

señales bajo de sistemas en tiempo discreto.

Una señal en tiempo discreto es una señal que solo está definida en valores discretos de tiempo es

decir aquellos valores en los que la variable independiente tiempo esta cuantificada ;por ejemplo una

señal digital es una señal en tiempo discreto con amplitud cuantificada.

Dicha señal se puede representar mediante secuencias de números binarios .El convertidor D/A

permite la conversión de las secuencia binaria en un valor analógico. La variación de la secuencia de

números binarios a la entrada del convertidor D/A permite la obtención de diferentes valores

analógicos a su salida. Si esta variación se hace a intervalos de tiempo regulares es puede generar

una señal analógica aproximada la deseada en tiempo continuo. .

Los datos que se le deben proporcionar al sistema para realizar el proceso de discretización de una

señal periódica son; el periodo de la señal deseada, el número de puntos en que se debe dividir la

señal , la amplitud de la señal y la función que define tipo de señal deseado. Con estos datos el

Page 9: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

9

ordenador calcula el valor en tiempo discreto de cada punto y el intervalo de tiempo que transcurre

entre valores .

Para realizar todo el proceso se requiere del uso de un hardware y un software que trabajen de forma

conjunta.

Page 10: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

10

1.5.0.- LIMITACIONES DEL PROYECTO:

Una limitación del generador de funciones es la imposibilidad de generar señales de gran frecuencia

debido a la velocidad de funcionamiento del bus ISA sobre el cual esta instalada la tarjeta del

generador de funciones.

Otro factor de limitación de velocidad es la que está en función ordenador sobre el cual se monte el

sistema, ya que esta influirá en la ejecución de la rutina de transferencia de datos, Este factor, que es

variable en función del ordenador, puede provocar la generación de señales de frecuencia incorrectas

.

Otro factor limitador de la velocidad viene impuesto por el sistema operativo bajo el cual corre elprograma por ejemplo Windows asigna un determinado tiempo para que una tarea pueda hacer usode la CPU del sistema después del cual otra tarea tendrá su disposición la CPU ,esto se hace deforma secuencial y esta impuesto por el sistema operativo .

1.6.0.-TARJETA DE ADQUISICIÓN DE DATOS

La parte de hardware del presente proyecto consta de una tarjeta de adquisición de datos. La tarjeta

va alojada en el interior de un equipo PC en una ranura de expansión del tipo ISA. La función

principal de esta tarjeta es la de servir como Interfaz entre el ordenador y el entorno externo para que

este sea capaz generar los valores analógicos en tiempo discreto que componen nuestra señal .

1 .6 .1- DESCRIPCIÓN DE LA TARJETA:

.

La tarjeta que vamos a utilizar es la placa de laboratorio de Advantech PCL-812

La placa pcl-812 es una placa de adquisición de datos multifunción para IBM PC/XT/AT y

ordenadores compatibles

Es una placa empleada en entornos industriales y en laboratorios. Permite la adquisición de datos,

procesos de control y automatización de industrias.

Page 11: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

11

Elementos que componen la placa

16 canales analógicos de entrada

Un convertidor A/D (HADC574Z)de 12 bits.

El rango máximo de muestreo es de 30 khz en el modo dma

Interruptores de selección del rango de entrada analógica

Tres modos de disparo A/D

Disparo por software

Disparo de espera Programable

Disparo Externo pulsatorio

La placa tiene la capacidad de transferir datos A/D por medio de un programa de control deinterrupciones o bien por medio del acceso directo a la memoria

Dispone de un timer programador programable que permite retener l a salida

Dispone de dos canales de salida D/A .Es un convertidor multiplicativo de 12 bits

Dispone de 16 TTL/DTL entradas digitales compatibles y 16 canales de salida.

La Pcl-812 tiene una serie de interruptores y puentes colocadas sobra placa que determinan laforma como trabaja esta .

La información acerca del hardware de la misma se debe buscar en el manual que acompaña laplaca.

La Pcl -812 requiere 16 direcciones consecutivas en el espacio I/O .

Page 12: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

12

1.6.2.- ENTORNO DEL PROGRAMA

El programa en particular esta orientado a laboratorios e industrias que requieran un generador defunciones de MBF a bajo costo pero sin renunciar a la calidad .

El entorno gráfico i la compatibilidad con otros programas es un factor importante .

Por lo tanto consideramos una condición básica de diseño es que el programa corra bajo el sistemaoperativo Windows 95/98/2000/XP.

1.7.0.- PROGRAMA DE CONTROL:

El programa de control del generador de funciones será implementado en lenguaje Delphi 2 ,basado

en object pascal, un lenguaje de programación visual totalmente estructurado que incorpora la

posibilidad de programación orientada a objetos y es usado en el desarrollo de aplicaciones

informáticas bajo Windows.

1.7.1.-FUNCIÓN DEL PROGRAMA:

La función del programa es la ofrecer un entorno de trabajo grafico al usuario de tal forma que

disponga de las herramientas básicas para gestionar un generador de funciones de muy baja

frecuencia a por medio de un software que controla una tarjeta de adquisición de datos

del tipo Advantech PCL-812.

Page 13: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

13

1.7.2.-ESTRUCTURA GLOBAL DEL PROGRAMA:

El programa se estructura de la siguiente forma:

Un modulo principal que gestiona diferentes módulos dependientes

Clasificación de los módulos dependientes:

La parte encargada de adquirir y presentar los datos necesarios desde el entorno de usuario, sellama Modulo de adquisición de datos.

La parte de la aplicación en la cual para unas variables de entrada del modulo de adquisición dedatos se calculan o transforman las mismas para que puedan ser procesadas por el siguiente módulo,se le llama Modulo de gestión de datos .

La parte que es la que contiene el conjunto de rutinas que permiten el control la placa de adquisiciónde datos ,se le llama Modulo de salida de datos.

1.8.0 ESTRUCTURA DEL PROGRAMA

En base a su funcionalidad a continuación se pasa a describir la estructura de los programas :

Modulo principal del programa

Dentro de este modulo se incluye :

UNIT1.PAS: Gestiona los datos del menú top-down es el programa principal i tiene la función de lallamada de todas las demás aplicaciones.

Modulo de adquisición de datos:

Engloba los programas que gestionan los formularios de entrada y salida de datos aparte delprincipal:

Su objetivo principal de recoger la información proporcionada por el usuario acondicionarla yasignarla a las variables que correspondan para que posteriormente sea procesada por elModulo de gestión de datos.

También tienen el objetivo de trabajar a la inversa es decir cuando el código lo requiera son losencargados de realizar el procesado de la información con el fin de que sea visible por pantalla o poralguna salida estándar del PC.

Modulo de Principal del programa

ModuloAdquisiciónde datos

Modulo Gestión de datos

ModuloSalidade datos

Page 14: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

14

Dentro de este modulo podemos incluir :

CONTRAM.PAS : Permite el control de la amplitud de la señal a generar ,tensión de offset,inversión etc.;

SPFORM.PAS : Permite seleccionar variables necesarias para el calculo de la función, como porejemplo el numero de muestras que quiere el usuario por periodo.

SELONDA.PAS : Gestión de la forma de onda

FORMSTAR.PAS : Gestiona la configuración de la tarjeta PCL-812

INSERTADAT.PAS: Formulario para la inserción de datos de la función por puntosModulo de gestión de datos:

Son llamados el programa principal para que ejecuten la operaciones necesarias de calculo ygestión , en base a las variables que el modulo de adquisición de datos les pasa .

Dentro de este modulo podemos incluir:

MISCALCULOS.PAS :Se definen las funciones de procesado y calculo matemático del programa.

MISCALCULOS2.PAS :Este modulo es el encargado de procesar la funciones de calculomatemático cuyas variables de entrada dependan de miscalculos.pas

GLOBAL.PAS: Es donde se declaran las variables de tipo global y las constantes .

Modulo de salida:

Este modulo tiene la finalidad de configurar i permitir el acceso a la placa de control es llamadosolo desde el modulo principal del programa.

FUNGESPCL.PAS :Gestiona las librerías y la variables necesarias para que las variables calculadaspor el núcleo se transfieran de forma correcta a la placa.

DRIVER..PAS :Es donde se declaran las funciones y variables desarrolladas en el dllcorrespondiente para permitir el acceso a las funciones de programación de la placa .Este programalo proporciona el fabricante.

GETEVENT.PAS: Este modulo gestiona la recepción y atención de los eventos de la tarjeta .

Page 15: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

15

1.8.1.- DESCRIPCIÓN DE USO DEL PROGRAMA.

En principio al arrancar el programa se nos presenta en pantalla un menú desplegable junto con unaserie de ventanas de visualización de datos.

El menú esta compuesto por cinco apartados ,los cuales se irán desplegando a medida que hagamosclic sobre ellos con el ratón. Algunos de estos apartados están inhabilitados. Se activaranposteriormente

Clasificacion general del Programa

Contram.pasFrecform.pasSelonda.pasEspform.pasgesbas.pasInserdat.pas

Modulo introduccion datosGestiona en interfaz usuariomaquina

global.pasMiscalculos.pasMiscalculos2.pasGetevent.pas

Modulo gestion datosGestiona los procesos de

calculo interno del program

Fungespcl.pasDriver.pas

Modulo de SalidaGestiona el interfaz del PC

con la tarjeta de salida

Programa principalGestión de los módulos

Unit1.pas

Page 16: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

16

Automáticamente tan solo arrancar el programa se nos presenta en pantalla un cuadro de dialogo quenos permite seleccionar diferentes opciones por medio de listas :

En caso de tener diferentes tarjetas instaladas en nuestro PC nos permite seleccionar una de ella .

Haciendo clic sobre un elemento de la lista seleccionar placa ,decidimos que tarjeta va a estaractiva.

Una vez seleccionada la tarjeta pcl-812 deseada se nos van activando otras listas que nos permitenseleccionar otras variables de configuración

También podemos seleccionar el voltaje de referencia y decidir si será externa o interna.

También podemos seleccionar el contador.

Page 17: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

17

Page 18: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

18

Una vez se a cumplimentado el formulario pulsamos el botón de Continuar i entramos en el menúprincipal del programa.

Si pulsamos Salir entonces la tarjeta no se inicializara y consecuentemente cualquier acción querealicemos en el menú no tendrá ningún efecto sobre la tarjeta pcl-812

Una vez seleccionada la tarjeta, debemos indicar una serie de variables mediante el menú opciones,dichas variables son necesarias a priori para el correcto funcionamiento del generador de funciones.

El primer cuadro de edición sirve para decidir el numero de muestras que deseamos por periodo ,enotras palabras en cuantas partes queremos trocear el periodo.

Una vez aceptado el proceso de especificación inicial ,se habilitan los menús que faltaban con locual podemos proceder a definir la clase de función que

deseamos.

Page 19: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

19

En el cuadro de dialogo que se genera al pulsar el menú frecuencia podemos especificar el valorque deseamos de frecuencia el rango de frecuencias de la misma y sus unidades bien hertzios o bienen segundos

Page 20: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

20

Si pulsamos aceptar dichos datos se cargaran a las variables correspondientes en caso de pulsarcancelar no se cargar ningún valor i las variables mantendrán los valores previos a la ejecución delcuadro de dialogo.

Una vez seleccionado del menu el valor Amplitud se nos genera el siguiente cuadro de dialogo.

Page 21: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

21

En el cual podemos seleccionar los valores referentes a la gestión amplitud de la señal ;Valores depico a pico, voltaje de offset, Factor de ganancia y unidades .

Todo lo anterior lo realiza el cuadro de dialogo de control de la amplitud. Una vez seleccionados losvalores deseados ,podemos pulsar aceptar si queremos actualizar nuestras opciones.

Page 22: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

22

Una vez seleccionados los valores de amplitud y de frecuencia procedemos a seleccionar la clase deseñal que deseamos generar, esto se consigue mediante la selección del menú Tipo de Señal.

El cuadro de dialogo que se nos presenta en este caso es un conjunto de puntos de selección solodebemos seleccionar el que queramos i pulsar aceptar , podemos solicitar que el programa haga unajuste automático de la señal .

Con esto el programa asigna lo valores necesarios al factor multiplicador de la señal y al offset conel fin de que la señal tenga como eje central de referencia a GND.

La opción de Función por puntos nos permite definir un escalado propio en nuestra función Unavez hemos seleccionado los valores que deseamos en los anteriores formularios, podemos crear unatabla de valores de salida propios.

Estos se hace pegando dicha lista desde el escritorio o bien introduciéndola o modificando nosotrosmismo los valores de la lista previamente introducida .El formato es del tipo TXT.

Page 23: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

23

Una vez hemos decidido los parámetros que conforman nuestra función podemos a calcular losvalores de los puntos en los que hemos escalado un periodo de la señal y llevar una copia de losmismos al portapapeles de Windows par su posterior tratamiento con otro programa.

Page 24: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

24

Page 25: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

25

Para ello regresamos al menú opciones y seleccionamos copiar función.

El menú Ejecutar es el encargado de abrir y gestionar el canal de comunicación entre el PC y latarjeta de adquisición de datos con el fin de que los valores correctos de voltaje voltajes seencuentren en la entrada del acondicionador de señal en el intervalo de tiempo adecuado.

Este menús dispone de dos opciones:

Al seleccionar Lanzar lo que hacemos es calcular el periodo de la función especificada, abrir lascomunicaciones con el puerto de la tarjeta, configurar los registros y lanzar a intervalos de tiempodefinidos, al puerto de salida de la tarjeta, los valores previamente calculados.

Si seleccionamos cerrar lo que hacemos es parar la ejecución del programa de generación de la señaly cerrar el canal de comunicación con la tarjeta .

Page 26: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

26

El menú Archivo es el encargado de la gestión de archivos del programa y de cerrar la aplicacióneste tiene tres opciones:

La opción Salir cierra la ejecución del programa y libera.

Page 27: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

27

La opción Salvar Sesión guarda la variables de la configuración actual en una base de datos para suposterior recarga

Dicha opcion genera un formulario en el cual se puede navegar por la base de datos, guardarnuestros registros o bien eliminar registros

Page 28: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

28

.

La opción Abrir abre un formulario que esta relacionado con una base de datos en el cual podemosnavegar por la base de datos, eliminar registros de la base de datos a de mas de poder configurar lasesión de trabajo actual a una sesión previamente guardada en la base de datos.

Page 29: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

29

Memoria técnica

2.0.0 DISEÑO DEL HARDWARE

2.0.1 Acondicionador de la señal

El Acondicionador de señal se de divide en las siguientes partes:

Circuito del acondicionador de la salida general del generador de funciones

Circuito de alimentación general del circuito.

Circuito del Acondicionador de la salida general del generador de funciones:

La entrada de información en esta línea viene dada por por la salida analógica del convertidor D/A ,este no esta conectado directamente a la salida física sino que su salida esta conectada a unoperacional OP-27 por lo tanto en vista de las hojas de especificaciones del fabricante PMI ofreceuna resistencia típica de salida de 70 ohms.

Alimentando con una tensión de referencia constante se puede conseguir un margen de voltaje desalida entre 0 y la tensión de referencia Vref.

Interesa conseguir un margen de salida entre +Vref y -Vref que es el margen donde operan todas lasseñales creadas por el generador. por lo tanto deberá implementarse un acondicionador de señal queconvierta la función unipolar del generador en una bipolar.

El circuito de alimentación de la placa

Este circuito proporciona la tensión de alimentación de los circuitos adecuada para que los elementossobre los que opera tengan un suministro estable

2.0.2 Los circuitos de la placa PCL-812

La placa pcl dispone de una serie de integrados activos cuyo conocimiento permite el desarrollo delcircuito adecuado a nuestras necesidades.

Para la descripción de sus características consultar el manual del usuario que acompaña la placaPCL-812.

Page 30: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

30

2.1.0 .- Los circuitos a desarrollar

2.1.1 El regulador de tensión de referencia de la PCl-812

Todas las tensiones generadas por el convertidor son fracciones de la misma, si entre dos medidas seproduce una variación de la tensión de referencia como consecuencia del ruido o bien pordesviaciones del comportamiento o bien inestabilidad de la misma dicho comportamiento erróneo severá reflejado en todas las medidas posteriores que realiza el convertidor

Como bien puede observarse en la tabla de especificaciones del fabricante para cada código de bitsintroducido en AD7541 se genera un valor fraccionario de Vref

Según el fabricante del convertidor la resistencia de entrada para la tensión de referencia delconvertidor AD7541 oscila entre 7-18. K OHMS.

Considerando que queremos una tensión estable de -10Volts DC.

Iref=Vref/R17

Irmax=10/7k=1.4 mA

Irmin=10/18K=0.5 mA

Irtyp=10/11k=0.9 mA

Se sabe que el AD7541 AKN tiene una precisión de ½ LSB por lo tanto sin contar los errores que sepuedan añadir a esta señal la máxima aproximación que podemos podrá variar entre:

N=2^12=4096

LSB=10/4096=2.4 mV

LSB/2=1.2mV

Por lo tanto consideraremos que para cualquier medida tendremos una imprecisión de +1.2rn V,- 1.2mV. También podemos decir que tenemos un error de relativo del 0.024%.

.

Como referencia si utilizamos el generador interno de la placa PCL-812 dispondríamos de una señalde V

Vref:=10V ± 0.05

Page 31: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

31

100 Eab

Er= ----------------- = 0.5 %v

Real Valor

Por lo tanto se pide al regulador que cumpla los siguientes requisitos:

Debe de generar una salida de 0 a - 10V

Error menor o igual que el del generador interno de la placa

Debe de ser capaz de suministrar una intensidad suficiente para que sin esfuerzo alimente alconvertidor.

Debe disponer de una buena estabilidad

Buena línea de regulación

Bajo ruido

Baja deriva

Conclusión:

Después de analizarlas características del AD7541 de la placa. El error del mismo es del0.024% .Valor considerablemente inferior al que ofrece la Vref de la tarjeta se ha optadopor utilizar el segundo canal de salida del convertidor D/A AD7541 como generador deVref(Voltaje de referencia) del circuito.

2.1.2 El acondicionador de señal de la salida general.

Cuando se alimenta el convertidor con un voltaje positivo de 10 volts obtenemos una salidamonopolar de 0 -10 Volts y a la inversa.

El objetivo de esta circuiteria es la de transformación de la salida del convertidor D/A general que esmonopolar en una salida bipolar

También debe de dotar al convertidor de la capacidad de alimentar cargas externas y de protegerlocontra sobreintensidades.

Los circuitos a desarrollar deben de realizar la siguiente función

Vo= V r e f - 2 * Vi

2.1.3 La etapa de entrada de señal

Esta etapa es la que se conecta con los puertos de salida de los convertidores D/A de latarjeta PCL812 con lo cual interesa que ofrezca una alta impedancia a la señal .

Para ello se compone de dos amplificadores operacionales op-27 trabajando en modoseguidor señal .

Page 32: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

32

2.1.4 El amplificador inversor

Se desarrolla un amplificador de señal de ganancia dos inversor cuya entrada va conectada a lasalida de un amplificador seguidor de fuente cuya salida va conectada a una de las entradas delamplificador sumador.

En baja frecuencia la principal fuente de error corresponde a los efectos de las corrientes y tensionesde offset

Por lo tanto cuanto mayor se reduzcan en las primeras etapas y si es posible antes de la amplificaciónde señal tanto mejor.

La formula que rige el circuito es:

Vo =- (R2/R1)*Vi

Con lo cual:

Si Vo=2Vi => -(R2/R1)*Vi=2*Vi=> -R2/R1=2

Si fijamos R2=20Kh => R1=10Kh

Page 33: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

33

2.1.5 El sumador

La formula que define el siguiente circuito es:

Vo= -((Rf/R1*V1).....+(Rf/Ri)*Vi)

Con lo cual para dos entradas una para la tensión de referencia y la otra para el valor de tensióngenerado por el D/A tenemos que:

Se quiere la siguiente funcion

Page 34: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

34

Vo=-(R7/R11*Vref+(R7/R8)*V2)

Como que

V2=-2*Vi

Vo=-((R7/R11)*Vref-2*(R7/R8)*Vi))

Con lo cual queremos que se cumpla:

R7/R11=1

R7/R8=1

Si fijamos R7=20Kh

R11=20 Kohms

R8=20 Kohms

Page 35: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

35

2.1.6 El Buffer

Se debe de dotar al amplificador de un buffer con el fin de pueda alimentar las cargas.

Sabernos que la corriente típica para un op es de 10 mA queremos que la corriente máxima decortocircuito en la carga sea de 200 mA.

El buffer se compondrá de un amplificador seguidor que contendrá una etapa transitorizada cuyoobjetivo es dotar a la señal de la potencia suficiente para que ejecute correctamente su tarea.

El buffer se calculara en base a un op-27 que nos da un bajo nivel de ruido.

Para la salida del buffer se ha pensado en una salida push-pull.

Calculo de los transistores

Datos

La salida típica del AI es de 10 mA

Deseamos limitar la corriente máxima de salida de la etapa a 200mA

La salida de la resistencia del op-27 es de 70 ohms,

Nuestra resistencia de salida RI=51 obms

Ecuaciones

ß=(Isc/Io)=200mA/10mA=20

Pdce=(Vce*Ic)=((Vcc-Vo)*Ic

Ic=Vo/Rl

Pcemax=(12-10)*10/50=0.4w

Por lo tanto debemos de encontrar unos transistores que cumplan lo siguiente

ß>20

Imax> 200mA

Pd> 0.4W

Se a optado por elegir los transistores BC547 y BC557 por ajustarse a nuestros requerimientos.

Page 36: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

36

Destacaremos la necesidad de introducir una serie de condensadores de desacoplo

100 nf entre +Vcc y masa cerámico

100 nf entre -Vcc y masa cerámico

47 uF en las entradas de alimentación de la placa y masa elctrolítico o de tantalio

2.1.7 La fuente de alimentación

El circuito que debe alimentar la fuente de alimentación tiene que ser capaz de suministrar unacorriente de 200mA con una carga de 50 ohmios lo que supone un consumo en cortocircuito de

P=R*I^2=50*(200*10E-3)^2=2W

La alimentación de los circuitos operacionales requiere un voltaje aproximado de ±12 V con lo cual lafuente de alimentación debe de ser capaz de suministrar un voltaje de ±12 V a su salida y unacorriente superior a 200mA si se considera que que a este valor se le debe de añadir el consumo dellos circuitos de la placa.

Se desea que la fuente sea capaz de suministrar dichos valores sin ningun problema con lo cual siconsideramos 200ma como 20% del total de lo que la fuente esta esta diseñada para soportarobtenemos que a fuente que deseamos de tener las siguientes características

Fuente capaz de suministrar un voltaje ±12V en continua con un factor de rizado del 5% a.

Capacidad para suministrar 1A de corriente en continua a la carga.

Un regulador de voltaje que cumple este requisito es el 7812 para +12 V y el

7912 para –12V

En el proceso de rectificación de la señal hay unas perdidas de voltaje en los diodos y en el reguladorprincipalmente que aproximadamente suman 3V

Page 37: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

37

Con lo cual el transformador elegido es un transformador con derivación central de

(220:30V ,1 A en el secundario)

La tensión eficaz en los extremos de transformador es de 30 V con lo que

Vmaxp=sqrt(2)*Vef=1.4142*30=42.43V

Los diodos del Puente rectificador deben soportar un voltaje inverso minimo de de como minimo43V i una corriente directa de 500mA de cortocircuito.

El voltaje en continua de salida es de

Vdc=(2/Pi)*Vamxp=27 V Voltaje en el puente rectificador.

Vdc’=Vdc/2=27/2=13.2 Voltaje a la entrada del regulador

Pd=Idc*Vdc=500ma*27=13.5W;Potencia disipada por elp.Rectificador

Como diodos rectificadores se ha optado por el 1N4007.

Se disponen de dos condensadores electroliticos de 2500 micF que se usa como filtro previoa la entrada del regulador.

Vriz=Icc/fC=1/(100*2500E-6)=4V

Al entrada del regulador tenemo 13.2 con un rizado de 4V .

El regulador estabiliza esta señal a un valor de 12V

Page 38: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

38

Diseño del Software

3.0.0 Introducción

La representación gráfica de los algoritmos de las funciones o módulos que contienen este proyecto,se representan mediante diagramas siguiendo el código de representación ANSI .

3.1.0 Generalidades del programa

Los algoritmos que empleamos para la generación de la señal se basan en enviar la información conla tensión requerida a la tarjeta del generador de funciones de forma continua y uniforme.

Para conseguir la comunicación con la tarjeta de realiza mediante un driver proporcionado por elfabricante gestionado mediante una dll.

Esta librería del driver nos permite controlar los protocolos de comunicación de nuestro programacon la placa.

Con las limitaciones que impone el Sistema operativo Windows.

En líneas generales la manera en que opera el programa es la siguiente :

-Arrancamos el programa-Activamos el canal de comunicación con la placa-Seleccionamos y calculamos un periodo de la función-Lanzamos la aplicación a la placa.

3.2.0 Fundamentos teóricos del programa

Toda señal que nosotros recibimos o generamos pasa por un proceso de discretizacónEs decir una vez hemos seleccionado una serie de variables mediante el software de adquisición dedatos; Procesamos dichos datos con el fin de adquirir una serie de variables numéricas que seránpasadas a la placa a intervalos de tiempo regulares.Dichas variables son convertidas en valores de tensión mediante el hardware de la placa.

El proceso de adquisición de datos es similar, a intervalos de tiempo regulares se pretende leer unosvalores de tensión disponibles a la entrada de la tarjeta los cuales son convertidos en variablesnuméricas y posteriormente procesados.

Page 39: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

39

Para controlar el proceso de una forma regular y precisa debemos implementar el software esnecesario conseguir controlar el contador de la placa el cual actúa como timer de gestión en elproceso de conversión.

La temporización necesaria para enviar el dato calculado de tensión a la tarjeta del generador defunciones se puede implementar por medio del temporizador interno del que disponen todos los pc el8253.Este elemento programable dispone de tres registros de 16 bits que se decrementan en cadaciclo de reloj que reciben ,activando su salida correspondiente cada vez que pasan por cero. Estosregistros pueden ser manipulados por software para trabajar de distintas formas través de los puertose/s .La dll driver nos permite escribir información en los puertos E/S.Por ejemplo como que la frecuencia de entrada es de 2 Mhz ,lo cual supone que los registros sedecrementan cada 500 ns. El timer 0 será reprogramado por nosotros, de forma conveniente paragenerar intervalos de tiempo lo suficientemente precisos.Todos los valores siguientes se calculan en base al timer interno de la placa ,no obstante nuestroprograma acepta la posibilidad de relojes externos cosa que obliga a que tengamos la posibilidad demodificar el tiempo de reloj para programar el valor que queremos que tenga el timer.Llamaremos Intervalo al valor expresado en seg que queremos que el contador este contando. N es el numero entero que debemos cargar al contador 0 para que a intervalos de reloj vayadecrementando dicho valor.Cuando el contador llega a cero introducimos un semáforo de final de cuenta para que ejecute laacción correspondiente.

Intervalo=N*(valor del reloj en seg)

Periodo de la funcion=Puntos*Intervalo=Puntos*N*(valor del reloj en seg)

N= Periodo de la función/(Puntos*Valor del reloj en seg.)

Luego

N=(Puntos*frequencia*(valor del reloj en seg.)) ^(-1)

Siendo puntos el numero de muestras que deseamos por periodo.

Para el calculo del valor a enviar al convertidor D/A a partir de la tensión necesaria considerando –10<v<+10

Valor DAC=((Rango DAC)/(Rango Salida))*(v+Vo max)

Valor DAC=4096*(v+10)/20

Page 40: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

40

3.3.0 Estructura del programa

3.3.1 Diagrama de flujo de llamadas de los módulos

Unit 1

Control dellamadasa funciones

formulariodel menúprincipal

FormularioCones.pas

FormularioContram.pas

FormularioDigcontrol.pas

FormularioEspform.pas

FormularioSelonda.pas

Control I/Odel

generador

Control amplitud de laseñal general generador

Control de señal digitalDel generador

Seleccióndel tipo defunción

Espcificacionesespara el muestreodel a señal

FormularioFrecform.pas

Control frecuencia de la señalgeneral del generador

Memodat.pas

Visualizar iexportarresultadosdel calculodel periodo

Miscalculos2.pasCálculosmatemáticosindirectos

Miscalculos.pasCálculosmatemáticosdirectos

Gestión delasfunciones dela libreríaDriver

Fungespcl.pcl Diver.pas

Gestión PCl812

Page 41: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

41

3.3.2 Diagramas de flujo de los módulos

El modulo de arranque del programa formstar.pasEste modulo merece un trato especial debido que a pesar de ser un modulo del tipo form en el que solodebieran de existir rutinas de entrada y salida de variables para un posterior posproceso .Al ser el modulo de configuración del la placa .Se incluyen rutinas de comunicación directa con la pclque corresponderían al modulo de salida.

Page 42: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

42

Page 43: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

43

Page 44: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

44

Page 45: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

45

Page 46: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

46

Page 47: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

47

El modulo gestor de frecuencia

Modulo Frecform.pas

Función

Dicho modulo se encargará de gestionar la entrada de información acerca del control de frecuenciageneral del programa.Interfaz de usuario.

procedure BNOVALEClick(Sender: TObject);

Oculta el formulario de gestión de frecuencia y muestra el formulario del menú principal.

procedure SelFrecuenCyKeyPress(Sender: TObject; var Key: Char);

Este procedimiento se activa al pulsar cualquier tecla dentro del campo edit, dispone de unavariable entera Key, que es evaluada y después asigna el valor en curso a un texto de otro formulario y auna variable global para su posterior proceso

Page 48: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

48

procedure DutyCicleKeyPress(Sender: TObject; var Key: Char);

Procedimiento que asigna el valor textual de una campo edita una variable .Pero Previamente se evalúa que todos los datos son numero enteros.

procedure ScrollBar2Change(Sender: TObject);

Procedimiento que asigna el valor textual de una campo edita una variable .Pero Previamente se evalúa que todos los datos son numero enteros

procedure ScrollBar1Change(Sender: TObject);

Procedimiento asignado al mover la barra scroll dependiente del valor del campo de edición de lafrecuenciaConvierte el valor numérico de la poción de la barra en un valor de texto y loa asigna al caption del editdel editor de frecuencias

Page 49: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

49

procedure RadioGroup2Click(Sender: TObject);

En función del índice seleccionado podemos definir si trabajamos con frecuencias o con periodos

procedure BValeClick(Sender: TObject);

Esta función calcula la frecuencia i la asigna a la variable frecsenal

Modulo contram.pas

FunciónDicho modulo se encargará de gestionar la entrada de información acerca del control de amplitudgeneral del programa.Interfaz de usuario.

Page 50: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

50

procedure BCanAmplClick(Sender: TObject);

Oculta el formulario .

procedure TRetardsigKeyPress(Sender: TObject; var Key: Char);

Para cada tecla pulsada evalúa si esta comprendida entre los caracteres 0-9

procedure TAmpsignKeyPress(Sender: TObject; var Key: Char);

Para cada tecla pulsada evalúa si esta comprendida entre los caracteres0-9

procedure EVoffsetKeyPress(Sender: TObject; var Key: Char);

Al pulsar cualquier tecla evalúa si esta o no entre el 0-9

procedure MargamplClick(Sender: TObject);

Asigna un valor determinado a la variable multiplicador en función de la selección en un itemindex

Procedure RetardSigClick(Sender: TObject);

Asigna un valor determinado a la variable multiplicador en función de la selección en un itemindex

Page 51: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

51

procedure MargOffsetClick(Sender: TObject);

Asigna un valor determinado a la variable multiplicador en función de la selección en un itemindex

procedure BAccAmplClick(Sender: TObject);Calcula el valor de la tensión de offset, amplitud, Retardo de la señal

procedure CInversionClick(Sender: TObject);

Asigna un determinado estado a una variable boolean según este o no seleccionada la casilla

Page 52: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

52

Modulo Selonda.pas

FunciónDicho modulo se encargará de gestionar la entrada de información acerca de la selección de la señalgeneral del programa.Interfaz de usuario.

Page 53: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

53

procedure BCancSenalClick(Sender: TObject);

Oculta el formulario

procedure SeleccionsenalClick(Sender: TObject);

Se encarga de asignar un valor numérico a la variable Selecciona función i de exportar un string dedialogo en función de un índice de selección

procedure BAccepSenalClick(Sender: TObject);

Crea una llamada al cuadro de dialogo de inserción de datos punto por punto en caso de haberseleccionado la inserción punto por punto.Oculta el formulario.

Page 54: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

54

Modulo Espform.pas

FunciónDicho modulo se encargará de gestionar la entrada de información acerca del control de muestreo delprograma.Interfaz de usuario.

procedure BCancEspClick(Sender: TObject);

Oculta el formulario

procedure Edit1KeyPress(Sender: TObject; var Key: Char);

Al pulsar cualquier tecla evalúa si esta o no entre el 0-9

procedure Edit2KeyPress(Sender: TObject; var Key: Char);

Al pulsar cualquier tecla evalúa si esta o no entre el 0-9

procedure Edit3KeyPress(Sender: TObject; var Key: Char);

Al pulsar cualquier tecla evalúa si esta o no entre el 0-9

procedure DefineNumMuestrasKeyPress(Sender: TObject; var Key: Char);

Al pulsar cualquier tecla evalúa si esta o no entre el 0-9

procedure BAcepEspClick(Sender: TObject);

Evalúa si el numero de muestras selecciona es par en caso negativo añade una muestra mas a la cantidadintroducida Asigna el valor cantidad muestra a una variable global y activa el menú generador y herramienta en elmenú principal

Page 55: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

55

Page 56: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

56

Modulo Cones.pas

FunciónDicho modulo se encarga de gestionar la entrada de información acerca del control de entradas i salidasdel programa en base a unas variables de chequeo nos permite seleccionar un canal u otro para la salidaanalógica.Interfaz de usuario.

Page 57: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

57

Modulo Memodat.pas

FunciónDicho modulo se encarga de gestionar la salida de información acerca de los resultados de cálculosrealizados por el programa.

Interfaz de usuario.

procedure SalememoClick(Sender: TObject);

Oculta el formulario

procedure BCopyClick(Sender: TObject);

Esta función introduce los datos de un dialogo memo al clipboard de Windows.

Modulo Miscalculos.pas

Función de moduloDicho programa se encarga de gestionar funciones de cálculos directos en el programaInterfaz de Núcleo.

Function ComparaPeriodos(PeriodoReloj:Single;PeriodoMuestreo:Single):Boolean;

Esta función asigna un valor verdadero o falso a una variable dependiendo de si el intervalo entremuestras es mayor o menor que una variable denominada Periodo reloj.

function Valorescala (VALORNUMAX: SINGLE;VALORNUMAX2: SINGLE;VALORINTERMEDIO:REAL):REAL ;

Dado un valor lo escala entre dos valores, un máximo y otro mínimo

function InvierteValor(Var Resultx:Real;Var Inv:BOOLEAN):real;

Esta función saca el resultx o –resultx dependiendo de si inv es verdadero falso

Page 58: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

58

Function DecidemaxCantidad(Var CantidadSeleccionada,Cantidadmaxima:Integer):Integer;

Esta función si Cantidad Seleccionada>CantidadMaxima sacara un mensaje de error y asigna a Cantidadel valor de CantidadMaxima.

ProcedureDecideMaximaFrequencia(VarPeriodoMinFuncion:Real;NumeroMuestras:Integer;PeriodoLectura:Real);

Asigna a la variable Periodo función el valor del producto de Periodo Lectura y numero de muestrasmultiplicado por 10

Procedure ejecutadelaytime(Muestreo:Real;Valorretardo:Real;Var Tablavalores:Array ofReal;CantidadMuestra:integer);

Esta función en base a un numero traslada una cierta cantidad de valores del inicio de al tabla hacia elfinal de la misma

Procedure CalculaNumerocuentas(Ts:Real;Var K1:LongInt);

Convierte un valor muestreado en un valor entero y listo para ser utilizado por el contador

function InvierteValor(Var Resultx:Real;Var Inv:BOOLEAN):real;

Esta función invierte el signo de un valor determinado en función de una variable de selección de cambiode signo Procedure TipoSemiperiodo(N:Integer;K:Integer;Var P1:Boolean);

Evita que en valores próximos a cero la función de división por cero}

Page 59: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

59

Procedure CalculaDuty(K:Integer;Dc:Integer;Count:Integer;Var P1:Boolean);

Calcula el valor del duty-cicle de la función

Procedure CalculaFrec1(Frecuencia:Integer;Multiplicador:Single;var Resultx:Real);

Esta función dado un entero llamado frecuencia y un valor real llamado multiplicador realiza su productodentro de otra variable

Page 60: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

60

procedure FuncCuadr(Ampl:Real;P1:Boolean;Var Resultx:Real);

Calcula el valor de la función cuadrada en un punto dependiendo de la variable p

Page 61: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

61

Procedure FuncSen(Ts:Real;Ampl:Real;Tc:Real;n:Integer;k:Integer;Det:Boolean;Var Resultx:Real);

Calcula el valor de la amplitud de la función Seno en base a un periodo

Page 62: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

62

Procedure FunCos(Ts:Real;Ampl:Real;Tc:Real;n:Integer;Var Resultx:Real);

Calcula el valor de la amplitud de la función Coseno en base a un periodo

Page 63: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

63

Procedure funSierra(Ampl:Real;Tc:Real;Ts:Real;N:Integer;P:Boolean;K:Integer;Det:Boolean;VarResultx:Real;Var Acumulado:Real);

Calcula la función diente de sierra para cada valor

Page 64: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

64

Procedure Funtriang(Ampl:Real;Tc:Real;Ts:Real;N:Integer;P:Boolean;K:Integer;Det:Boolean;VarResultx:Real;Var Acumulado:Real);

Calcula la función triangular en cada punto;

Page 65: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

65

Procedure DetectaSemiperiodo(N:Integer;K:Integer;Var P1:Boolean);

Dicha función detecta valor próximo a cero en funciones en que el paso por cero es un valor critico parael ordenador

Procedure FunMuestreaPer(K:Integer;Tc:Real;Var Ts:Real);

Calcula el periodo de muestreo en función del numero de muestras y el periodo total de la función

Procedure CalculaHex(Vref:Integer;Vo:Single;Var Resultx:String);

Función que convierte un valor entero en hexadecimal

Procedure FunMuestreaFrec(K:Integer;Fc:Real;Var Fs:Real);Calcula frecuencia de muestreo en función del numero de muestras y la frecuencia total de la función pormedio de una relación

FUNCTION DeterminaOffset(Vnormal:Real;Voffset :Real):REAL;A un valor determinado del periodo le añade un valor de offset

Page 66: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

66

Modulo Miscalculos2.pas

FuncionDicho programa se encarga de gestionar funciones de cálculos indirectos en el programaInterfaz de Núcleo.Procedurecalculaperiodo(K:Integer;Ampl:Real;Offset:Real;Acum:real;InVer:Boolean;Dc:Integer;Resul:Real;VarPeriodo:Real;VAR PerMuestra:Real; Selec:Integer;Var Calculavalores: Array of Real{;Var ValorHEX: Array of String;};VAR P:BOOLEAN);

Función que gestiona i selecciona el calculo de un periodo completo de la función

Page 67: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

67

Modulo Fungespcl.pas

FunciónDicho programa se encarga de gestionar el control de las funcione de la librería driver del programaInterfaz de Salida.

Function CalculaNumerotimer1(TMuestra:Real;Muestraperiod:integer):LongInt;

Función cuya misión es calcular en base a una frecuencia de mues- treo y en base a un intervalo de tiempo debemos obtener un numero lque sirve como referencia de valor al contador de la placa Tenemos un tiempo de reloj ,tenemos un intervalo de muestreo por lo tanto

Resultado:=(abs(TMUestra/muestraperiod));

Page 68: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

68

Procedure EjecutaValorcuenta(TablaValores:Array of Real;Muestra:Integer; VArNumerocuenta:Integer);

Esta función gestiona la secuencia de rutina para sacar un valor de tensión de la tabla de valores por uncanal seleccionado de una forma secuencial.

Page 69: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

69

Procedure DecideEstadoCuenta( ValorContador:longInt; ValorIntervalo:Longint; var

SacarValor:Boolean);Esta función sacara un valor true si la diferencia enter el contador y el final de la cuenta es menor que elerror establecido En caso contrario el valor es falso.

Function CalculaNumeroReloj(Treloj:Single;TMuestra:Real):LongInt;

Función cuya misión es calcular en base a una frecuencia de mues- treo y en base a un intervalo de tiempo debemos obtener un numero longint que sirve como referencia de valor al contador de la placa tenemos un tiempo de reloj ,tenemos un intervalo de muestreo por lo tanto Tmuestra:=K*Treloj y Tmuestra siempre> Treloj k debe ser long int

Resultado:=abs(TMUestra/TRELOJ)

Page 70: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

70

Modulo unit1.pas

FunciónPrograma que gestiona el menú i las llamada a las diferentes funciones del programa.Interfaz de Usuario.

procedure Salir1Click(Sender: TObject);

Cierra el programa y la comunicación con la placa

procedure ClaseSenalClick(Sender: TObject);

Muestra el formulario de selección de la señal

procedure Especificaciones1Click(Sender: TObject);

Muestra el formulario de Espicificaciones del muestreo de la señal

procedure Amplitud1Click(Sender: TObject);

Muestra el formulario de control de amplitud de la señal

procedure Salvacalculo1Click(Sender: TObject);

Salva los datos de la sesión de trabajo en un fichero de texto

Page 71: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

71

procedure FormCreate(Sender: TObject);

Muestra el cuadro de dialogo del menú principal

procedure Lanzar1Click(Sender: TObject);

Calcula el periodo i llama a las funciones necesaria para que la aplicación se ejecute en la placa pcl .

Page 72: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

72

Page 73: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

73

procedure Reset1Click(Sender: TObject); Cierra el contador.Cierra la comunicación con la placa pero el programa permanece activo

procedure General1Click(Sender: TObject);

Muestra el formulario de gestión de la frecuencia principal

Page 74: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

74

Modulo Getevent.pas

Dicho modulo gestiona el thread de atención de servicio de los eventos.

procedure Execute;

En esta función es donde se ejecutan las rutinas del thread.

Preparamos las estructuras para el chequeo del estado de la placa

Inicio Execute

Inicializamos los registros que controlan los eventos de checqueo de la entrada analogica

Calculamos el tiempo de duracion del chequeo

Mientras el evento sea ser ciclico 1. Obtener el elemento del evento

Evento interrupcion=

true

Si

No

Llamar a ejcutavalorcuenta()

Fin

Page 75: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

75

3.3.4-Diagrama de flujo funcional del programa

F o r m u l a r i o M e n ú d e I n i c i o

C .D

I n i c i a l i z a c i ó n P C l-8 1 2

M e n ú P i n c i p a l

A r c h i v o O p c i o n e s F u n c i o n e s ( I n h a b i l i t a d o)

G e n e r a d o r ( I n h a b i l i t a d o)

A y u d a

Sa l i r S a l v a r A b r i r

C . D i a l o g . A b r i r F i c h e r o

C . D i a l o g o S a l v a r F i c h e r o

C . D i a l o g o E s p e c i f i c a c i o n es H a b i l i t a r G e n e r a d o r

G e n e r a d o r ( h a b i l i t a d o )

C o n t r o l S a l i d a G e n e r a l

C .D F r e c u e n c i a s

C .D A m p l i tud

C .D T i p o F u n c i ó n

A c t i v a r F u n c i o n e s

F u n c i o n e s ( H a b i l i t a d o )

L a n z a r C e r r a r

C a l cu l a r u n p e r i o d o

L a n z a r d a t o s

D e t e n e r L a n z a r D a t o s

L i b e r a r R e c u r s o s

Page 76: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

76

PLIEGO DE CONDICIONES

4.0.0 -CONDICIONES GENERALES

Introducción

El presente Pliego de condiciones tiene por objeto definir al fabricante del producto el alcance deltrabajo y la ejecución cualitativa del mismo

El trabajo consistirá en el desarrollo para su posterior fabricación de un equipamientoelectronico-informatico cuya misión es la de actuar como generador de funciones muy bajafrecuencia.

El alcance del trabajo del fabricante incluye el diseño , preparación de todos los planos, diagramasespecificaciones , listas de material y requisitos adicionales para la correcta fabricación delgenerador diseñado.

Reglamentos y normas

Todas las unidades de desarrollo del producto se ejecutaran cumpliendo las prescripcionesindicadas en los reglamentos y normas técnicas de obligado cumplimiento en proyectosinformáticos y electrónicos.

Equipos y componentes

Todos los componentes empleados serán de primera calidad.

Cumplirán las especificaciones y tendrán las características indicadas en el proyecto y en las normastécnica generales.

En caso de existir contradicción u omisión en los documentos del proyecto, el fabricante tendrá laobligación de ponerlo de manifiesto al Director Técnico del producto quien decidirá sobre elparticular.

Ejecución del proyecto

El fabricante dará comienzo al desarrollo del producto en el plazo que figure en el contratoo en su defecto a los quince días de la firma del contrato.

Page 77: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

77

El fabricante esta obligado a notificar por escrito o personalmente en forma directa al al Directortécnico del proyecto la fecha de inicio de la fase de desarrollo del proyecto.

Interpretación y desarrollo del proyecto

La interpretación técnica de los documentos del proyecto corresponden al Director técnico delproducto .El fabricante está obligado a someter a éste cualquier duda, aclaración contradicción quesurja durante el proceso de desarrollo del mismo.El fabricante se hace responsable de cualquier error de ejecución durante el desarrollo delProducto motivado por la omisión de esta obligación y consecuentemente deberá rehacer y costearlos trabajos correctivos pertinentes

Acciones complementarias

El fabricante tiene la obligación de realizar todas las acciones que sean indispensables para ejecutarcualquiera de la partes producto especificadas en el proyecto ,aunque en el no figuren explícitamentemencionadas dichas acciones complementarias. Todo ello sin variación del importe contratado.

Modificaciones

El fabricante está obligado durante la fase de desarrollo a realizar las acciones que se leencarguen resultantes de modificaciones del proyecto, tanto en aumento como en disminución osimplemente variación ,siempre y cuando el importe de las mismas no alteren mas o menos de un25% el valor contratado

La valoración de las mismas se hará de acuerdo ,con los valores establecidos en el presupuestoentregado por el fabricante y que a sido tomado como base del contrato.El Director técnico de producto esta facultado para introducir las modificaciones de acuerdo con sucriterio ,en cualquier unidad de producto, durante el desarrollo del mismo, siempre que cumplan lascondiciones técnicas referidas en el proyecto y de modo que ello no varíe el importe total de la obra.

Producto defectuoso

Cuando el fabricante halle cualquier unidad del producto que no se ajuste a lo especificado en elproyecto o en este pliego de condiciones ,el Director técnico del producto podrá aceptarlo orechazarlo ;en el primer caso ,este fijará el precio que crea justo con arreglo a las diferencias quehubiera, estando obligado el fabricante a aceptar dicha valoración, en el otro caso se reparara aexpensas del contratista la parte mal ejecutada sin que ello sea motivo de reclamación económica ode ampliación del plazo de desarrollo.

Page 78: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

78

Medios Auxiliares

Es obligación del fabricante la conservación correcta de las unidades del producto hasta la fechala recepción definitiva por parte del propietario del producto y corren a su cargo los gastos derivadosde ello

Fianza

El contrato establecerá la fianza que el fabricante deberá depositar en garantía del cumplimiento delmismo, o se convendrá una retención sobre los pagos realizados a cuenta del partes del productodesarrollado.

De no estipularse la fianza en el contrato se entiende que se adopta como garantía una retención del5% sobre los pagos a cuenta citadosEn el caso de que el fabricante se negase a hacer por su cuenta los trabajos para ultimar el productoen las condiciones contratadas ,el propietario podrá ordenar ejecutar los trabajos a un tercero,abonando su importe con cargo a la retención o fianza, sin perjuicio de las acciones legales que tengaderecho el propietario si el importe de la fianza no fuese suficiente.La fianza retenida se abonara al fabricante en un plazo no superior a treinta días una vez firmada larecepción definitiva del producto.

4.1.0CONDICIONES ECONOMICAS

Abono del producto

En el contrato se deberá fijar detalladamente la forma y plazos que se abonaran las obras. Lasliquidaciones parciales que puedan establecerse tendrán carácter de documentos provisionales abuena cuenta ,sujetos a las certificaciones que resulten de la liquidación final. No suponiendo dichasliquidaciones ,aprobación ni recepción del producto que comprenden.Terminado el producto se procederá a la liquidación final que se efectuara de acuerdo con loscriterios establecidos en el contrato.

Precios

El fabricante presentará ,al formalizarse el contrato ,relación de los precios de las unidades deproducto que integran el proyecto, los cuales al ser aceptados tendrán valor contractual y se aplicarana las posibles variaciones que puedan haber.

Page 79: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

79

Estos precios unitarios ,se entiende que comprenden la ejecución total de la unidad del producto,incluyendo todos los trabajos aún los complementarios y los materiales así como la parteproporcional de imposición fiscal, las cargas laborales y otros gastos repercutieres.En el caso de tener que realizarse unidades de producto no previstas en el proyecto ,se fijará suprecio entre el Director técnico del producto y el fabricante antes de iniciar la obra y se presentaráal propietario para su aceptación o no.

Revisión de precios

En el contrato se establecerá si el fabricante tiene derecho a revisión de precios y la fórmula aaplicar para calcularla.En defecto de esta última ,se aplicará a juicio d3el Director técnico alguno de los criterios oficialesaceptados.

Penalizaciones

Por retraso en los plazos de entrega de las obras, se podrán establecer tablas de penalización cuyascuantías y demoras se fijaran en el contrato.

Contrato

El contrato se formalizará mediante documento privado. Comprenderá la adquisición de todos losmateriales, equipos, componentes accesorios, mano de obra y medios auxiliares para el desarrollodel producto proyectado en el plazo estipulado así como la reconstrucción de las unidadesdefectuosas, la realización de la acciones complementarias y las derivadas de las modificaciones quese introduzcan durante la ejecución de estas últimas en los términos previstos.

Responsabilidades

El fabricante es el responsable de la ejecución del producto en las condiciones establecidas en elproyecto y en el contrato. Como consecuencia de ello vendar obligado a la destrucción de loselementos mal ejecutados y a su posterior manufactura de forma correcta sin que sirva de excusa elque el Técnico haya examinado y reconocido las acciones sobre el producto.El fabricante es el único responsable de todas las contravenciones que el o su personal cometandurante la ejecución del producto u operaciones relacionadas con las mismas.También es responsable de los accidentes o daños que por errores o inexperiencia o empleo demétodos inadecuados se produzcan a la propiedad o a terceros en general.

El fabricante es el único responsable del incumplimiento de las disposiciones vigentes en la materialaboral respecto de su personal y por lo tanto accidentes que puedan sobrevenir y de los derechosque puedan derivarse de ellos.

Page 80: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

80

Rescisión del contrato

Se consideraran causas suficientes para la rescisión del contrato las siguientes:

• Muerte o incapacitación del fabricante.• Quiebra del fabricante.• Modificación del proyecto cuando se produzca alteración en mas o menos 25% del valor

contratado• Modificación de las unidades del producto en un numero superior al 40%• La no iniciación de las obras en el plazo estipulado cuando sea por causa ajenas al

propietario.• Suspensión del desarrollo del producto siempre y cuando dicha suspensión tenga un

plazo superior a dos meses• Incumplimiento de las condiciones del contrato cuando implique mala fe• Terminación del plazo de desarrollo del producto sin haberse completado este.• Actuación de mala fe en la ejecución del desarrollo del producto.• Subcontractación de parte del desarrollo del producto por parte del fabricante a terceros

sin la autorización del director técnico.

4.2.0-CONDICIONES FACULTATIVAS

Normas a seguir

El diseño del producto estará de acuerdo con las exigencias o recomendaciones expuesta en la ultimaedición de los siguientes códigos:

• Reglamento electromecánico de baja tensión• Normas UNE• Normas ANSI• Normas ISA

Personal

El fabricante tendrá al frente del equipo de desarrollo del producto un responsable con autoridadsobre los demás empleados y conocimientos acreditados suficientes para llevar a cabo la tarea deejecución del producto.El responsable de equipo recibirá ,cumplirá y transmitirá las instrucciones del Director técnico deproducto.El Fabricante destinará al desarrollo del producto el número y clase de técnicos que haga falta parael volumen y la naturaleza de los trabajos que se realicen, estos deberán disponer de reconocidaaptitud y experiencia en su especialidad.El fabricante está obligado a separa del equipo de desarrollo ,a aquel personal que a juicio deDirector Técnico de producto no cumpla con sus obligaciones, realice el trabajo defectuosamente,bien por falta de conocimientos o por obrar de mala fe.

Page 81: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

81

Reconocimiento y ensayos previos

Cuando lo estime oportuno el Director Técnico ,podrá encargar y ordenar el análisis, ensayo ocomprobación de los materiales, componentes ,equipos y programas ,bien sea en fabrica de origen olaboratorios oficiales, según crea mas conveniente, aunque estos no estén indicados en el pliego.En caso de discrepancia ,los ensayos o pruebas se realizaran en laboratorios oficiales que el Directortécnico designe.Loa gastos ocasionados por estas pruebas corren a cargo de Fabricante.

Page 82: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

82

MEDICIONES Y PRESUPUESTO

5.0.0-PRESUPUESTO

Las siguientes tablas describen los costos y mediciones para implementar el proyecto se divide en trespartes el precio de los materiales, el costo de manufactura del proyecto ,el valor de diseño del mismo y elpresupuesto total que es la suma de todos loa anteriores mas los impuestos

5.1.0.-PRESUPUESTO DE MATERIAL

Presupuesto del material del Proyecto

Materiales Referencia Precio Unitario Cantidad Total /eurosCondensadores 100nf/35 MKT 0.09 12 1.08Conectores DIN 20 0.60 3 1.80Conectores BNC 1.48 4 5.94Conectores Faston 0.36 6 2.16Transistor BC140-16 0.36 2 0.70Transistor BC161 0.36 2 0.72Resistencia 4K7 1/2W 5% 0.15 3 0.45Resistencia 8k2 1/2W 5% 0.15 2 0.30Resistencia 20k 1/2W 5% 0.15 1 0.15Resistencia 10K 1/2W 5% 0.15 3 0.45Resistencia 25k 1/2W 5% 0.15 4 0.60Resistencias 15k 1/2W 5% 0.15 4 0.60Resistencias multv. R.V 1.44 4 5.77Operacionales OP-27 0.48 7 3.37Operacionales REF-102 2.52 1 2.53Tarjeta Laboratorio PCL812 PG 480.81 1 480.81Placa fotosensible 130*180 7-81 1 7.81Cable Plano din 20 0.82 2 1.63Caja y Accesorios Alum 150*210 30.05 1 30.05

Valor total de los materiales 546.98

Page 83: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

83

5.2.0.- PRESUPUESTO DE MANO DE OBRA

Presupuesto Mano de obra

PartidasPrecio Unitario Cantidad Unidades Total

Analisis ,Programación pruebas y documentación de1000 lineas de código

4.81 2.232 1000 líneas 10569.40

Valor de la realización de una placade circuito impreso de (130*180)

18.03 1 Unidad 18.03

Precio de montaje de un componente en la placataladrar,montar soldar y acabados

0.91 50 Componentes 45.38

Ensamblaje, montaje de accesorios finales delproducto y verificación

15.03 12 horas 180.36

Valor total mano de obra 10810.10

Page 84: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

84

5.3.0.-PRESUPUESTO DE DISEÑO DEL PROYECTO

Presupuesto de diseñoPartidas Precios

Valor total de los materiales delproyecto

546.95

Valor total mano de obra delproyecto

10810.10

Total Suma de Partidas delproyecto

11357.06

Valor diseño 6%

Valor Total Diseño 681,42

Page 85: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

85

5.4.0- PRESUPUESTO TOTAL

Presupuesto Total del Proyecto euros

Partidas ValoresValor total de los materiales delproyecto

546.95

Valor total mano de obra delproyecto

10810.10

Valor Total diseño del proyecto 681.42

Suma partidas 12038.48

Iva 16% 1926.15

Total del proyecto 13964.63

Page 86: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

ETSE

PROYECTO PARA EL DESARROLLO DE

UNGENERADOR

DEFUNCIONES DE

M.B.FIMPLEMENTADO

PORPC

Parte II

AUTOR: SIGFRIDO BERGAPONENTE: ESTEBAN DEL CASTILLO

Page 87: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

6.0.0-Esquemas eléctricos

Page 88: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para
Page 89: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para
Page 90: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

6.1.0-Cara de soldadura

Page 91: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Acondicionador de Señal

Fuente de alimentación

Page 92: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

6.2.0 –Cara de componentes

Page 93: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Acondicionador de señal

Fuente de alimentacion

Page 94: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

6.3.0-Serigrafía de Componentes

Page 95: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Acondicionador de señal

Fuente de alimentación

Page 96: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

7.0.0-Código Fuente

Page 97: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

El modulo de introducciónde Datos

Page 98: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Formstar.pas

Funcion:Detecta las tarjetas instaladas, según la tarjeta que seleccionamos a traves de un cuador de dialogode configuración nos permite definir las condiciones iniciales de trabajo de la tarjeta PCL812.

{Unidad que permite detectar que placas tenemos instaladas,configuracion de las mismas ipor medio de menus activamos las salidas de las diferentes areas de la pcl-812}unit Formstar;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Driver, Global, ExtCtrls,Mask, DdeMan;

type Tfrmstart = class(TForm) cmdRun: TButton; cmdExit: TButton; LstCONTADOR: TListBox; LbContador: TLabel; Panel1: TPanel; labSelDev: TLabel; labChannel: TLabel; labVoltageRange: TLabel; lstDevice: TListBox; lstChannel: TListBox; lstVoltageRange: TListBox; Eddigchan: TEdit; LbDigChan: TLabel; LSTvoltagecla: TListBox; Lbvoltagecla: TLabel; GroupBox1: TGroupBox; RBTrigint: TRadioButton; RadioButton2: TRadioButton; chkEventEnable: TCheckBox; chkcyclic: TCheckBox; ddeserveritem1: TDdeServerItem; procedure cmdExitClick(Sender: TObject); {salir sin activar la pcl 812} procedure cmdRunClick(Sender: TObject); {activar la pcl 812 en base a nuestra selccion} procedure FormCreate(Sender: TObject); {crea un formulario} procedure lstDeviceClick(Sender: TObject); {Permite seleccionar una de las placas instaladas} procedure lstChannelClick(Sender: TObject); {permite selecciona un canal determinado de salidaanalogicade la lista} procedure LSTvoltageclaClick(Sender: TObject); {permite seleccionar el tipo de voltaje de la lista} procedure LstCONTADORClick(Sender: TObject); {permite selccionar un de los contadores libres de laplaca} procedure lstVoltageRangeClick(Sender: TObject); procedure RBTrigintClick(Sender: TObject); procedure chkEventEnableClick(Sender: TObject);

Page 99: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

private

{ Private declarations } public { Public declarations }

end;

var frmstart: Tfrmstart; { frminit:tfrminit;}implementation

uses formrun,Unit1,convert;

var aicfgCurDevice : DEVCONFIG_AI; lpDevFeatures : DEVFEATURES; lpDevConfig_AI : PT_AICONFIG; {Estructura de configuracion del AI} gnNumOfSubdevices : Smallint; Response : Integer; lpGETConfig_AI : PT_AIGETCONFIG;{$R *.DFM}procedure Tfrmstart.cmdExitClick(Sender: TObject);{Procedimiento ligado a la pulsacion del boton exit}begin globalFree(Hglobal(glpIntBuf));

if bRun then DRV_DeviceClose(DeviceHandle); {Cierra el canal de comunicacion con la tarjeta} fungenerador.Enabled:=true; close;end;

procedure Tfrmstart.cmdRunClick(Sender: TObject); {procedimiento ligado a la acceptacion del menu} begin

ErrCde := DRV_AOConfig(DeviceHandle, ptAOConfig[0]); {configuramos el canal de salida analogica} If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; end;

ErrCde := DRV_AOConfig(DeviceHandle, ptAOConfig[1]); If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; end; {Obtener la configuracion del AI} with aicfgcurdevice do begin uschanconfig:=0; usgainctrmode:=0;

Page 100: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

uspolarity:=0; usdasgain:=3; end;

lpGETConfig_AI.buffer := @aicfgCurDevice; lpGETConfig_AI.size := SizeOf(DEVCONFIG_AI);

ErrCde := DRV_AIGetConfig(devicehandle, lpGETConfig_AI); if ( ErrCde<> 0 ) then begin DRV_DeviceClose(devicehandle); Exit; end;

lpDevConfig_AI.DASchan:=10; lpDEVConfig_AI.DASGAIN:=0; Errcde:=DRV_AICONFIG(devicehandle,lpDEVConfig_AI); If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; END; convert.ghbcyclic:=(frmstart.chkcyclic.checked); Fungenerador.Enabled:=true;{activamos el menu principal} frmstart.hide; {ocultamos el menu principal} end;

procedure Tfrmstart.FormCreate(Sender: TObject);{Este procedimiento se activa al inicializar wl formulario }var szdeviceName:Array[0..100] of char; MaxEntries, OutEntries : Smallint; NumOfDevice : Smallint; i, j : Integer; tempStr : String; testRes : boolean;begin

{ Añade el tipo PC Laboratory Card } ErrCde := DRV_DeviceGetList(DeviceList[0], MaxEntries, OutEntries); {detecta los elemento instaldos iconfigura registros} If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; end;

{ Aqui MaxEntries = OutEntries } ErrCde := DRV_DeviceGetNumOfList(MaxEntries); If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit;

Page 101: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

end;

For i := 0 To (MaxEntries - 1) do begin tempStr := ''; For j := 0 To MaxDevNameLen do tempStr := tempStr + DeviceList[i].szDeviceName[j]; lstDevice.Items.Add(tempStr); end;

{ desactivamos modulos } LstCONTADOR.Enabled:=False; LbContador.Enabled:=False; Eddigchan.Enabled :=False; LbDigChan.Enabled :=False; LSTvoltagecla.Enabled:=FALSE; Lbvoltagecla.Enabled:=FALSE; labChannel.Enabled := False; lstChannel.Enabled := False; lstVoltageRange.Enabled := False; labVoltageRange.Enabled := False; cmdRun.Enabled := False; frmstart.show; end;

procedure Tfrmstart.lstDeviceClick(Sender: TObject);{Al seleccionar una de las placas presentadas se ejecuta el siguiente procedimiento}var tempNum, i, ii : Integer; nOutEntries : Smallint; TestRes : Boolean; TempStr : String; dwDeviceNum : Longint; lpAIGetConfig : PT_AIGetConfig; lpDEVCONFIG_AI : DEVCONFIG_AI;begin { lstModule.Items.Clear; } lstChannel.Items.Clear; lstVoltageRange.Items.Clear; lstVoltagecla.Items.Clear; Eddigchan.text:=''; {lstExpChl.Clear;}

tempNum := Pos('DEMO', lstDevice.Items[lstDevice.ItemIndex]); if (tempNum <> 0) then TestRes := True else TestRes := False;

{ evitar al abrri la placa } If (TestRes) Then begin LSTvoltagecla.Enabled:=FALSE; Lbvoltagecla.Enabled:=FALSE; LstCONTADOR.Enabled:=False; LbContador.Enabled:=False; Eddigchan.Enabled :=False; LbDigChan.Enabled :=False; labChannel.Enabled := false; lstChannel.Enabled := false;

Page 102: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

labVoltageRange.Enabled := False; lstVoltageRange.Enabled := False; lstChannel.Items.Add('No Use'); cmdRun.Enabled := true; end;

If (Not TestRes) Then begin { checquea elementos com } gnNumOfSubdevices := DeviceList[lstDevice.ItemIndex].nNumOfSubdevices; if (gnNumOfSubdevices > MaxDev) then gnNumOfSubdevices := MaxDev;

lpDeviceNum := DeviceList[lstDevice.ItemIndex].dwDeviceNum; {lpDeviceNum:=dwdevicenum; } { COM i CAN bus }

{ PCL DAS & DIO } if (gnNumOfSubdevices = 0) then begin ErrCde := DRV_DeviceOpen(lpDeviceNum, DeviceHandle);

If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; end else bRun := True;

ptDevGetFeatures.buffer := @lpDevFeatures; ErrCde := DRV_DeviceGetFeatures(DeviceHandle, ptDevGetFeatures); If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; end; { añade canales analogicos } tempNum := lpDevFeatures.usMaxAOChl; if (tempNum > 0) then begin For i := 0 To (tempNum - 1) do begin tempStr := 'Chan#' + IntToStr(i); lstChannel.Items.Add(tempStr); end;

labChannel.Enabled := True; lstChannel.Enabled := True; LstCONTADOR.Enabled:=False; LbContador.Enabled:=False;

end;

tempNum := lpDevFeatures.usMaxTimerChl; if (tempNum > 0) then

Page 103: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

begin For i := 0 To (tempNum - 1) do begin tempStr := 'Chan#' + IntToStr(i); lstContador.Items.Add(tempStr); end;

end;

{ voltajes de salida } lstVoltageRange.Items.Add('0 ~ 5 V'); lstVoltageRange.Items.Add('0 ~ 10 V'); labVoltageRange.Enabled := false; lstVoltageRange.Enabled := false; lstVoltagecla.Items.Add('Interna'); lstVoltagecla.Items.Add('Externa'); lbvoltagecla.enabled:=false ; lstvoltagecla.enabled:=false;

end; end;end;

procedure Tfrmstart.lstChannelClick(Sender: TObject);begin ptAOConfig[0].chan :=lstchannel.ItemIndex; {configura automaticamente el canal de salida digital enfuncion del canal de salida anlogica seleccionado} if ptAOConfig[0].chan=0 then begin ptAOConfig[1].chan :=1;

end else if ptAOConfig[0].chan=1 then begin ptAOConfig[1].chan :=0;

end;

{Definimos las tensiones maximas i mininimas admisibles en la placa} begin { for DAS and DIO card series }

end;{Activamos informacion sobre que canal de salida analogica digital vamos a UTILIZAR} lbdigchan.enabled:=true; eddigchan.Enabled:=true; eddigchan.ReadOnly:=False; eddigchan.text:='CHAN#'+intTostr(ptAOConfig[1].chan) ; eddigchan.ReadOnly:=true;labVoltageRange.Enabled := true;lstVoltageRange.Enabled := true;

Page 104: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

end;

procedure Tfrmstart.LSTvoltageclaClick(Sender: TObject);begin{Decidimos si queremos una alimentacion externa o bien una alimentacion interna} ptAOConfig[0].Refsrc:= lstVoltagecla.ItemIndex; LstCONTADOR.Enabled:=true; LbContador.Enabled:=true; {Combiene preveer que maximo voltaje permite la placa de forma interna}

end;

procedure Tfrmstart.LstCONTADORClick(Sender: TObject);beginPtCounterEventstart.Counter:=lstContador.Itemindex;cmdRun.Enabled := True;end;

procedure Tfrmstart.lstVoltageRangeClick(Sender: TObject);begin

{if gnNumOfSubdevices = 0 then } If lstVoltageRange.ItemIndex = 0 Then begin ptAOConfig[0].MaxValue := 5.0; ptAOConfig[0].MinValue := 0.0; ptAOConfig[1].MaxValue := 5.0; ptAOConfig[1].MinValue := 0.0; end else If lstVoltageRange.ItemIndex = 1 Then begin ptAOConfig[0].MaxValue := 10.0; ptAOConfig[0].MinValue := 0.0; ptAOConfig[1].MaxValue := 5.0; ptAOConfig[1].MinValue := 0.0; end;

lbvoltagecla.enabled:=true ; lstvoltagecla.enabled:=true; end;

procedure Tfrmstart.RBTrigintClick(Sender: TObject);beginif RBTrigint.checked=False thentipodedisparo:=1elsetipodedisparo:=0;end;

procedure Tfrmstart.chkEventEnableClick(Sender: TObject);beginif(chkeventenable.checked=true) then chkcyclic.enabled:=true

Page 105: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

else chkcyclic.enabled:=false;

if frmstart.chkeventenable.checked=false then begin fungenerador.abrir1.visible:=false; fungenerador.salvarsesion1.visible:=false; end else begin fungenerador.abrir1.visible:=true; fungenerador.salvarsesion1.visible:=true; end;

end;

end.

Page 106: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Frecorm.pas

Funcionn:

Programa encargado de pemitir a través de un cuadro de dialogo la introducción los datos detrabajo necesarios referentes a la gestión de frecuencia del generador de funciones.Duty-cicle, Rango de frecuencia, Fruecuencia, Unidades de trabajo etc.

unit Frecform;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,Miscalculos, FileCtrl, ComCtrls,global;

type TFrecControl = class(TForm) Label1: TLabel; SelFrecuenCy: TEdit; Label2: TLabel; DutyCicle: TEdit; BVale: TButton; BNOVALE: TButton; FrecRange: TRadioGroup; ScrollBar1: TScrollBar; ScrollBar2: TScrollBar; RadioGroup2: TRadioGroup; PerSel: TRadioGroup; lasignanummuestra: TLabel; EAsignanummuestra: TEdit; Rfreq: TGroupBox; RadioButton1: TRadioButton; RadioButton2: TRadioButton; RadioButton3: TRadioButton; RadioButton4: TRadioButton; UpDown1: TUpDown; N_amp: TEdit; Label3: TLabel; procedure BNOVALEClick(Sender: TObject); procedure SelFrecuenCyKeyPress(Sender: TObject; var Key: Char); procedure DutyCicleKeyPress(Sender: TObject; var Key: Char); procedure ScrollBar2Change(Sender: TObject); procedure ScrollBar1Change(Sender: TObject); procedure RadioGroup2Click(Sender: TObject); procedure PerSelClick(Sender: TObject); procedure BValeClick(Sender: TObject); procedure FrecRangeClick(Sender: TObject); procedure EAsignanummuestraKeyPress(Sender: TObject; var Key: Char); procedure FormCreate(Sender: TObject); procedure UpDown1Changing(Sender: TObject; var AllowChange: Boolean);

Page 107: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

private { Private declarations } public { Public declarations } end;

var FrecControl: TFrecControl; CantidadMaximaMuestreo:Integer; ControlDeDatos:BOOLEAN; ControlPERFREC:Boolean; factorMultiplicador:real ; implementation

uses Unit1, Espcform, Formstar;

{$R *.DFM}{Este modulo controla el menu de introduccion de datos del control de frequenciadelde la salida DA}procedure TFrecControl.BNOVALEClick(Sender: TObject);{Se activa la pulsar cancel,esconde un formulario y muestra otro}BeginFrecControl.hide ;FunGenerador.Show ; end;

procedure TFrecControl.SelFrecuenCyKeyPress(Sender: TObject; var Key: char);

begin{Este procedimiento se activa al pulsar cualquier tecla dentro del campoedit,dispone de una variable entera Key,que es evaluada y despues aigna el valor en curso a un texto deotro formulario y a una variable globalpara su posterior proceso}If((Key<'0')Or (Key>'9'))And (Key<>#8) And (Key <>'.') thenKey:=#0

else ControlDedatos:=true;

{Fungenerador.Valfrec1.Caption:=Selfrecuency.Text;CapturaSenal:=(Fungenerador.Valfrec1.Caption); } {Asignacion a variable globaldefinida en unit 1}

end;

procedure TFrecControl.DutyCicleKeyPress(Sender: TObject; var Key: Char); {Procedimiento que asigna el valor textual de una campo edita una variable,Pero Previamente se evalua que todos los datos son numero enteros}beginIf((Key<'0')Or (Key>'9'))And (Key<>#8) thenKey:=#0 ;

end;

Page 108: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

procedure TFrecControl.ScrollBar2Change(Sender: TObject);{Procedimiento que asigna el valor textual de una campo edita una variable,Pero Previamente se evalua que todos los datos son numero enteros}beginDutyCicle.Text:=IntToStr(ScrollBar2.Position); {Asigna a campo texto de edit elvalor posicional de la barra}Fungenerador.edutycicle1.text:=DutyCicle.Text;{Asigna a una variable string deunit 1 el valor del campo texto}

end;

procedure TFrecControl.ScrollBar1Change(Sender: TObject); {Procedimiento asignado al mover la barra scroll dependiente del valor delcampo de edicion de la frquencia}begin {Convierte el valor numerico de la posion de la barra en un valor de texto yloa asigna al caption del edit del editor de frequencias} SelFrecuenCy.Text:=IntToStr(ScrollBar1.Position); end; {En funcion del Radiogroup2 seleccionado hace viable un panel o bien otro(Periodos o frecuencias)}procedure TFrecControl.RadioGroup2Click(Sender: TObject);{En funcion del indice seleccionado podemos definir si trabajamos con frequencio con periodos}begin

If RadioGroup2.ItemIndex=0 then begin

FrecRange.Visible:=True; PerSel.Visible:=False; FrecRange.ItemIndex:=ItemPer; ControlPERFREC:=FALSE; rfreq.caption:='Rango de trabajo'; radiobutton1.caption:='1000-100 sg' ; radiobutton4.caption:='100-10 sg' ; radiobutton2.caption:='10-1 sg' ; radiobutton3.caption:='1-0.1 sg' ; end;If RadioGroup2.ItemIndex=1 thenbeginPerSel.Visible:=True;FrecRange.Visible:=False;FrecRange.ItemIndex:=ItemFrec;ControlPERFREC:=true; rfreq.caption:='Rango de trabajo' ; radiobutton1.caption:='0.001-0.01 Hz' ; radiobutton4.caption:='0.01-0.1 Hz' ; radiobutton2.caption:='0.1-1 Hz' ; radiobutton3.caption:='1-10 Hz' ; end; N_amp.clear; N_amp.text:=inttostr(RadioGroup2.ItemIndex);

end;

procedure TFrecControl.FrecRangeClick(Sender: TObject);{En funcion del radiobutton seleccionado asignamos un valor de multiplicador ala

Page 109: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

variable multiplicador} {Ltitlefrec.caption:='Frecuencia'; }

begin fungenerador.Ltitlefrec.caption:='Frecuencia';

If (FrecRange.ItemIndex=0) then Begin ItemFrec:=0; Multiplicador1:=1 ; End ; If (FrecRange.ItemIndex=1) then begin IteMFrec:=1; Multiplicador1:=0.001 ; End; If (FrecRange.ItemIndex=2) then begin IteMFrec:=2; Multiplicador1:=0.000001; end;

end;

procedure TFrecControl.PerSelClick(Sender: TObject); {Seleccion el factor de multiplicacion para el periodo}begin fungenerador.Ltitlefrec.caption:='Periodo';

If (PerSel.ItemIndex=0) then {Si estamos en periodo entonces...} Begin ItemFrec:=0; Multiplicador1:=0.000001 ;

End ; If (PerSel.ItemIndex=1) then begin IteMFrec:=1 ; Multiplicador1:=0.001 ; End; If (PerSel.ItemIndex=2) then Begin ItemFrec:=2; Multiplicador1:=1 ; End;

end;

{Esta funcio calcula la frecuenciai la asigna a frecsenal}procedure TFrecControl.BValeClick(Sender: TObject); var Estado:boolean ; Decisor:Integer ; {Se activa al pulsar el boton aceptar}

Page 110: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

beginCantidadMaximaMuestreo:=60000; {variable que indica la cantidamaxima de muestras que podemos introducir} if(frmstart.chkeventenable.checked=true) then begin if(radiobutton1.checked=true )then begin Nummuestra:=1000; mastiempo:=60000 ; esppcl.definenummuestras.text:=inttostr(Nummuestra); end; if(radiobutton4.checked=true )then begin Nummuestra:=1000; mastiempo:=60000 ; esppcl.definenummuestras.text:=inttostr(Nummuestra); end; if(radiobutton2.checked=true)then begin Nummuestra:=100; mastiempo:=6000 ; esppcl.definenummuestras.text:=inttostr(Nummuestra); end; if(radiobutton3.checked=true)then begin Nummuestra:=10; mastiempo:=6000 ; esppcl.definenummuestras.text:=inttostr(Nummuestra); end; end; if(frmstart.chkeventenable.checked=false) then begin NumMuestra:=strtoint(easignanummuestra.text); {trunc(1/(frecsenal/50))}{StrToInt(Easignanummuestra.Text);} {convierte en un valor entero el stringintroducido cdialog numero de muestras}Esppcl.DefineNumMuestras.Text:= Easignanummuestra.Text; fungenerador.vercalculo1.enabled:=true;{----------------------------------------------------------}Decisor:=NumMuestra MOD 2;If decisor=0 then {si el numero de muestras es par aceptar valor}NumMuestra:=NumMuestra;{----------------------------------}If (decisor<> 0)thenbegin {si es impar sumar 1 al numero de muestras imostrar aviso del cambio}NumMuestra:=(NumMuestra+1) ; {suma 1 al numero de muestras seleccionado}Easignanummuestra.Text:=IntToStr(NumMuestra); {Asigna estring al edti denumero de muestras}MessageDlg('El numero de muestras debe ser par.Se añadira una muestra mas alNumero de muestras',mtWarning,[mbOK],0);end; {genera mensaje de error} end; ControlDedatos:=true;

if ControlDedatos=False then Miscalculos.CalculaFrec1((ScrollBar1.Position),Multiplicador1,FrecSenal);

If ControldeDatos=True AND ControlPERFREC=False then

begin

Page 111: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Frecsenal:=StrToFLoat(Selfrecuency.text);

fungenerador.Evalorrangefre.text:='Sg' ; if (frecsenal/Nummuestra)<0.000001 then ShowMessage('Atencion este valor frecuencia podria consumir muchos recursosdel sistema'); end;

If ControldeDatos=True AND ControlPERFREC=True then Begin

Frecsenal:=1/StrToFLoat(Selfrecuency.text); {parche que ajusta la salida para minimizar el error}

fungenerador.Evalorrangefre.text:='Hz' ; if (frecsenal/Nummuestra)<0.0000001 then ShowMessage('Atencion este valor frecuencia podria consumir muchos recursosdel sistema'); end; { NumMuestra:={trunc(1/(frecsenal/50))}{strtoint(easignanummuestra.text);}{ Fungenerador.Valfrec1.text:=Selfrecuency.Text;} {Fungenerador.Vermulti.Caption:=FloatToStr(Multiplicador1);} {Convierte ennumerico el string multiplicador}

Fungenerador.EVerfrec1.text:=Formatfloat('0.0000',StrToFLoat(Selfrecuency.text)); {Convierte en numerico el estring del edit frecsenal} unit1.DutyCicle:=Scrollbar2.position; {Asigna el valor de posicion descroll2 a una variable gloabal de la unidad 1} Fungenerador.Edutycicle1.text:=floattostr(unit1.DutyCicle); FrecControl.hide ; {Oculta el formulario} chekfincuenta[0] :=False; end;

procedure TFrecControl.EAsignanummuestraKeyPress(Sender: TObject; var Key: Char);begin If((Key<'0')Or (Key>'9'))And (Key<>#8) thenKey:=#0 ; {fuerza laentrada de numeros entre 0-9}

end;

procedure TFrecControl.FormCreate(Sender: TObject);begin ControlPERFREC:=TRUE ; if(frmstart.chkeventenable.checked=true) then begin lasignanummuestra.visible:=false; easignanummuestra.visible:=false; updown1.visible:=true; end;

if(frmstart.chkeventenable.checked=false) then begin

lasignanummuestra.visible:=true; easignanummuestra.visible:=true;

Page 112: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

lasignanummuestra.show; easignanummuestra.show;

end;

end;

procedure TFrecControl.UpDown1Changing(Sender: TObject; var AllowChange: Boolean);

begin if(frmstart.chkeventenable.checked=true) then

begin {configuracion del los objetos del menu}

updown1.min:=10; updown1.max:=100; Selfrecuency.Maxlength:=5 ; updown1.increment:=1;

if(radiogroup2.itemindex=1)then

begin label1.caption:='Frecuencia'; fungenerador.Ltitlefrec.caption:='Frecuencia'; if(radiobutton1.checked=true) then begin

updown1.min:=10; updown1.max:=100; Selfrecuency.Maxlength:=5 ; updown1.increment:=1; factormultiplicador:=0.0001 ;

SelFrecuency.text:=floattostrf((updown1.position)*factormultiplicador,fffixed,4,4) end; if(radiobutton4.checked=true) then begin updown1.min:=10; updown1.max:=100; Selfrecuency.Maxlength:=5 ; updown1.increment:=1; factormultiplicador:=0.001;

SelFrecuency.text:=floattostrf((updown1.position)*factormultiplicador,fffixed,4,4) end;

end; if(radiobutton2.checked=true) then

begin

updown1.min:=10; updown1.max:=100; Selfrecuency.Maxlength:=5 ; updown1.increment:=1; factormultiplicador:=0.01;

Page 113: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

SelFrecuency.text:=floattostrf((updown1.position)*factormultiplicador,fffixed,4,4) end; if(radiobutton3.checked=true) then begin

updown1.min:=10; updown1.max:=100; Selfrecuency.Maxlength:=5 ; updown1.increment:=1; factormultiplicador:=0.1 ;

SelFrecuency.text:=floattostrf((updown1.position)*factormultiplicador,fffixed,4,4) end;

end;

if(radiogroup2.itemindex=0)then begin label1.caption:='Periodo'; if(radiobutton1.checked=true) then begin updown1.min:=1; updown1.max:=100; Selfrecuency.Maxlength:=5 ; updown1.increment:=1; factormultiplicador:=10 ;

SelFrecuency.text:=floattostrf((updown1.position)*factormultiplicador,fffixed,4,4) end; if(radiobutton4.checked=true) then begin updown1.min:=1; updown1.max:=100; Selfrecuency.Maxlength:=5 ; updown1.increment:=1; factormultiplicador:=1 ;

SelFrecuency.text:=floattostrf((updown1.position)*factormultiplicador,fffixed,4,4) end;

if(radiobutton2.checked=true) then begin updown1.min:=1; updown1.max:=100; Selfrecuency.Maxlength:=5 ; updown1.increment:=1; factormultiplicador:=0.1 ;

SelFrecuency.text:=floattostrf((updown1.position)*factormultiplicador,fffixed,4,4) end; if(radiobutton3.checked=true) then begin updown1.min:=1;

Page 114: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

updown1.max:=100; Selfrecuency.Maxlength:=5 ; updown1.increment:=1; factormultiplicador:=0.01 ;

SelFrecuency.text:=floattostrf((updown1.position)*factormultiplicador,fffixed,4,4) end;

end;

end;

{end;}

End.

Page 115: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Contram.Pas

Función: Programa de introducción de datos a través de una cuadro de dialogo para la gestión de laamplitud del generador de funciones.Amplitud, ,Magnitudes, Factor de amplificación, offset etc.

unit Contram; {Cuadro de dialogo que nos permite definir las amplitud de la señal deseada,retardo con que queremos que comienze,la componente de continua que deseamos,los nuemros que se introducen son enteros,que los multiplicamospor un factor real seleccionado en las checkbox}interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Miscalculos, ExtCtrls,GLOBAL, Spin,driver, ComCtrls;

type TAmpLform = class(TForm) Ampsig: TLabel; TAmpsign: TEdit;{definimos un valor enteroi para la amplitud} Label2: TLabel; EVoffset: TEdit; CInversion: TCheckBox; {Nos permite inverit la forma de la onda} BAccAmpl: TButton; {Acceptamos la condiciones de trabajo} BCanAmpl: TButton; {Rechazamos las condiciones de trabajo} Margampl: TRadioGroup; {Conjunto de checbox que nos permiten definir elmargen de trabajo del generador} MargOffset: TRadioGroup; {Conjunto de checbox que nos permiten definir elmargen de offset del generador} Label1: TLabel; ERetardSig: TEdit; {Definimos el factor entero del retardo que deseamos enla señal} TRetardSig: TRadioGroup; SpinEdit1: TSpinEdit; Label3: TLabel; Label5: TLabel; CheckBox1: TCheckBox; Edit1: TEdit; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label4: TLabel; UpDown1: TUpDown; valspin: TEdit; Label9: TLabel; N_amp: TEdit; namp: TLabel; {Escojemos un factor de multiplicacion para el retardo }

procedure BCanAmplClick(Sender: TObject); {Al pulsar el boton activamos esteprocedimiento} procedure TRetardsigKeyPress(Sender: TObject; var Key: Char);

Page 116: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

procedure TAmpsignKeyPress(Sender: TObject; var Key: Char); procedure EVoffsetKeyPress(Sender: TObject; var Key: Char); procedure MargamplClick(Sender: TObject); procedure RetardSigClick(Sender: TObject); procedure MargOffsetClick(Sender: TObject); procedure BAccAmplClick(Sender: TObject); procedure CInversionClick(Sender: TObject); procedure SpinEdit1Change(Sender: TObject); procedure FormCreate(Sender: TObject); procedure UpDown1Click(Sender: TObject; Button: TUDBtnType); procedure Edit1Change(Sender: TObject);

private { Private declarations } public { Public declarations } end;

var AmpLform: TAmpLform; decideoffset:boolean; mes:array[0..100] of real;implementationuses Unit1, Formstar, Espcform;{$R *.DFM}

procedure TAmpLform.BCanAmplClick(Sender: TObject);beginAmplform.hide; end;

procedure TAmpLform.TRetardsigKeyPress(Sender: TObject; var Key: Char);{Para cada tecla pulsada evalua si esta comprendida entre los caracteres0-9}begin If((Key<'0')Or (Key>'9')) And (Key<>#8) then

Key:=#0;

end;

procedure TAmpLform.TAmpsignKeyPress(Sender: TObject; var Key: Char);{Para cada tecla pulsada evalua si esta comprendida entre los caracteres0-9}begin If((Key<'0')Or (Key>'9'))And (Key<>#8) then Key:=#0 ;

end;

procedure TAmpLform.EVoffsetKeyPress(Sender: TObject; var Key: Char);{Al pulsar qualquier tecla evalua si esta o no entre el 0_9}begin If((Key<'0')Or (Key>'9'))And (Key<>#8)And (key<>'-') thenKey:=#0 {Si no lo esta no permite su insercion}end;

procedure TAmpLform.MargamplClick(Sender: TObject);begin

Page 117: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

if (Margampl.ItemIndex=0) then Multiplicador2:=0.001; alfa:=1 ; if (Margampl.ItemIndex=1) then Multiplicador2:=1; alfa:=1; N_amp.text:=inttostr(Margampl.itemindex); end;

procedure TAmplform.RetardSigClick(Sender: TObject);begin if (TRetardSig.ItemIndex=0) then Multiplicador3:=0.001; if (TRetardSig.ItemIndex=1) then Multiplicador3:=1;

end;

procedure TAmpLform.MargOffsetClick(Sender: TObject);begin if (MargOffset.ItemIndex=0) then Multiplicador4:=0.001; if (MargOffset.ItemIndex=1) then Multiplicador4:=1;

end;

procedure TAmpLform.BAccAmplClick(Sender: TObject); Var Valor1,Valor2,Valor3,x:Integer;begin {Calcula el valor de la tension de offset,amplitud,Retardo de la señal} x:=0; Amplitud:=0; RetardoSenal:=0; TensionOffset:=0; Valor1:=StrToInt(Tampsign.text); Valor2:=StrToInt(ERetardSig.text); Valor3:=StrToInt(EVoffset.text);

CalculaFrec1(Valor1,Multiplicador2,Amplitud); {if(amplitud>ptAOConfig[1].MaxValue) THEN AMPLITUD:=ptAOConfig[1].MaxValue/2; } CalculaFrec1(Valor2,Multiplicador3,Retardosenal); CalculaFrec1(Valor3,Multiplicador4,TensionOffset);

Fungenerador.EVerAmplitud.text:=TAMPSIGN.TEXT; if (Margampl.ItemIndex=0) then FUNGENERADOR.ETIPOVOLTAJE.TEXT:='mV';

if (Margampl.ItemIndex=1) then FUNGENERADOR.ETIPOVOLTAJE.TEXT:='V';

Fungenerador.Eretart.text:=Eretardsig.text;

if (tretardsig.ItemIndex=0) then begin FUNGENERADOR.evalretard.TEXT:='ms'; Multiplicador3:=0.001; end; if (tretardsig.ItemIndex=1) then

Page 118: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

begin FUNGENERADOR.evalretard.TEXT:='s'; Multiplicador3:=1; end;

Fungenerador.Eoffsetout.text:=evoffset.text; if (margoffset.ItemIndex=0) then FUNGENERADOR.Evaloffset.TEXT:='mV'; if (margoffset.ItemIndex=1) then FUNGENERADOR.Evaloffset.TEXT:='V';

while mes[x]<=strtofloat(formatfloat('0.000',amplitud)) do begin x:=x+1; kft:=x; if x=100 then break; end; x:=0; { Fungenerador.VerRetardo.Caption:=FloatTostr(RetardoSenal);} {Selecciona el canal por el que saldra dicho valor}

if decideoffset=true then begin {updown1.position:=trunc(1000*lpAOVoltageOut1.OutputValue/(ptAOConfig[0].MaxValue*2.77))}

end;

Edit1.text:=FloattoStrf(2.77*lpAOVoltageOut1.OutputValue,fffixed,5,4); { esppcl.spinedit1.value:=amplform.updown1.position; } esppcl.editvalo.text:=amplform.edit1.text; {esppcl.Editvalo.text:=FloattoStrf(ptAOConfig[0].MaxValue*2.22*updown1.position/1000,fffixed,4,2); } fungenerador.eoffsetout.TEXT:=Edit1.text;

Amplform.hide;

end;

procedure TAmpLform.CInversionClick(Sender: TObject);beginIf CInversion.Checked then BeginInversion:=TRUE ;fungenerador.edit1.text:='Si';EndelseBeginInversion:=FALSE;fungenerador.edit1.text:='No';end;End;

procedure TAmpLform.SpinEdit1Change(Sender: TObject); var x:integer;beginx:= spinedit1.value;

Page 119: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

kf1:=spinedit1.value/100 ; valspin.clear; valspin.text:=inttostr(x);end;

procedure TAmpLform.FormCreate(Sender: TObject);varcontador:integer;Calibrador1:Array[0..100] of integer;

valor:real;begin valor:=0; contador:=100;

while contador<>0 dobegin

mes[100-contador]:=valor; valor:=valor+0.1 ; contador:=contador-1 ; end;

end;

procedure TAmpLform.UpDown1Click(Sender: TObject; Button: TUDBtnType);

begin updown1.enabled:=TRUE; if decideoffset=false then begin updown1.enabled:=TRUE; amplform.updown1.visible:=true;lpAOVoltageOut1.OutputValue :=ptAOConfig[0].MaxValue *updown1.position/5000;{Pone un valor a la salida del buffer de vlotaje} {Sentencias de verificacion} lpAOVoltageOut1.chan := ptAOConfig[1].chan; ErrCde := DRV_AOVoltageOut(DeviceHandle, lpAOVoltageOut1);{Ejecuat alfuncion poner nivel de voltaje a uns salida}

If (ErrCde <> 0) Then {En caso de error mostrar mensaje} begin DRV_GetErrorMessage(ErrCde, pszErrMsg); {Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); } DRV_DeviceClose(DeviceHandle); fungenerador.timer2.Enabled:=False; Exit; end;

end; {Selecciona el canal por el que saldra dicho valor} if decideoffset=true then begin { updown1.position:=trunc(1000*lpAOVoltageOut1.OutputValue/(ptAOConfig[0].MaxValue*2.77)) ; } updown1.enabled:=false; end;

Edit1.text:=FUNGENERADOR.EOFFSETOUT.TEXT ; esppcl.spinedit1.value:=amplform.updown1.position;

Page 120: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

esppcl.editvalo.text:=amplform.edit1.text;

esppcl.Editvalo.text:=FloattoStrf(ptAOConfig[0].MaxValue*2.22*updown1.position/1000,fffixed,4,2);

end;

procedure TAmpLform.Edit1Change(Sender: TObject);beginEdit1.text:=FloattoStrf(2.77*lpAOVoltageOut1.OutputValue,fffixed,5,4); esppcl.spinedit1.value:=amplform.updown1.position;esppcl.editvalo.text:=amplform.edit1.text;

esppcl.Editvalo.text:=FloattoStrf(ptAOConfig[0].MaxValue*2.22*updown1.position/1000,fffixed,4,2);end;

end.

Page 121: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Selonda.pas

Funcion: Este programa gestiona la entrada de datos para seleccionar un determinado tipo de fornade onda para el generador de funciones tambien permite la selección de la opcion de configuraciónautomatica o no.

Onda cuadrada , triangular, Senoidal , Diente de sierra, Por puntos, Configuración automatica.

unit SelOnda;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;

type TTipoSenal1 = class(TForm) BAccepSenal: TButton; BCancSenal: TButton; seleccionsenal: TRadioGroup; CheckBox1: TCheckBox; Label1: TLabel; Enfun: TEdit; procedure SeleccionsenalClick(Sender: TObject); procedure BAccepSenalClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure BCancSenalClick(Sender: TObject); private { Private declarations } public { Public declarations } end;

var TipoSenal1: TTipoSenal1;

implementation Uses Unit1,insertadat, Contram;{$R *.DFM} procedure TTipoSenal1.SeleccionsenalClick(Sender: TObject);

begin SeleccionaFuncion:=TipoSenal1.Seleccionsenal.ItemIndex; If Seleccionafuncion=0 then Fungenerador.EFunsel.text:='Cuadrada'; If Seleccionafuncion=1 then Fungenerador.EFunsel.text:=' Triangular'; If Seleccionafuncion=2 then Fungenerador.EFunsel.text:='Diente de Sierra'; If Seleccionafuncion=3 then Fungenerador.EFunsel.text:='Senoidal'; If Seleccionafuncion=4 then

Page 122: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Fungenerador.EFunsel.text:='Coseno'; If Seleccionafuncion=5 then Fungenerador.EFunsel.text:='Por puntos'; Enfun.text:=inttostr(seleccionafuncion); end;

procedure TTipoSenal1.BAccepSenalClick(Sender: TObject);begin

TipoSenal1.hide; if seleccionafuncion=5 then begin Application.CreateForm(TForm22, form22); form22.show; end; if(checkbox1.checked=true)then begin amplform.checkbox1.checked:=true; decideoffset:=true ; amplform.updown1.enabled:=false; amplform.spinedit1.enabled:=false;

end else begin amplform.checkbox1.checked:=false; decideoffset:=false; amplform.updown1.enabled:=TRUE; amplform.spinedit1.enabled:=true; end; end;

procedure TTipoSenal1.FormCreate(Sender: TObject);beginTipoSenal1.visible:=false; tiposenal1.hide;end;

procedure TTipoSenal1.BCancSenalClick(Sender: TObject);beginTipoSenal1.visible:=false; tiposenal1.hide;end;

end.

Page 123: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Insertadat.pas

Función: Este programa permite la la inserción de de formas de onda personalizadas por el usuario.Es llamado por el programa Selonda.pas cuando se escoje la opción de función por puntos.Sustituye los valores calculados de un tipo de onda previa por uno valores asignados por el usuario

unit insertadat;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type TForm22 = class(TForm) datos: TMemo; aceptar: TButton; cancelar: TButton; Insert: TButton; Edattext: TEdit; Ltit1: TLabel; Lcountx: TLabel; procedure InsertClick(Sender: TObject); procedure cancelarClick(Sender: TObject); procedure aceptarClick(Sender: TObject); private count,contador:integer; { Private declarations } public

{ Public declarations } end;

var Form22: TForm22;

implementationuses unit1,espcform;{$R *.DFM}

procedure TForm22.InsertClick(Sender: TObject);begindatos.clear;datos.pastefromclipboard;count:=datos.lines.count;NumMuestra:=count;lcountx.caption:=IntToStr(count);end;

procedure TForm22.cancelarClick(Sender: TObject);beginclose;end;

Page 124: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

procedure TForm22.aceptarClick(Sender: TObject);varcontador:integer;

beginif count<10000 then

begin Esppcl.DefineNumMuestras.Text:=IntToStr(count); for contador:=0 to (Nummuestra-1) dobegin Edattext.text:=datos.lines[contador]; unit1.tablavalores[contador]:=StrToFloat(edattext.text); end;

close; end

else showmessage('Numero de variables excesivo'); close; end;

end.

Page 125: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Espform.pas

Función: Asigna valores por defecto a variables de configuración de la tarjeta PCl-812 .

Numero de muestras por defecto, offset por defecto;

unit Espcform;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Unit1,Miscalculos, Spin,global,driver, MPlayer;

type TEsppcl = class(TForm) BAcepEsp: TButton; BCancEsp: TButton; LMuesta: TLabel; DefineNumMuestras: TEdit; LDefineReloj: TLabel; EDefineReloj: TEdit; enlacevi: TCheckBox; Ecalibre: TEdit; Label1: TLabel; Label2: TLabel; SpinEdit1: TSpinEdit; editvalo: TEdit; Label4: TLabel; Label3: TLabel; procedure BCancEspClick(Sender: TObject);

procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Edit2KeyPress(Sender: TObject; var Key: Char); procedure Edit3KeyPress(Sender: TObject; var Key: Char); procedure DefineNumMuestrasKeyPress(Sender: TObject; var Key: Char); procedure BAcepEspClick(Sender: TObject); procedure enlaceviClick(Sender: TObject); procedure SpinEdit1Click(Sender: TObject); procedure FormCreate(Sender: TObject);

private { Private declarations } public { Public declarations } end;

var

Esppcl: TEsppcl;

Page 126: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

CantidadMaximaMuestreo:Integer;implementation

uses Formstar, Contram;

{$R *.DFM} {dicho modulo genera un cuadro de dialogo del tipo form que permite introducirel numero dem uestras que deseamos de nuestro period i nos permite definir que base de tiemapos debemos asignar para el calculos delas temporizaciones del hardware estas dependen del tipo de conatador i del periodo de trabajo del mismo}procedure TEsppcl.BCancEspClick(Sender: TObject);beginEsppcl.hide; {oculta el formulario de especificaciones } Fungenerador.Generador1.enabled:=true; Fungenerador.Herramientas1.enabled:=true;end;

procedure TEsppcl.Edit1KeyPress(Sender: TObject; var Key: Char);begin If((Key<'0')Or (Key>'9'))And (Key<>#8) then {evalua la entrada de numerosentre 0-9}Key:=#0end;

procedure TEsppcl.Edit2KeyPress(Sender: TObject; var Key: Char);

begin If((Key<'0')Or (Key>'9'))And (Key<>#8) then {fuerza la entrada de numerosentre 0-9}Key:=#0

end;

procedure TEsppcl.Edit3KeyPress(Sender: TObject; var Key: Char);begin If((Key<'0')Or (Key>'9'))And (Key<>#8) then {fuerza la entrada denumeros entre 0-9}Key:=#0

end;

procedure TEsppcl.DefineNumMuestrasKeyPress(Sender: TObject; {evento que seproduce al pulsae una tecla} var Key: Char);begin If((Key<'0')Or (Key>'9'))And (Key<>#8) thenKey:=#0 ; {fuerza laentrada de numeros entre 0-9}

end;

procedure TEsppcl.BAcepEspClick(Sender: TObject); {dicha funcion se ejecuatacuando pulsamos aceptar en el menu}VarDecisor:Integer ;

begin

Page 127: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

CantidadMaximaMuestreo:=10000; {variable que indica la cantidamaxima de muestras que podemos introducir}NumMuestra:=StrToInt(Esppcl.DefineNumMuestras.Text); {convierte en un valorentero el string introducido cdialog numero de muestras}

{----------------------------------------------------------}Decisor:=NumMuestra MOD 2;If decisor=0 then {si el numero de muestras es par aceptar valor}NumMuestra:=NumMuestra;{----------------------------------}If (decisor<> 0)thenbegin {si es impar sumar 1 al numeor de muestras imostrar aviso del cambio}NumMuestra:=(NumMuestra+1) ;Esppcl.DefineNumMuestras.Text:=IntToStr(NumMuestra);MessageDlg('El numero de muestras debe ser par.Se añadira una muestra mas alNumero de muestras',mtWarning,[mbOK],0);end;{-----------------------------------}TReloj:=StrToFloat(Esppcl.EDefineReloj.Text); {assignamos a la variable relojdel hardware un valor manualmente} Esppcl.DefineNumMuestras.Text:=INTTOSTR(NumMuestra); {deb de corresponder conel valor real del reloj interno o bien el externo} Fungenerador.Generador1.enabled:=true; Fungenerador.Herramientas1.enabled:=true; {activamos las partes del menuprincipal que teniamos deshabilitadas} {lpAOVoltageOut1.OutputValue :=ptAOConfig[0].MaxValue *spinedit1.value/1000;{Pone un valor a la salida del buffer de vlotaje} {Sentencias de verificacion} {lpAOVoltageOut1.chan := ptAOConfig[1].chan; {Selecciona el canal porel que saldra dicho valor} {Editvalo.text:=FloattoStrf(ptAOConfig[0].MaxValue*2.77*spinedit1.value/1000,fffixed,5,4); Amplform.edit1.text:= Editvalo.text; ErrCde := DRV_AOVoltageOut(DeviceHandle, lpAOVoltageOut1);{Ejecuat alfuncion poner nivel de voltaje a uns salida}

{ If (ErrCde <> 0) Then {En caso de error mostrar mensaje} { begin DRV_GetErrorMessage(ErrCde, pszErrMsg); {Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); } {DRV_DeviceClose(DeviceHandle); {unit1.timer2.Enabled:=False; } { Exit; end; }{Editvalo.text:=FloattoStrf(ptAOConfig[0].MaxValue*2.22*spinedit1.value/100,fffixed,4,2); }{ Editvalo.Text:=FloatTostr(2*ptAOConfig[0].MaxValue*spinedit1.value/100) ;}

Esppcl.Hide; {ocultamos el formulario}

end;

procedure TEsppcl.enlaceviClick(Sender: TObject);

Page 128: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

beginIf(enlacevi.checked=true) then

if Not fungenerador.datclient.Setlink('genie','knostr')then {Establecemos elservicio} messagedlg('No es posible iniciar la conversacion',mtinformation,[mbOK],0);

fungenerador.timer1.enabled:=true;

if(enlacevi.checked=false)then

fungenerador.timer1.enabled:=false; fungenerador.datclient.ConnectMode:=ddeManual; fungenerador.datclient.closelink; end;procedure TEsppcl.SpinEdit1Click(Sender: TObject);begin

lpAOVoltageOut1.OutputValue :=ptAOConfig[0].MaxValue*spinedit1.value/1000; {Pone un valor a la salida del buffer de vlotaje} {Sentencias de verificacion} lpAOVoltageOut1.chan := ptAOConfig[1].chan; {Selecciona el canal porel que saldra dicho valor}

Editvalo.text:=FloattoStrf(ptAOConfig[0].MaxValue*2.77*spinedit1.value/1000,fffixed,5,4); amplform.updown1.position:=spinedit1.value; amplform.edit1.text:=editvalo.text; ErrCde := DRV_AOVoltageOut(DeviceHandle, lpAOVoltageOut1);{Ejecuat alfuncion poner nivel de voltaje a uns salida}

If (ErrCde <> 0) Then {En caso de error mostrar mensaje} begin DRV_GetErrorMessage(ErrCde, pszErrMsg); {Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); } DRV_DeviceClose(DeviceHandle); {unit1.timer2.Enabled:=False; } Exit; end;

Editvalo.text:=FloattoStrf(ptAOConfig[0].MaxValue*2.22*spinedit1.value/1000,fffixed,4,2);{contram.Editvalo.Text:=FloatTostr(2*ptAOConfig[0].MaxValue*spinedit1.value/100);}

end;procedure TEsppcl.FormCreate(Sender: TObject);beginif(frmstart.chkeventenable.checked=true)thenbegin defineNummuestras.visible:=false; spinedit1.value:=250; lmuesta.visible:=false; Fungenerador.Generador1.enabled:=true; Fungenerador.Herramientas1.enabled:=true; end;end;

Page 129: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

end.

Gesbas.pas

Funcion: Este programa permite la gestión del cuadro de dialogo que permite importar ,exportar,Navegar, Salvar y eliminar sesiones de trabajo del generador de funciones.

unit gesbas1;

interface

uses SysUtils, Windows, Messages, Classes, Graphics, Controls, StdCtrls, Forms, DBCtrls, DB, ExtCtrls, Mask, DBTables, ComCtrls;

type TForm2 = class(TForm) Table1FRECUENCIA: TFloatField; Table1AMPLITUD: TFloatField; Table1OFFSET: TFloatField; Table1DUTY: TSmallintField; Table1MUESTRAS: TFloatField; Table1FRECMUES: TFloatField; Table1FORMAOND: TStringField; Table1SELONDA: TSmallintField; DataSource1: TDataSource; Table1: TTable; ScrollBox: TScrollBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; EditFRECUENCIA: TDBEdit; EditAMPLITUD: TDBEdit; EditOFFSET: TDBEdit; EditDUTY: TDBEdit; EditMUESTRAS: TDBEdit; EditFRECMUES: TDBEdit; EditFORMAOND: TDBEdit; EditSELONDA: TDBEdit; DBNavigator: TDBNavigator; Importar: TButton; Exportar: TButton; Cancelar: TButton; Label9: TLabel; EDITNUMEROAMPLITUD: TDBEdit; NFUN: TDBEdit; Label10: TLabel; Label11: TLabel; EDITNUMEROFRECUENCIA: TDBEdit; ProgressBar1: TProgressBar; procedure FormCreate(Sender: TObject);

Page 130: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

private { private declarations } public { public declarations } end;

var Form2: TForm2;

implementation

{$R *.DFM}

procedure TForm2.FormCreate(Sender: TObject);begin Table1.Open;end;

end.

Page 131: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

El Modulo de Gestiónde Datos

Page 132: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Miscalculos.pas

Función: Modulo encargado de operar la variables adquiridas por los el modulo de adquisición dedatos y realizar operaciones matemáticas basicas .

unit Miscalculos;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus,Unit1,GLOBAL;

Var

Inc_Yn,Resultx:Real; function ComparaPeriodos(PeriodoReloj:Single;PeriodoMuestreo:Single):Boolean; Function DecidemaxCantidad(VarCantidadSeleccionada,Cantidadmaxima:Integer):Integer; Procedure DecideMaximaFrequencia( VarPeriodoMinFuncion:Real;NumeroMuestras:Integer;PeriodoLectura:Real); Procedure ejecutadelaytime(Muestreo:Real;Valorretardo:Real;VarTablavalores:Array of Real;CantidadMuestra:integer); Procedure CalculaNumerocuentas(Ts:Real;Var K1:LongInt); function InvierteValor(VarResultx:Real;Inv:BOOLEAN;tipo:integer;ampli:real;vof:real):real; Procedure DetectaSemiperiodo(N:Integer;K:Integer;Var P1:Boolean); Procedure TipoSemiperiodo(N:Integer;K:Integer;Var P1:Boolean); Procedure CalculaDuty(K:Integer;Dc:Integer;Count:Integer;Var P1:Boolean); Procedure CalculaFrec1(Frecuencia:Integer;Multiplicador:Single;varResultx:Real); procedure FuncCuadr(Ampl:Real;P1:Boolean;Var Resultx:Real); Procedure FuncSen(Ts:Real;Ampl:Real;Tc:Real;n:Integer;k:Integer;Det:Boolean;VarResultx:Real); Procedure FunCos(Ts:Real;Ampl:Real;Tc:Real;n:Integer;k:Integer;Det:Boolean;VarResultx:Real) ; ProcedureFunSierra(Ampl:Real;Tc:Real;Ts:Real;N:Integer;P:Boolean;K:Integer;Det:Boolean;Var Resultx:Real;Var Acumulado:Real); Procedure Funtriang(Ampl:Real;Tc:Real;Ts:Real;N:Integer;varP:Boolean;K:Integer;Det:Boolean;Var Resultx:Real;Var Acumulado:Real); Procedure FunMuestreaPer(K:Integer;Tc:Real;Var Ts:Real); Procedure CalculaHex(Vref:Integer;Vo:Single;Var Resultx:String); Procedure FunMuestreaFrec(K:Integer;Fc:Real;Var Fs:Real); FUNCTION DeterminaOffset(Vnormal:Real;Voffset :Real):REAL;

{ Function InvierteValor(Var Resultx:Real;Var Inv:BOOLEAN):REAL; }{ Procedure DeterminaOffset(Vnormal:Real;Voffset:Real;Var Resulta:Real);} function VALORESCALA(VALORNUMAX: SINGLE;VALORNUMAX2: SINGLE;VALORINTERMEDIO:REAL):REAL ;

VAR Yn,Period1:REAL;

Page 133: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

implementation

procedure FuncCuadr(Ampl:Real;P1:Boolean;Var Resultx:Real); {Calcula el valor de la funcion cuadrada en un punto depediendo de la variablep} VAR Contador:Integer; begin

If (P1=True) then Resultx:=(kf1*Ampl) else Resultx:=-kf1*Ampl; end ;

Procedure FuncSen(Ts:Real;Ampl:Real;Tc:Real;n:Integer;k:Integer;Det:Boolean;VarResultx:Real) ; {Calcula el valor de la amplitud de la funcio Seno en base a un periodo} begin

Resultx:=Kf1*Ampl*Sin((2*3.1418*n*Ts/TC)); { DetectaSemiperiodo(n,k,Det); If det =true then Resultx:=0; } end ;

Procedure FunCos(Ts:Real;Ampl:Real;Tc:Real;n:Integer;k:Integer;Det:Boolean;VarResultx:Real) ; {Calcula el valor de la amplitud de la funcio Cos en base a un periodo} begin Resultx:=kf1*(Ampl/2)*Cos((2*3.1418*n*Ts/tc)); {DetectaSemiperiodo(n,k,Det); If det =true then Resultx:=0; } end ; ProcedureFunSierra(Ampl:Real;Tc:Real;Ts:Real;N:Integer;P:Boolean;K:Integer;Det:Boolean;Var Resultx:Real;Var Acumulado:Real); {Calcula la funcio diente de sierra para cada valor} Var Temp1,Yn,kf:Real; begin

{Calculamo el Incremeto minimo de variacion de tension para u incremento defrecuencia de muestreo} Yn:=N*(Ts/Tc)*(Kf1*Ampl) ;

{Comprobamos que la funcion no este ni al principio ni al final del periodoen caso de estarlo assignamos el valor correspondiente} { if (temp1<Acumulado)then temp1:=Acumulado; {---------------------------------------------------------------}

Page 134: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

If (P=False) then begin Resultx:=Yn ;

if(acumulado>(Kf1*Ampl)) then P:=True; end ;

If (P=True) then begin Resultx:=0; if(Resultx<=Yn )then P:=False; end ;

{----------------------------------------------------------------} {Verificar si esta acitvada la inversion de señal} {Calculamos los valores para valores intermedios del periodo} { if((N>0) And (N<K))Then Resultx:=abs(Acumulado+Inc_Yn );

if (N=0 ) then begin Resultx:=(0); Acumulado:=0; end;

If (N=K ) then begin ResultX:=Temp1 ; end; {Asignamos nuevo valor al acumulador} { DetectaSemiperiodo(n,k,Det);} { If det =true then { Resultx:=0; }

Acumulado:=Resultx;

end ; Procedure Funtriang(Ampl:Real;Tc:Real;Ts:Real;N:Integer;Var P:Boolean; K:Integer;Det:Boolean; Var Resultx:Real;Var Acumulado:Real ) ; {Calcula la funcio triangular en cada punto;} Var Inc_Yn,yn:Real; begin

Yn:=N*(Ts/Tc)*(2*Kf1*Ampl) ;

If (P=False) then begin Resultx:=Yn ;

if(N<=K/2) then P:=True; end ;

If (P=True) then begin Resultx:=Yn ;

Page 135: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Acumulado:= Resultx; end

{DetectaSemiperiodo(n,k,Det); } { If det =true then begin

End; }

end ;

Procedure FunMuestreaPer(K:Integer;Tc:Real;Var Ts:Real); {Evalua el periodo de muestreo dividiendo el period total en el numero demuestras} begin Ts:=Tc/K ; end;

Procedure FunMuestreaFrec(K:Integer;Fc:Real;Var Fs:Real); begin Fs:=K*Fc;

end;

{Funcion que convierte un valor entero en hexadecimal} Procedure CalculaHex(Vref:Integer;Vo:Single;Var Resultx:String); Var Nd:Integer; Nh:String; Begin {lee el valor de la tension de referencia redondea la tension de salida y loconvierte en hexadecimal} Nd:=Round(Vo*4096/Vref); Nh:=IntToHex(Nd,2); Resultx:=Nh; End;

{Calcul la frecuencia i la multiplica por un factor de multiplicacion} Procedure CalculaFrec1(Frecuencia:Integer;Multiplicador:Single;VarResultx:Real); Begin Resultx:=Frecuencia*Multiplicador; End;

{Funcion que gestiona i selecciona el calculo de un periodo de la funcion} {Añade una tension de offset a un valor previmenate calculado}

{añade un valor de tension de offset a un valor de entrada} FUNCTION DeterminaOffset(Vnormal:Real;Voffset :Real):REAL; var varoff: Real;

BeginVaroff:=(Vnormal+Voffset ); DETERMINAOFFSET:=Varoff; if(varoff> ptAOConfig[1].MaxValue) then varoff:=ptAOConfig[1].MaxValue;

End;

Page 136: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

{Calculamos el valor del duty-cicle}Procedure CalculaDuty(K:Integer;Dc:Integer;Count:Integer;Var P1:Boolean);

Varx:single;Percentk:LongInt;Beginx:=DC/100;Percentk:=round(X*K);If (Count<=Percentk) thenP1:=TRUE; If (Count>Percentk) thenP1:=FALSE;end;

{Evita que en valores proximos a cero la funcion de division por cero} Procedure TipoSemiperiodo(N:Integer;K:Integer;Var P1:Boolean); Var Trans:Real;

Begin Trans:=N/K;

If (Trans<0.50000) then P1:=true ; If (trans>=0.50000) then P1:=False;

End; {Dicha funcion detecta el cero en funciones en que el paso por cero es unvalor critico para el ordenador} Procedure DetectaSemiperiodo(N:Integer;K:Integer;Var P1:Boolean); Var Trans:Real;

Begin Trans:=N/K;

If (Trans=0.50000) then P1:=true ; If (trans<>0.50000) then P1:=False;

End;

{Assigna un valor calculado de la funcion a un ESPACIO DE LA MATRIZSELECCIONADA}{ DeterminaOffset(Resultx,Offset,Resul); }

{ESTA FUNCION CONVIERTE UN DATO ESCALADO DE UNA FUNCION CUYOS VALORESESTAN ENTE -MAX Y +MAX A UN DATO ESCALADO ENTER CERO I +MAX1}

function VALORESCALA(VALORNUMAX: SINGLE;VALORNUMAX2: SINGLE;VALORINTERMEDIO:REAL):REAL ;

VARNUEVOVALOR:REAL;PUNTOMEDIO:REAL;

Page 137: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

BEGIN

PUNTOMEDIO:=VALORNUMAX/2; NUEVOVALOR:=((VALORNUMAX2/(2*VALORNUMAX))*VALORINTERMEDIO)+PUNTOMEDIO ; VALORESCALA :=NUEVOVALOR; END;

{esta funcion canvia el signo de un valor determinado en funcio de una variablede seleccion de cambio de signo} function InvierteValor(VarResultx:Real;Inv:BOOLEAN;tipo:integer;ampli:real;vof:real):real; VAR VarCambio:Integer; CTE:real; BEGIN If Inv=TRUE then Begin case tipo of 0: begin VarCambio:=-1; Resultx:=Resultx*Varcambio; end ; 1:begin Resultx:=Ampli-Resultx; end; 2:begin Resultx:=Ampli-Resultx; end;

end; end; If Inv=FALSE then Begin VarCambio:=(-1); Resultx:=Resultx*Varcambio; end; result:=Resultx; end;

{Funcion que en base al numero de muestras definido y al periodo de la funciondefineel numero de muestras que debemos de tomar} Procedure CalculaNumerocuentas(Ts:Real;Var K1:LongInt); BEGIN K1:=Trunc(Ts); {Convierte un valor muestreado en un valor entero y listopara ser utilizado por el contador}

END;

{Elaboramos una funcio que evalua si la cantida selecciona es mayor que unacierta variable sie es mayor emite un mensaje de error y a ajusta el valor al maximopermitido} Function DecidemaxCantidad(VarCantidadSeleccionada,Cantidadmaxima:Integer):Integer; begin If CantidadSeleccionada>CantidadMaxima then begin MessageDlg('El Numero de muestra excesivo.Se ajusta al maximo permitido',mtWarning,[mbOK],0); CantidadSeleccionada:=CantidadMaxima;

Page 138: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

end; end; {Funcion que verifica que el periodo de muestreo no es inferrio al periodo delreloj selecccionado} function ComparaPeriodos(PeriodoReloj:Single;PeriodoMuestreo:Single):Boolean; Var VariableDecision:Boolean;

Begin If PeriodoReloj>PeriodoMuestreo then begin VariableDecision:=True; end else VariableDecision:=False ;

result:=VariableDecision; End;

{Elaboramos una funcion cuya mision es en base a un numero de muestras y aunos valores de frequencia de muestreo decidir que frequencia maxima podemos gestionar}

Procedure DecideMaximaFrequencia( VarPeriodoMinFuncion:Real;NumeroMuestras:Integer;PeriodoLectura:Real);

BeginPeriodoMinFuncion:=100*NUmeroMUestras*PeriodoLectura;

End;

{Est funcion en base a un numero traslada una cierta cantidad de valores delinicio de al tabla hacia el final de la misma} Procedure ejecutadelaytime(Muestreo:Real;Valorretardo:Real;VarTablavalores:Array of Real;CantidadMuestra:integer); var Muestraretardo,x,j:integer; ValorTemporal:Real; begin

MuestraRetardo:=trunc(abs(ValorRetardo/Muestreo));

for x:=0 to MuestraRetardo do begin ValorTemporal:=TablaValores[0] ; for j:=1 to CantidadMuestra do begin TablaValores[j-1]:= TablaValores[j]; end; TablaValores[CantidadMuestra]:=Valortemporal; end;

end;

END.

Page 139: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Miscalculos2.pas

Funcion: Programa cuyas funciones requieren la intervención de variables generadas porfunciones de miscálculos.pas para su ejecución.

unit miscalculos2;

interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus,unit1,GLOBAL,miscalculos,fungespcl,espcform;

ProcedureCalculaperiodo(K:Integer;Ampl:Real;Offset:Real;Acum:real;InVer:Boolean;Dc:Integer;Resul:Real;Var Periodo:Real;VAR PerMuestra:Real; Selec:Integer;Var Calculavalores: Array of Real{;Var ValorHEX: Array ofString;};VAR P:BOOLEAN);

implementation

{Funcion que gestiona i selecciona el calculo de un periodo de la funcion} ProcedureCalculaperiodo(K:Integer;Ampl:Real;Offset:Real;Acum:real;InVer:Boolean;Dc:Integer;Resul:Real;Var Periodo:Real;VAR PerMuestra:Real; Selec:Integer;Var Calculavalores: Array of Real;Var P:BOOLEAN);

Var Contador:Integer; Resultm,Resul2,variable,var2:Real; Begin Acum:=0; resul2:=resul; {Calculamos el periodo de muestreo cada vez que activamos aceptar} FunMuestreaPer(k,Periodo,PerMuestra); CalculaNumerocuentas(PerMuestra,NumeroCuentas);

For Contador:=0 TO K DO Begin {Selecciona un tipo de funcion calcula el Resultx para una muestra y la saignaa una matriz de datos} Case Selec of0:BEGINCalculaDuty(K,Dc,Contador,P);Miscalculos.FuncCuadr(Ampl,P,Resul);{Resul:=Miscalculos.DeterminaOffset(Resul,TensionOffset);}Resul:=Miscalculos.InvierteValor(Resul,Inver,0,Ampl,TensionOffset); CalculaValores[Contador]:=Resul; END; {Llama la funcion i calcula un valor determinado}1: begin{FunSierra(Ampl:Real;Tc:Real;Ts:Real;N:Integer;P:Boolean;Var Resultx:Real;VarAcumulado:Real); }

TipoSemiperiodo(Contador,k,INver);

Page 140: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Funtriang(Ampl,FrecSenal,PerMuestra,Contador,Inver,K,DetectaSemi, Resul, Acum);{Resul:=Miscalculos.DeterminaOffset(Resul,TensionOffset); }Resul:=Miscalculos.InvierteValor(Resul,Inver,1,Ampl,TensionOffset); if(contador<=k/2) then begin CalculaValores[Contador]:=Resul; CalculaValores[k-Contador]:=Resul; end; end;2:Begin{TipoSemiperiodo(N:Integer;K:Integer;Var P1:Boolean); } FunSierra(Ampl,Frecsenal,PerMUestra,Contador,Inver,K,DetectaSemi,Resul,Acum); {Resul:=Miscalculos.DeterminaOffset(Resul,TensionOffset);} Resul:=Miscalculos.InvierteValor(Resul,Inver,2,Ampl,TensionOffset); CalculaValores[Contador]:=Resul; end;{FuncSen(Ts:Real;Ampl:Real;Tc:Real;n:Integer;Var Resultx:Real) ; }3:BeginFuncSen(PerMuestra,Ampl,FrecSenal,Contador,k,DetectaSemi,Resul);{Resul:=Miscalculos.DeterminaOffset(Resul,TensionOffset); }Resul:=Miscalculos.InvierteValor(Resul,Inver,3,Ampl,TensionOffset); if(contador<=k/4) then begin CalculaValores[Contador]:=Resul; CalculaValores[trunc(k/2)-Contador]:=Resul; CalculaValores[trunc(k/2)+Contador]:=-Resul; calculavalores[k-contador]:=-resul; end;

{ CalculaValores[Contador]:=Resul;} end;4:BeginFunCos(PerMuestra,Ampl,FrecSenal,Contador,k,DetectaSemi,Resul);{Resul:=Miscalculos.DeterminaOffset(Resul,TensionOffset);}Resul:=Miscalculos.InvierteValor(Resul,Inver,4,Ampl,TensionOffset); { CalculaValores[Contador]:=Resul; } if(contador<=k/4) then begin CalculaValores[Contador]:=Resul; CalculaValores[trunc(k/2)-Contador]:=-Resul; CalculaValores[trunc(k/2)+Contador]:=-Resul; calculavalores[k-contador]:=resul; end;

end; 5:Begin CalculaValores[Contador]:=Tablavalores[Contador];{ Resul:=Miscalculos.DeterminaOffset(CalculaValores[Contador],TensionOffset);} Resul:=Miscalculos.InvierteValor(Resul,Inver,5,Ampl,TensionOffset); CalculaValores[Contador]:=Resul; end; END;

{ if selec=1 then begin var2:=calculavalores[0]; variable:=calculavalores[K] ; calculavalores[0]:=variable ; For Contador:=0 TO K-1 DO begin variable:=Calculavalores[Contador+1];

Page 141: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

calculavalores[contador+1]:=var2 ; var2:=variable; } end; end;

{ejecutadelaytime(Permuestra,Retardosenal,calculavalores,NumMuestra); }

{ end; }

end.

Page 142: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Global.pas

Función: Conjunto declaraciones de variables del uso global en el programa.

unit Global;

interfaceuses Driver;Type lpDevlist=^PT_DEVLIST;

const BASE=220; Const MaxEntries = 255; const

{FACTORES DE MULTIPLICACION DE LA SEÑAL PARA OBTENER EL VALOR CALCULADO A LA SALIDA DEL EQUIPO} {calsen:Array[0..50] ofinteger=(2000,2000,1250,800,700,425,375,339,330,300,270,260

,210,190,180,170,160,150,140,140,130,130,110,110,100,100,100,95,90,85,80,80,75,75,73,70,70,67,67,63,60,60, 57,57,57,54,54,52,52,50,50) ; } calsen:Array[0..49] ofinteger=(2500,1240,820,615,498,406,350,310,275,270,222,205,190, 175,163,153,143,135,129,129,115,106,106,101,97,93,90,90,84,82,79,76,74, 72,69,67,62,60,59,61,58,58,58,55,54,53,52,51,51,50) ;

Ampltri:Array[0..49]ofreal=(7.0081,6.9250,6.8696,6.8419,6.7865,6.7588,6.7034,6.7034,6.6757, 6.648,6.675,6.6480,6.6480,6.6480,6.757,6.6480,6.7311,6.7311,6.7311,6.7311,

6.8419,6.8973,6.9804,7.0358,7.0912,7.1189,7.2574,7.3128,7.4513,7.5067,7.6729,7.7560,7.8668,7.9499,

8.0607,8.1992,8.3131,8.5039,8.6424,8.6424,8.917,9.0025,9.3349,9.5011,9.5565,9.9335,9.9443, 10.2490,10.2490,10.5810);

{Ampltri:Array[0..49]ofreal=(7.0635,6.8419,6.7588,6.5372,6.509,6.3710,6.454,6.6757,6.4818,6.718,6.59,6.7865,6.2325,6.2325,6.581,6.54,6.6203,

6.6757,6.5926,6.9250,6.9250,7.0635,7.2020,7.2020,7.2020,7.2297,7.2574,7.2574,7.3682,7.4236,7.7283,7.7560,8.0330,7.922,8.2546,8.2546,8.6147,

8.6147,8.8363,8.8917,9.2241,9.4457,9.7504,9.812,10.1110,10.1110,10.2770,10.3320,10.4710,10.7480); ] {calsen:Array[0..48] of integer=(350,350,300,250,245,210,170,150,135,110, 115,115,115,90,90,90,70,70,65,65,60,58,56,53,50,46,40,42,43,40,39,39,39,

Page 143: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

39,39,39,39,37,37,36,36,35,35,35,35,34,34,34,30) ;} caltri:Array[0..49] ofinteger=(5000,2870,1825,1300,1050,860,717,650,551,506,450, 418,400,360,330,315,293,277,263,255,238,228,218,211,211,200,195,177,171,

165,160,155,150,145,142,138,134,134,128,127,121,120,115,115,111,110,106,105, 105,100);

{ caltri:Array[0..50] ofinteger=(5000,5000,2800,1500,1000,800,800,650,600,600, 500,450,425,400,375,350,325,300,290,275,226,225,200,200,200,200,185,185, 175,170,160,155,150,145,140,135,130,127,122,122,120,115,112,112,110,105 ,105,103,100,98,95); } Amplsin:Array[0..49]ofreal=(7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912, 7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912, 7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,

7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912, 7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912,7.0912);

{Amplsin:Array[0..49]ofreal=(6.9205,6.9205,6.9205,6.7034,6.7311,6.7034,6.81,7.0081,6.9250,7.3128,7.839,7.5067,

6.6757,6.7034,6.7311,7.0367,7.0358,7.0635,7.0081,7.0081,7.2297,7.2297,7.0389,7.0635,7.2297,7.2020,7.2574,

7.2574,7.2574,7.2574,7.25851,7.2574,6.7560,6.8391,6.8142,6.9527,7.1189,7.0912,7.0912,7.0912,7.1743,7.1466, 7.2851,7.3959,7.3405,7.3405,7.3405,7.3405,7.3405,7.3405);}

Amplrampa:Array[0..49]ofreal=(7.0358,6.9250,6.8696,6.8142,6.7311,6.6483,6.4818,6.4818,6.4264,

6.3987,6.2879,6.2048,6.1217,6.0663,6.0109,5.9001,5.8447,5.8170,5.7616,5.6508,5.5400,

5.4846,5.4569,5.3838,5.3184,5.2630,5.2076,5.0168,5.0137,4.0306,4.8752,4.819,4.7367,4.6259,

4.5428,4.5478,4.4874,4.404,4.404,4.2104,4.1827,4.0996,4.0442,3.9611,3.8503,3.7549,3.7395, 3.6564,3.6010,3.5456);

{Amplrampa:Array[0..49]ofreal=(6.7865,6.7865,6.7588,6.3710,6.3433,6.2919,6.2879,6.3196, 6.4264,6.48,6,703,6.703,5.5954,5.5954,5.9278,5.8447,5.7893,5.73,5.1245,

5.6231,5.6231,5.6231,5.2353,5.3184,5.3184,5.3184,5.3184,5.3184,5.3184,5.3184,4.875,4.875,

4.875,4.370,4.3766,4.3766,4.2935,4.404,4.3212,4.3212,4.3212,4.3212,4.3212,4.3212, 4.0719,4.0719,4.0719,4.071,4.071); }

AmplCuad:Array[0..49] ofreal=(6.7311,6.7311,6.7311,6.7311,6.7311,6.7311,6.7311,6.9804,7.0912,7.081,8.310,6.3433,6.4818,

Page 144: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

6.7311,7.0911,6.9527,7.0635,7.0635,7.0635,7.0635,7.1743,7.1743,6.9527,6.9527,7.1466,7.1466,7.1466,7.1466,7.1466,7.1466,7.1466,7.1466

,7.1466,7.1466,7.1466,7.1466,7.1466,7.1466,7.1466,7.1466,7.1466,7.1466,7.3128,7.3128,7.3218,7.3959,7.3959,7.3959, 7.3959,7.3959);

{calram:Array[0..50] of integer=(5000,5000,2000,1500,1200,1000,800,700,650, 550,510,450,425,375,350,330,320,300,275,275,250,240,230,220,215,205, 195,185,180,175,170,165,155,150,150,142,140,140,130,130,125,120,120, 116,112,112,107,107,105,100,90) ;} calram:Array[0..49] of integer=(5000,2800,1825,1325,1070,875,810,650,575,

500,470,427,400,365,344,322,300,284,275,265,245,235,229,220,211,204,196,189,175,170,164,

158,154,150,145,140,135,132,127,127,120,122,117,115,115,111,108,104,101,101);

{ calram:Array[0..48] of integer=(900,900,775,650,500,375,350,290,280,275,234,215, 195,170,170,160,150,140,130,130,120,115,110,105,100,70,75,77,77,75,75,75, 72,70,68,65,63,60,65,61,61,55,55,52,51,51,48,48,48); } { caltri:Array[0..50] ofinteger=(1000,1000,933,920,420,390,340,310,270,250,240,220,

200,175,150,150,145,140,135,120,115,110,105,105,95,90,85,80,75,72,72,68,68,65,62,62, 60,57,55,53,53,52,52,50,50,47,47,46,46,43,43); } calsqr:Array[0..50] ofinteger=(1000,1000,450,350,285,200,185,175,150,125,110,95,95 ,90,92,82,72,72,65,60,60,55,55,50,50,47,47,43,43,41,41,38,38,38,35,32, 32,32,32,30,29,28,28,27,26,26,26,25,24,24,23);

var lpdevicenum :longint; ptaitransfer :PT_FAITransfer; ptaichecK :PT_FAICHECK; ptEnableEvent :PT_EnableEvent; ptwriteportword :PT_WRITEPORTWORD; ptreadportword :PT_READPORTWORD; aicfgCurdevice :DEVCONFIG_AI; ptAistart :PT_FAIINTSTART ; ptAOConfig : Array[0..4] of PT_AOConfig; lpAigetConfig :PT_AIGETCONFIG; LPdEVcONFIG_AI :DEVCONFIG_AI; Devicenum1 : LONGINT; DeviceHandle : Longint; ptDevGetFeatures : PT_DeviceGetFeatures; DeviceList : array [0..MaxEntries] of PT_DEVLIST; SubDeviceList : array [0..MaxEntries] of PT_DEVLIST; ErrCde : Longint; szErrMsg : string; pszErrMsg : Pchar = @szErrMsg; bRun : Boolean; flagrun :boolean; flagreset :boolean; flagstart :boolean;

Page 145: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

flagactivaciclo :boolean; numerodeciclos :longint; {PUNTERO A LA ESTRUCTURA DE LA SALIDA GENERAL } lpAOVoltageOut : PT_AOVoltageOut; lpAOVoltageOut1 : PT_AOVoltageOut; {Punteros a structuras de inicializacion del contador i lectura del mismo} PtCounterEventstart :Pt_CounterEventStart; PtCounterEventRead :PT_CounterEventRead; glpIntbuf:pointer ; giConvCount:Smallint; kf1:real; alfa,kft:integer;

mastiempo:longint ; P:pointer; implementation

end.

Page 146: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Getevent.pas

Funcion: Programa del tipo thread cuya finalidad es la detección de los eventos producidos por latarjeta PCL-812 o bien por una de las entradas estandart asi como la identificación del evento y suposterior tratamiento.

unit GetEvent;

interface

uses Classes, SysUtils, windows,Frecform, SelOnda, Espcform,Contram,miscalculos,Memodatos,miscalculos2, DigControl,controlthread,cones,driver,global,convert,unit1,fungespcl;

{ Init ,Convert, Driver; }

type TGetEvent = class(TThread) private { Private declarations } contador :longint; dwDeviceNumber : Longint; dwDuration : Longint; bCyclic : Boolean;

Newthrd:controlthrd;

protected procedure Execute; override;

procedure adInterruptEvent; procedure adBufChangeEvent; procedure adOverrunEvent; procedure adWatchdogEvent; procedure adTerminateEvent;

public constructor Create(dwDevNum : Longint; dwDur : Longint; bCyc : Boolean); end;

implementation

{ Important: Methods and properties of objects in VCL can only be used in a method called using Synchronize, for example,

Synchronize(UpdateCaption);

and UpdateCaption could look like,

procedure TGetEvent.UpdateCaption; begin Form1.Caption := 'Updated in a thread'; end; }

{*************************************************************

Page 147: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

* Function: Handle the error code. If the input error code > 0, * it means some error apperent. This function can * show the error message to a message box and stop * this application. * Input: The error code. * return: none ************************************************************* }Function DoesErr(var lErrCode: LongInt): integer;var szErrMsg : string[100]; pszErrMsg : PChar;

begin {Check the pressed error code} If (lErrCode <> 0) Then begin pszErrMsg := @szErrMsg; DRV_GetErrorMessage(lErrCode, pszErrMsg); MessageBox(0, pszErrMsg, 'Thread Message', MB_OK); DoesErr := 1; end else DoesErr := 0;end;

{ TGetEvent }constructor TGetEvent.Create(dwDevNum : Longint; dwDur : Longint; bCyc :Boolean);begin inherited Create(False); dwDeviceNumber := dwDevNum; dwDuration := dwDur; bCyclic := bCyc; FreeOnTerminate := True;

end;

procedure TGetEvent.Execute;var lTickCount : Longint; dwResult : Longint;

ptChkEvent : PT_CheckEvent; wEventType : Word;

begin { Place thread code here }

{Prepare structure for checking conversion status} with ptChkEvent do begin EventType := @wEventType; {devuelve un tipo de evento del driver} Milliseconds :=dwduration; {Intervalo de tiempo muerton en ms} end;

with ptAiCheck do begin ActiveBuf := @WactiveBuf; {salida,no dice qu buffer esta siendo llenado} stopped := @WStopped; {Indica si la operacion se ha completado o no}

Page 148: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

retrieved := @lretrieved; {cantida de conversiones guardadas en elbuffer} overrun := @WOverrun; {Indica si hemos sobrepasadoel buffer dedatos en mod ociclyco} HalfReady := @WHalfready; {Indica si la mitad del buffer esta lleno ovacio,0,1,2} end;

{Calculation the terminate time} lTickCount := GetTickCount + dwDuration + mastiempo; contador:=0; {Cyclic get deiver's event} while (bCyclic = True) or (lTickCount > GetTickCount) do begin

{1. Get the Device event} if DRV_CheckEvent(Devicehandle, ptChkEvent) <> 0 then {Elimina el eventoi le su estado} begin {If cannot get event close and terminate thread} MessageBox(0,'Check Event Error !','Thread Message',MB_OK); exit; end;

{2. Does it contain the Interrupt event?} if (wEventType and ADS_EVT_INTERRUPT) <> 0 then {process interrupt event} adInterruptEvent();

{3. Does it contain the buffer change event?} if (wEventType and ADS_EVT_BUFCHANGE) <> 0 then {process buffer change event} adBufChangeEvent();

{4. Does it contain Overrun event?} if (wEventType and ADS_EVT_OVERRUN) <> 0 then {process overrun event} adOverrunEvent(); {5. Does it ccontain the Watchdog event?} if (wEventType and ADS_EVT_WATCHDOG) <> 0 then {process watchdog event} adWatchdogEvent();

{6. Does it contain terminate event?} if (wEventType and ADS_EVT_TERMINATED) <> 0 then begin {process terminate event} adTerminateEvent(); exit; end;

end;

Page 149: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

{Exit get event loop. Display error message and termionate GetEvent} MessageBox(0,'Never Get Any Event! Terminate GetEvent thread', 'Thread Message',MB_OK);end;

procedure TGetEvent.adInterruptEvent();

begin {Process Interrupt event}

fungenerador.memo1.Lines.Append('Interrupt generating'); EjecutaValorcuenta(unit1.TablaValores2,unit1.NumMuestra,unit1.CuentaMuestras);

end;

procedure TGetEvent.adBufChangeEvent();var lErrCde : Longint;begin {Process Buffer change event} fungenerador.memo1.Lines.Append('BUFF'); {DRV_FAITRANSFER(devicehandle,ptaitransfer ); } ; { EjecutaValorcuenta(unit1.TablaValores2,unit1.NumMuestra,unit1.CuentaMuestras);} lErrCde := DRV_FAiCheck(Devicehandle, ptAiCheck); if DoesErr(lErrCde) = 1 then exit;

if PTAICHECK.halfready^=2 then begin fungenerador.memo1.Lines.Append('transfer'); {DRV_FAITRANSFER(devicehandle,ptaitransfer ); } end; end;

procedure TGetEvent.adOverrunEvent();var lErrCde : Longint;begin {Process overrun event. This demo does not care the overrun event, just clear it} fungenerador.memo1.Lines.Append('Overrunning');

lErrCde := DRV_ClearOverrun(Devicehandle); if DoesErr(lErrCde) = 1 then exit;end;

procedure TGetEvent.adWatchdogEvent();begin {Processing Watchdog event.} { frmConverting.memEvent.Lines.Append('WatchDog Event'); }

Page 150: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

end;

procedure TGetEvent.adTerminateEvent();begin {Close the converting form and make it to retrieved convered data} fungenerador.memo1.Lines.Append('Terminated'); fungenerador.ghThreadGetEvent:= 0;end;

end.

Modulo Principal

Page 151: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Unit1.pas

Función : Programa que gestiona el Menu principal del generador de funciones y a traves de lasdiferentes opciones seleccionadas llama a una u otra función del los modulos anteriores según lorequiera la ocasión.

unit Unit1;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ExtCtrls,Global,Driver,Formstar,Formrun,Fungespcl,insertadat, ComCtrls, DdeMan,linkthr, OleCtnrs, DB, DBTables, DBCtrls,gesbas;

type TFunGenerador = class(TForm) MainMenu1: TMainMenu; Archivo1: TMenuItem; Abrir1: TMenuItem; SalvarSesion1: TMenuItem; Salir1: TMenuItem; Opciones1: TMenuItem; Generador1: TMenuItem; Frecuencia1: TMenuItem; Amplitud1: TMenuItem; ControlES1: TMenuItem; ClaseSenal: TMenuItem; Titefun: TLabel; FUNSEL: TLabel; LTitlefrec: TLabel; Valfrec1: TLabel; VerDuty: TLabel; DatDuty: TLabel; Vermulti: TLabel; VeresFrec: TLabel; VerRetardo: TLabel; Textampl: TLabel; VerAmplitud: TLabel; Salvacalculo1: TMenuItem; Vercalculo1: TMenuItem; Herramientas1: TMenuItem; Reset1: TMenuItem; Lanzar1: TMenuItem; Ayuda1: TMenuItem; LTitulovalores1: TLabel; Evalorcurso: TEdit; General1: TMenuItem; Timer2: TTimer; Everfrec1: TEdit; Edutycicle1: TEdit; everamplitud: TEdit; efunsel: TEdit; ETIPOVOLTAJE: TEdit; Label1: TLabel; Label2: TLabel;

Page 152: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Eoffsetout: TEdit; Evaloffset: TEdit; Label3: TLabel; Eretart: TEdit; EValretard: TEdit; ldigfrec: TLabel; Edigfrec: TEdit; LDigduty: TLabel; Edigduty: TEdit; Label6: TLabel; Evaldigfrec: TEdit; Label4: TLabel; Edigvalorcurso: TEdit; Label7: TLabel; Digital2: TMenuItem; N1: TMenuItem; Salidaanalogica1: TMenuItem; Frecuencia2: TMenuItem; Amplitud2: TMenuItem; Tipodeseal1: TMenuItem; N2: TMenuItem;

Opciones2: TMenuItem; Memo1: TMemo; Evalorrangefre: TEdit; Label8: TLabel; Edit1: TEdit; Label5: TLabel; Edit2: TEdit; Label9: TLabel; Edit3: TEdit; Edit4: TEdit; UpDown1: TUpDown;

Timer1: TTimer; Datclient: TDdeClientConv; DdeClientItem1: TDdeClientItem; DdeClientItem2: TDdeClientItem; DdeClientItem3: TDdeClientItem; DdeClientItem4: TDdeClientItem; DdeClientItem5: TDdeClientItem; DdeClientItem6: TDdeClientItem; Timer3: TTimer; DdeServerItem1: TDdeServerItem; Label10: TLabel;

procedure Salir1Click(Sender: TObject); procedure ClaseSenalClick(Sender: TObject); procedure Especificaciones1Click(Sender: TObject); procedure Amplitud1Click(Sender: TObject); procedure Salvacalculo1Click(Sender: TObject); procedure Vercalculo1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Lanzar1Click(Sender: TObject); procedure Reset1Click(Sender: TObject); procedure Digital1Click(Sender: TObject); procedure General1Click(Sender: TObject); procedure ControlES1Click(Sender: TObject); procedure Timer2Timer(Sender: TObject);

Page 153: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

procedure Abrir1Click(Sender: TObject); procedure UpDown1Click(Sender: TObject; Button: TUDBtnType); procedure Timer1Timer(Sender: TObject); procedure pruevasClick(Sender: TObject); procedure AD1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Timer3Timer(Sender: TObject); procedure DdeServerItem1Change(Sender: TObject); procedure Memo2Change(Sender: TObject);

private { Private declarations }

public { Public declarations } ghThreadGetEvent : Longint;

end; var

cuentaticks,Free,Amplitud,Frecsenal,Frecmuestreo,Periodo,Resultado,AmplitudOffset,Acumulado,Multiplicador1,Multiplicador2,Multiplicador3,Multiplicador4:Real; xx,ResulHex:STRING; TensionOffset,Retardosenal,TReloj,ErrorReloj,xxx:Real; numtimer2:Array[0..3]of longint; chekfincuenta:Array[0..3] of boolean; Tablavalores:Array[0..1000]of Real; Tablavalores2:Array[0..1000]of Real; digTablavalores:Array[0..1000]of Real; digTablavalores2:Array[0..1000]of Real; SELDUTY,Inversion,detectasemi,decidefinalCuenta:Boolean;

DutyCicle,NumMuestra,Seleccionafuncion,Frecsenal1,Itemfrec,Itemper,NumInterrupcion,NumDMA,NumDirMem,VREFER:Integer; CapturaSenal:String; cancel,Entradatos2,activa1:BOOLEAN; ii,dignumerocuenta,CuentaMuestras:Integer; FunGenerador:TFunGenerador; VariableFichero:Array[1..10000]of string;

Numerocuentas,count2,count1,CuentaActual,VarContador,valor,acum,numtimer,numtimerdig,valordat,numerociclo,numerociclo2:LongInt ; port1:integer ; n,tipodedisparo :integer; wActivebuf: word; wstopped : word; yyy,lretrieved: longint; woverrun : word;

Page 154: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

whalfready : word; lthr:linker; implementation

uses Frecform, SelOnda, Espcform, Contram,miscalculos,Memodatos,miscalculos2, DigControl,controlthread,cones,getevent, Convert,controlcontador, Adiquisicion;

{$R *.DFM}

Function DoesErr(var lErrCode: LongInt): integer;var szErrMsg : string[100]; pszErrMsg : PChar; iRet : integer;begin {Checkeamos si se ha producido un error} If (lErrCode <> 0) Then begin pszErrMsg := @szErrMsg; DRV_GetErrorMessage(lErrCode, pszErrMsg); iRet := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); DoesErr := 1; end else DoesErr := 0;end;

{Funcion que se ejecuta al salir del programa}procedure TFunGenerador.Salir1Click(Sender: TObject);begin TerminateThread(ghThreadGetEvent, 0); CloseHandle(ghThreadGetEvent); globalFree(Hglobal(glpIntBuf)); {liberamos el buffer de datos creado}Close; {cerramos el programa}

end;

procedure TFunGenerador.ClaseSenalClick(Sender: TObject);beginTipoSenal1.show; {Muestra el formulario de seleccion de tipo de señal}end;

procedure TFunGenerador.Especificaciones1Click(Sender: TObject);begin

Esppcl.Show; {Muestra el formulario de las especificaciones delprograma}

Page 155: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

end;

procedure TFunGenerador.Amplitud1Click(Sender: TObject);beginAmplform.Show; {Muestra el formulario de espcificaciones de amplitud}end;

{gestiona la funcion de salvar la configuarcion actual }procedure TFunGenerador.Salvacalculo1Click(Sender: TObject);

Var evalbool:integer; PuntVar:String ; Contadors:Integer;begin{asignamos las variables a guardar para el calculo del periodo}memo1.clear;Form2.show;form2.bguard.show;form2.bresti.hide;

esppcl.definenummuestras.selectall;esppcl.definenummuestras.copytoclipboard; form2.editmuestras.clear; form2.editmuestras.pastefromclipboard;

esppcl.definenummuestras.selectall;esppcl.definenummuestras.copytoclipboard; form2.editmuestras.clear; form2.editmuestras.pastefromclipboard;

amplform.Tampsign.selectall;amplform.Tampsign.copytoclipboard;form2.editamplitud.clear;form2.EditAmplitud.pastefromclipboard;

amplform.edit1.selectall; amplform.edit1.copytoclipboard; form2.editoffset.clear; form2.editoffset.pastefromclipboard;

freccontrol.dutycicle.selectall;freccontrol.dutycicle.copytoclipboard; form2.editduty.clear;form2.editduty.pastefromclipboard;

freccontrol.selfrecuency.selectall; freccontrol.selfrecuency.copytoclipboard; form2.editfrecuencia.clear; form2.editfrecuencia.pastefromclipboard;

fungenerador.efunsel.selectall; fungenerador.efunsel.copytoclipboard; form2.editformaond.clear; form2.editformaond.pastefromclipboard;

Page 156: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

amplform.valspin.selectall; amplform.valspin.copytoclipboard;

form2.editampl_SEAL.CLEAR; form2.editampl_seal.pastefromclipboard;

tiposenal1.Enfun.selectall; tiposenal1.enfun.copytoclipboard; form2.editN_FUN.clear; form2.editN_FUN.pastefromclipboard;

amplform.N_amp.selectall; amplform.N_amp.copytoclipboard; form2.editn_amp.pastefromclipboard;

fungenerador.etipovoltaje.selectall; fungenerador.etipovoltaje.copytoclipboard; form2.editt_amp.clear; form2.editt_amp.pastefromclipboard;

fungenerador.evalorrangefre.selectall; fungenerador.evalorrangefre.copytoclipboard; form2.editt_fre.clear; form2.editt_fre.pastefromclipboard;

amplform.N_amp.selectall; amplform.N_amp.copytoclipboard; form2.editN_amp.clear; form2.editN_amp.pastefromclipboard;

{ if Selduty=true thenevalbool:=1elseevalbool:=0 ;

{ memo1.lines.add('valor de seleccion del duty:=');memo1.lines.add(IntTostr(evalbool)); }

if Inversion=true then {Evaluamos si hemos seleccionado la inversion iguardamos un dato en memo}evalbool:=1elseevalbool:=0;

if digdutycicle2=true thenevalbool:=1elseevalbool:=0 ;

{ memo1.lines.add('valor de seleccion del duty:=');memo1.lines.add(IntTostr(evalbool));

Page 157: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

if digInver=true then {Evaluamos si hemos seleccionado la inversion i guardamosun dato en memo}evalbool:=1{elseevalbool:=0; memo1.lines.add('valor de seleccion de Inversion digital:=');memo1.lines.add(IntTostr(evalbool)); {salvamos un entero para su posteriorconversion a true o false}

{Activamos el menu de salvar la función}

{ If CDSAvedialog1.Execute then

begin {try{ memo1.lines.SaveToFile(cdsavedialog1.filename);} {Intenta salvar los datos aun fichero selecconado} {Except On Exception do ShowMessage('Imposible realizar la grabacion'); end; } {end;}

end; {Esta funcion permite la visualizacion del calculo de la tabla de resultadoscalculados para un period dado}

procedure TFunGenerador.Vercalculo1Click(Sender: TObject); {Ejecuta}

VarContadors:Integer; Estado:boolean ; canal :Integer ;{variable que se usa para definir un canal selecciona} ValorEscalado:Real; Variable,Variable2:String ;PuntVar:^String ;beginApplication.CreateForm(TMiradatos,Miradatos);

{Calculamos un periodo de la funcion } {Rutina de verificacion conforme no se excede la frecquencia maximapermitida}

Estado:=ComparaPeriodos(TReloj,FrecSenal); If Estado=true then begin ShowMessage('Error:Frequencia General excesiva,Corrija por favor'); exit; end ;

{ Miradatos.Show; } if SeleccionaFuncion=1 then NumMuestra:=Nummuestra-2;

miscalculos2.Calculaperiodo(NumMuestra,Amplitud,AmplitudOffset,Acumulado,InVersion,Dutycicle,Resultado,FrecSenal,FrecMuestreo , SeleccionaFuncion, TablaValores,SelDuty); {Calcula el periodo de la funciongeneral}

Page 158: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

For Contadors:=0 to NumMuestra Do Begin canal:=ptaoconfig[0].chan; {assignamos Un canal de salida} Variable:=(formatfloat('0.0000',TablaValores[Contadors])); {Asignamos unvalor string a una variable de intercanvio}

ValorEscalado:=miscalculos.ValorEscala(ptAOConfig[canal].MaxValue,Amplitud,TablaValores[Contadors]); {Escalamos la salidapar convertirla de una funcion calculabipolar en una funcion unipolar} Variable2:=Formatfloat('0.0000',ValorEscalado); {Asignamos un valor stringa una variable de intercanvio} Miradatos.Introducedatos.Text:=Variable; {Asignamos lods valores escalados a una tabla} TablaValores2[Contadors]:=ValorEscalado; {Asignamos el valor escalado a unasegunda tabla} {Asigna compnentes string as la lista} Miradatos.ListaResultado.Items.add( Miradatos.Introducedatos.Text);{añadimos el valor tablavalores[i] a una listas} Miradatos.LstValorEscalado.Items.add(Variable2); Miradatos.Tclip.lines.add(Variable); {añadimos el valor tablavalores[i] auna listas} end; miradatos.Tclip.SelectAll; {los seleccionamo todo} miradatos. Tclip.CopyToClipboard; {Lo copiamos al clipboard de windows} miradatos.Tclip.Clear;{limpiamos la lista}

end;

{Al generar el menu se activa la siguiente funcion}

procedure TFunGenerador.FormCreate(Sender: TObject); var nm,i,n:integer;

begin

{Muestra el cuadro de dialogo del menu principal} Fungenerador.Enabled:=FALSE; Fungenerador.show; Entradatos2:=false; fungenerador.edit1.text:='No'; fungenerador.edit2.text:='No'; fungenerador.datclient.DDEService:='Genie'; fungenerador.datclient.DDETopic:='knostr'; fungenerador.ddeclientItem3.DDEITEM:='DDES1';{ fungenerador.ddeclientItem1.DDEITEM:='DDES2'; } fungenerador.ddeclientItem2.DDEITEM:='DDES5'; fungenerador.vercalculo1.visible:=true; if frmstart.chkeventenable.checked=false then begin fungenerador.abrir1.visible:=false; fungenerador.salvarsesion1.visible:=false; end else begin fungenerador.abrir1.visible:=true; fungenerador.salvarsesion1.visible:=false;

end;

Page 159: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

END;

{Al pulsar lanzar la aplicacion se establece el sigueinte codigo}

procedure TFunGenerador.Lanzar1Click(Sender: TObject);

var varcontador2:longint; hexdat:string; i,x,valoraperiodo2,valoraperiodo:Integer; creathrd:boolean; {variables para el calculo del periodo}Contadors:Integer; Estado:boolean ; canal :Integer ;{variable que se usa para definir un canal selecciona} ValorEscalado:Real; Variable,Variable2:String ;PuntVar:^String ;

{-----------------} begin {inicio funcion} { creathrd:=false; } valor:=0; CuentaMuestras:=0; acum:=0; cuentaticks:=0;

{calculamos el periodo cada vez que lanzamos la aplicacion}{--------------------------------------} fungenerador.vercalculo1.visible:=false; {_____________________________________________}

lanzar1.enabled:=false; {desactivamos la posibilidad de relanzar laaplicacion} reset1.enabled:=true; {Activamos la posibilidad de resetear la aplicacion} amplform.updown1.visible:=true;; if(amplform.checkbox1.checked=true or Tiposenal1.checkbox1.checked=true)then begin

if(TipoSenal1.Seleccionsenal.ItemIndex=0) then begin kf1:=calsqr[kft-alfa]; amplform.spinedit1.value:=calsqr[KFT-alfa]; amplform.checkbox1.checked:=FALSE;

lpAOVoltageOut1.OutputValue :=amplcuad[kft-alfa] ; lpAOVoltageOut1.chan := ptAOConfig[1].chan; AMPLFORM.updown1.position:=trunc(1000*lpAOVoltageOut1.OutputValue/(ptAOConfig[0].MaxValue*2.77)) ; end; if(TipoSenal1.Seleccionsenal.ItemIndex=3) then begin kf1:=calsen[kft-alfa]; amplform.spinedit1.value:=calsen[KFT-alfa]; lpAOVoltageOut1.OutputValue :=amplsin[kft-alfa] ; lpAOVoltageOut1.chan := ptAOConfig[1].chan; amplform.checkbox1.checked:=FALSE;

Page 160: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

AMPLFORM.updown1.position:=trunc(1000*lpAOVoltageOut1.OutputValue/(ptAOConfig[0].MaxValue*2.77)) ; end; if(TipoSenal1.Seleccionsenal.ItemIndex=2) then begin kf1:=calram[kft-alfa]; amplform.spinedit1.value:=calram[KFT-alfa]; lpAOVoltageOut1.OutputValue :=amplrampa[kft-alfa] ; lpAOVoltageOut1.chan := ptAOConfig[1].chan; AMPLFORM.updown1.position:=trunc(1000*lpAOVoltageOut1.OutputValue/(ptAOConfig[0].MaxValue*2.77)) ; amplform.checkbox1.checked:=FALSE; end; if(TipoSenal1.Seleccionsenal.ItemIndex=1) then begin

kf1:=caltri[kft-alfa]; amplform.spinedit1.value:=caltri[KFT-alfa]; lpAOVoltageOut1.OutputValue :=ampltri[kft-alfa]; lpAOVoltageOut1.chan := ptAOConfig[1].chan; amplform.checkbox1.checked:=FALSE; AMPLFORM.updown1.position:=trunc(1000*lpAOVoltageOut1.OutputValue/(ptAOConfig[0].MaxValue*2.77)) ; end;

end;

if(amplform.checkbox1.checked=false and Tiposenal1.checkbox1.checked=false)then

begin kf1:=amplform.spinedit1.value/100 ; end;

if chekfincuenta[0]=false then {Evalumaos si las condiciones delanzamiento de la aplicacion no estan inhibidas} begin {if SeleccionaFuncion=1 then NumMuestra:=Nummuestra/2; }

miscalculos2.Calculaperiodo(NumMuestra,Amplitud,AmplitudOffset,Acumulado,InVersion,Dutycicle,Resultado,FrecSenal,FrecMuestreo , SeleccionaFuncion, TablaValores,SelDuty); {Calculamos un periodocompleto y lo guardamos en una matriz de datos}

For Contadors:=0 to NumMuestra Do Begin canal:=ptaoconfig[0].chan; {Este bucle escala la tabla de valores en unanueva tabla para su correcta ejecucion en la salida de al pcl} Variable:=FloatToStr(TablaValores[Contadors]);

ValorEscalado:=miscalculos.ValorEscala(ptAOConfig[canal].MaxValue,Amplitud ,TablaValores[Contadors]); Variable2:=FloatToStr(ValorEscalado); Miradatos.Introducedatos.Text:=Variable; {Asignamos lods valores escalados a una tabla} TablaValores2[Contadors]:=ValorEscalado; end; {FINAL BUCLE FOR}

Page 161: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

{--------------------------------------------------------------------------------} For Contadors:=0 to NumMuestra Do {funcion interna de chequeo } Begin canal:=ptaoconfig[0].chan; Variable:=(formatfloat('0.0000',TablaValores[Contadors])); {Escalamos los valores i los asignamos a la tabla de valores escalados con lafuncion siguiente } {Function VALORESCALA(VALORNUMAX: SINGLE;VALORNUMAX2: SINGLE;VALORINTERMEDIO:REAL):REAL ;} ValorEscalado:=miscalculos.ValorEscala(ptAOConfig[canal].MaxValue,Amplitud ,TablaValores[Contadors]); Variable2:=Formatfloat('0.0000',ValorEscalado); Miradatos.Introducedatos.Text:=Variable; {Asignamos lods valores escalados a una tabla} TablaValores2[Contadors]:=ValorEscalado; {Asigna compnentes string as la lista} Miradatos.ListaResultado.Items.add( Miradatos.Introducedatos.Text); Miradatos.LstValorEscalado.Items.add(Variable2); Miradatos.Tclip.lines.add(Variable); end; {final bucle for}

With ptAItransfer do begin

overrun := @wOverrun; {salida overrun 1 si 0 no} count :=Nummuestra; {Numero de puntos a copiar del buffer fuente albuffer de datos} start := 0; {Start from buffer begging} DataType := 1; {tipos de datos a copiar en el buffer 0short 1 float} ActiveBuf := 0; {Single buffer}

{If want floating data} if DataType = 1 Then i := SizeOf(single) {Else need Raw data} else i := SizeOf(Word); GetMem(DataBuffer,i*nummuestra); {Alolocate memory for data} end;

{ p:=ptAItransfer.databuffer; }

{----------------------------------------------} VarContador:=CalculaNumeroReloj(Treloj,FrecMuestreo);{calculamos la realcionexistente entre la frecuencia de muestreo y el timer del reloj seleccionado} ValoraPeriodo:=trunc(1/(frecmuestreo)); {convertimos un frequencia a un numerentero} { Numerociclo:=trunc(frecmuestreo*valoraperiodo);

Page 162: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Numerociclo2:=0; }

begin if(valoraperiodo<>0) then NUMTIMER2[0]:=trunc(2000/valoraperiodo); {Asignamos un intervalo de muestrepar el contador de muestreo digital}; {Asignamos un intervalo de muestre par el contador de muestreo digital}

if frecmuestreo= 0 then {el periodo de muestreo no puede ser cero} begin

MessageDlg('El periodo no puede valer 0 ',mtWarning,[mbOK],0); Numtimer2[0]:=0; close; end;{FIN IF} if valoraperiodo= 0 then {la frecuencia de muestreo no puede ser cero} begin MessageDlg('Error en la frecuencia de muestreo ',mtWarning,[mbOK],0); Numtimer2[0]:=0; end; {FIN IF}

if numerociclo<1 then begin numtimer:=Varcontador; end Else begin Numtimer:=65535; end;

If((Numtimer2[0]=0) and (frmstart.chkeventenable.checked=false))then{El intervalo de muestreo del timer debe de ser mayor que 0} begin MessageDlg('Numero de muestras excesivo o frequencia demasiado altareduzca alguna de las dos variables ',mtWarning,[mbOK],0); ChekFinCuenta[0]:=true; activa1:=true; end;

{------------------------------------------------------------------------------------------}

if(NUMTIMER2[0]<>0) THEN {Si el intervalo de contador del timer esdiferente de ceros abrimos un canal de comunicacion con la tarjeta} begin

ErrCde := DRV_DeviceOpen(lpDeviceNum, DeviceHandle);

If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; end; {-------}

{--------} if(frmstart.chkeventenable.checked=true) then timer2.enabled:=false else

Page 163: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

timer2.interval:=NUMTIMER2[0]; timer2.enabled:=true;

end; end; {------------------------------------------------------------------}

if(frmstart.chkeventenable.checked=true) then begin {Creamos un buffer para almacenar datos} {----------------------------------------------------------------------} {esppcl.definenumMuestras.text:=inttostr(trunc(1/frecsenal)); } giConvCount:=strToINt(esppcl.definenumMuestras.text); glpIntBuf:=Pointer(GlobalAlloc(gptr,Sizeof(Word)*giconvCount));

if glpIntBuf=nil then begin

Application.MessageBox('Fallo de asignacion de memoria detransferencia','Error!!',MB_OK); Drv_DeviceClose(deviceHandle); end; {-----------------------------------------------------------------------------}

{Activamos caracteristicas de los eventos} {-------------------------------------------------------------------------- } with ptEnableEvent do begin

EventType:=ADS_EVT_INTERRUPT or ADS_EVT_Bufchange or ADS_EVT_Terminated or ADS_EVT_Overrun ;

Enabled:=word(frmstart.chkEventEnable.checked); count:={512;} (1); ErrCde := DRV_EnableEvent(DeviceHandle,ptEnableEvent);

If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); globalfree(hglobal(glpintbuf)); DRV_DeviceClose(DeviceHandle); Exit; end;{FIN IF}

end; {FIN WHIT}

{---------------------------------------------------------------------------}

{Inicializacion de la funcion de interrupcion del AI} {-----------------------------------------------------------------------} with ptAistart do begin trigSrc:=tipodedisparo; {DEFINE SI EL DISPARO ES EXTERNO O INTERN0}

Page 164: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

SampleRate:=trunc(1/frecmuestreo); {intervalo de muestreo} Chan:=10 ; {canal de adquisioion de datos} gain:=0; {codigo de ganancia} Buffer:=glpIntBuf ; {buffer asignado por el usuario} count:=giConvCount;{numero de muestras} cyclic:=word(frmstart.chkcyclic.checked) ; {muestreo ciclico si/no} Intrcount:=1; {interrupcion} end; {FIN WHIT}

{llamamos a la funcion Api drv_faiinstart}

{Inicializar structura de drv:check} {------------------------------------------------------------------------}

with ptAiCheck do begin ActiveBuf := @wactivebuf; stopped := @wStopped; retrieved := @lretrieved; overrun := @wOverrun; HalfReady := @wHalfready; end; {FIN WITH}

{----------------------------------------------------------------}

ErrCde:=drv_Faiintstart(devicehandle,ptaistart); If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; globalfree(hglobal(glpintbuf)); end; {FIN IF}

{Activamos el thread para obtener mensajes} {--------------------------------------------------------------------------}

if frmstart.chkeventEnable.checked=true then begin with tgetEvent.Create(lpDeviceNum ,(ptaistart.count*1000 div ptaistart.samplerate+1000) ,frmstart.chkcyclic.checked) do ghthreadGetevent:=handle; end; sleep(0); end; {FIN WITH}{end;}{00000000000000000000000000000000000000000000000} { end; } { if frmstart.chkeventEnable.checked=false then }

{00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000}

Page 165: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

{IF chekfincuenta[1]=false then begin VarContador:=CalculaNumeroReloj(Treloj,digcontrol.digfrecmuestrasenal); Numtimer2[1]:=Calculanumerotimer1(digfrecmuestrasenal*1000,1); END;}

{ If(Numtimer2[1]=0)then begin MessageDlg('Numero de muestras excesivo o frequencia demasiado altareduzca alguna de las dos variables ',mtWarning,[mbOK],0); { timer2.interval:=numtimer2[1]; } { timer2.Enabled:=False; } {ChekFinCuenta[1]:=true; activa1:=true; } { end;} end; if(NUMTIMER2[0]<>0) THEN begin

ErrCde := DRV_DeviceOpen(lpDeviceNum, DeviceHandle);

If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); amplform.updown1.visible:=false; Exit; end;

end; { digNumerocuenta:=0; } {asignamos el puerto del contador} { timer2.interval:=NUMTIMER2[1];} { timer2.enabled:=true; } { end; } { end; {FIN FUNCION}

{-------------------------------------------------------------------------------}

if contram.decideoffset=true then begin DRV_AOVoltageOut(DeviceHandle, lpAOVoltageOut1);

amplform.Edit1.text:=FloattoStrf(lpAOVoltageOut1.OutputValue,fffixed,5,4);

EOFFSETOUT.TEXT:=FloattoStrf(2.77*lpAOVoltageOut1.OutputValue,fffixed,5,4); end; end ;

procedure TFunGenerador.Reset1Click(Sender: TObject); {Esta funcion se ejecutauna puesta a cero de la comunicacion con la placa}

varbok:boolean;

Page 166: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

i:integer;

begin

lanzar1.enabled:=True; {Permite al activacion de lanzar} reset1.enabled:=False; {Deshabilita la posibilidad de volver a resetear} chekFinCuenta[0]:=false; chekfincuenta[1]:=true; timer2.Enabled:=False; {INActiva el timer de gestion de la salida digital} fungenerador.vercalculo1.visible:=true;

{finalizar el thread} if ghThreadGetEvent <> 0 then begin bOk := GetExitCodeThread(ghThreadGetEvent, i); if (i = STILL_ACTIVE) and (bOk = True) then begin TerminateThread(ghThreadGetEvent, 0); CloseHandle(ghThreadGetEvent); end; ghThreadGetEvent := 0; Sleep(0);

end; DRV_FAISTOP(DeviceHandle); globalfree(hglobal(glpintbuf)); DRV_DeviceClose(DeviceHandle); {cierra la comunicacion con la pcl} activa1:=true;

end;

procedure TFunGenerador.Digital1Click(Sender: TObject);begin Digform.show; {Muestra el formulario del control digital}end;

procedure TFunGenerador.General1Click(Sender: TObject);begin if(frmstart.chkeventenable.checked=true) then begin freccontrol.rfreq.show ; freccontrol.lasignanummuestra.hide; freccontrol.easignanummuestra.hide;

freccontrol.Selfrecuency.readonly:=true; end;

if(frmstart.chkeventenable.checked=false) then begin freccontrol.Selfrecuency.readonly:=false; freccontrol.rfreq.hide; freccontrol.lasignanummuestra.show; freccontrol.easignanummuestra.show; freccontrol.updown1.hide; end;

freccontrol.show; {Muestra el formulario de control de la frecuencia}

Page 167: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

end;

procedure TFunGenerador.ControlES1Click(Sender: TObject);beginFcones.show;

end;

{Procedimiento ejecutado por el timer ;se encarga de gestionar la salidadigit<l}

procedure TFunGenerador.Timer2Timer(Sender: TObject);

begin

{ timer2.interval:=NUMTIMER2[0]; } if(frmstart.chkeventenable.checked=true) then timer2.Enabled:=False else timer2.Enabled:=true; if chekfinCuenta[0]=true then {Minetras no solicitemos linhabilitacion} begin end; timer2.Enabled:=true; {El timer permanece activado}

fungespcl.EjecutaValorcuenta(unit1.TablaValores2,unit1.NumMuestra,unit1.CuentaMuestras);

{ if chekfinCuenta[1]=False then {Minetras no solicitemos linhabilitacion} { begin timer2.Enabled:=False; {El timer permanece activado} { exit; end;

lpAOVoltageOut1.OutputValue :=digTablaValores2[digNumerocuenta]; {Pone unvalor a la salida del buffer de vlotaje} {Sentencias de verificacion} {lpAOVoltageOut1.chan := ptAOConfig[1].chan; {Selecciona el canal por elque saldra dicho valor}

{ ErrCde := DRV_AOVoltageOut(DeviceHandle, lpAOVoltageOut1);{Ejecuat alfuncion poner nivel de voltaje a uns salida}

{ If (ErrCde <> 0) Then {En caso de error mostrar mensaje} {begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); DRV_DeviceClose(DeviceHandle); timer2.Enabled:=False; Exit; end;

Page 168: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

{digNumerocuenta:=strToINt(FUNGENERADOR.EdigValorcurso.Text); } { digNumeroCuenta:=digNumerocuenta+1 ; {Incrementar contador } {FUNGENERADOR.EdigValorcurso.Text:=formatfloat('0.000',digTablaValores2[digNumerocuenta]); {visualizar valoren un editor de fungenerador}

{ if digNumerocuenta>digNumMuestra then {Verifica si hemos llegado alfinal del muestreo} { begin {digNumerocuenta:=0 ; {Pone el contador de control del tipo de muestraal inicio}

{FUNGENERADOR.EdigValorcurso.Text:=formatfloat('0.000',digTablaValores2[digNumerocuenta]); {Visualiza el valor} {end; } end;

{Procedimiento de la carga de un fichero de configuracion de una sesion detrabajo}procedure TFunGenerador.Abrir1Click(Sender: TObject);varsel:integer;

begin memo1.clear; {Limpiamos el memo que utilizamo pra intercanviar datoscon el fichero} form2.show; form2.bguard.hide; form2.bresti.show;

end;

procedure TFunGenerador.UpDown1Click(Sender: TObject; Button: TUDBtnType);begin

lpAOVoltageOut1.OutputValue :=ptAOConfig[0].MaxValue*UpDown1.position/100; {Pone un valor a la salida del buffer de vlotaje} {Sentencias de verificacion} lpAOVoltageOut1.chan := ptAOConfig[1].chan; {Selecciona el canal porel que saldra dicho valor} Fungenerador.Edigvalorcurso.text:=FloattoStr(ptAOConfig[0].MaxValue*UpDown1.position/100);

ErrCde := DRV_AOVoltageOut(DeviceHandle, lpAOVoltageOut1);{Ejecuat alfuncion poner nivel de voltaje a uns salida}

If (ErrCde <> 0) Then {En caso de error mostrar mensaje} begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); DRV_DeviceClose(DeviceHandle); timer2.Enabled:=False; Exit; end;

Page 169: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Edigvalorcurso.Text:=FloatTostr(ptAOConfig[0].MaxValue*Updown1.position/100)end;

procedure TFunGenerador.Timer1Timer(Sender: TObject);

begin lthr:=linker.create(true); lthr.FreeOnTerminate := False;

fungenerador.datclient.Setlink('genie','knostr'); fungenerador.ddeclientitem1.ddeitem:='DDES2'; fungenerador.ddeclientitem3.ddeitem:='DDES1'; fungenerador.ddeclientitem2.ddeitem:='DDES3'; fungenerador.datclient.openlink; try with lthr do lthr.datob3:=ddeclientitem1.text; lthr.datob2:=ddeclientitem2.text; lthr.datob1:=ddeclientitem3.text;

lthr.Resume; except on EConvertError do ShowMessage('numero invalido!'); end; end;

procedure TFunGenerador.pruevasClick(Sender: TObject);beginform3.show ;end;

procedure TFunGenerador.AD1Click(Sender: TObject);beginform4.show;end;

Page 170: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

procedure TFunGenerador.Button1Click(Sender: TObject);begin{ if timer3.enabled=true then timer3.enabled:=false ; cancel:=true ; if timer3.enabled=false then timer3.enabled:=true ; cancel:=false ;}

end;

procedure TFunGenerador.Timer3Timer(Sender: TObject);begin if cancel=true then timer3.enabled:=false; if cancel=false then timer3.enabled:=true; p:=ptAItransfer.databuffer; {memo2.Lines.Clear ; } for ii:=0 to Nummuestra do begin if(ptAItransfer.datatype=1)then begin{ memo2.Lines.Append(FloatToStr(single(p^) )); } Longint(p) := Longint(p) + SizeOf(single);

end else begin {memo2.Lines.Append(INTTOHEX(word(p^),16) );} Longint(p) := Longint(p) + SizeOf(word);

end end;

end;

procedure TFunGenerador.DdeServerItem1Change(Sender: TObject);begin{ddeserveritem1.copytoclipboard;}end;

procedure TFunGenerador.Memo2Change(Sender: TObject);begin{ddeserveritem1.lines:=memo2.Lines; }end;

END.

Page 171: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para
Page 172: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Modulo de salida

Fungespcl.pas

Funcion: Conjunto de funciones encargadas de administrar la tarjeta PCL-812 a través de elprograma Driver.pas proporcionado por el fabricante el cual a su ves gestiona la libreríaADASAPI812.DLL o.

unit Fungespcl;

interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ExtCtrls,Global,Driver,Formstar,Formrun;

procedure Leecontador(Puertocontador:word;var datocontador:longint);

Page 173: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

procedure Escribecontador(Puertocontador:integer;datocontador:integer);

{procedure buclecuenta8253(Estadobucle:Array ofboolean;Periodo:longint;TablaValores:Array of Real; var NumMuestra:Integer ;VArNumerocuenta:Integer;var valor:longint; Var acumulador:longint;valormuestra:longint);}

Function CalculaNumerotimer1(TMuestra:Real;Muestraperiod:integer):LongInt; Procedure EjecutaValorcuenta(TablaValores:Array of Real;var Muestra:Integer;VAr Numerocuenta:Integer); Procedure DecideEstadoCuenta( ValorContador:longInt; ValorIntervalo:Longint;var SacarValor:Boolean); procedure Tforstart; procedure Tfrmrun(var Valorx:LongInt); procedure TforReset; Function CalculaNumeroReloj(Treloj:Single;TMuestra:Real):LongInt; procedure metodobucle;

var Response,valoroverflow : Integer;

implementation uses Unit1;

{ Produce un reset en un contador determinado}

procedure TforReset;

begin flagreset:=false; ErrCde := DRV_CounterReset(DeviceHandle,Frmstart.lstContador.ItemIndex); If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; end; if (ErrCde=0) then begin flagreset:=true; end; End;

{Este procedimiento inicializa el contador empieza a contar} procedure Tforstart; begin flagstart:=false; ptCounterEventStart.counter := Frmstart.lstContador.ItemIndex; { ptCounterEventStart.GateMode := Frmstart.lstGateMode.ItemIndex;} ErrCde :=DRV_CounterEventStart(DeviceHandle, ptCounterEventStart);

If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg);

Page 174: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; end; if (ErrCde=0) then begin flagstart:=true; end;

end;{Lee los valores del contador sin interrumpir la cuenta} procedure Tfrmrun(var Valorx:LongInt);var x:integer ; overflow : Integer; count : Longint;begin flagrun:=false; ptCounterEventRead.counter := ptCounterEventStart.counter; ptCounterEventRead.overflow := @overflow; ptCounterEventRead.count := @count; ErrCde := DRV_CounterEventRead(DeviceHandle, ptCounterEventRead);

If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; end ; if (ErrCde=0) then begin valorx:=ptcountereventread.count^; flagrun:=true;

end; end;

{Establecemos las condiciones para las que el contador para la cuenta y saca elresultado}

Procedure DecideEstadoCuenta( ValorContador:longInt; ValorIntervalo:Longint;var SacarValor:Boolean); {Esta funcion sacara un valor true si la diferencia enter el contador y elfinal de la cuenta es menor que el error establecido En caso contrario el valor es falso.}

Begin

If Valorcontador<=ValorIntervalo then begin Sacarvalor:=True end else Sacarvalor:=False;

End;

{Esta funcion en base a las variables de estado de cuenta final saca un valordado }

Page 175: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

Procedure EjecutaValorcuenta(TablaValores:Array of Real;var Muestra:Integer;VAr Numerocuenta:Integer);

Begin

lpAOVoltageOut.chan := ptAOConfig[0].chan; lpAOVoltageOut.OutputValue :=TablaValores[Numerocuenta]; {Sentencias de verificacion}

ErrCde := DRV_AOVoltageOut(DeviceHandle, lpAOVoltageOut);

If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); DRV_DeviceClose(DeviceHandle); Exit; end; { Numerocuenta:=strToINt(FUNGENERADOR.EValorcurso.Text); } NumeroCuenta:=Numerocuenta+1; FUNGENERADOR.EValorcurso.Text:=formatfloat('0.00000',TablaValores[Numerocuenta]); if Numerocuenta=Muestra then begin Numerocuenta:=0 ;

FUNGENERADOR.EValorcurso.Text:=formatfloat('0.00000',TablaValores[Numerocuenta]); end; { FUNGENERADOR.timer2.enabled:=true; } end; {Esta funcion escribe un dato en un puerto de salida los dastos debe serhexadecimales}

procedure Escribecontador(Puertocontador:integer;datocontador:integer); begin ptWriteportword.port:=puertocontador; ptWriteportword.WordData:=datocontador; ErrCde := DRV_WritePortWord(DeviceHandle, ptWriteportword);

If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; end; end;

procedure Leecontador(Puertocontador:word;var datocontador:longint);

VAR Worddata:longint; pworddata:^longint;

begin

Page 176: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

worddata:=0; ptReadportword.worddata:=longint(@datocontador); ptReadportword.port:=puertocontador; ErrCde := DRV_ReadPortWord(DeviceHandle, ptreadportword);

If (ErrCde <> 0) Then begin DRV_GetErrorMessage(ErrCde, pszErrMsg); Response := Application.MessageBox(pszErrMsg, 'Error!!', MB_OK); Exit; end; if (ErrCde=0)then begin longint(pworddata):=(ptReadportword.worddata); datocontador:=pworddata^;{ fungenerador.evalortiempo.text:=IntToStr(datocontador); }

end; end;

{Funcion cuya mision es calcular en base a una frequencia de mues- treo y en base a un intervalo de tiempo debemos obtener un numero longint que sirve como referencia de valor al contador de la placa tenemos un tiempo de reloj ,tenemos un intervalo de muestreo por lo tanto Tmuestra:=K*Treloj y Tmuestra siempre> Treloj k debe ser long int}

Function CalculaNumeroReloj(Treloj:Single;TMuestra:Real):LongInt;

Begin Result:=Trunc(abs(TMUestra/TRELOJ)); end;

{Esta funcio calcula el valor que debemos de introducir en base al numero demuestra que queremo por intervalo de frequencia de muestreo} Function CalculaNumerotimer1(TMuestra:Real;Muestraperiod:integer):LongInt;

Begin Result:=Trunc(abs(TMUestra/muestraperiod)); end;

{Realizacion de una funcion tal que´permite en base al estado de una variable Activar un bucle de llamada que controla el 8253 el objetivo de esta funciones conseguir activar desactivari,leer i manipular la informacion adquirida atraves del contador 0 de la placa pcl 812 La funcion biene controlada una variable de boolean que indica cuando debesalir del bucle el bucle se activa una vez inicializado el contador por medio de la funcionlanzar dicho bucle lee el valor con tfrmrun del contador lo compara con la frequ demuestreo si es igual pone el contador a cero i lo reinicializa implementado otra vezel contaje La funcion dispone de de las siguientes variables una variable boolean queactiva el bucle

Page 177: UN GENERADOR DE FUNCIONES DE M.B.F …deeea.urv.cat/public/PROPOSTES/pub/pdf/391pub.pdf · Amplificadores operacionales y circuitos Integrados lineales ... y la senoidal, ... (para

una varible de entrada tipo longint que es la frecuencia de muestreo,unvariable de contaje int que es el numero de veces que se realiza el bucle,dichavarible la genera el bucle en cada ciclo i sirve para que la funcion que controla la salida dela señal decida cuando a llegeado al final del muestreo i reinizialize el bucle,por lotanto el bucle recive una variable boolean de reinicio del contador i del bucle} {procedure buclecuenta8253(Estadobucle:Array ofboolean;Periodo:longint;TablaValores:Array of Real; var NumMuestra:Integer ;VArNumerocuenta:Integer;var valor:longint; Var acumulador:longint;valormuestra:longint);

var

x:Integer; salida:longint;

BEGIN

END; } {funcion para visualizar resultados}

procedure metodobucle;begin

while activa1=false dobegin if flagstart=true thenbeginfungespcl.tfrmrun(valor);if flagrun=true thenbegin VALOR:=ptCounterEventRead.count^ ;

{buclecuenta8253(activa1,chekfincuenta,Numtimer2,TablaValores2,NumMuestra,CuentaMuestras,valor,acum); newcontrolthrd.valor:=acum; newcontrolthrd.resume; }

end; end; end;end;

{Close device}{ GlobalFree(Longint(glpINtbuf)); DRV_DeviceClose(devicehandle);}{end; }

end.