parent
1867a0eaf1
commit
0467c240e0
@ -0,0 +1,102 @@ |
||||
import gex |
||||
|
||||
CMD_STOP = 0 |
||||
CMD_PWM_CONT_START = 1 |
||||
CMD_PWM_BURST_START = 2 |
||||
CMD_PWM_CONT_READ = 10 |
||||
|
||||
class FCAP_Report: |
||||
def __init__(self): |
||||
self.period = 0 |
||||
self.ontime = 0 |
||||
self.frequency = 0 |
||||
self.duty = 0 |
||||
|
||||
# Raw data (can be used to avoid distortion by float arithmetics) |
||||
self.period_raw = 0 |
||||
self.ontime_raw = 0 |
||||
self.sample_count = 0 |
||||
self.clock_freq = 0 |
||||
|
||||
def __str__(self): |
||||
return "{\n f = %f Hz\n T = %f s\n Ton = %f s\n duty = %f\n}" % \ |
||||
(self.frequency, self.period, self.ontime, self.duty) |
||||
|
||||
class FCAP(gex.Unit): |
||||
""" |
||||
Frequency and pulse measurement |
||||
""" |
||||
|
||||
def _type(self): |
||||
return 'FCAP' |
||||
|
||||
def stop(self, confirm=True): |
||||
""" Stop any ongoing capture """ |
||||
self._send(CMD_STOP, confirm=confirm) |
||||
|
||||
def indirect_start(self, confirm=True): |
||||
""" Start continuous PWM measurement """ |
||||
self._send(CMD_PWM_CONT_START, confirm=confirm) |
||||
|
||||
def indirect_read(self): |
||||
""" |
||||
Read the current continuous measurement values |
||||
Returns value of the last measurement in continuous mode |
||||
""" |
||||
|
||||
resp = self._query(CMD_PWM_CONT_READ) |
||||
pp = gex.PayloadParser(resp.data) |
||||
|
||||
mhz = pp.u16() |
||||
period = pp.u32() |
||||
ontime = pp.u32() |
||||
|
||||
rp = FCAP_Report() |
||||
rp.period = period / (mhz*1e6) # to seconds |
||||
rp.frequency = 1 / rp.period |
||||
rp.ontime = ontime / (mhz*1e6) # in seconds |
||||
rp.duty = rp.ontime / rp.period |
||||
|
||||
rp.clock_freq = mhz*1e6 |
||||
rp.sample_count = 1 |
||||
rp.period_raw = period |
||||
rp.ontime_raw = ontime |
||||
|
||||
# returned in microseconds |
||||
return rp |
||||
|
||||
def indirect_single(self, timeout=5): |
||||
""" |
||||
Perform a burst measure with averaging (sum/count) |
||||
""" |
||||
return self.indirect_burst(count=1, timeout=timeout) |
||||
|
||||
def indirect_burst(self, count, timeout=5): |
||||
""" |
||||
Perform a burst measure with averaging (sum/count) |
||||
""" |
||||
|
||||
pb = gex.PayloadBuilder() |
||||
pb.u16(count) |
||||
|
||||
resp = self._query(CMD_PWM_BURST_START, pld=pb.close(), timeout=timeout) |
||||
pp = gex.PayloadParser(resp.data) |
||||
|
||||
mhz = pp.u16() |
||||
nsamp = pp.u16() |
||||
period = pp.u64() |
||||
ontime = pp.u64() |
||||
|
||||
rp = FCAP_Report() |
||||
rp.period = period / (nsamp*mhz*1e6) # to seconds |
||||
rp.frequency = 1 / rp.period |
||||
rp.ontime = ontime / (nsamp*mhz*1e6) # in seconds |
||||
rp.duty = rp.ontime / rp.period |
||||
|
||||
rp.clock_freq = mhz*1e6 |
||||
rp.sample_count = 1 |
||||
rp.period_raw = period |
||||
rp.ontime_raw = ontime |
||||
|
||||
return rp |
||||
|
@ -0,0 +1,18 @@ |
||||
import time |
||||
|
||||
import gex |
||||
|
||||
with gex.Client(gex.TrxRawUSB()) as client: |
||||
fcap = gex.FCAP(client, 'fcap') |
||||
|
||||
fcap.stop() |
||||
fcap.indirect_start() |
||||
|
||||
while True: |
||||
time.sleep(1) |
||||
print(fcap.indirect_read()) |
||||
#print(fcap.indirect_burst(3, timeout=20)) |
||||
|
||||
# print(fcap.indirect_burst(10, timeout=20)) |
||||
|
||||
|
Loading…
Reference in new issue