## Contents

- Acciones previas
- Habilito y verifico la comunicacion con el Osciloscopio TBS1052B-EDU
- Habilito y verifico la comunicacion con el Generador de Funciones Tektronix AFG1022
- ESPECIFICO parte de la configuracion del osciloscopio (como ejemplos)
- Preparo la fuente
- Lazo de medicion
- Grafico final
- Finalizo

     % Osc_y_Gen

## Acciones previas

    clear all       % Borro variables previos
    pause on        % Habilito la funcion PAUSE (permite hacer pausas en la
                    % ejecucion del programa

## Habilito y verifico la comunicacion con el Osciloscopio TBS1052B-EDU

    if(exist('osc') == 1)
        % Si el canal de comunicacion ya esta abierto, NO LO ABRO NUEVAMENTE.
        disp('La comunicacion con el osciloscopio ya esta abierta')
    else
        % Si el canal de comunicacion aun no esta abiero, lo DEFINO ahora.
        % Uso un puerto USB de la PC y el protocolo denominado:
        % Virtual Instrument Software Architecture (VISA).

        osc = visa('ni','USB0::0x0699::0x0368::C017041::INSTR')

        % Se necesita incrementar el tama#o del buffer de comunicacion para
        % poder recabar/adquirir señales extensas.

        set(osc,'InputBufferSize',20000)

        % Finalmente ABRO la comunicacion con el instrumento.

        fopen(osc);
    end

    % Pruebo que la communicacion funciona correctamente

    % Le pido al osciloscopio algo elemental: que se identifique.
    % Si da error, la comunicacion no esta correctamente establecida y carece
    %   de sentido continuar ejecutando el resto del programa.

    fprintf(osc,'*IDN?')    % Pregunta la identificacion.
    ID = fscanf(osc)        % Escribe la identificacion en la pantalla.

    Error using visa (line 233)
    Unable to create VISA object.  The required drivers may not be installed properly.
    Type 'instrhelp visa' for more information.

    Error in Osc_y_Gen_B (line 18)
        osc = visa('ni','USB0::0x0699::0x0368::C017041::INSTR')

## Habilito y verifico la comunicacion con el Generador de Funciones Tektronix AFG1022

    if(exist('gen') == 1)
        % Si el canal de comunicacion ya esta abierto, NO LO ABRO NUEVAMENTE.
        disp('La comunicacion con el generador ya esta abierta')
    else
        % Si el canal de comunicacion aun no esta abiero, lo DEFINO ahora.
        % Uso un puerto USB de la PC y el protocolo denominado:
        % Virtual Instrument Software Architecture (VISA).

        gen = visa('ni','USB::0x0699::0x0353::1915264::INSTR')

        % Finalmente ABRO la comunicacion con el instrumento.

        fopen(gen);
    end

    % Pruebo que la communicacion funciona correctamente

    % Le pido al generador algo elemental: que se identifique.
    % Si da error, la comunicacion no esta correctamente establecida y carece
    %   de sentido continuar ejecutando el resto del programa.

    fprintf(gen,'*IDN?')    % Pregunta la identificacion.
    ID = fscanf(gen)        % Escribe la identificacion en la pantalla.

## ESPECIFICO parte de la configuracion del osciloscopio (como ejemplos)

    % El resto debe hacerse manualmente

    % ACOPLO el CH1 en DC (CC en castellano) y el CH2 en AC (CA en castellano)
    fprintf(osc,'CH1:COUPling DC')
    fprintf(osc,'CH2:COUPling AC')

    % Ubico el cero del eje vertical de cada canal a mitad de la pantalla
    fprintf(osc,'CH1:POSition 0.0E0')
    fprintf(osc,'CH2:POSition 0.0E0')

    % Especifico que la amplificacion vertical sea 2V/div en cada canal
    fprintf(osc,'CH1:SCAle 2.0E0')
    fprintf(osc,'CH2:SCAle 2.0E0')

    % Promedio un "NroProm" de mediciones, por ej. 16
    NroProm = 16;    % Se admiten los valores: 4, 16, 64 o 128
    fprintf(osc,['ACQuire:NUMAVg ', num2str(NroProm)])

    % Especifico que las "sondas" conectadas a los canales 1 y 2 dividen por 1
    fprintf(osc,'CH1:PRObe 1')
    fprintf(osc,'CH2:PRObe 1')

    % Especifico que ningun canal invierta la se#al que le llegue
    fprintf(osc,'CH1:INVert OFF')
    fprintf(osc,'CH2:INVert OFF')

    % ESPECIFICO LAS MEDICIONES AUTOMATICAS QUE NECESITO
    % (Borrar las mediciones automaticas preexistentes)

    % Eespecifico que la:
    %   Medicion 1 sea la frecuencia de la se#al enviada al CH1
    fprintf(osc,'MEASU:MEAS1:SOURCE CH1')
    fprintf(osc,'MEASU:MEAS1:TYPE FREQuency')
    %   Medicion 2 sea el valor pico a pico del canal 1
    fprintf(osc,'MEASU:MEAS2:SOUrce CH1')
    fprintf(osc,'MEASU:MEAS2:TYPE PK2pk')
    %   Medicion 3 sea el valor pico a pico del canal 2
    fprintf(osc,'MEASU:MEAS3:SOUrce CH2')
    fprintf(osc,'MEASU:MEAS3:TYPE PK2pk')

## Preparo la fuente

Es pecifico el tipo de se#al, amplitud, offset y luego HABILITO la salida

    fprintf(gen,'SOURce1:FUNCtion:SHAPe SINusoid')
    fprintf(gen,'SOURce1:VOLTage 10 Vpp')
    fprintf(gen,'SOURce1:VOLTage:OFFSet 0')
    fprintf(gen,'OUTPut1:STATe ON')

## Lazo de medicion

    % TRIGGER. Especifico canal, nivel y pendiente
    fprintf(osc,'TRIGger:MAIn:EDGE:SOUrce CH1')
    fprintf(osc,'TRIGger:MAIn:LEVel 1.0')
    fprintf(osc,'TRIGger:MAIn:EDGE:SLOpe RISe')

    % Especifico el rango de frecuencias a explorar
    %f = [logspace(0,2,9) logspace(log10(200),4,5)];
    f =[3 5 10 15 20 30 40 50 100 200];

    % Defino la matriz de SALIDA como nula (vacia).
    %   Luego contendra las 3 columnas siguientes:
    %   frecuencia  Vpp_del_CH1  Vpp_del_CH2
    salida = [];
    salidanueva = []; % Defino una salida parcial auxiliar

    for i = 1:length(f)
    Indice_de_Medicion_y_Frec_Nominal_en_Hz = [i f(i)]
    fprintf(gen,['SOUR1:FREQ ',num2str(f(i))])

    % Especifico velocidad de barrido horizontal (seg/div) de modo de tener
    % unos 5 periodos en la pantalla, aproximadamente.

    fprintf(osc,['HORizontal:MAIn:SCAle ',num2str(1.5/(10*f(i)))]) % En seg/div

    disp('Controlar Frecuencia en la Fuente.')
    disp('Controlar/CORREGIR barrido horizontal del Osciloscopio y apretar tecla')
    pause

    % Espero a que complete el "NroProm" de se#ales que le pedi que promedie
    pause(NroProm * 1.0/(2*f(i)) * 12 )

    % Mido la frecuencia
    fprintf(osc,'MEASU:MEAS1:VAL?')
    frecuencia = str2num(fscanf(osc))

    % Mido el Vpp_del_CH1
    fprintf(osc,'MEASU:MEAS2:VAL?')
    Vpp_del_CH1 = str2num(fscanf(osc))

    % Mido el Vpp_del_CH2
    fprintf(osc,'MEASU:MEAS3:VAL?')
    Vpp_del_CH2 = str2num(fscanf(osc))

    salidanueva = [frecuencia Vpp_del_CH1 Vpp_del_CH2]

    % Voy construyendo la matriz de salida
    salida = [salida; salidanueva];

    % Grafico lo obtenido hasta ahora
    figure(2)
    plot(salida(:,1),salida(:,2),'*-',salida(:,1),salida(:,3),'sr-')
    xlabel('f (Hz)')
    ylabel('Vpp de los canales 1 (DC) y 2 (AC)')
    title('Comparación entre acoplamiento del Osc. en DC o AC')
    grid on
    drawnow

    disp('Colocar el cursor en la pantalla de comandos y apretar tecla')
    pause

    end

    % Guardo las mediciones en el archivo: mediciones.txt
    save mediciones.txt salida -ASCII
    % Y tambien en CommaSeparatedValues (.csv) . Compatible con Python y Excel
    csvwrite('mediciones.csv', salida)

## Grafico final

    figure(2)
    plot(salida(:,1),salida(:,2),'*-',salida(:,1),salida(:,3),'sr-')
    xlabel('f (Hz)')
    ylabel('Vpp de los canales 1 (DC) y 2 (AC)')
    title('Comparación entre acoplamiento del Osc. en DC o AC')
    grid on

## Finalizo

    fprintf(osc,'*CLS')

    pause off