Counter 0 is configured for range counting and will count continuously from 0 to 9999. Gating and counter output is also demonstrated. The gate when high allows counting and the output will toggle low when the count reaches 9999 then back high from 0 to 9998. Counter 1 is used to count the output transitions from counter 0. The Timer output is used as a test signal. To see the counters in action, wire TMR0 to C0IN; wire DIO0 to C0GT and wire C0O over to C1IN
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
Wrapper call demonstrated: daqi_device.daq_in_scan()
Purpose: Performs a continuous scan of the counter and digital port input subsystems
Demonstration: Displays counter 0 & 1 and the digital port
data. Both subsystems are read simultaneously
"""
from __future__ import print_function
from time import sleep
from os import system
from sys import stdout
from uldaq import (InterfaceType,
DaqInChanType,
DaqInChanDescriptor,
DaqInScanFlag,
CounterMeasurementType,
CounterMeasurementMode,
CounterEdgeDetection,
CConfigScanFlag,
CounterTickSize,
CounterDebounceMode,
CounterDebounceTime,
CounterRegisterType,
Range,
ScanOption,
ScanStatus,
TmrIdleState,
PulseOutOption,
DigitalDirection,
DigitalPortType,
get_daq_device_inventory,
DaqDevice,
create_float_buffer)
def main():
"""Multi-subsystem simultaneous input scan example."""
ctr0 = 0
ctr1 = 1
digital_port = 1
daq_device = None
daqi_device = None
status = ScanStatus.IDLE
#timer output (TMR0) used as signal source for ctr0 input
timer_number = 0
frequency = 2000.0 # Hz
duty_cycle = 0.5 # 50 percent
pulse_count = 0 # Continuous
initial_delay = 2.0
idle_state = TmrIdleState.LOW
samples_per_channel = 1000
rate = 100.0
options = ScanOption.DEFAULTIO | ScanOption.CONTINUOUS
flags = DaqInScanFlag.DEFAULT
try:
# Get descriptors for all of the available DAQ devices.
devices = get_daq_device_inventory(InterfaceType.ANY)
number_of_devices = len(devices)
if number_of_devices == 0:
raise RuntimeError('Error: No DAQ devices found')
descriptor_index = 99
print('Found', number_of_devices, 'DAQ device(s):')
#search for USB-CTR04
for i in range(number_of_devices):
if devices[i].product_name == "USB-CTR04":
descriptor_index = i
break
descriptor_index = int(descriptor_index)
if descriptor_index not in range(number_of_devices):
raise RuntimeError('Error: Invalid descriptor index')
# Create the DAQ device from the descriptor at the specified index.
daq_device = DaqDevice(devices[descriptor_index])
# Get the DaqiDevice object and verify that it is valid.
daqi_device = daq_device.get_daqi_device()
if daqi_device is None:
raise RuntimeError('Error: The device does not support daq input '
'subsystem')
# Establish a connection to the DAQ device.
descriptor = daq_device.get_descriptor()
print('\nConnecting to', descriptor.dev_string, '- please wait...')
daq_device.connect(connection_code=0)
# wire DIO0 to C0GT - set bit high to enable counting
dio_device = daq_device.get_dio_device()
# make half of the digital port output and the other half input
dio_device.d_config_bit(DigitalPortType.AUXPORT, 0, DigitalDirection.OUTPUT)
dio_device.d_config_bit(DigitalPortType.AUXPORT, 1, DigitalDirection.OUTPUT)
dio_device.d_config_bit(DigitalPortType.AUXPORT, 2, DigitalDirection.OUTPUT)
dio_device.d_config_bit(DigitalPortType.AUXPORT, 3, DigitalDirection.OUTPUT)
dio_device.d_config_bit(DigitalPortType.AUXPORT, 4, DigitalDirection.INPUT)
dio_device.d_config_bit(DigitalPortType.AUXPORT, 5, DigitalDirection.INPUT)
dio_device.d_config_bit(DigitalPortType.AUXPORT, 6, DigitalDirection.INPUT)
dio_device.d_config_bit(DigitalPortType.AUXPORT, 7, DigitalDirection.INPUT)
# demonstrate how toset some lines on the digital port
dio_device.d_bit_out(DigitalPortType.AUXPORT, 0, 0)
dio_device.d_bit_out(DigitalPortType.AUXPORT, 1, 1)
dio_device.d_bit_out(DigitalPortType.AUXPORT, 2, 1)
dio_device.d_bit_out(DigitalPortType.AUXPORT, 3, 1)
# Get the CtrDevice object and verify that it is valid.
ctr_device = daq_device.get_ctr_device()
mode = CounterMeasurementMode.GATING_ON | CounterMeasurementMode.OUTPUT_ON | CounterMeasurementMode.RANGE_LIMIT_ON
# configure counter 0 for COUNT mode
ctr_device.c_config_scan(ctr0,
CounterMeasurementType.COUNT,
mode,
CounterEdgeDetection.RISING_EDGE,
CounterTickSize.TICK_20PT83ns, #parameter ignored
CounterDebounceMode.NONE,
CounterDebounceTime.DEBOUNCE_0ns,
CConfigScanFlag.DEFAULT)
#counter will count 0 to 9999
ctr_device.c_load(ctr0,CounterRegisterType.MIN_LIMIT, 0)
ctr_device.c_load(ctr0,CounterRegisterType.MAX_LIMIT, 9999)
#counter output line will go high from 0 to 9998 then low for one count
ctr_device.c_load(ctr0,CounterRegisterType.OUTPUT_VAL0, 0)
ctr_device.c_load(ctr0,CounterRegisterType.OUTPUT_VAL1, 9999)
# configure counter 1 for period to count output transitions from counter 0
# wire C1IN to C0O
ctr_device.c_config_scan(ctr1,
CounterMeasurementType.COUNT,
CounterMeasurementMode.GATING_ON,
CounterEdgeDetection.RISING_EDGE,
CounterTickSize.TICK_20PT83ns, #parameter ignored
CounterDebounceMode.TRIGGER_AFTER_STABLE,
CounterDebounceTime.DEBOUNCE_500ns,
CConfigScanFlag.DEFAULT)
#get timer output object
tmr_device = daq_device.get_tmr_device()
#wire TMR0 to C0IN - this your test signal
#initial delay is set to 2 second.
(frequency,duty_cycle,initial_delay) = tmr_device.pulse_out_start(timer_number, frequency,
duty_cycle, pulse_count,
initial_delay, idle_state,
PulseOutOption.DEFAULT)
# Configure the input channels.
channel_descriptors = []
channel_descriptors.append( DaqInChanDescriptor(ctr0, DaqInChanType.CTR32, Range.BIP10VOLTS) )
channel_descriptors.append( DaqInChanDescriptor(ctr1, DaqInChanType.CTR32, Range.BIP10VOLTS) )
channel_descriptors.append( DaqInChanDescriptor(digital_port, DaqInChanType.DIGITAL, Range.BIP10VOLTS) )
number_of_scan_channels = len(channel_descriptors)
# Allocate a buffer to receive the data
data = create_float_buffer(number_of_scan_channels, samples_per_channel)
system('clear')
# Start the acquisition.
rate = daqi_device.daq_in_scan(channel_descriptors,
samples_per_channel,
rate,
options,
flags,
data)
#wire DIO0 to C0GT - set bit high to enable counting
dio_device.d_bit_out(DigitalPortType.AUXPORT, 0, 1)
try:
while True:
try:
# Get the status of the background operation
status, transfer_status = daqi_device.get_scan_status()
reset_cursor()
print('Please enter CTRL + C to terminate the process\n')
print('Active DAQ device: ', descriptor.dev_string, ' (',
descriptor.unique_id, ')\n', sep='')
print('actual scan rate = ', '{:.6f}'.format(rate), 'Hz\n')
index = transfer_status.current_index
print('currentScanCount = ',
transfer_status.current_scan_count)
print('currentTotalCount = ',
transfer_status.current_total_count)
print('currentIndex = ', index, '\n')
for i in range(number_of_scan_channels):
if (channel_descriptors[i].type
== DaqInChanType.DIGITAL):
clear_eol()
print('(Di', channel_descriptors[i].channel, '): ',
'{:d}'.format(int(data[index + i])))
else:
clear_eol()
print('(Ci', channel_descriptors[i].channel, '): ',
'{:d}'.format(int(data[index + i])))
sleep(0.1)
except (ValueError, NameError, SyntaxError):
break
except KeyboardInterrupt:
pass
#stop time
tmr_device.pulse_out_stop(timer_number)
#set counter #1 gate low to prevent counting
dio_device.d_bit_out(DigitalPortType.AUXPORT, 0, 0)
except RuntimeError as error:
print('\n', error)
finally:
if daq_device:
# Stop the scan if it is still running.
if status == ScanStatus.RUNNING:
daqi_device.scan_stop()
if daq_device.is_connected():
daq_device.disconnect()
daq_device.release()
def reset_cursor():
"""Reset the cursor in the terminal window."""
stdout.write('\033[1;1H')
def clear_eol():
"""Clear all characters to the end of the line."""
stdout.write('\x1b[2K')
if __name__ == '__main__':
main()