Digital Multimeters (DMMs) and Precision DC Sources

cancel
Showing results for 
Search instead for 
Did you mean: 

How do I a pulse measurement using an SMU?

I have a PXIe-4139 and I want to make a pulsed current measurement.

I will be creating a program to run this test and I will be using nidcpower to interface to the SMU (I have version 20.7)/

I found several documents describing how to configure the various parameters but I don't see how to initiate the pulse.

I want to do this under SW control not using a HW trigger.

0 Kudos
Message 1 of 16
(3,210 Views)

In that case, just the Initiate should fire the pulse.

Santhosh
Soliton Technologies

New to the forum? Please read community guidelines and how to ask smart questions

Only two ways to appreciate someone who spent their free time to reply/answer your question - give them Kudos or mark their reply as the answer/solution.

Finding it hard to source NI hardware? Try NI Trading Post
0 Kudos
Message 2 of 16
(3,196 Views)

Cool, I will try that.

Thanks

0 Kudos
Message 3 of 16
(3,192 Views)

I think I found it.  In order to generate a pulse, you need to use the new (v 21.0) Pulse Trigger

markshancock_0-1654193286774.png

markshancock_1-1654193298519.png

 

0 Kudos
Message 4 of 16
(3,120 Views)

I configured the SW pulse trigger and I am still not able to generate a pulst

0 Kudos
Message 5 of 16
(3,104 Views)

Hello markshancock,


Have you tried using one of the examples installed with NI-DCPower?


https://www.ni.com/docs/en-US/bundle/ni-dcpower-21.0-help/page/ni_dc_power_supplies_help/ni-dcpower_...

 

C:\Users\Public\Documents\National Instruments\NI-DCPower\Examples\DotNET 4.5\Pulsing\Single point\Pulse Current\cs

our pulse current examples should have what you need to get started, if not, please do reach out again.

thanks,

0 Kudos
Message 6 of 16
(3,086 Views)

The driver I am updating is older and uses the .c api.  Is there an example for creating a pulse using the c api?
One big question I have is the difference between the two sets of methods (one with and one without "WithChannels")
Ex: 

niDCPower_ConfigureSourceMode(ViSession vi,ViInt32 sourceMode);

niDCPower_ConfigureSourceModeWithChannels(ViSession vi,ViConstString channelName,ViInt32 sourceMode);

 

The 1.6 v did not have the WithChannels methods (except for InitializeWithChannels).

0 Kudos
Message 7 of 16
(3,046 Views)

There is no C example, but the ADE bindings for all the other languages map very very well to C, you should be able to translate it.

 

> One big question I have is the difference between the two sets of methods (one with and one without "WithChannels")

 

NI-DCPower's overall operating model was changed recently. You opt-in by opening your session using niDCPower_InitializeWithIndependentChannels(). This is the default in LabVIEW and the preferred way of using NI-DCPower.

 

What does "Independent Channels" give you? The ability to control the state of the channels independently when in a multi-channel session. For example, instead of calling niDCPower_Initiate(vi) which acts on all the channels in the session, you can call niDCPower_InitiateWithChannels(vi, "0-3") to initiate that subset. It also allows multi-intrument sessions - that is, sessions that span channels across multiple SMUs.

 

I hope that explains the difference.

Marcos Kirsch
Chief Software Engineer
NI Driver Software
0 Kudos
Message 8 of 16
(3,021 Views)

@kirsch,

      The SW example I used was C# PulseVoltage.

dcPowerSession.Source.Mode = DCPowerSourceMode.SinglePoint;
dcPowerSession.Outputs[FullyQualifiedChannelName].Source.Output.Function = DCPowerSourceOutputFunction.PulseVoltage;
dcPowerSession.Outputs[FullyQualifiedChannelName].Source.PulseVoltage.VoltageLevel = PulseVoltageLevel;
dcPowerSession.Outputs[FullyQualifiedChannelName].Source.PulseVoltage.VoltageLevelRange = PulseVoltageLevelRange;
dcPowerSession.Outputs[FullyQualifiedChannelName].Source.PulseVoltage.BiasCurrentLimit = BiasCurrentLimit;
dcPowerSession.Outputs[FullyQualifiedChannelName].Source.PulseVoltage.CurrentLimit = PulseCurrentLimit;
dcPowerSession.Outputs[FullyQualifiedChannelName].Source.PulseVoltage.CurrentLimitRange = PulseCurrentLimitRange;
dcPowerSession.Outputs[FullyQualifiedChannelName].Source.PulseVoltage.BiasVoltageLevel = BiasVoltageLevel;
dcPowerSession.Outputs[FullyQualifiedChannelName].Source.PulseOnTime = PulseOnTime;
dcPowerSession.Outputs[FullyQualifiedChannelName].Source.PulseOffTime = PulseOffTime;
dcPowerSession.Outputs[FullyQualifiedChannelName].Source.PulseBiasDelay = PulseBiasDelay;
dcPowerSession.Outputs[FullyQualifiedChannelName].Source.SourceDelay = SourceDelay;
dcPowerSession.Outputs[FullyQualifiedChannelName].Measurement.ConfigureApertureTime(ApertureTime, DCPowerMeasureApertureTimeUnits.Seconds);
//Initiate the device to start generation and acquisition.
dcPowerSession.Control.Initiate();

I added log statements to record the calls I am making to niDCPower_32.dll

16:50:01,837 Abort[0], Rtn=0
16:50:01,837 Set property[0,OutputFunction] to value=1049, Rtn=0
16:50:01,867 Get property[0,OutputFunction] returned value=1049, Rtn=0
16:50:01,887 ConfigPulseVoltageRange[0]=3.6, Rtn=0
16:50:01,897 ConfigPulseVoltage[0]=3, Rtn=0
16:50:01,917 ConfigPulseBiasCurrentLimit[0]=0.01, Rtn=0
16:50:01,937 ConfigPulseCurrentLimitRange[0]=0.1, Rtn=0
16:50:01,957 ConfigPulseCurrentLimit[0]=0.01, Rtn=0
16:50:01,977 ConfigPulseBiasVoltage[0]=0, Rtn=0
16:50:01,997 Set property[0,PulseOnTime] to value=0.1, Rtn=0
16:50:02,017 Set property[0,PulseOffTime] to value=0.1, Rtn=0
16:50:02,037 Set property[0,PulseBiasDelay] to value=0.0001, Rtn=0
16:50:02,057 ConfigSoftwarePulseTrigger[0], Rtn=0
16:50:04,088 Set property[0,OutputEnabled] to value=True, Rtn=0
16:50:04,088 Set property[0,OutputConnected] to value=True, Rtn=0
16:50:04,098 Initiate[0], Rtn=0
16:50:04,138 SendSoftwareTrigger=1053, Rtn=0
16:50:05,339 Abort[0], Rtn=0

The [0] indicates the call is made on channel '0' using a "...WithChannels" call.  Ex:

public int Initiate(string Channel)
{
   int pInvokeResult = PInvoke.InitiateWithChannels(this._handle, Channel);
   log.DebugFormat("Initiate[{0}], Rtn={1}", Channel, pInvokeResult);
   PInvoke.TestForError(this._handle, pInvokeResult);
   return pInvokeResult;
}

I have the SMU attached to a PXIe-5160 and I am capturing the output waveform.

To confirm the setup, I generated a pulse in SW by running the SMU in VoltageMode and changing the output voltage.

That worked fine so I know the setup is correct.

Note: I setup the digitizer and start the acquisition in the gap around 16:50:03 

When I run my pulse code, this is what I get. No pulse

markshancock_1-1655827739525.png

I don't see much difference between the calls I make and my inference from the C# example

 

0 Kudos
Message 9 of 16
(3,014 Views)

Note: I tried the code without the ConfigSoftwarePulseTrigger and SendSoftwareTrigger and I get the same result.

0 Kudos
Message 10 of 16
(3,005 Views)