Skip to content
Snippets Groups Projects
initTrapAWG.m 6.27 KiB
Newer Older
  • Learn to ignore specific revisions
  • whuie2's avatar
    whuie2 committed
    function [awg_trap, success] = initTrapAWG(wfms, awg_trap)
    
        success = false;
    
        %Set AWG parameters
        samplerate = awg_trap.samplerate; 
        chAmp = awg_trap.chAmp; 
        memSamples = awg_trap.memSamples; 
    
        % helper maps to use label names for registers and errors
        mRegs = spcMCreateRegMap();
        mErrors = spcMCreateErrorMap();
    
        % ----- init card and store infos in cardInfo struct -----
        % This is the place where the AWG internal indexing can sometimes get
        % messed up if you have multiple AWGs and the computer restarts
        [success, cardInfo] = spcMInitCardByIdx(1);
    
        if success
            % ----- print info about the board -----
            cardInfoText = spcMPrintCardInfo(cardInfo);
            fprintf(cardInfoText);
        else
            spcMErrorMessageStdOut(cardInfo, 'Error: Could not open card\n', true);
            return;
        end
    
        % ----- set the samplerate and internal PLL, no clock output -----
        [success, cardInfo] = spcMSetupClockPLL(cardInfo, samplerate, 0);  % clock output : enable = 1, disable = 0
        if ~success
            spcMErrorMessageStdOut(cardInfo, 'Error: spcMSetupClockPLL:\n\t', true);
            return;
        end
        fprintf ('\n ..... Sampling rate set to %.1f MHz\n', cardInfo.setSamplerate / 1e6);
    
        
        % Here are some examples of different triggering methods, either
        % software triggering or hardware triggering with 4V activation
        
        % ----- set software trigger, no trigger output -----
        % [success, cardInfo] = spcMSetupTrigSoftware (cardInfo, 0);  % trigger output : enable = 1, disable = 0
        % if ~success
        %     spcMErrorMessageStdOut (cardInfo, 'Error: spcMSetupTrigSoftware:\n\t', true);
        %     return;
        % end
    
        %%%%%%%%%
        % ----- extMode = risingEdge, trigTerm = 0, pulseWidth = 0, singleSrc = 1, extLine = 0 -----
        % [success, cardInfo] = spcMSetupTrigExternal (cardInfo, mRegs('SPC_TM_POS'), 0, 0, 1, 0);
        % if ~success
        %     spcMErrorMessageStdOut (cardInfo, 'Error: spcMSetupExternal:\n\t', true);
        %     return;
        % end
    
    %     [success, cardInfo] = spcMSetupTrigExternalLevel (cardInfo, mRegs('SPC_TM_POS'), 4000, 0, 0, 0, 0, 1, 0);
    %     if ~success
    %         spcMErrorMessageStdOut (cardInfo, 'Error: spcMSetupExternal:\n\t', true);
    %         return;
    %     end
    
        %%%%%%%%%
    
        % ----- program all output channels with no offset and no filter -----
        for ii = 0:(cardInfo.maxChannels-1)
            [success, cardInfo] = spcMSetupAnalogOutputChannel(cardInfo, ii, chAmp(ii + 1), 0, 0, mRegs('SPCM_STOPLVL_ZERO'), 0, 0); % doubleOut = disabled, differential = disabled
            if ~success
                spcMErrorMessageStdOut(cardInfo, 'Error: spcMSetupInputChannel:\n\t', true);
                return;
            end
        end
    
        % Divide memory in segments
        % ----- setup sequence mode, 1 channel, numMemBlocks segments, start segment 0 -----
        [success, cardInfo] = spcMSetupModeRepSequence(cardInfo, 0, bi2de(awg_trap.active_channels), awg_trap.numMemBlocks, 0); 
        if ~success
            spcMErrorMessageStdOut(cardInfo, 'Error: spcMSetupModeRepSequence:\n\t', true);
            return;
        end
    
        firstStep = 0;
        changeStep = 1;
        firstSeg = 0;
    
        % create signal
        signals = [];
        overPowerFlag = false;
        awg_trap.cardInfo = cardInfo;
        for ind = 1:cardInfo.maxChannels
            if awg_trap.active_channels(ind)
                wfm = wfms.(sprintf('ch%i', ind - 1));
                signal = staticArraySignal(wfm, awg_trap);
    
            else
                signal = zeros(1, memSamples);
            end
            signals = [signals; signal];
        end
        signal_zero = zeros(1,memSamples);
    
        %Step 1 - Set segments
        % ----- set segment 0 -----
        error = spcm_dwSetParam_i32(cardInfo.hDrv, mRegs('SPC_SEQMODE_WRITESEGMENT'), firstSeg);
        error = spcm_dwSetParam_i32(cardInfo.hDrv, mRegs('SPC_SEQMODE_SEGMENTSIZE'), memSamples);
        errorCode = spcm_dwSetData(cardInfo.hDrv, 0, memSamples, numel(awg_trap.active_channels), 0, ...
            signals(1, :), signals(2, :), signals(3, :), signals(4, :));
    
        % ----- set segment 1 -----
        error = spcm_dwSetParam_i32(cardInfo.hDrv, mRegs('SPC_SEQMODE_WRITESEGMENT'), 1);
        error = spcm_dwSetParam_i32(cardInfo.hDrv, mRegs('SPC_SEQMODE_SEGMENTSIZE'), memSamples);
        errorCode = spcm_dwSetData (cardInfo.hDrv, 0, memSamples, numel(awg_trap.active_channels), 0, ...
            signal_zero, signals(2, :), signals(3, :), signals(4, :));
    
        % Step 2 - Set sequence steps
        %                                step, nextStep, segment, loops, condition (0 => End loop always, 1 => End loop on trigger, 2 => End sequence)
        % Understanding how the sequencereplay works on the AWG is crucial to
        % understanding how to effectively program it. See the manual.
        spcMSetupSequenceStep(cardInfo, firstStep, changeStep, firstSeg, 1, 1);
        spcMSetupSequenceStep(cardInfo, changeStep, firstStep, firstSeg, 1, 0);
    
        
        % Honestly for this next part, it is always a bit of trial and error. I
        % am sure there is a better way to do this though... I've left some
        % things which we don't actually use (like the commandMask syntax) in
        % in case it is useful.
        
        % ----- define series of commands -----
        % commandMask = mRegs('M2CMD_CARD_START');
        % commandMask = bitor (mRegs('M2CMD_CARD_START'), mRegs('M2CMD_CARD_ENABLETRIGGER'));
        % commandMask = bitor (commandMask, mRegs('M2CMD_CARD_WAITREADY'));
    
        % ----- set series of command -----
        errorCode = spcm_dwSetParam_i32(cardInfo.hDrv, mRegs('SPC_M2CMD'), mRegs('M2CMD_CARD_START'));
        errorCode = spcm_dwSetParam_i32(cardInfo.hDrv, mRegs('SPC_M2CMD'), mRegs('M2CMD_CARD_ENABLETRIGGER'));
        if (errorCode ~= 0)   
            [~, cardInfo] = spcMCheckSetError(errorCode, cardInfo);
            if errorCode == mErrors('ERR_TIMEOUT')
                error = spcm_dwSetParam_i32(cardInfo.hDrv, mRegs('SPC_M2CMD'), mRegs('M2CMD_CARD_STOP'));
                fprintf (' OK\n ................... replay stopped\n');
            else
                spcMErrorMessageStdOut(cardInfo, 'Error: spcm_dwSetParam_i32:\n\t', true);
                return;
            end
        end
    
        errorCode = spcm_dwSetParam_i32(awg_trap.cardInfo.hDrv, mRegs('SPC_M2CMD'), mRegs('M2CMD_CARD_FORCETRIGGER'));
    
        awg_trap.cardInfo = cardInfo;
        success = true;
    
    end