15 October 2009

Fe de erratas PFC y Programas MATLAB mejorados

En la siguiente URL:

http://www.mediafire.com/file/1dmkonydeed/textos_adicionales_al_PFC.pdf

Se pueden encontrar un documento de Fe de erratas al PFC, así como diversos programas MATLAB optimizados para su uso en el desarrollo del PFC. Estos documentos no están en el Proyecto original, ya que son una mejora realizada al mismo.

Se puede encontrar el documento a continuación por si fallara el anterior link.


FE DE ERRATRAS DE LA MEMORIA PRESENTADA PARA EL PFC

Página 11 sobra una palabra en un párrafo (una)
Página 34 Se indica erróneamente que la figura 13 se trata de un modelo del sistema de ecolocación
de los murciélagos, cuando en realidad se trata del sistema pasivo de ecolocación de un búho.
Página 45 Dice que el RADAR (activo) usa la emisión de sonido, cuando debería decir que usa la
emisión de ondas electromagnéticas.
Página 61 sobra un “de” en un parrafo “depende de del autor”
Página 88 En cuanto lo que hace referencia a los transductores electrostáticos, cabe añadir para
clarificar que las frecuencias de resonancia y sus armónicos están fuera del rango de
funcionamiento de uso normal. Lo que hace referencia a los transductores electrodinámicos, se
puede añadir que se introduce “color” debido precisamente a que las frecuencias de resonancia y
sus armónicos están dentro del rango de funcionamiento normal de dichos sistemas.
Página 95 Sobran dos referencias que están duplicadas. ( www.tdt.com y www.neotronic.com )

Programas MATLAB Para la presentación.

Funciones ELAB-080 llamadas desde MATLAB

%uso de las funciones en la libreria ElabDLL
[notfound,warnings]=loadlibrary('ElabDLL.dll', 'ElabDLL.h')
libfunctions ElabDLL
libfunctions ElabDLL -full
libfunctionsview ElabDLL
%1
%C prototipe
%bool GetHWStatus()
%Matlab Prototipe
%bool GetHWStatus
a=calllib('ElabDLL', 'GetHWStatus')
% 0 not found or without power 1 if is ready to work
%2
%C prototipe
%bool GetSerialNumber(long *SerialNumber)
%Matlab Prototipe
%[bool, longPtr] GetSerialNumber(longPtr)
x = 15;
xp = libpointer('longPtr', x);
get(xp)
b=calllib('ElabDLL', 'GetSerialNumber',xp)
get(xp, 'Value')
%3
%C prototipe
%int SetAnalogChannels(int CH1Gain, int CH2Gain, bool CH1Couple, bool CH2Couple,
bool CH1Multiplier, bool CH2Multiplier)
%Matlab Prototipe
%int32 SetAnalogChannels(int32, int32, bool, bool, bool, bool)
intA=500; %Ch1 mV/div Possible values are 10, 20, 50, 100, 200, 500
intB=100; %Ch2 mV/div Possible values are 10, 20, 50, 100, 200, 500
boolA=1; %Ch1 DC(1)/AC(0)
boolB=1; %Ch2 DC(1)/AC(0)
boolC=1; %Ch1 probe 10X(1)/1X(0)
boolD=0; %Ch2 probe 10X(1)/1X(0)
ReturnInt=calllib('ElabDLL', 'SetAnalogChannels', intA, intB, boolA, boolB,
boolC, boolD)
% ReturnInt=1 Ch1 incorrect value =2 Ch2 incorrect value =0 Success
%4
%C prototipe
%long SetDSODCOffsets(double CH1DCOffVoltage, double CH2DCOffVoltage)
%Matlab Prototipe
%long SetDSODCOffsets(double, double)
% The range allowed is +/- (5*V/div setting).
% Thus in 5V/div, you can set to +/-
% 25V, in 20mV/div, this can be set to +/- 100mV.
doubleA=0.1; %Ch1 offset
doubleB=0.1; %Ch2 offset
ReturnLong=calllib('ElabDLL', 'SetDSODCOffsets', doubleA, doubleB)
% 1 failure, 0 success
%5
%C prototipe
%double SetDSOLASampleRate(double DesiredFreq)
%Matlab Prototipe
%double SetDSOLASampleRate(double)
doubleA=300000; %Frecuencia de muestreo del DSO desde 8KHz a 40MHz
ReturnDouble=calllib('ElabDLL', 'SetDSOLASampleRate', doubleA)
% returndoble Devuelve el valor asignado para el muestreo
%6
%C prototipe
%int CaptureDSOData(unsigned int total_blocks, unsigned int pre_trigger_blocks,
unsigned int trigger_channel, double trigger_value, unsigned int
auto_roll, long OverrideOtherClocks)
%Matlab Prototipe
% int32 CaptureDSOData(uint32, uint32, uint32, double, uint32, long)
uintA=31; %Numero de Bloques 1 a 32 de 1K
uintB=0; %Numero de bloques antes del trigger
uintC=1; % 0 no Trigger, 1 Ch2, 2 Ch2, 3 LA
doubleA=0;
%This value is in volts if the trigger is a DSO trigger, and in bits if a
%LA trigger. The trigger must be “on screen”, which is +/- 5 divisions from the
current DC
%offset. If the trigger is an LA trigger, only the least significant 4 bits are
used, and one of
%these bits must be “1”
uintD=1; % if 1 auto trigger, if 0 whait fpr the trigger
longA=1; % si es 0 no fuerza el cambio de los valores de reloj, 1 fuerza cambio
de valores de relojes en el dispositivo...
ReturnInt=calllib('ElabDLL', 'CaptureDSOData',uintA, uintB, uintC, doubleA,
uintD, longA)
% 0 failure, 1 success
%7
%C prototipe
%long RetrieveDSOData(unsigned char whatchannels, double *DSOCH1, double
*DSOCH2, unsigned short *LADATA, unsigned char Nth_Sample)
%Matlab Prototipe
%long, doublePtr, doublePtr, uint16Ptr] RetrieveDSOData(uint8, doublePtr,
doublePtr, uint16Ptr, uint8)
uintA=1; %Mascara de bits con los canales que se leeran The LSB is DSO CH1, bit
1 is DSO CH2, bit 2 is LA CH0-7, bit 3 is LA CH8-15
x = zeros(32768, 1);
y = zeros(32768, 1);
z = zeros(32768, 1); %reserva espacio en memoria 32*1024 "filas" por 3 columnas
una por canal
doublePtrA = libpointer('doublePtr',x);
doublePtrB = libpointer('doublePtr',y);
uint16PtrA = libpointer('uint16Ptr',z);
uintB=1; %Allows the programmer to download only every Xth Set to “1” to
download all data. Can range from 1-255
ReturnLong=calllib('ElabDLL', 'RetrieveDSOData', uintA, doublePtrA, doublePtrB,
uint16PtrA, uintB)
canal1=get(doublePtrA,'Value');
close all
plot(canal1)
pause
canal2=get(doublePtrB,'Value')
plot(canal2)
LA_CH0_15=get(uint16Ptr,'Value')
%8
%C prototipe
%float SetUPPS1(float Voltage)
%Matlab Prototipe
%single SetUPPS1(single)
singleA=4.1;
ReturnSingle=calllib('ElabDLL', 'SetUPPS1', singleA)
%9
%C prototipe
%float SetUPPS2(float Voltage)
%Matlab Prototipe
%single SetUPPS2(single)
singleA=9;
ReturnSingle=calllib('ElabDLL', 'SetUPPS2', singleA)
%10
%C prototipe
%int GetUPPSOverload()
%Matlab Prototipe
%int32 GetUPPSOverload
ReturnInt=calllib('ElabDLL', 'GetUPPSOverload')
%11
%C prototipe
%double SetProgClocks (char Switch, double Frequency1, double Frequency2, double
*Freq1Actual, double *Freq2Actual, long OverrideClocks)
%Matlab Prototipe
%[double, doublePtr, doublePtr] SetProgClocks(int8, double, double, doublePtr,
doublePtr, long)
intA=1; %0 for programable cloks off, 1 for turn on the cloks
doubleA=40000000; %configura valor reloj 1
doubleB=50000000; %configura valor reloj 2
x = 0;
doublePtrA = libpointer('doublePtr', x); %retrorna valor establecido de reloj 1
doublePtrB = libpointer('doublePtr', x); %retrorna valor establecido de reloj 2
longA=1; %0 devuelve un error si no se puede configurar, con 1 la función fuerza
el cambio de valor en los relojes
ReturnDouble=calllib('ElabDLL', 'SetProgClocks',intA, doubleA, doubleB,
doublePtrA, doublePtrB, longA)
get(doublePtrA) %muestra contenido del puntero y su tipo doublePtrA
% 0 failure, 1 success
%12
%C prototipe
%long SetupAWG(double *AnalogVoltage, short *DigitalData, long BufferSize,
double DCOffsetVoltage, double SampleFrequency, long Use4xGain, double
OutputImpedance, long Repeat,long Triggered, long OverrideOtherClocks)
%Matlab Prototipe
%[long, doublePtr, int16Ptr] SetupAWG(doublePtr, int16Ptr, long, double, double,
long, double, long, long, long)
n=1:10;
x=sin(n);%Datos a transmitir por el generador de funciones analógico
y=0; %Datos a transmitir por el generador de funciones digital
doublePtrA = libpointer('doublePtr', x); %analog data +-1.25V or +-5V
int16PtrA = libpointer('int16Ptr', y); %digital data (5 bits)
longA=10; %Number of samples to play
doubleA=0; % DC offset
doubleB=50000; % play frecuency
longB=1; % 0 para modo 1X , 1 para modo 4X , steep 2.5mV / 10mV
doubleC=50; %impedancia de Salida
longC=1; % 1 to repeat the wave, 0 for only one time
longD=0; % 1 to play only if trigger input is on, 0 to play when AWGStart is
Called
longE=1; % 0 to return fail if can't perform the clock change, 1 if force the
change
ReturnLong=calllib('ElabDLL', 'SetupAWG', doublePtrA, int16PtrA, longA, doubleA,
doubleB, longB, doubleC, longC, longD, longE)
awg_out=get(doublePtrA,'Value'); %muestra contenido del puntero y su tipo
doublePtrA
% “1” if successful, “0” if failure occurs.
%13
%C prototipe
%long AWGStart(long OverrideOtherClocks)
%Matlab Prototipe
%long AWGStart(long)
longA=0;% 0 to return fail if can't perform the clock change, 1 if force the
change
ReturnLong=calllib('ElabDLL', 'AWGStart', longA)
% “1” if successful, “0” if failure occurs.
%14
%C prototipe
%long AWGStop()
%Matlab Prototipe
%long AWGStop
ReturnLongt=calllib('ElabDLL', 'AWGStop')
% “1” if successful, “0” if failure occurs.
% unloadlibrary ElabDLL

Simulación FDTD con captura de emisiones y de retorno de ecos.

close all;
clear all;
spatialWidth=400; temporalWidth=2;
p=zeros(spatialWidth+1,temporalWidth); % filas, columnas
v=zeros(spatialWidth+1,temporalWidth);
length=0.1;
dx=length/spatialWidth;
c=340;
dt=dx/c;
amplitude=1
rho=1.21;
K=rho*c^2;
duration=0.0008;
iterations=duration/dt;
excitationPoint=2;%spatialWidth/2; %modifico punto de excitacion
xPML=2;
%signal=zeros((0.0002/dt),2); %matriz donde se almacenará la señal emitida y la
recibida
load signal_test.mat %carga una variabla llamada signal que contiene dos
vectores columna correspondientes a los datos de la señal a emitir, y el
espacio en memoria de la señal a recibir
[a b]=size(signal);
s1=1; %contador usado para capturar señal a emitir
s2=1; %contador usado para capturar señal de retorno
%falta introducir atenuación real, programa para generar señal en función
%del valor de las variables de control.

for n=2:iterations
t=n*dt;
for i=2: spatialWidth-1
if i>(spatialWidth-xPML)
xi=xPML-(spatialWidth-i);
a0=log(10)/(K*dt);
a1=a0*(xi/xPML)^2;
a2=a0*((xi-1/2)/xPML)^2;
p(i,1)=exp(-(a1*K)*dt)*p(i,2)-(1-exp(-(a1*K)*dt))/(a1*K)*K*1/dx*(v(i+1,2)-v(i,2));
v(i,1)=exp(-(a2*K)*dt)*v(i,2)-(1-exp(-(a2*K)*dt))/(a2*K)*(1/rho)*1/dx*(p(i,1)-p(i-1,1));
else
p(i,1)=p(i,2)-K*dt/dx*(v(i+1,2)-v(i,2));

if i==excitationPoint & (na) & (p(i,1)>0.001|p(i,1)<-0.001 ) & s2<=a%Condicion de retorno signal(s2,2)=p(i,1); %se captura retorno s2=s2+1; end v(i,1)=v(i,2)-(1/rho)*dt/dx*(p(i,1)-p(i-1,1)); end p(i,2)=p(i,1)*0.995; %he introducido el factor de atenuación 0.99 de atenuación v(i,2)=v(i,1)*0.995;%he introducido el factor de atenuación 0.99 end plot(p(:,2)) axis([0 spatialWidth -2 2]); frame = getframe(); end % Db=20*log(signal( calculo de la atenuacion en dB ) Programa de test de captura de datos con “ELAB-080--MATLAB” y TRANSDUCTOR DE 40KHZ. %Programa que captura datos de un emisor de ultrasonidos resonante a 40KHz mediante un receptor de ultrasonidos resonante a 40KHz [notfound,warnings]=loadlibrary('ElabDLL.dll', 'ElabDLL.h') %Configurar SISTEMA DE ADQUISICIÓN DE DATOS disp(' Configuración del sistema de adquisición de datos') intA = input('Set Ch1 mV/div. Possible values are 10, 20, 50, 100, 200, 500 \n'); intB= 500 ; boolA= input('Set Ch1 DC(1)/AC(0) \n'); boolB=0; boolC= input('Set Ch1 probe 10X(1)/1X(0) \n'); boolD=0; ReturnSetAnalogChannels=calllib('ElabDLL', 'SetAnalogChannels', intA, intB, boolA, boolB, boolC, boolD); doubleA=0; doubleB=0; ReturnSetDSODCOffsets=calllib('ElabDLL', 'SetDSODCOffsets', doubleA, doubleB); doubleA=190000; MuestreoAsignado=calllib('ElabDLL', 'SetDSOLASampleRate', doubleA); %poner en marcha el GENERADOR DE FUNCIONES Frecuency=40000; %frecuencia de la señal generada PlayFrecuency=100000000; %frecuencia de muestreo o reproducción SamplesPlay=PlayFrecuency/Frecuency; %puntos por periodo n=0:2*pi/SamplesPlay:2*pi; %Vector escalar con el numero de puntos por periodo x=cos(n);%Datos a transmitir por el generador de funciones analógico doublePtrA = libpointer('doublePtr', x); %analog data +-1.25V or +-5V int16PtrA = libpointer('int16Ptr', x); %digital data (5 bits) SignalAWG=get(doublePtrA,'Value'); close all plot(SignalAWG) %forma de la señal a emitir title('Forma de la señal que se emitirá en el Generador de Funciones') pause doubleA=0;%DC ofset longB=1; %1x=0 4x=1 doubleC=50; %impedancia de salida longC=1; %1=repeat longD=0;%1 play with trigger longE=1;% change clocks to perform the generation. ReturnSetupAWG=calllib('ElabDLL', 'SetupAWG', doublePtrA, int16PtrA, SamplesPlay, doubleA, PlayFrecuency, longB, doubleC, longC, longD, longE); longA=1; ReturnAWGStart=calllib('ElabDLL', 'AWGStart', longA); %poner en marcha la captura de datos blocknumbers=16; uintB=1; uintC=0; doubleA=0; uintD=1; longA=1; ReturnCaptureDSOData=calllib('ElabDLL', 'CaptureDSOData',blocknumbers, uintB, uintC, doubleA, uintD, longA); %Descargar datos del ELAB uintA=1; x = zeros(blocknumbers*1024, 1);%reserva espacio en memoria 32*1024 "filas" por 3 columnas una por canal y = zeros(blocknumbers*1024, 1); z = zeros(blocknumbers*1024, 1); doublePtrA = libpointer('doublePtr',x); doublePtrB = libpointer('doublePtr',y); uint16PtrA = libpointer('uint16Ptr',z); uintBA=1; CapturedSamples=calllib('ElabDLL', 'RetrieveDSOData', uintA, doublePtrA, doublePtrB, uint16PtrA, uintB); %parar AWG ReturnAWGStop=calllib('ElabDLL', 'AWGStop'); %Confirmar correcto funcionamiento de los sitemas if (ReturnSetupAWG==1) & (ReturnAWGStart==1)& (ReturnAWGStop==1) disp(' El generador de funciones digital esta configurado correctamente y funciona') PlayFrecuency SamplesPlay else disp(' El generador de funciones digital NO esta configurado correctamente') return end if ReturnCaptureDSOData disp(' Se ha realizado la captura de datos correctamente') else disp(' NO Se ha realizado la captura de datos correctamente') return end if (ReturnSetAnalogChannels==0) & (ReturnSetDSODCOffsets==0)& (MuestreoAsignado~=0) & (ReturnCaptureDSOData==1)& (CapturedSamples~=0) disp(' El Osciloscopio digital esta configurado correctamente y funciona') MuestreoAsignado CapturedSamples else disp(' El Osciloscopio digital NO esta configurado correctamente') return end SignalAWG=get(doublePtrA,'Value'); %visualizar datos del DSO canal1=get(doublePtrA,'Value'); close all plot(canal1) grid xlabel('Muestras') ylabel('Amplitud') texto=['Canal 1 con ', num2str(CapturedSamples), ' muestras y frecuencia de muestreo= ', num2str(MuestreoAsignado),'Hz']; title(texto) pause close all [f,mag] = daqdocfft(canal1,MuestreoAsignado,CapturedSamples); plot(f,mag) grid on ylabel('Magnitude (dB)') xlabel('Frequency (Hz)') title('Frequency Components Ch1') % unloadlibrary ElabDLL Programa de test que realiza un barrido en frecuencias para ver la respuesta en frecuencia de los transductores DE 40KHZ con sistema “ELAB-080— MATLAB” %Programa que muestra la respuesta en frecuencia de un emisor de %ultrasonidos resonante a 40KHz y de un receptor de ultrasonidos resonante %a 40KHz por medio de un barrido en frecuencias. [notfound,warnings]=loadlibrary('ElabDLL.dll', 'ElabDLL.h') %Configurar SISTEMA DE ADQUISICIÓN DE DATOS intA =20; %20mV/div Possible values are 10, 20, 50, 100, 200, 500 intB= 500 ; boolA=0; %configurado en AC DC(1)/AC(0) boolB=0; boolC=0; %probe ch1 1x 10X(1)/1X(0) boolD=0; ReturnSetAnalogChannels=calllib('ElabDLL', 'SetAnalogChannels', intA, intB, boolA, boolB, boolC, boolD); doubleA=0; doubleB=0; ReturnSetDSODCOffsets=calllib('ElabDLL', 'SetDSODCOffsets', doubleA, doubleB); doubleA=200000; MuestreoAsignado=calllib('ElabDLL', 'SetDSOLASampleRate', doubleA); %poner en marcha el GENERADOR DE FUNCIONES for Frecuency=20000:1000:80000 %frecuencia de la señal generada PlayFrecuency=100000000; %frecuencia de muestreo o reproducción SamplesPlay=PlayFrecuency/Frecuency; %puntos por periodo n=0:2*pi/SamplesPlay:2*pi; %Vector escalar con el numero de puntos por periodo x=cos(n);%Datos a transmitir por el generador de funciones analógico doublePtrA = libpointer('doublePtr', x); %analog data +-1.25V or +-5V int16PtrA = libpointer('int16Ptr', x); %digital data (5 bits) SignalAWG=get(doublePtrA,'Value'); doubleA=0;%DC ofset longB=1; %1x=0 4x=1 doubleC=50; %impedancia de salida longC=1; %1=repeat longD=0;%1 play with trigger longE=1;% change clocks to perform the generation. ReturnSetupAWG=calllib('ElabDLL', 'SetupAWG', doublePtrA, int16PtrA, SamplesPlay, doubleA, PlayFrecuency, longB, doubleC, longC, longD, longE); longA=1; ReturnAWGStart=calllib('ElabDLL', 'AWGStart', longA); %poner en marcha la captura de datos blocknumbers=12; uintB=1; uintC=0; doubleA=0; uintD=1; longA=1; ReturnCaptureDSOData=calllib('ElabDLL', 'CaptureDSOData',blocknumbers, uintB, uintC, doubleA, uintD, longA); %Descargar datos del ELAB uintA=1; x = zeros(blocknumbers*1024, 1);%reserva espacio en memoria blocknumbers*1024 "filas" por 3 variables y = zeros(blocknumbers*1024, 1); z = zeros(blocknumbers*1024, 1); doublePtrB = libpointer('doublePtr',y); uint16PtrA = libpointer('uint16Ptr',z); doublePtrA = libpointer('doublePtr',x); uintBA=1; CapturedSamples=calllib('ElabDLL', 'RetrieveDSOData', uintA, doublePtrA, doublePtrB, uint16PtrA, uintB); %parar AWG ReturnAWGStop=calllib('ElabDLL', 'AWGStop'); %visualizar datos del DSO canal1=get(doublePtrA,'Value'); [f,mag] = daqdocfft(canal1,MuestreoAsignado,CapturedSamples); plot(f,mag) grid on ylabel('Magnitude (dB)') xlabel('Frequency (Hz)') title('Frequency Components Ch1') frame = getframe(); end % unloadlibrary ElabDLL

No comments: