Products > Test Equipment
Python script to measure DC-DC converters
(1/1)
tszaboo:
I've made a python script to measure DC-DC converters.
It measures the efficiency across input voltage and load current
And shows the load dependency of the output voltage.
I've included an example output of a very simple 7812 based power supply.
Code is below. Uses python, finds the VISA connected instruments.
Uses a Rigol DP832 Power supply and a Siglent SDL1020 in my case.
Warning: The code will totally blow up your DUT if you don't configure it correctly.
I suggest manually setting up the Overvoltage and Overcurrent conditions on both your instruments before starting.
tszaboo:
It was running using jupyter notebook, but there is no reason why it wouldn't work from regular python console.
--- Code: ---import pyvisa
import numpy as np
import itertools
import time
import csv
import pandas as pd
import matplotlib.pyplot as plt
import datetime
rm = pyvisa.ResourceManager()
[print(x) for x in rm.list_resources()];
#use instrument names OR serial numbers
#Power supply settings
PSU_NAME = "DP832"
VIN_NUMBER_OF_SAMPLES = 20
VIN_MIN = 15
VIN_MAX = 22
IIN_MAX = 1
#DC load settings
DC_LOAD_NAME = "SDL1020"
IOUT_NUMBER_OF_SAMPLES = 20
IOUT_MIN = 0.01
IOUT_MAX = 0.3
DELAY = 0.5
CSV_FILE = 'measurements.csv'
EFFICIENCY_IMAGE = 'Efficiency.png'
VOLTAGE_IMAGE = 'Output.png'
#Creating measurement parameters
VIN = np.linspace (VIN_MIN,VIN_MAX,VIN_NUMBER_OF_SAMPLES)
IOUT = np.linspace (IOUT_MIN,IOUT_MAX,IOUT_NUMBER_OF_SAMPLES)
N= len(list(itertools.product(VIN,IOUT)))
print (f"Taking {N} measurements")
print (f"Expected time: {N*(DELAY+2)} seconds")
#Connecting to instruments
# Example usage:
#instrument_identifier = "DP832" # Or any other identifier
def find_instrument(instrument_identifier,rm):
instruments = rm.list_resources()
for instrument_name in instruments:
try:
instrument = rm.open_resource(instrument_name)
idn = instrument.query("*IDN?")
if instrument_identifier in idn:
print("Instrument found:")
print(idn)
return instrument
else:
instrument.close()
except:
pass
return None
PSU = find_instrument(PSU_NAME,rm)
DCL = find_instrument(DC_LOAD_NAME,rm)
def measure_point(vin, iin, iout):
PSU.write(f"APPL CH1,{vin},{iin}")
#if PSU.query(":OUTPut:STATe? CH1").find("ON") == -1:
# PSU.write(":OUTPut:STATe CH1,ON")
DCL.write(f":SOURce:CURRent:LEVel:IMMediate {iout}")
#if DCL.query(":SOURce:INPut?").find("ON") == -1:
# DCL.write(":SOURce:INPut ON")
time.sleep(DELAY)
a= PSU.query(":MEASure:CURRent:DC? CH1", 0.1)
b= PSU.query(":MEASure:VOLTage:DC? CH1", 0.1)
c= DCL.query(":MEASure:CURRent:DC?", 0.1)
d= DCL.query(":MEASure:VOLTage:DC?", 0.1)
a = float(a.strip())
b = float(b.strip())
c = float(c.strip())
d = float(d.strip())
#print ((a,b,c,d))
print(".", end="")
try:
eff = (c*d)/(a*b)*100
except ZeroDivisionError:
eff = 0
return vin,iout,eff,a,b,c,d
vin,iout = next(itertools.product(VIN, IOUT))
measure_point(vin,IIN_MAX,iout)
PSU.write(":OUTPut:STATe CH1,ON")
DCL.write(":SOURce:INPut ON")
with open(CSV_FILE,'w', newline='') as csvfile:
print (datetime.datetime.now())
headerList = ['VIN','IOUT','EFF', 'CIN', 'VIN_A', 'IOUT_A','VOUT']
writer = csv.writer(csvfile, delimiter=',')
writer.writerow(headerList)
for vin,iout in itertools.product(VIN,IOUT):
#print (vin,iout)
m = measure_point(vin,IIN_MAX,iout)
writer.writerow(m)
#Turn off output
PSU.write("OUTP CH1,OFF")
DCL.write(":SOURce:INPut OFF")
#Beep
PSU.write(":SYSTem:BEEPer:IMMediate")
time.sleep(0.5)
PSU.write(":SYSTem:BEEPer:IMMediate")
time.sleep(0.5)
PSU.write(":SYSTem:BEEPer:IMMediate")
print (datetime.datetime.now())
print ("Measurements done")
df = pd.read_csv(CSV_FILE)
df
plt.tricontourf(df['VIN'], df['IOUT'], df['EFF'], cmap='seismic',levels=30)
plt.xlabel('Input voltage')
plt.ylabel('Output current')
plt.colorbar(label='Efficiency')
plt.savefig(EFFICIENCY_IMAGE) # Save the plot
plt.show()
plt.tricontourf(df['VIN'], df['IOUT'], df['VOUT'], cmap='viridis',levels=30)
plt.xlabel('Input voltage')
plt.ylabel('Output current')
plt.colorbar(label='Output voltage')
plt.savefig(VOLTAGE_IMAGE) # Save the plot
plt.show()
--- End code ---
Navigation
[0] Message Index
Go to full version