function htconv(archivo) % HTCONV Convierte archivo de datos generado por el software del osciloscopio USB HANTEK 1008A. % % Ejemplo 1: htconv('triangular@500mV.txt') % Lee los datos del archivo de texto 'triangular@500mV.txt' generado por el software del % instrumento y crea un nuevo archivo de texto de nombre 'triangular' que contiene dos % columnas: la primer columna es un vector de instantes de tiempo en milisegundos y la % segunda columna un vector de muestras de señal en voltios. % % Ejemplo 2: htconv % Se aplica como en el ejemplo 1 a todos los archivos de la forma '*******@**V' % % Version 1 del 30/10/2014 para el lab. de Int. a la Teoría de Control. switch nargin case 1 D.name = archivo; case 0 D = dir; otherwise error('Demasiados argumentos.') end for k = 1:length(D) archivo = D(k).name; ind = strfind(archivo,'@'); % Buscar arroba que indica el comienzo de la especificación de volt/div. if ~isempty(ind) disp(['Leyendo.......',archivo]); if length(ind) > 1 error('El nombre del archivo debe tener una sola @.') end nombrebase = archivo(1:ind-1); % Guardar nombre base del archivo (string antrior al @) para generar nuevo archivo. VxDstr = archivo(ind+1:end); % Extraer string de volt/div. ind = strfind(VxDstr,'V'); % La especificación de volt/div termina en un caracter 'V'. if isempty(ind) || length(ind) > 1 error('La especificación de volt/div no tiene el formato preestablecido.') end VxDstr = VxDstr(1:ind-1); % Una vez removido el 'V' reconocer si los volts/div están en mV o en V. if VxDstr(end) == 'm' VxDfactor = 1e-3; VxDval = str2double( VxDstr(1:end-1) ); % valor de volt/div sin unidades. else VxDfactor = 1; VxDval = str2double( VxDstr(1:end) ); % valor de volt/div sin unidades. end if isnan(VxDval) error('No se pudo extraer los volts/div del nombre del archivo.') end VxD = VxDval*VxDfactor; % volt/div en voltios. archivo_id = fopen( archivo ); % Abrir archivo de datos. clockValor = fscanf(archivo_id, '%*s\n#CLOCK=%f', [1,1]); % Leer valor de CLOCK. clockUnidad = fscanf(archivo_id, '%s', 1); % Leer unidad de CLOCK. nroMuestras = fscanf(archivo_id, '\n#SIZE=%f', 1); % Leer SIZE. datosUnidad = fscanf(archivo_id, '\n#UNITS:%s', 1); % Leer UNITS (no se usará porque es incorrecto). datos = fscanf(archivo_id, '\n%f', [nroMuestras,1]); % Leer datos. fclose(archivo_id); % Generar vector de tiempo. switch clockUnidad case 'nS' clockFactor = 1e-9; case 'uS' clockFactor = 1e-6; case 'mS' clockFactor = 1e-3; case 'S' clockFactor = 1; otherwise error('Unidad de tiempo desconocida.') end dt = (10*clockValor*clockFactor)/nroMuestras; t = 1000*((0:(nroMuestras-1))*dt).'; % Vector de tiempo en milisegundos. % Generar vector de muestras de señal en voltios. switch VxD case 10e-3 datosFactor = 10e-3*4/0.2; case 20e-3 datosFactor = 20e-3*4/0.2; case 50e-3 datosFactor = 50e-3*4/2; case 100e-3 datosFactor = 100e-3*4/2; case 200e-3 datosFactor = 200e-3*4/2; case 500e-3 datosFactor = 500e-3*4/16; case 1 datosFactor = 1*4/16; case 2 datosFactor = 2*4/16; case 5 datosFactor = 5*4/16; otherwise error('Valor de volt/div incorrecto.') end x = datos*datosFactor; % Señal adquirida en voltios. % Generar un nuevo archivo con el mismo nombre base del archivo de datos. disp(['Escribiendo...',nombrebase]); salvar = [ t , x ]; save(nombrebase,'salvar','-ascii','-double','-tabs'); end end end