08-02-2025 02:07 AM
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
08-04-2025 01:06 AM
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?
08-25-2025 11:23 AM
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