viernes, 21 de abril de 2017

Programa para medir el resistencia a 4 puntas de un multimetro digital contra la temperatura

/*  Programa para medir el resistencia a 4 puntas de un multimetro digital
contra la temperatura Luis M. Le¢n, 23 de  marzo 1998 */

#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <graphics.h>  /*Para el manejo de los graficos*/
#include <dos.h> /* Para manejar el tiempo con la funci¢n delay() */
#include "c_hpib.h"

int controlador = DETECT; /*Detecta la tarjeta grafica presente*/
int modo;      /*No se especifica el modo, para que sea detectado*/
int erro;     /*Para el manejor de errores*/

  long    dc;                    /* tarjeta */
  long    dvm1;                  /* multimetro 7 resistencia*/
  long    dvm2;                  /* multimetro 8 voltaje */
 FILE *f1;
 char arch[]="voltaje.dat";     /*Nombre del archivo donde se guardan datos*/

 char arch1[]="resisten.dat";     /*Nombre del archivo donde se guardan datos*/

/* declaracion de rutina de manejo de errores */
void M_errores(int error, char* rutina);

/*declaracion de rutina para dibujar*/
void dibuja(void);

/*Inicializacion del modo grafico*/
void Initialize(void);

int GraphDriver;     /* Manejador del aparato gr fico  */
int GraphMode;       /* Valores del modo gr fico       */
double AspectRatio;  /* Razon de aspectos de un pixel en la pantalla */
int MaxX,MaxY;       /* Maxima resoluci¢n de la pantalla             */
int MaxColors;       /* Maximo # de colores posibles                 */
int ErrorCode;       /* Reporta algun error en la gr fica            */
struct palettetype palette; /* Usado para leer el informe de la paleta */
void Initialize(void);

/*Graficacion de los puntos*/
void puntos(void);

float lapso, lapso2, res_max, res_min ;
float temp_max, temp_min ;
float tiem_max;
int st;
float deltay, deltax ;
float deltay_pixel, deltax_pixel ;
float *lec1;
float *lec2;
/*float *lec3;*/

      float datox[1000], datoy[1000] ;
FILE *tabla ;
double temp ;
char file_name [80] ;
char texto1[50];
char texto2[50];
char texto3[10];

main ()

{

char *codigo;
char codigo1[80];
char texto[50];
int cdatos=1000000;  /*El n£mero maximo de datos a adquirir*/
int error ;
int i,ciclo ;
char funcion ;
char nombre_archivo[80], nombre_archivo1[80] ;


/*Presentaci¢n*/

system("cls");
printf("\n                    **********");
printf("\n   *****    LABORATORIO DE FISICA MODERNA    *****");
printf("\n   *****     FACULTAD DE CIENCIAS, UNAM.     *****");
printf("\n   *****        23 DE MARZO DE 1998.         *****");
printf("\n                    **********");
printf("\n");
printf("\n\t\t**********");

printf("\n¨Que deseas medir?:");
printf("\n Oprimir la tecla (v) para voltaje, (r) para resitencia a 4 puntas\n");
printf("\n en funci¢n de la temperatura ¢ (t) para voltaje en funci¢n del tiempo\n");
while ((funcion = getch()) != 'v' && funcion != 'r' && funcion != 'V' && funcion != 'R' && funcion != 't' && funcion != 'T');
{
printf("\n¨Que deseas medir?:");
printf("\n Oprimir la tecla (v) para voltaje, (r) para resitencia a 4 puntas\n");
printf("\n en funci¢n de la temperatura ¢ (t) para voltaje en funci¢n del tiempo\n");
}
printf("\n\t\t**********");

printf("\n Direcci¢n de los voltmetros: voltaje o resistencia (7) , temperatura (8) y para voltaje v.s. tiempo (8)");

printf("\n\t\t**********");

printf("\n Oprima cualquier tecla para terminar la adquisici¢n de datos.");

printf("\n\t\t**********");

printf("\n Los valores de los datos adquiridos se muestran en la pantalla");

printf("\n\t\t**********");

printf("\n ¨Cada cuanto tiempo (segundos) quiere tomar datos (>=1)?: ");
scanf("%f",&lapso);

printf("\n\t\t**********");

printf("\n¨Cu nto tiempo (segundos) quiere que dure el experimento?: ");
scanf("%f",&tiem_max);

printf("\n\t\t**********");

/* Para graficar en el eje X */

if(funcion == 'v' || funcion == 'V' || funcion == 'r' || funcion == 'R'){
printf("\nValor m¡nimo y m ximo de la Temperatura (K) en la gr fica?\n" );
printf("\nmin,max:  " );
scanf("%f,%f", &temp_min, &temp_max);
}

if(funcion == 't' || funcion == 'T'){
temp_min = 0 ;
 temp_max = tiem_max ;
}

printf("\n\t\t**********");

/* Para graficar en el eje Y */
if(funcion == 'v' || funcion == 'V' || funcion == 't' || funcion == 'T'){

  printf("\nValor m¡nimo y m ximo del Voltaje (Volts) en la gr fica?\n" );
   printf("\nmin,max:  " );
    scanf("%f,%f", &res_min, &res_max);
}

printf("\n\t\t**********");

if(funcion == 'r' || funcion == 'R'){
  printf("\nValor m¡nimo y m ximo de la Resistencia (Ohm) en la gr fica?\n" );
   printf("\nmin,max:  " );
    scanf("%f,%f", &res_min, &res_max);
}

printf("\n\t\t**********");

if((codigo=(char *)malloc(sizeof(char)*100))==NULL){
exit(1);
   }

/*** En todos programas hay que alojar exactamnete en la memoria un valor
 del puntero */


printf("\nDame el nombre del archivo a donde vas a guardar tus datos con extensi¢n (.dat):");
scanf("%s", &nombre_archivo1);
strcpy(nombre_archivo,"");
 strcat(nombre_archivo, nombre_archivo1);

      if((f1=fopen(nombre_archivo,"w"))==NULL){
printf("Error no se puede abrir el archivo %s. \n",arch);
exit(0);
      }

Initialize();

      if((lec1=(float *)malloc(sizeof(float)*cdatos))==NULL){
printf("No hay memoria para alojar datos.\n");
exit(1);
}

      if((lec2=(float *)malloc(sizeof(float)*cdatos))==NULL){
printf("No hay memoria para alojar datos.\n");
exit(1);
}

     /* if((lec3=(float *)malloc(sizeof(float)*cdatos))==NULL){
printf("No hay memoria para alojar datos.\n");
exit(1);
}       */

/*******/

  dc=7L;                 /* tarjeta */
  dvm2=708L;             /* Voltmetro digital HP 34401A, voltaje. */
  dvm1=707L;             /* Voltmetro digital HP 34401A, resistencia. */

      error=IORESET(dc);
M_errores(error,"IORESET");

if(funcion == 'v' || funcion == 'V' || funcion == 'r' || funcion == 'R'){

error=IOCLEAR(dvm1);
M_errores(error,"IOCLEAR dvm1");

if(funcion == 'v' || funcion == 'V'){
strcpy(codigo1,"CONF:VOLT:DC");
}

if(funcion == 'r' || funcion == 'R'){
strcpy(codigo1,"CONF:FRES");
}

IOOUTPUTS(dvm1,codigo1,strlen(codigo1));   /* configura el instrumento
para medir voltaje o resistencia
directos */
}

      error=IOCLEAR(dvm2);
M_errores(error,"IOCLEAR dvm2");

strcpy(codigo1,"CONF:VOLT:DC");
      IOOUTPUTS(dvm2,codigo1,strlen(codigo1));   /*configura el instrumento
para medir voltaje
directos*/

dibuja();
st=0;
setcolor(WHITE);

if(funcion == 'v' || funcion == 'V' || funcion == 'r' || funcion == 'R'){
outtextxy(101,4,"Temperatura (K)");
outtextxy(((getmaxx()-50)/2)-9,getmaxy()-10,"Temperatura (K)");
}

if(funcion == 't' || funcion == 'T'){
outtextxy(101,4,"Tiempo (seg)");
outtextxy(((getmaxx()-50)/2)-9,getmaxy()-10,"Tiempo (seg)");
}

if(funcion == 'v' || funcion == 'V' || funcion == 't' || funcion == 'T'){
outtextxy(245,4,"Voltaje (Volts)");
}
if(funcion == 'r' || funcion == 'R'){
outtextxy(245,4,"Resistencia (Ohm)");
}

/* Despliega la escala en el eje X */

      deltax = (temp_max-temp_min)/5 ;

      deltax_pixel = (getmaxx()-120)/5 ;

      for(ciclo=0;ciclo<=5;ciclo++){

 sprintf(texto1,"%3.0f",temp_min+(ciclo*deltax));
  settextstyle(GOTHIC_FONT, HORIZ_DIR,1);
  setusercharsize(2,1,3,1);
  outtextxy((ciclo*deltax_pixel)+81+(2*ciclo),getmaxy()-26,texto1);

    }

/* Despliega la escala en el eje Y */

      deltay = (res_max-res_min)/5 ;

   deltay_pixel = (getmaxy()-45)/5 ;

      for(ciclo=0;ciclo<=5;ciclo++){

 sprintf(texto1,"%3.6f",res_min+(ciclo*deltay));
  settextstyle(GOTHIC_FONT, HORIZ_DIR,1);
  setusercharsize(2,1,3,1);
  outtextxy(25,(5-ciclo)*deltay_pixel+12,texto1);

    }

/* outtextxy(getmaxx()/2,getmaxy()/2,"Resistencia (Ohm)");  */
/* settextstyle(DAFAULT_FONT,VERT_DIR,1);  */

lapso2 = 0 ;

 while(st<=cdatos && !kbhit()){

 st++ ;

if(funcion == 'v' || funcion == 'V' || funcion == 'r' || funcion == 'R'){

if(funcion == 'v' || funcion == 'V'){
strcpy(codigo1,"MEAS:VOLT:DC?");
    }

if(funcion == 'r' || funcion == 'R'){
strcpy(codigo1,"MEAS:FRES?");
 }

 IOOUTPUTS(dvm1,codigo1,strlen(codigo1));  /* Prepara Voltaje o Resistencia a 4 puntas */

     }

 delay(100);

 strcpy(codigo1,"MEAS:VOLT:DC?");
 IOOUTPUTS(dvm2,codigo1,strlen(codigo1));  /* Prepara voltajes dc */
 delay(100);

if(funcion == 'v' || funcion == 'V' || funcion == 'r' || funcion == 'R'){

  IOENTER(dvm1,(lec1+st));
   }

 delay(100);

   IOENTER(dvm2,(lec2+st));

/*      datoy[st] = 1.000*random(7) ;
datox[st] = -0.001*random(7) ;  */

if(funcion == 'v' || funcion == 'V' || funcion == 'r' || funcion == 'R'){
     datoy[st] = *(lec1+st) ;
}

datox[st] = *(lec2+st) ;

temp=273.85255+27346.124*datox[st]-1.1999e6*datox[st]*datox[st]-2.3948444e8*datox[st]*datox[st]*datox[st]+2.1120772e10*datox[st]*datox[st]*datox[st]*datox[st]+1.3639246e13*datox[st]*datox[st]*datox[st]*datox[st]*datox[st];
/* Con este polinomio grado 5 se calcula el valor de la temperatura directamente de
del archivo tabla.mag obtenidas del programa Origin, con un coeficiente de correlacion de
0.9997 y una desviaci¢n estandar de 2.40267 */

/*  Guarda los datos en el archivo nombre.dat  */

if(funcion == 'v' || funcion == 'V' || funcion == 'r' || funcion == 'R'){
    fprintf(f1,"%.2f %.8f\n", temp, datoy[st]);
     }

if(funcion == 't' || funcion == 'T'){
    fprintf(f1,"%f %.8f\n", lapso2, datox[st]);
  }
/*******/

/* Despliega los datos experimentales */

if(funcion == 'v' || funcion == 'V' || funcion == 'r' || funcion == 'R'){

  sprintf(texto1,"%2.2f",temp);

   settextstyle(GOTHIC_FONT, HORIZ_DIR,1);
   setcolor(GREEN);
   setusercharsize(2,1,3,1);
      outtextxy(103,20,texto1);

sprintf(texto2,"%2.8f",datoy[st]);

   settextstyle(GOTHIC_FONT, HORIZ_DIR,1);
    setcolor(RED);
     setusercharsize(2,1,3,1);
      outtextxy(245,20,texto2);


/* Las siguientes 3 instrucciones dibujan los puntos en la gr fica */

/* putpixel(((getmaxx()-120)/(temp_max-temp_min))*(datox[st]-temp_min)+100,(((getmaxy()-45)/(res_max-res_min))*(res_max-datoy[st]))+15,WHITE);*/
 putpixel(((getmaxx()-120)/(temp_max-temp_min))*(temp-temp_min)+100,(((getmaxy()-45)/(res_max-res_min))*(res_max-datoy[st]))+15,WHITE);

 setcolor(WHITE);

/* circle(((getmaxx()-120)/(temp_max-temp_min))*(datox[st]-temp_min)+100,(((getmaxy()-45)/(res_max-res_min))*(res_max-datoy[st]))+15,3); */
/* circle(((getmaxx()-120)/(temp_max-temp_min))*(temp-temp_min)+100,(((getmaxy()-45)/(res_max-res_min))*(res_max-datoy[st]))+15,3);  */
  circle(((getmaxx()-120)/(temp_max-temp_min))*(temp-temp_min)+100,(((getmaxy()-45)/(res_max-res_min))*(res_max-datoy[st]))+15,3);

}

/**************/

 if(funcion == 't' || funcion == 'T'){

datoy[st]=datox[st] ;
datox[st]=lapso2 ;

sprintf(texto1,"%2.8f",lapso2);

   settextstyle(GOTHIC_FONT, HORIZ_DIR,1);
   setcolor(GREEN);
   setusercharsize(2,1,3,1);
      outtextxy(103,20,texto1);

sprintf(texto2,"%2.8f",datoy[st]);

   settextstyle(GOTHIC_FONT, HORIZ_DIR,1);
    setcolor(RED);
     setusercharsize(2,1,3,1);
      outtextxy(245,20,texto2);


/* Las siguientes 3 instrucciones dibujan los puntos en la gr fica */

/* putpixel(((getmaxx()-120)/(temp_max-temp_min))*(datox[st]-temp_min)+100,(((getmaxy()-45)/(res_max-res_min))*(res_max-datoy[st]))+15,WHITE);*/
  putpixel(((getmaxx()-120)/(temp_max-temp_min))*(lapso2-temp_min)+100,(((getmaxy()-45)/(res_max-res_min))*(res_max-datoy[st]))+15,WHITE);

 setcolor(WHITE);

/* circle(((getmaxx()-120)/(temp_max-temp_min))*(datox[st]-temp_min)+100,(((getmaxy()-45)/(res_max-res_min))*(res_max-datoy[st]))+15,3); */
  circle(((getmaxx()-120)/(temp_max-temp_min))*(lapso2-temp_min)+100,(((getmaxy()-45)/(res_max-res_min))*(res_max-datoy[st]))+15,3);

  }
/***************/

/*  cambio de variables  */

 /* Ajuste de tiempo, depende de la computadora y del multimetro */
/*Esta ajustado para 1 segundo*/
/*El comportamiento del tiempo no es lineal*/
/*buscar otra forma de controlar el tiempo*/

/****** Aborta el programa *******/

 if( (bioskey (1)) != 0 )   /* test if there is a keystroke */
/*        step = analyze_key (&page) ;
   if (step == 0)              */
break ;

/********************************/

 sprintf(texto3,"%d",st);
   settextstyle(GOTHIC_FONT, HORIZ_DIR,1);
   setcolor(YELLOW);
   setusercharsize(2,1,3,1);
      outtextxy(2,getmaxy()-10,texto3);

   setcolor(random(14));
outtextxy(getmaxx()-76,getmaxy()-10,"Salir (S)");
   setcolor(WHITE);
outtextxy(516,4,"F.M,Ciencias.");

lapso2 = lapso+lapso2;

 sleep(lapso);

 setcolor(BLACK);

 outtextxy(103,20,texto1);
  outtextxy(245,20,texto2);
      outtextxy(2,getmaxy()-10,texto3);
    outtextxy(getmaxx()-76,getmaxy()-10,"Salir (S)");
  outtextxy(516,4,"F.M,Ciencias.");

 if(lapso2 >= tiem_max)   break;

}/* Fin de while(st<=cdatos && !kbhit()) */

      error=IORESET(dc);
      M_errores(error,"IORESET");

free(codigo);
free(lec1);
free(lec2);

 fclose(f1);   /* Cierra el archivo de datos.dat */
    closegraph();   /* Cierra el modo gr fico */

} /* Fin de main() */


void M_errores(int error, char* rutina)
   {

if(error != NOERR)
{
printf("Error en llamada a %s \n",rutina);
printf("%d %s \n",error,errstr(error));
printf("presione cualquier tecla para continuar.");
getch();
}
   }/* void M_errores(int error, char* rutina) */

void dibuja(void)
   {
   float dxp, dxg ;
   int marcax ;
   float dyp, dyg ;
   int marcay ;

setcolor(BLUE);
rectangle(0,0,getmaxx(),getmaxy());

setcolor(BLUE);
rectangle(100,15,getmaxx()-20,getmaxy()-30);

/* Marcas grandes en la gr fica eje X */

dxg = (getmaxx()-120)/5 ;             /* a getmaxx() le corresponde 640 */
 setcolor(GREEN);
 for(marcax=1;marcax<=4;marcax++)
{
 line((marcax*dxg)+100,getmaxy()-40,(marcax*dxg)+100,getmaxy()-30);
}

/* Marcas peque¤as en la gr fica eje X */

dxp = (getmaxx()-120)/5 ;
 setcolor(YELLOW);
 for(marcax=0;marcax<=4;marcax++)
{
 line((marcax*dxp)+(100+dxp/2),getmaxy()-35,(marcax*dxp)+(100+dxp/2),getmaxy()-30);
}

/* Marcas grandes en la gr fica eje Y */

dyg = (getmaxy()-45)/5 ;    /* a getmaxy() le corresponde 480 y al intervalo 434 */
 setcolor(RED);
 for(marcax=1;marcax<=4;marcax++)
{
 line(100,(marcax*dyg)+15,110,(marcax*dyg)+15);
}

/* Marcas peque¤as en la gr fica eje Y */

dyp = (getmaxy()-45)/5 ;
 setcolor(YELLOW);
 for(marcax=0;marcax<=4;marcax++)
{
 line(100,(marcax*dyp)+(15+dyp/2),105,(marcax*dyp)+(15+dyp/2));
}

   }/* Fin de void dibuja(void) */

/* INITIALIZE: Inicializa el sistema gr fico y reporta algun error  */
void Initialize(void)
{
  int xasp, yasp;        /* Usado para leer la razon aspecto        */
  GraphDriver = DETECT;  /* Pone la auto detecci¢n */
  initgraph( &GraphDriver, &GraphMode, "" );
  ErrorCode = graphresult(); /* Lee resultados de inicializaci¢n    */
  if( ErrorCode != grOk ){   /* Error ocurrido durante la inicializaci¢n */
    printf(" Graphics System Error: %s\n", grapherrormsg( ErrorCode ));
    exit( 1 );
  }
  getpalette( &palette );         /* Lee la paleta desde el board */
  MaxColors = getmaxcolor() + 1;  /* Lee el maximo # de colores   */
  MaxX = getmaxx();
  MaxY = getmaxy();               /* Lee el tama¤o de la pantalla */
  getaspectratio( &xasp, &yasp ); /* Lee el aspecto del hardware  */
  AspectRatio=(double)xasp/(double)yasp;/* Obtiene el factor de correcci¢n */
}

No hay comentarios:

Publicar un comentario

zen consultora

Blogger Widgets

Entrada destacada

Platzy y el payaso Freddy Vega, PLATZI APESTA, PLATZI NO SIRVE, PLATZI ES UNA ESTAFA

  Platzy y los payasos fredy vega y cvander parte 1,  PLATZI ES UNA ESTAFA Hola amigos, este post va a ir creciendo conforme vaya escribiend...