這是適用于 Windows的產品特定USB-QUAD08 Python 示例。它將通道 0 配置為編碼器模式,將通道 1 配置為周期模式。它使用假距離值以將編碼器位置顯示為以英寸為單位的 +/- 距離。周期模式用于計算頻率和 RPM。為此,將計數乘以刻度大小 (20.83nS),然后取倒數并乘以 60 以獲得 RPM。Python 文件附在下面作為下載。
從 __future__ 導入 absolute_import,除法,print_function
進口時間
from builtins import * # @UnusedWildImport
從時間導入睡眠
從 ctypes 導入強制轉換、指針、c_double、c_ushort、c_ulong
從 mcculw 進口 ul
從 mcculw.enums 導入 ScanOptions、FunctionType、Status
從 mcculw.ul 導入 ULError,a_input_mode
從 mcculw.enums 導入接口類型
從 mcculw.enums 導入 CounterMode
從 mcculw.enums 導入 CounterDebounceMode
從 mcculw.enums 導入 CounterDebounceTime
從 mcculw.enums 導入 CounterEdgeDetection
從 mcculw.enums 導入 CounterTickSize
use_device_detection = True
def run_example():
board_num = 0
board_index = 0
find_device = " USB-QUAD08 "
如果使用_device_detection:
board_num = -1
ul.ignore_instacal()
dev_list = ul.get_daq_device_inventory(InterfaceType.USB)
如果 len(dev_list) > 0:
對于 dev_list 中的設備:
如果 str(device) == find_device:
print(f"找到 {find_device} 板號 = {board_index}")
print(f"序列號:{device.unique_id}")
print(f"產品類型:{hex(device.product_id)}")
board_num = board_index
ul.create_daq_device(board_num, 設備)
board_index = board_index + 1
如果 board_num == -1:
print(f"設備 {find_device} 未找到")
返回
別的:
print("未檢測到設備")
返回
# ************探索結束************
率 = 200
points_per_channel = 40
low_chan = 0
high_chan = 1
num_chans = 2
total_count = points_per_channel * num_chans
half_count = int(total_count / 2)
# SCALEDATA 選項,返回電壓而不是 A/D 計數
scan_options = ScanOptions.CONTINUOUS | 掃描選項。背景 | 掃描選項.CTR32BIT
memhandle = ul.win_buf_alloc_32(total_count)
buf_data = cast(memhandle, POINTER(c_ulong))
# 檢查緩沖區是否分配成功
如果不是內存句柄:
print("分配內存失敗")
返回
嘗試:
ul.c_config_scan(board_num,
低陳,
CounterMode.ENCODER | CounterMode.ENCODER_MODE_BIT_32,
CounterDebounceTime.DEBOUNCE500ns,
CounterDebounceMode.TRIGGER_AFTER_STABLE,
CounterEdgeDetection.RISING_EDGE,
CounterTickSize.TICK20PT83ns,
low_chan)
ul.c_config_scan(board_num,
high_chan,
CounterMode.PERIOD | CounterMode.PERIOD_MODE_BIT_32,
CounterDebounceTime.DEBOUNCE500ns,
CounterDebounceMode.TRIGGER_AFTER_STABLE,
CounterEdgeDetection.RISING_EDGE,
CounterTickSize.TICK20PT83ns,
high_chan)
# tick_size 是分配給單個計數的時間量
tick_size = 0.00000002083
# distance_per_tick 是分配給單個計數的距離(用于演示的任意值)
distance_per_tick = 0.001
# 開始讀取輸入
ul.c_in_scan(
board_num, low_chan, high_chan, total_count,
率,memhandle,scan_options)
# 創建一個格式字符串,對齊列中的數據
# curr_index 和 curr_count 加兩個
row_format = "{:8}" * (num_chans)
# 打印頻道名稱標題
標簽 = []
對于范圍內的 ch_num(low_chan,high_chan + 1):
標簽.append("CH" + str(ch_num) + "\t")
打印(row_format.format(*標簽))
# 用于切換讀取上下緩沖區的布爾標志
read_lower = 真
# 開始更新顯示的值
狀態,curr_count,curr_index = ul.get_status(
board_num, FunctionType.CTRFUNCTION)
最后 = 0
差異 = 0
而狀態!= Status.IDLE 和 curr_count < 5000:
# 確保數據點可用于顯示。
如果 curr_count > 0:
# curr_index 指向最后一個完成的開始
# 在板和板之間傳輸的通道掃描
# 數據緩沖區。顯示每個的最新值
# 渠道。
# 顯示數據 = []
如果(curr_index > half_count)和(read_lower == True):
# 將緩沖區的下半部分轉移到 buf_data 數組
ul.win_buf_to_array_32(memhandle, buf_data, 0, int(half_count))
如果 buf_data[1] > 0:
# 假設每轉一個脈沖
周期 = buf_data[1] * tick_size
頻率 = 1 / 周期
rpm = 頻率 * 60
距離 = buf_data[0] * distance_per_tick
print('{:.3f} 英寸\t\t{:.3f} RPM'.format(distance, rpm))
read_lower = 假
elif (curr_index < half_count) 和 (read_lower == False):
# 將緩沖區的上半部分傳輸到 buf_data 數組
ul.win_buf_to_array_32(memhandle, buf_data, int(half_count), int(half_count))
如果 buf_data[1] > 0:
# 假設每轉一個脈沖
周期 = buf_data[1] * tick_size
頻率 = 1 / 周期
rpm = 頻率 * 60
距離 = buf_data[0] * distance_per_tick
print('{:.3f} 英寸\t\t{:.3f} RPM'.format(distance, rpm))
read_lower = 真
睡眠(0.1)
狀態,curr_count,curr_index = ul.get_status(
board_num, FunctionType.CTRFUNCTION)
# 停止后臺操作(即使
# 掃描成功)
ul.stop_background(board_num, FunctionType.AIFUNCTION)
print("掃描成功。")
除了 ULError 為 e:
print("UL 錯誤\n", e)
最后:
# 在 finally 塊中釋放緩沖區以防止錯誤導致
# 內存泄漏。
ul.win_buf_free(內存句柄)
如果使用_device_detection:
ul.release_daq_device(board_num)
如果 __name__ == '__main__':
運行示例()