41-610 Arbitrary Waveform Generator

Note: The 41-610 is no longer in production so this page is provided for support purposes.

Creating Waveforms

It is helpful to add a few definitions to the code:

enum {ARB_SINE, ARB_SQUARE, ARB_TRIANGLE};          // Definitions of waveshapes, 0 = Sine, 1 = Square, 2 = Triangle
#define MAX_AMP 65535             // Maximum DAC output
#define MID_AMP 32768             // Middle DAC output == 0 Vdc
 

Then, taking the example in the help document as a starting point (no error checking for ease of understanding):

PRE-DEFINED WAVEFORMS

    pg14102_Init(4, 11, &vi);
 
    pg14102_SetActiveChannel(vi, 1);
    pg14102_SetLockMode(vi, 0);
    pg14102_SignalClear(vi);
 
    pg14102_SignalAdd(vi, ARB_SINE, 1.0, 1, 0, 50);    // vi, type, ampl, periods, phase, symm
    pg14102_SetStartAddress(vi, 0);
    pg14102_SetStopAddress(vi, 999);            // stop-start+1 = samples
    pg14102_SignalToRam(vi);
 
    pg14102_SetClockDivider(vi, 100);                // Divide 100MHz by this
    pg14102_SetAttenuator(vi, -6);
    pg14102_SetDCOffsetVoltage(vi, 0);
    pg14102_SetFilter(vi, 1);
    pg14102_SetClockSource(vi, 1);
    pg14102_SetTriggerMode(vi, 8, 0);
    pg14102_ConnectCard(vi, 1);
    pg14102_ResetToStartAddress(vi);
    pg14102_SetLockMode(vi,1);
    pg14102_SetSoftwareTriggerStatus(vi, 1);

Note that rather than using 1024 samples as shown in the manual, 1000 are used, this made the calculations simpler.

Now, using the 100MHz clock and dividing by 100, we get a 1MHz sample rate, and so with 1000 samples we end up with a 1KHz signal repetition rate, in the above case we get a 1KHz sinewave. Simply change ARB_SINE to ARB_SQUARE or ARB_TRIANGLE to select one of the other predefined waveforms.

ARBITRARY WAVEFORMS

Next, some arbitrary waveforms. While they may not be what you are looking for, they help understanding how the ARB works and should allow you to create any waveform you wish.

PULSE

Replacing the lines SignalAdd through SignalToRam with this:

    ViUInt32 data[1000];
    for(int i=0; i< 1000; i++)
    {
        data[i] = (i<10)? MAX_AMP:MID_AMP;            // Create 10 wide pulse ( 1% m-s ratio)
    }
    pg14102_SetStartAddress(vi, 0);
    pg14102_WriteRamBuffer(vi, 1000, data);
    pg14102_SetStopAddress(vi, 999);                // stop-start+1 = samples

Produces a 1kHz rate, 10% pulse width signal at maximum amplitude for 10% of the period and 0V for the rest

RAMP 'PULSE'

Change the calculation to this:

    for(int i=0; i< 1000; i++)
    {
        data[i] = (i<100)? MID_AMP*(1+(double)i/100):MID_AMP;    // Create ramp in first 100 samples
    }

To produce a linear ramp, 0V to maximum amplitude over 10% of the period and 0V the remainder.

HALF-SINE 'PULSE'

Change the calculation to this:

    for(int i=0; i< 1000; i++)
    {
        data[i] = (i<100) ? MID_AMP*(1+sin(3.142*i/100)): MID_AMP; // Create half sine in first 100 samples
    }

To produce a half sine wave in the first 10% of the period and 0V in the rest

SINGLE CYCLE SINE 'PULSE'

And to this:
    for(int i=0; i< 1000; i++)
    {
        data[i] = (i<200) ? MID_AMP*(1+ sin(3.142*2*i/200)): MID_AMP; // Create full sine in first 100 samples
    }

To produce a full sine wave in the first 20% of the period and 0V in the rest

Summary

The general principles in creating an arbitrary waveform are:

  • Decide how many samples are needed to create the waveform with sufficient fidelity
  • Set the clock and divider to define a suitable sample rate
  • Set the RAM to 32768 for a DC level of 0
  • Set values 0 through 65535 for the waveform

APH, May 21, 2009

How did we do?
0 out of 0 people found this helpful.