Automatización de la medida de característica estática de circuitos analógicos 8. Anexo 8.1. Código de programación del multímetro digital. /* * main.c * * Author: Daniel Narbona Miguel * Versión:1.3 */ #include #include #include #include <stdio.h> <stdlib.h> "visa.h" "Ag34970.h" /*** FUNCION ***/ void err_handler (ViSession vi, ViStatus x); #define DEVICE_ADDRESS "TCPIP0::169.254.9.72::inst0::INSTR" int main() { FILE *archivo; char buf[512] = {0}; double tensionsalida=0; medida*/ char tiempotensionsalida[512]={0}; tensión medida*/ /*Almacena la tensión de salida /*Almacena el tiempo de salida de la int canal=0; /*Para indicar en el archivo de salida el canal donde se ha medido*/ char comando_medida[30]="*WAI; ROUT:SCAN (@100)\n"; char caracter_canal[3]; /*Variable char para modificar el canal en el bucle for de medida*/ char comando_tension_puerta[30]; char comando_tension_drenador[30]; float tension_puerta=0; float tension_drenador=0; float incremento; float tension_limite=0; int num_canales=0; ViStatus err; ViSession defaultRM, funcgen; /*Apertura del archivo en el cual se van a almacenar los datos obtenidos*/ archivo=fopen("datos.txt","w"); if(archivo==NULL) { puts("error al crear el fichero de datos"); exit(0); } 68 Automatización de la medida de característica estática de circuitos analógicos /* Abrimos los recursos*/ viOpenDefaultRM (&defaultRM); viOpen(defaultRM, DEVICE_ADDRESS,VI_NULL, VI_NULL, &funcgen); /* Resetea el módulo y limpia la memoria */ err=viPrintf(funcgen, "*RST;*CLS\n"); if(err != VI_SUCCESS) err_handler(funcgen, err); /* Identifica el dispositivo */ err=viPrintf(funcgen, "*IDN?\n"); if(err != VI_SUCCESS) err_handler(funcgen, err); err=viScanf(funcgen, "%t", &buf); if(err != VI_SUCCESS) err_handler(funcgen, err); printf("Module ID = %s\n\n", buf); err=viPrintf(funcgen, "DISP:TEXT 'START PRUEBA'\n"); if(err != VI_SUCCESS) err_handler(funcgen, err); /***************************************************************************/ /*ALIMENTACIÓN DE LOS TRANSISTORES*/ /*Se pide al usuario la tensión en el drenador de los transistores*/ printf("Escriba la tension VDD (min -12V, max 12V)"); scanf("%f",&tension_drenador); if(tension_drenador>12) { printf("Tension maxima VDD mayor de 12V, se fija la tension del drenador a 12V"); tension_drenador=12; } if(tension_drenador<-12) { printf("Tension maxima VDD menor que -12V, se fija la tension del drenador a -12V"); tension_drenador=-12; } /*Se crea el comando SCPI para la tensión en el drenador (es una cadena de caracteres)*/ sprintf(comando_tension_drenador,"*WAI; SOUR:VOLT %.3f,(@304)\n",tension_drenador); printf("Escriba el incremento de tension en el puerta (min 0.001V, max 12V)"); scanf("%f",&incremento); if(incremento>12) { printf("Tension en la puerta menor que el minimo, se fija la tension de de la puerta y su incremento en 1mV"); incremento=12; } 69 Automatización de la medida de característica estática de circuitos analógicos if(incremento<-12) { printf("Tension en la puerta menor que el minimo, se fija la tension de de la puerta y su incremento en 1mV"); incremento=-12; } err=viPrintf(funcgen, "DISP:TEXT 'ALIMENTACION ON'\n"); if(err != VI_SUCCESS) err_handler(funcgen, err); err=viPrintf(funcgen,comando_tension_drenador); if(err != VI_SUCCESS) err_handler(funcgen, err); /*Se establece como tensión inicial en la puerta de los transistores 0V*/ err=viPrintf(funcgen,"*WAI; SOUR:VOLT 0,(@305)\n"); if(err != VI_SUCCESS) err_handler(funcgen, err); /***************************************************************************/ /*CONFIGURACIÓN DE LOS CANALES DE MEDIDAS Y VARIACIÓN DE LA TENSIÓN EN LA PUERTA DE LOS TRANSISOTRES*/ /*CONFIGURA LOS CANALES PARA REALIZAR UNA TENSIÓN DC*/ err=viPrintf(funcgen, "*WAI; CONF:VOLT:DC (@101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119 ,120)\n"); if(err != VI_SUCCESS) err_handler(funcgen, err); printf("¿Numero de canales a escanear?"); scanf("%d",&num_canales); tension_limite= tension_drenador+incremento; /*Pregunta*/ while(tension_puerta <=tension_limite) { for (canal=1;canal<=num_canales;canal++) { if(canal<10) { itoa(canal,caracter_canal,10); comando_medida[20]=caracter_canal[0]; } else { itoa(canal,caracter_canal,10); comando_medida[20]=caracter_canal[1]; comando_medida[19]=caracter_canal[0]; } /*Indica el canal que se debe escanear*/ err=viPrintf(funcgen, comando_medida); if(err != VI_SUCCESS) err_handler(funcgen, err); /*Lee el valor obtenido */ err=viPrintf(funcgen, "*WAI; READ?\n"); if(err != VI_SUCCESS) err_handler(funcgen, err); err=viScanf(funcgen, "%le",&tensionsalida); if(err != VI_SUCCESS) err_handler(funcgen, err); 70 Automatización de la medida de característica estática de circuitos analógicos /*Para obtener el instante en el cual se produce la medida*/ err=viPrintf(funcgen, "*WAI; CALC:AVER:MIN:TIME?\n"); if(err != VI_SUCCESS) err_handler(funcgen, err); err=viScanf(funcgen, "%t",&tiempotensionsalida); if(err != VI_SUCCESS) err_handler(funcgen, err); fprintf(archivo,"%d %le %.3f %s\n", canal, tensionsalida, tension_puerta, tiempotensionsalida); } comando_medida[20]='0'; comando_medida[19]='0'; tension_puerta=tension_puerta+incremento; sprintf(comando_tension_puerta,"*WAI; SOUR:VOLT %.3f,(@305)\n",tension_puerta); err=viPrintf(funcgen, comando_tension_puerta); if(err != VI_SUCCESS) err_handler(funcgen, err); } /*Volvemos a poner la fuente de tensión a 0V, mira si hay algún modo de apagarla*/ err=viPrintf(funcgen, "SOUR:VOLT 0,(@304,305)\n"); if(err != VI_SUCCESS) err_handler(funcgen, err); /**************************************************************************** **************************/ err=viPrintf(funcgen, "DISP:TEXT 'FIN'\n"); if(err != VI_SUCCESS) err_handler(funcgen, err); /* Busca errores del sistema */ err=viQueryf(funcgen, "SYST:ERR?\n", "%t", buf); if(err != VI_SUCCESS) err_handler(funcgen, err); printf("Errores del sistema = %s\n\n", buf); /* Cierra la sesión */ err=viClose(funcgen); if(err != VI_SUCCESS) { err_handler(funcgen, err); } fclose(archivo); printf("\nPulse una tecla para finalizar\n"); getchar(); return 0; } /* Fin de main */ /*** Función para conocer el tipo de error ***/ void err_handler(ViSession funcgen, ViStatus err) { 71 Automatización de la medida de característica estática de circuitos analógicos char buf[1024] = {0}; viStatusDesc(funcgen, err, buf); printf("ERROR = %s\n", buf); return; } 72 Automatización de la medida de característica estática de circuitos analógicos 8.2. % % % Código Matlab para el procesamiento y representación de los datos obtenidos. Archivo: main.m Creador: Daniel Narbona Miguel Versión: 1.2 clear all; clc; %********************************************************** % Apertura del archivo .txt y extracción de los datos % Función para llamar al archivo [archivo ruta]=uigetfile('*.txt','Abrir archivo'); tamanoarchivo=length(archivo); if(tamanoarchivo==1) disp('No se ha podido abrir ningún archivo'); else fid=fopen(archivo,'r'); tline = fgets(fid); ind=1; while ischar(tline) if(length(tline)>5) [canal,tension_drenador,tension_puerta,tiempo] = strread(tline,'%d%f%f%s'); tabla_canal(ind)=canal; tabla_tension_drenador(ind)=tension_drenador; tabla_tension_puerta(ind)=tension_puerta; tabla_tiempo(ind)=tiempo; ind=ind+1; end tline = fgets(fid); end fclose(fid); % ******************************************************************* ****** % Creación de gráficas % ******************************************************************* ****** num_canales=max(tabla_canal); 73 Automatización de la medida de característica estática de circuitos analógicos canal_representado=1; tamano=length(tabla_canal); %Tabla que contiene las cadenas de caracteres para representación tablacolores(1,:)='-b '; tablacolores(2,:)=['-r ']; tablacolores(3,:)=['-g ']; tablacolores(4,:)=['-m ']; tablacolores(5,:)=['-y ']; tablacolores(6,:)=['-k ']; tablacolores(7,:)=['-c ']; tablacolores(8,:)=['-. ']; tablacolores(9,:)=['--b']; tablacolores(10,:)=['--r']; tablacolores(11,:)=['--g']; tablacolores(12,:)=['--m']; tablacolores(13,:)=['--y']; tablacolores(14,:)=['--k']; tablacolores(15,:)=['--c']; tablacolores(16,:)=['-.r']; indcolor=1; % El bucle recorre los vectores de datos extraídos para obtener los datos por canales, estos se almacenan un unos vectores hasta la representación while(canal_representado<=num_canales) recorre=1; i=1; while (recorre<=tamano) if(canal_representado==tabla_canal(recorre)) tabla_representa_tension_puerta(i)=tabla_tension_puerta(recorre); tabla_representa_tension_drenador(i)=tabla_tension_drenador(recorre ); i=i+1; end recorre=recorre+1; end incremento=tabla_representa_tension_puerta(2); %Calculo de la ganancia derivada=(diff(tabla_representa_tension_drenador)/incremento); hold on figure(1) plot(tabla_representa_tension_puerta,tabla_representa_tension_drena dor,tablacolores(indcolor,:)); 74 Automatización de la medida de característica estática de circuitos analógicos xlabel('Vgs'); ylabel('Vout'); legend('T1','T2','T3','T4','T5','T6','T7','T8','T9','T10','T11','T1 2','T13','T14','T15','T16'); hold off hold on figure(2) tam_deriv=length(derivada); plot(tabla_representa_tension_puerta(1:tam_deriv), derivada,tablacolores(indcolor,:)); xlabel('Vgs'); ylabel('Av'); legend('T1','T2','T3','T4','T5','T6','T7','T8','T9','T10','T11','T1 2','T13','T14','T15','T16'); hold off indcolor=indcolor+1; canal_representado=canal_representado+1; end end 75 Automatización de la medida de característica estática de circuitos analógicos 76