Capítulo 8

Anuncio
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
Descargar