PXI

cancel
Showing results for 
Search instead for 
Did you mean: 

High-Speed Power Profiling with PXIe-4147 SMU & PXIe-6361 — Successes and Current Hurdles

Hello everyone,

I wanted to share a recent application and start a discussion around a common challenge in validation: accurately profiling power consumption on a live system running high-speed firmware.

 

The Challenge & Solution

 

We needed to measure current draw (milliamps to >10A) and supply voltage simultaneously, with a sampling rate fast enough to capture microsecond-scale events. Our solution uses an NI PXIe-4147 SMU for power sourcing/measurement and a PXIe-6361 for capturing firmware GPIO toggles as triggers.

 

The setup has been very successful for its primary goal. By combining the SMU's 1.8 MS/s digitization with advanced triggering off the DAQ's digital inputs, we can build a complete power profile precisely around events of interest, correlating power spikes directly to firmware state transitions.

I've written a detailed blog post covering this setup, the benefits of the approach, and some thoughts on extending it for power disturbance simulation.

 

You can read the full post here: When NI Shines: High-Speed Power Profiling Made Simple

 

Pushing Further & Seeking Advice

Now, I'm trying to push the system's performance further and have run into a couple of hurdles. I was hoping to tap into the community's expertise here, especially from anyone who has worked with these modules in Python.

 

1. Throughput Limit with Software Triggering (~200 kS/s)
I'm implementing a software-based trigger where I continuously read data, evaluate a trigger condition in my Python code, and then decide whether to stay in a pre-trigger buffer or move to post-trigger capture. However, I seem to be capped at a reading speed of about 200 kS/s. I'm trying to determine if this is a limitation of the MXIe bus, an overhead in the Python niDCPower wrapper, or if there's a more efficient way to implement this logic.

 

2. Source-Adapt Settings in Ganged Mode
I am trying to programmatically change the Source-Adapt transient response settings while the four channels of the SMU are ganged together to provide higher current. Despite sending the commands via the Python API, the settings don't seem to apply and remain fixed. Is this a known limitation when channels are ganged, or am I possibly misinterpreting how the API should be used in this configuration?

 

Any insights on these specific issues, or general advice on high-speed power profiling setups, would be greatly appreciated.

Best regards,

Filippo

FiloP
It doesn't matter how beautiful your theory is, it doesn't matter how smart you are. If it doesn't agree with experiment, it's wrong.
Richard P. Feynman
0 Kudos
Message 1 of 3
(198 Views)

Sharing your existing code greatly helps to see if there's any implementation mistakes.

 

For the fastest synchronization you definitely need to use Hardware triggers and events. What is your requirement for sync between SMU and DAQ?

DAQ captures digital events and SMU for the power profile, later you correlate them? how are those two sync'd?

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
Message 2 of 3
(164 Views)

Hello,

I figured out the issue.

I was not calling 

ch.transient_response = nidcpower.TransientResponse.NORMAL (Or FAST or SLOW or CUSTOM)


Previus setup code.

import nidcpower

def setup_smu_multichannel(master,slaves,voltage,current_limit,session) :

channel = session.channels[master]
session.merged_channels = [slaves]
session.power_line_frequency = 50

channel.output_function = nidcpower.OutputFunction.DC_VOLTAGE
#source adapt fast settings

channel.transient_response = nidcpower.TransientResponse.FAST (<<Will test custom afterwards)  
session.voltage_gain_bandwidth = 20e3 (<<Currently useless I'll if FAST/SLOW/NORMAL selected will need CUSTOM I believe)  
session.voltage_compensation_frequency = 200.023e3
session.voltage_pole_zero_ratio = 0.29996


session.current_gain_bandwidth = 200e3
session.current_compensation_frequency = 40.0129e3
session.current_pole_zero_ratio = 0.59996



channel.voltage_level_range = 8
channel.voltage_level = voltage
channel.current_limit_range = 3

channel.current_limit = current_limit
channel.sense = channel.sense.REMOTE
channel.output_enabled = True

return session,channel

Actual setup code

import nidcpower

def setup_smu_multichannel(master,slaves,voltage,current_limit,session) :

channel = session.channels[master]
session.merged_channels = [slaves]
session.power_line_frequency = 50

channel.output_function = nidcpower.OutputFunction.DC_VOLTAGE
#source adapt fast settings
session.voltage_gain_bandwidth = 20e3
session.voltage_compensation_frequency = 200.023e3
session.voltage_pole_zero_ratio = 0.29996


session.current_gain_bandwidth = 200e3
session.current_compensation_frequency = 40.0129e3
session.current_pole_zero_ratio = 0.59996



channel.voltage_level_range = 8
channel.voltage_level = voltage
channel.current_limit_range = 3

channel.current_limit = current_limit
channel.sense = channel.sense.REMOTE
channel.output_enabled = True

return session,channel

FiloP
It doesn't matter how beautiful your theory is, it doesn't matter how smart you are. If it doesn't agree with experiment, it's wrong.
Richard P. Feynman
0 Kudos
Message 3 of 3
(123 Views)