Está en la página 1de 18

Instituto Balseiro

Servomecanismos.

Informe 1

Ortiz Villasuso, Hector Francisco.


Price Torrendell, Santiago

Miercoles 26 de febrero de 2020


Índice
1. Introducción 4

2. Trabajo Práctico 1 4
2.1. Medición del tiempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2. Temporización en intervalos discretos . . . . . . . . . . . . . . . . . . . . . . . . 4

3. Trabajo Práctico 2 6
3.1. Placa de adquisición USB-1208FS de Measurment Computing . . . . . . . . . . 6
3.2. Funciones para el manejo de la placa . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2.1. Inicialización de la placa . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2.2. Cerrado de la placa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2.3. Lectura de tensión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.2.4. Escritura de tensión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.3. Medición de tiempo de operaciones lectura y escritura analógicas . . . . . . . . . 7
3.4. Mediciones de ruido presente en salidas analógicas: . . . . . . . . . . . . . . . . 7

4. Trabajo Práctico 3 7
4.1. Funcion Senoidal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.2. Función Chirp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.3. Función secuencia pseudo aleatoria binaria . . . . . . . . . . . . . . . . . . . . . 9
4.4. Espectro de potencia de las funciones generadas . . . . . . . . . . . . . . . . . . 10
4.5. Muestreo de señales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.5.1. Muestreo señal senoidal . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.5.2. Muestreo señal triangular . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.6. Análisis espectral de las señales muestreadas . . . . . . . . . . . . . . . . . . . . 11

A. Anexo 1: Archivos de funciones y main 13


A.1. Archivo funciones.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
A.2. Main.c TP1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
A.3. Main.c TP2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
A.4. Main.c TP3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2
1. Introducción
En este informe se desarrollan las practicas 1, 2 y 3 realizadas durante la cátedra de ser-
vomecanismos. A continuación se explican cada una de las experiencias realizadas y el código
desarrollado.

2. Trabajo Práctico 1
En esta práctica, se analizaron las demoras asociadas al tiempo de ejecución de un cierto tipo
de instrucciones de manera cı́clica. Estos tiempos de procesamiento, inherente a las operaciones
necesarias que el ordenador debe realizar, son importantes de conocer dado que limitan la tasa
de variables a analizar. Para sistemas de tiempo real, esto fija un lı́mite superior respecto de la
frecuencia de muestreo de las mediciones que pueden ser adquiridas.

2.1. Medición del tiempo


A fin de realizar una medición del tiempo transcurrido en el programa, se llama a la función
gettimeofday al inicio y fin del listado de instrucciones a analizar. La misma retorna un valor de
tiempo transcurrido respecto a cierta referencia en una estructura que da una parte en segundos
y la fracción en microsegundos. Para obtener el tiempo transcurrido entre ambas llamadas, se
generó la función que toma ambos valores y retorna su diferencia en segundos.

2.2. Temporización en intervalos discretos


Se implementó una función que fija la duración en tiempo de cada bucle de trabajo. Para ello
se mide el tiempo transcurrido durante la instrucción mediante el procedimiento detallado en
la sección anterior, y luego se impone un retardo hasta alcanzar el tiempo deseado. Si el tiempo
de la instrucción excede el lı́mite impuesto no se impone demora y se pasa al siguiente ciclo.
Se muestra a modo de ejemplo un programa que ejecuta un bucle por segundo. La duración de
las instrucciones varı́a entre 0,5 y 0,8 segundos y son complementadas por cierta demora para
alcanzar el tiempo deseado, la excepción es el ciclo 6 donde las instrucciones se ejecutaron en
1,2 segundos y se ignoró la demora.

Figura 1: Ejemplo de bucle con control de tiempo.

Se puso a prueba esta implementación imponiendo distintos tiempos de ejecución para


generar y almacenar una variable aleatoria. Con tiempos del orden de los 50 milisegundos la

4
duración media del programa coincide con el valor impuesto, pero disminuyendo el periodo se
llega al punto que se pierde control sobre el tiempo del bucle, dado que los periodos de espera
resultan negativos. Esto se puede observar en los histogramas de la Figura 2. Para un tiempo de
muestreo de 5 mS se puede ver que el tiempo de demora es siempre positivo y ocupa gran parte
del ciclo de trabajo. Para 50 microsegundos se observa que en la mitad de los ciclos resultan
negativos y para 5 microsegundos se pierde el control temporal de los bucles.

Figura 2: Histograma de tiempos de espera a periodos de muestreo de 5 µs,50 µs y 5 mS.

Haciendo estadı́stica sobre el tiempo de los bucles se puede observar que la desviación
estandar aumenta en un orden de magnitud para tiempos menores a 100 µs como se observa
en la Figura 3.

Figura 3: Desviación estándar de duración de bucle a distintos tiempos

De lo observado, se verificó que pueden controlarse el tiempo de un set instrucciones hasta

5
500 µs. Dicho lı́mite no siempre es válido, dado que estará condicionado por la cantidad de
instrucciones que tenga el lazo.

3. Trabajo Práctico 2
En este trabajo por un lado se identificó la placa de adquisición que se va a utilizar en los
siguientes trabajos y se registraron sus caracterı́sticas y por otro se llevaron adelante funciones
que realizan las operaciones básicas para emplear una placa de adquisición USB-1208FS: inicio
y cierre de la placa, escritura de salidas analógicas y lectura de entradas analógicas. Para ello
se utilizó la biblioteca libmccusb y el API de usb-1208FS.c y sb-1208FS.h.

3.1. Placa de adquisición USB-1208FS de Measurment Computing


Esta placa es un dispositivo de adquisición de datos que entre sus caracterı́sticas se encuen-
tran:

8 canales de entrada analógica con 11 bits de resolución en modo SE o 12 en modo


diferencial, con rangos de ±20, ±10V, ±5V, ±2,5, ±2, ±1,25V, ±1V .

2 canales de 12 bits de salida analógica, con un rango de 0 a 4.096V

16 canales de entrada/salida digital.

3.2. Funciones para el manejo de la placa


Se realizo un conjunto de funciones para el manejo de la placa, las cuales se declararon
primero en un archivo de cabecera funciones.h y posteriormente se implementaron en un archivo
.c que se adjunta en el anexo A.1 y se detallan a continuación.

3.2.1. Inicialización de la placa


Todo el proceso de inicialización de la placa se realiza con la función placa adq ini. La misma
recibe un doble puntero a libusb device handle cuyo contenido es de esperarse que sea nulo,
realiza toda la inicialización de los puertos y le asigna un el valor del handle correspondiente.

3.2.2. Cerrado de la placa


Esta función recibe un puntero a libusb device handle, reinicia la placa y pone todas las
salidas a cero para finalmente cerrar con el comando de cierre de la librerı́a de la placa.

3.2.3. Lectura de tensión


Para la lectura de tensión se implemento la función lee tension, que recibe el canal por el
cual se desea leer, la ganancia que corresponde al tipo de rango en el que se lee y el handle al
dispositivo y devuelve el valor de tensión leı́do.

3.2.4. Escritura de tensión


La escritura de tensión en el puerto analógico se implemento en la función escribe tension
que recibe la tensión que se quiere escribir, el canal del puerto analógico y el handle al dispo-
sitivo.

6
3.3. Medición de tiempo de operaciones lectura y escritura analógi-
cas
Se realizaron dichas mediciones usando la misma metodologı́a que la práctica anterior, calcu-
lando la diferencia de evaluar gettimeofday al inicio y final de las instrucciones correspondientes.
Evaluando 1000 operaciones de lectura y de escritura se tiene que la demora media para leer
una variable analógica es 3 ± 0,02ms y para escribir 1 ± 0,05ms. Para el caso de la escritura,
midiendo la salida analógica del osciloscopio en una región de transición el tiempo de transición
es de 7 µs como se muestra en la Figura 4.

Figura 4: Transición de estado en salida digital medida por osciloscopio

Dicha demora es varios ordenes de magnitud menor al valor hallado por software. Esto
ocurre porque en el segundo caso se ejecutan instrucciones que no son visibles por el usuario
pero son necesarias para cambiar una variable. Un ejemplo de esto es la revisión de errores
durante la ejecución del programa.

3.4. Mediciones de ruido presente en salidas analógicas:


A fin de caracterizar las mediciones de la placa, se estudió el ruido presente en varias entradas
analógicas manteniendo en las mismas un valor de tensión contante. Se tomaron 1000 lecturas
en los canales 0, 1 y 2 imponiendo una tensión de 0 y 2V. Para cada caso el valor RMS del ruido
resultó inferior a 5 mV, que está en el orden de un bit. En la Figura 5 se puede ver también que
el ruido presente es del orden de una cuenta dado que son menores a los 10 mV de resolución
y poseen una duración de un periodo de muestreo.

4. Trabajo Práctico 3
Tres funciones importantes en el desarrollo de la materia son la función senoidal, la chirp y
la secuencia binaria pseudo aleatoria. En este trabajo se implementaron estas funciones en C
para luego analizar su desempeño. El código asociado a las mismas se puede ver en el anexo
A.1. A continuación se detallan cada una de las funciones y su implementación.

7
Figura 5: Lectura de entrada analógica a 0V durante 3 segundos

4.1. Funcion Senoidal


La función senoidal esta dada por la ecuación:

V = V0 sin(ωt) + V0 (4.1)
donde V0 es la amplitud de la señal.
Esta función se implemento en C y se utilizó un bucle controlado para guardar los valores
de salida de la misma para luego analizar su desempeño.
Los valores obtenidos se muestran en la figura 6. Se utilizó una frecuencia de muestreo de
1kHz y la frecuencia de la señal senoidal de 100 Hz.

Figura 6: Gráfico de la función senoidal implementada.

4.2. Función Chirp


La función chirp esta dada por la ecuación:

V = V (t)sin(ω(t)t) − cte (4.2)


donde V (t) esta definida como:

8

 V0 ∗ t/t0 de t = 0 a t = t0
V (t) = V0 de t = t0 a t = t1
V0 ∗ (t2 − t)/(t2 − t1) de t = t1 a t = t2

,
t2 es la duración total de la chirp, t0 = 0,1 ∗ t2 , t1 = 0,9 ∗ t2 y ω(t) = wo + t/t2 ∗ (ω1 − ω0 ),
con ω1 y ω0 el rango de frecuencias de la chirp.
Se realizó un programa con un bucle controlado de frecuencia 1kHz para ensayar la función.
A la misma se la configuró con un rango de frecuencias de 1 a 50 Hz y una amplitud V 0 = 5.
Los resultados obtenidos se pueden observar en la figura 7.

Figura 7: Salida de la función chirp desarrolada.

4.3. Función secuencia pseudo aleatoria binaria


El objetivo de esta función es generar una secuencia binaria de pulsos que oscilan entre 0 y
V 0 cuya duración es aleatoria entre un valor mı́nimo y uno máximo.
La salida de la función se puede ver en la figura 8, donde se puede observar que los valores
oscilan entre 0 y 5 y la duración de cada uno es aleatoria entre 5 y 20 ms. Para implementar la
pseudo aleatoriedad se utilizó la función rand() de la libreria stdlib.c.

Figura 8: Salida de la función pseudo aleatoria desarrollada.

9
4.4. Espectro de potencia de las funciones generadas
Se calculó el espectro de potencia de las funciones realizadas y se las graficó en la figura 9.
En la misma se puede ver como en la senoidal aparece un pico que coincide con la frecuencia
de generación de la onda (100Hz).
En el caso de la chirp, se puede observar una meseta que va desde aproximadamente 10Hz
hasta 90 Hz, un poco menor al doble ancho de banda que se configuró (49Hz). Esto coincide con
lo que se esperarı́a de la función chirp ya que al tener una función cuadrática en el tiempo en
el argumento de la función seno (dado que la frecuencia instantánea es la derivada del mismo).

Figura 9: Espectro de potencia de las funciones desarrolladas.

En el espectro de potencia de la secuencia binaria pseudo aleatoria se observa que el mismo


permanece aproximadamente constante por encima de los 100 Hz. Cabe destacar que al ser
pseudo aleatoria, este espectro de potencia depende fuertemente de la semilla con la que se
inicializa el algoritmo pseudoaleatorio.

10
4.5. Muestreo de señales
Se realizó el muestreo de dos tipos de señales, una senoidal y una triangular. A continuación
se detalla el proceso de ambas.

4.5.1. Muestreo señal senoidal


La señal senoidal se genero con un generador de onda que permitı́a configurar tanto la
frecuencia como la amplitud de la misma. Además permitı́a regular la deformación de la onda,
por lo que la forma senoidal se terminaba de configura a .ojo”. La señal de salida del generador
se visualizó con un osciloscopio (ver figura 11) y del cual se determino que la frecuencia es de
aproximadamente 4 Hz.
Posteriormente se muestreo la señal con la placa de adquisición y una frecuencia de muestreo
de 100Hz, el valor de la misma se eligio para que la frecuencia de la senoidal sea al menos 10
veces menor a fS /2.

4.5.2. Muestreo señal triangular


Con la señal triangular se realizó el mismo proceso, la señal generada se puede ver en la
figura 10. Una señal triangular con una frecuencia de aproximadamente 4Hz.
También se muestreo con la placa de adquisición y una frecuencia de muestreo de 100 Hz.

Figura 10: Señal triangular muestreada Figura 11: Señal senoidal muestreada me-
medida con osciloscopio. dida con osciloscopio.

4.6. Análisis espectral de las señales muestreadas


Para el análisis espectral de las señales se utilizó una discretización temporal de 0.01 se-
gundos (100Hz) y se midió durante 10 segundos (1000 puntos). Es importante destacar que
esta frecuencia se eligió de modo tal que la frecuencia de nyquist este una decada por encima
del primer armónico (4 Hz) y el tiempo de muestreo permita observar varios ciclos. Con esta
configuración se obtuvo el espectro de potencias de las mismas que se puede observar en la
figura 12. En la misma se observa que en la señal senoidal se ve un pico correspondiente a los
4Hz y luego disminuye de forma abrupta siguiendo un pico a aproximadamente 8Hz (el doble
del primer armónico).
En el caso de la señal triangular el mayor pico se observa también a 4Hz pero también se
observan picos a mayores frecuencias.

11
Figura 12: Espectro de potencia de las señales muestreadas.

12
A. Anexo 1: Archivos de funciones y main
A.1. Archivo funciones.c
#include < s t d l i b . h>
#include <s t d i o . h>
#include <s t r i n g . h>
#include <u n i s t d . h>
#include <time . h>
#include < f c n t l . h>
#include <c t y p e . h>
#include <s t d i n t . h>
#include <math . h>
#include <s t d b o o l . h>

#include ”pmd . h”
#include ” usb 1 2 0 8 FS . h”
#include ” f u n c i o n e s . h”

void p l a c a a d q i n i t ( l i b u s b d e v i c e h a n d l e ∗∗ udev ) {
int r e t ;
r e t = l i b u s b i n i t (NULL) ;
i f ( r e t < 0) {
perror ( ” l i b u s b i n i t : Failed to i n i t i a l i z e l i b u s b ” ) ;
exit (1) ;
}
i f ( ( ∗ udev = usb device find USB MCC ( USB1208FS PID , NULL) ) ) {
p r i n t f ( ”USB 1 2 0 8 FS D ev ic e i s found ! \ n” ) ;
init USB1208FS ( ∗ udev ) ;
} else {
p r i n t f ( ”No d e v i c e found . \ n” ) ;
exit (0) ;
}
/∗ c o n f i g mask 0 x01 means a l l i n p u t s ∗/
usbDConfigPort USB1208FS ( ∗ udev , DIO PORTA, DIO DIR OUT) ;
usbDConfigPort USB1208FS ( ∗ udev , DIO PORTB, DIO DIR IN ) ;
usbDOut USB1208FS ( ∗ udev , DIO PORTA, 0 ) ;
usbDOut USB1208FS ( ∗ udev , DIO PORTA, 0 ) ;
}
void p l a c a a d q s h u t d o w n ( l i b u s b d e v i c e h a n d l e ∗ udev )
{
usbReset USB1208FS ( udev ) ;
int i =0;
l i b u s b c l e a r h a l t ( udev , LIBUSB ENDPOINT IN | 1 ) ;
l i b u s b c l e a r h a l t ( udev , LIBUSB ENDPOINT OUT | 2 ) ;
l i b u s b c l e a r h a l t ( udev , LIBUSB ENDPOINT IN | 3 ) ;
l i b u s b c l e a r h a l t ( udev , LIBUSB ENDPOINT IN | 4 ) ;
l i b u s b c l e a r h a l t ( udev , LIBUSB ENDPOINT IN | 5 ) ;
f o r ( i = 0 ; i < 4 ; i ++) {
l i b u s b r e l e a s e i n t e r f a c e ( udev , i ) ;
}
l i b u s b c l o s e ( udev ) ;

}
double l e e t e n s i o n ( u i n t 8 t channel , u i n t 8 t gain , l i b u s b d e v i c e h a n d l e ∗ udev )
{
return v o l t s S E ( usbAIn USB1208FS ( udev , channel , g a i n ) ) ;
}
void e s c r i b e t e n s i o n ( double t e n s i o n , u i n t 8 t channel , l i b u s b d e v i c e h a n d l e ∗ udev )

13
{
usbAOut USB1208FS ( udev , channel , ( u i n t 1 6 t ) t e n s i o n ∗ 1 0 0 0 ) ;
}

double r e s t a t i m e v a l ( struct t i m e v a l ∗ t1 , struct t i m e v a l ∗ t 0 ) {


return ( t1 > t v s e c t0 > t v s e c ) +(t1 > t v u s e c t0 > t v u s e c ) / 1 0 0 0 0 0 0 . 0 ;
}

double e s p e r a s i g u i e n t e i n t e r v a l o ( struct t i m e v a l ∗ t0 , int n , double dt ) {


double t e s ;
struct t i m e v a l t a ;
struct t i m e s p e c t s ;
g e t t i m e o f d a y (&ta ,NULL) ;
t e s = ( double ) n∗ dt+(t0 > t v s e c+t0 > t v u s e c ∗1 e 6 ) ( t a . t v s e c+t a . t v u s e c
∗1 e 6 ) ;
i f ( t e s >0.0) {
t s . t v s e c = ( int ) t e s ;
t s . t v n s e c = ( t e s t s . t v s e c ) ∗1 e9 ;
n a n o s l e e p (& t s ,NULL) ;
}
return t e s ;
}

double f u n c i o n s e n o ( double Vo , double w, double t ) {


return Vo∗(1+ s i n ( 2 ∗ M PI∗w∗ t ) ) ;
}

double f u n c i o n c h i r p ( double Vo , double w0 , double w1 , double t , int n , double dt


){
double V;
int n0 , n1 , n2 , n a c t u a l ;
n a c t u a l = t / dt ;
n2 = pow ( 2 , n ) ;
n0 = 0 . 1 ∗ n2 ;
n1 = n2 n0 ;
i f ( n a c t u a l <= n0 ) V=Vo ∗ 1 . 0 ∗ n a c t u a l /n0 ;
e l s e i f ( n a c t u a l >= n1 ) V=Vo∗ ( n2 n a c t u a l ) ∗ 1 . 0 / ( n2 n1 ) ;
e l s e V = Vo ;
return V∗ s i n ( ( w0+(1.0∗ n a c t u a l /n2 ) ∗ (w1 w0) ) ∗2∗M PI∗ t )+Vo ;
}

void f u n c i o n r a n d o m ( double Vo , double t 0 , double t 1 , double dt , int seed ,


double v a l o r [ ] , int n )
{
int i , j , num max ,NMUESTRAS;
NMUESTRAS= pow ( 2 , n ) ; // 255
int randSeq [NMUESTRAS ] ;
bool f l a g = true ;
num max = t 1 / dt t 0 / dt ;
srand ( seed ) ;
randSeq [ 0 ] = rand ( ) % ( num max+1)+t 0 / dt ;
i = 0;
j = 0;
while ( randSeq [ i ]<NMUESTRAS) {
i ++;
randSeq [ i ] = randSeq [ i 1 ] +rand ( ) % ( num max+1)+t 0 / dt ;
}
f o r ( i =0; i <NMUESTRAS; i ++) {

14
i f ( i == randSeq [ j ]){
j ++;
flag = ! flag ;
}
i f ( flag ) valor [ i ] = Vo ;
else valor [ i ] = 0;
}
}

A.2. Main.c TP1


#include ” f u n c i o n e s . h”
#include <s t d i o . h>
#include < s t d l i b . h>
#define NMUESTRAS 1000
int main ( int argc , char ∗ argv [ ] ) {
// P r e p a r a c i o n p r e v i a a l e x p e r i m e n t o
int i ;
double dt = 0 . 0 0 0 0 0 5 ; // 0 . 0 0 0 0 5 0

double t e [NMUESTRAS] , t [NMUESTRAS ] ;


struct t i m e v a l t0 , t i ;
// Comienzo de e x p e r i m e n t o
g e t t i m e o f d a y (&t0 ,NULL) ;
f o r ( i =0; i <NMUESTRAS; i ++) {
// Bucle C o n t r o l a d o
g e t t i m e o f d a y (& t i ,NULL) ;
t [ i ] = r e s t a t i m e v a l (& t i ,& t 0 ) ;
// p r i n t f (” % f \n ” , r e s t a t i m e v a l (& t i ,& t 0 ) ) ;
// Acciones
t e [ i ] = e s p e r a s i g u i e n t e i n t e r v a l o (&t0 , i +1, dt ) ;
}
f o r ( i =0; i <NMUESTRAS; i ++){
p r i n t f ( ” %f \ t %f \n” , t e [ i ] , t [ i ] ) ;
}
// p o s t p r o c e s a m i e n t o de r e s u l t a d o s
return 0 ;
}

A.3. Main.c TP2


#include < s t d l i b . h>
#include <s t d i o . h>
#include <s t r i n g . h>
#include <u n i s t d . h>
#include <time . h>
#include < f c n t l . h>
#include <c t y p e . h>
#include <s t d i n t . h>
#define NCICLOS 1000
#include ”pmd . h”
#include ” usb 1 2 0 8 FS . h”
#include ” f u n c i o n e s . h”

int main ( void )


{

15
int i =0;
double t e n s i o n = 4 . 0 ;
u i n t 8 t channel = 3 ;
double t e [ NCICLOS ] , t f [ NCICLOS ] , v [ NCICLOS ] ;
struct t i m e v a l t0 , t ;
l i b u s b d e v i c e h a n d l e ∗ udev = NULL;
p l a c a a d q i n i t (&udev ) ;

g e t t i m e o f d a y (&t0 ,NULL) ;

while ( i <NCICLOS) {
/∗
e s c r i b e t e n s i o n ( 0 . 0 , channel , udev ) ;

e s c r i b e t e n s i o n ( t e n s i o n , channel , udev ) ;
∗/
// e s c r i b e t e n s i o n ( t e n s i o n , channel , udev ) ;
v [ i ]= l e e t e n s i o n ( channel , SE 10 00V , udev ) ;
g e t t i m e o f d a y (&t ,NULL) ;
t f [ i ]= r e s t a t i m e v a l (&t ,& t 0 ) ;
e s c r i b e t e n s i o n ( t e n s i o n , channel , udev ) ;
g e t t i m e o f d a y (&t ,NULL) ;
t e [ i ]= r e s t a t i m e v a l (&t ,& t 0 ) ;
g e t t i m e o f d a y (&t0 ,NULL) ;
l e e t e n s i o n ( channel , SE 10 00V , udev ) ;
g e t t i m e o f d a y (&t ,NULL) ;
t f [ i ]= r e s t a t i m e v a l (&t ,& t 0 ) ; ∗ /
i ++;
}
f o r ( i =0; i <NCICLOS ; i ++){
p r i n t f ( ” %f \ t %f \n” , t f [ i ] , v [ i ] ) ;
}
p l a c a a d q s h u t d o w n ( udev ) ;
return 0 ;
}

A.4. Main.c TP3


#include ” f u n c i o n e s . h”
#include <s t d i o . h>
#include < s t d l i b . h>
#include <math . h>
#include <s t d b o o l . h>
#define N 10
#define SEED 123

int main ( int argc , char ∗ argv [ ] ) {


// P r e p a r a c i o n p r e v i a a l e x p e r i m e n t o
int i ,NMUESTRAS, Vo ;
double te , dt = 0 . 0 0 1 ;
NMUESTRAS= pow ( 2 ,N) ; // 255
double v a l o r [NMUESTRAS] , t 0 , t 1 ;
t 0 = 5∗ dt ;
t 1 = 20∗ dt ;
Vo=5;

// funcion random (Vo , t 0 , t 1 , dt , SEED, v a l o r , N) ;

16
struct t i m e v a l t0 , t i ;
// Comienzo de e x p e r i m e n t o
g e t t i m e o f d a y (&t0 ,NULL) ;
f o r ( i =0; i <NMUESTRAS; i ++) {
// Bucle C o n t r o l a d o
g e t t i m e o f d a y (& t i ,NULL) ;
// Acciones
// v a l o r [ i ]= f u n c i o n s e n o ( 5 , 100 , i ∗ d t ) ;
v a l o r [ i ] = f u n c i o n c h i r p ( 5 , 1 , 5 0 , i ∗ dt , N, dt ) ;
t e = e s p e r a s i g u i e n t e i n t e r v a l o (&t0 , i +1, dt ) ;
}

f o r ( i =0; i <NMUESTRAS; i ++){


p r i n t f ( ” %f \n” , v a l o r [ i ] ) ;
}
// p o s t p r o c e s a m i e n t o de r e s u l t a d o s
return 0 ;
}

17

También podría gustarte