/* 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