Skip to content
Merged

Dev #33

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 22 additions & 4 deletions example.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
3. read stream of data
"""
import time
from src.ppk2_api.ppk2_api import PPK2_API
from ppk2_api.ppk2_api import PPK2_API

ppk2s_connected = PPK2_API.list_devices()
if(len(ppk2s_connected) == 1):
Expand All @@ -32,8 +32,17 @@
for i in range(0, 1000):
read_data = ppk2_test.get_data()
if read_data != b'':
samples = ppk2_test.get_samples(read_data)
samples, raw_digital = ppk2_test.get_samples(read_data)
print(f"Average of {len(samples)} samples is: {sum(samples)/len(samples)}uA")

# Raw digital contains the raw digital data from the PPK2
# The number of raw samples is equal to the number of samples in the samples list
# We have to process the raw digital data to get the actual digital data
digital_channels = ppk2_test.digital_channels(raw_digital)
for ch in digital_channels:
# Print last 10 values of each channel
print(ch[-10:])
print()
time.sleep(0.01)

ppk2_test.toggle_DUT_power("OFF") # disable DUT power
Expand All @@ -44,8 +53,17 @@
for i in range(0, 1000):
read_data = ppk2_test.get_data()
if read_data != b'':
samples = ppk2_test.get_samples(read_data)
samples, raw_digital = ppk2_test.get_samples(read_data)
print(f"Average of {len(samples)} samples is: {sum(samples)/len(samples)}uA")

# Raw digital contains the raw digital data from the PPK2
# The number of raw samples is equal to the number of samples in the samples list
# We have to process the raw digital data to get the actual digital data
digital_channels = ppk2_test.digital_channels(raw_digital)
for ch in digital_channels:
# Print last 10 values of each channel
print(ch[-10:])
print()
time.sleep(0.01) # lower time between sampling -> less samples read in one sampling period

ppk2_test.stop_measuring()
ppk2_test.stop_measuring()
38 changes: 32 additions & 6 deletions example_mp.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
3. read stream of data
"""
import time
from src.ppk2_api.ppk2_api import PPK2_MP as PPK2_API
from ppk2_api.ppk2_api import PPK2_MP as PPK2_API

ppk2s_connected = PPK2_API.list_devices()
if(len(ppk2s_connected) == 1):
Expand All @@ -21,6 +21,9 @@
ppk2_test.get_modifiers()
ppk2_test.set_source_voltage(3300)

"""
Source mode example
"""
ppk2_test.use_source_meter() # set source meter mode
ppk2_test.toggle_DUT_power("ON") # enable DUT power

Expand All @@ -29,23 +32,46 @@
# the number of measurements in one sampling period depends on the wait between serial reads
# it appears the maximum number of bytes received is 1024
# the sampling rate of the PPK2 is 100 samples per millisecond
for i in range(0, 1000):
while True:
read_data = ppk2_test.get_data()
if read_data != b'':
samples = ppk2_test.get_samples(read_data)
samples, raw_digital = ppk2_test.get_samples(read_data)
print(f"Average of {len(samples)} samples is: {sum(samples)/len(samples)}uA")

# Raw digital contains the raw digital data from the PPK2
# The number of raw samples is equal to the number of samples in the samples list
# We have to process the raw digital data to get the actual digital data
digital_channels = ppk2_test.digital_channels(raw_digital)
for ch in digital_channels:
# Print last 10 values of each channel
print(ch[-10:])
print()

time.sleep(0.001)

ppk2_test.toggle_DUT_power("OFF") # disable DUT power
ppk2_test.stop_measuring()

"""
Ampere mode example
"""
ppk2_test.use_ampere_meter() # set ampere meter mode

ppk2_test.start_measuring()
for i in range(0, 1000):
while True:
read_data = ppk2_test.get_data()
if read_data != b'':
samples = ppk2_test.get_samples(read_data)
samples, raw_digital = ppk2_test.get_samples(read_data)
print(f"Average of {len(samples)} samples is: {sum(samples)/len(samples)}uA")

# Raw digital contains the raw digital data from the PPK2
# The number of raw samples is equal to the number of samples in the samples list
# We have to process the raw digital data to get the actual digital data
digital_channels = ppk2_test.digital_channels(raw_digital)
for ch in digital_channels:
# Print last 10 values of each channel
print(ch[-10:])
print()
time.sleep(0.001) # lower time between sampling -> less samples read in one sampling period

ppk2_test.stop_measuring()
ppk2_test.stop_measuring()
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def read(*names, **kwargs):

setup(
name="ppk2-api",
version="0.9.1",
version="0.9.2",
description="API for Nordic Semiconductor's Power Profiler Kit II (PPK 2).",
url="https://github.com/IRNAS/ppk2-api-python",
packages=find_packages("src"),
Expand Down
43 changes: 33 additions & 10 deletions src/ppk2_api/ppk2_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,11 +189,8 @@ def _generate_mask(self, bits, pos):
mask = self._twos_comp(mask)
return {"mask": mask, "pos": pos}

def _get_masked_value(self, value, meas):
def _get_masked_value(self, value, meas, is_bits=False):
masked_value = (value & meas["mask"]) >> meas["pos"]
if meas["pos"] == 24:
if masked_value == 255:
masked_value = -1
return masked_value

def _handle_raw_data(self, adc_value):
Expand All @@ -205,10 +202,10 @@ def _handle_raw_data(self, adc_value):
bits = self._get_masked_value(adc_value, self.MEAS_LOGIC)
analog_value = self.get_adc_result(
current_measurement_range, adc_result) * 10**6
return analog_value
return analog_value, bits
except Exception as e:
print("Measurement outside of range!")
return None
return None, None

@staticmethod
def list_devices():
Expand Down Expand Up @@ -327,6 +324,26 @@ def _digital_to_analog(self, adc_value):
"""Convert discrete value to analog value"""
return int.from_bytes(adc_value, byteorder="little", signed=False) # convert reading to analog value

def digital_channels(self, bits):
"""
Convert raw digital data to digital channels.

Returns a 2d matrix with 8 rows (one for each channel). Each row contains HIGH and LOW values for the selected channel.
"""

# Prepare 2d matrix with 8 rows (one for each channel)
digital_channels = [[], [], [], [], [], [], [], []]
for sample in bits:
digital_channels[0].append((sample & 1) >> 0)
digital_channels[1].append((sample & 2) >> 1)
digital_channels[2].append((sample & 4) >> 2)
digital_channels[3].append((sample & 8) >> 3)
digital_channels[4].append((sample & 16) >> 4)
digital_channels[5].append((sample & 32) >> 5)
digital_channels[6].append((sample & 64) >> 6)
digital_channels[7].append((sample & 128) >> 7)
return digital_channels

def get_samples(self, buf):
"""
Returns list of samples read in one sampling period.
Expand All @@ -338,28 +355,35 @@ def get_samples(self, buf):
sample_size = 4 # one analog value is 4 bytes in size
offset = self.remainder["len"]
samples = []
raw_digital_output = []

first_reading = (
self.remainder["sequence"] + buf[0:sample_size-offset])[:4]
adc_val = self._digital_to_analog(first_reading)
measurement = self._handle_raw_data(adc_val)
measurement, bits = self._handle_raw_data(adc_val)
if measurement is not None:
samples.append(measurement)
if bits is not None:
raw_digital_output.append(bits)

offset = sample_size - offset

while offset <= len(buf) - sample_size:
next_val = buf[offset:offset + sample_size]
offset += sample_size
adc_val = self._digital_to_analog(next_val)
measurement = self._handle_raw_data(adc_val)
measurement, bits = self._handle_raw_data(adc_val)
if measurement is not None:
samples.append(measurement)
if bits is not None:
raw_digital_output.append(bits)

self.remainder["sequence"] = buf[offset:len(buf)]
self.remainder["len"] = len(buf)-offset

return samples # return list of samples, handle those lists in PPK2 API wrapper
# return list of samples and raw digital outputs
# handle those lists in PPK2 API wrapper
return samples, raw_digital_output


class PPK_Fetch(threading.Thread):
Expand Down Expand Up @@ -401,7 +425,6 @@ def run(self):
self._buffer_q.get()
local_buffer = local_buffer[self._buffer_chunk:]
self._last_timestamp = tm_now
# print(len(d), len(local_buffer), self._buffer_q.qsize())

# calculate stats
s += len(d)
Expand Down