這是適用于 Linux的產品特定USB-CTR04和USB-CTR08 C 示例。它將通道 0 配置為脈沖寬度模式,將通道 1 配置為周期模式。因為占空比測量是脈沖寬度除以周期,所以占空比與脈沖寬度和周期一起顯示。本文底部附有C代碼文件。
/*
UL 調用演示: ulCInConfigScan()
目的: 執行連續掃描
指定頻道
演示:脈寬和周期模式
腳步:
1.調用ulGetDaqDeviceInventory()獲取可用DAQ設備列表
2.調用ulCreateDaqDevice()獲取第一個DAQ設備的句柄
3.調用ulConnectDaqDevice()建立與DAQ設備的UL連接
4. 調用 ulCConfigScan() 配置通道
5.調用ulCInScan()開始通道掃描
6.調用ulCInScanStatus()查看后臺運行狀態
7. 顯示每個通道的數據
8.調用ulCInScanStop()停止后臺操作
9. 退出進程前調用ulDisconnectDaqDevice()和ulReleaseDaqDevice()。
*/
#include <stdio.h>
#include <stdlib.h>
#include "uldaq.h"
#include "utility.h"
#define MAX_DEV_COUNT 100
#define MAX_SCAN_OPTIONS_LENGTH 256
#define ActualTickSize 0.00000002083
int main(void)
{
int descriptorIndex = -1;
DaqDeviceDescriptor devDescriptors[MAX_DEV_COUNT];
DaqDeviceInterface interfaceType = USB_IFC;
daqDeviceHandle daqDeviceHandle = 0;
無符號整數 numDevs = MAX_DEV_COUNT;
// 設置一些用于獲取數據的變量
int FirstChannel = 0;
int LastChannel = 1;
int ChannelCount = 2;
const int samplesPerCounter = 100;
雙采樣率 = 100;
整數索引 = 0;
unsigned long long* 緩沖區 = NULL;
UlError err = ERR_NO_ERROR;
int i = 0;
int __attribute__((未使用)) ret;
字符 c;
// 獲取所有可用 DAQ 設備的描述符
err = ulGetDaqDeviceInventory(interfaceType, devDescriptors, &numDevs);
如果(錯誤!= ERR_NO_ERROR)
到最后;
// 驗證至少檢測到一個 DAQ 設備
如果 (numDevs == 0)
{
printf("未檢測到數據采集設備\n");
到最后;
}
printf("找到 %d 個數據采集設備\n", numDevs);
for (i = 0; i < (int) numDevs; i++)
{
printf(" [%d] %s: (%s)\n", i, devDescriptors[i].productName, devDescriptors[i].uniqueId);
// USB-CTR04 id = 0x12E,USB-CTR08 id = 0x127
if((devDescriptors[i].productId == 0x12E) || (devDescriptors[i].productId == 0x127))
{
描述符索引 = i;
daqDeviceHandle = ulCreateDaqDevice(devDescriptors[descriptorIndex]);
休息;
}
}
如果(描述符索引 == -1)
{
printf("\n錯誤:未找到USB-CTR04或USB-CTR08 \n");
返回0;
}
printf("句柄 = %d\n", daqDeviceHandle);
printf("\n正在連接設備 %s - 請稍候...\n", devDescriptors[descriptorIndex].devString);
// 創建到設備的連接
錯誤 = ulConnectDaqDevice(daqDeviceHandle);
如果(錯誤!= ERR_NO_ERROR)
到最后;
// 為脈寬模式配置通道
錯誤 = ulCConfigScan(daqDeviceHandle,
0,
CMT_PULSE_WIDTH,
CMM_DEFAULT,
CED_RISING_EDGE,
CTS_TICK_20PT83ns,
CDM_NONE,
CDT_DEBOUNCE_500ns,
CF_DEFAULT);
如果(錯誤!= ERR_NO_ERROR)
到最后;
// 為周期模式配置通道
錯誤 = ulCConfigScan(daqDeviceHandle,
1、
CMT_PERIOD,
CMM_DEFAULT,
CED_RISING_EDGE,
CTS_TICK_20PT83ns,
CDM_TRIGGER_AFTER_STABLE,
CDT_DEBOUNCE_500ns,
CF_DEFAULT);
如果(錯誤!= ERR_NO_ERROR)
{
到最后;
}
// 分配一個緩沖區來接收數據
buffer = (unsigned long long*) malloc(ChannelCount * samplesPerCounter * sizeof(unsigned long long));
如果(緩沖區== NULL)
{
printf("\n內存不足,無法創建掃描緩沖區\n");
到最后;
}
printf("\n%s 就緒\n", devDescriptors[descriptorIndex].devString);
printf("函數演示:ulCConfigScan()\n");
printf(" 計數器:%d - %d\n", FirstChannel, LastChannel);
printf(" 每個通道的樣本數:%d\n", samplesPerCounter);
printf(" 率:%f\n", 采樣率);
printf("\n按回車鍵繼續\n");
ret = scanf("%c", &c);
ret = system("清除");
雙頻 = 1000;
雙重職責 = 0.2;
雙延遲 = 0.0;
//定時器輸出用作測試信號,將TMR0連接到兩個計數器輸入
err = ulTmrPulseOutStart(daqDeviceHandle, 0, &freq, &duty, 0, &delay, TMRIS_LOW, PO_DEFAULT);
// 開始獲取
錯誤 = ulCInScan(daqDeviceHandle,
第一頻道,
最后一個頻道,
每個計數器的樣本,
&采樣率,
SO_DEFAULTIO | SO_CONTINUOUS,
CINSCAN_FF_CTR32_BIT ,
緩沖);
如果(錯誤 == ERR_NO_ERROR)
{
ScanStatus 狀態;
TransferStatus transferStatus;
int i = 0;
// 獲取獲取的初始狀態
ulCInScanStatus(daqDeviceHandle, &status, &transferStatus);
while(狀態 == SS_RUNNING && err == ERR_NO_ERROR && !enter_press())
{
// 獲取當前的獲取狀態
錯誤 = ulCInScanStatus(daqDeviceHandle, &status, &transferStatus);
如果(錯誤 == ERR_NO_ERROR)
{
// 將光標重置到顯示的頂部并
// 顯示終止消息
重置光標();
printf("按回車鍵終止進程\n\n");
printf("活動數據采集設備:%s (%s)\n\n", devDescriptors[descriptorIndex].productName, devDescriptors[descriptorIndex].uniqueId);
printf("實際掃描率 = %f\n\n", SampleRate);
索引 = transferStatus.currentIndex;
printf("currentScanCount = %-10llu \n", transferStatus.currentScanCount);
printf("currentTotalCount = %-10llu \n", transferStatus.currentTotalCount);
printf("currentIndex = %-10d \n\n", index);
如果(指數 >= 0)
{
// 顯示數據
浮動脈沖寬度 = (float)((buffer[index] * ActualTickSize) * 1000);
浮動周期 = (float)((buffer[index +1] * ActualTickSize) * 1000);
清除EOL();
//脈寬
printf("chan %d \t= %2.3f mS\n",0, 脈寬);
//周期通道
printf("chan %d \t= %2.3f mS\n",1, period );
printf("占空比 \t= %2.3f %\n", (脈沖寬度/周期) * 100);
usleep(100000);
}
}
}
// 如果它仍在運行,則停止獲取
如果(狀態 == SS_RUNNING && err == ERR_NO_ERROR)
{
錯誤 = ulCInScanStop(daqDeviceHandle);
}
}
// 斷開與 DAQ 設備的連接
ulDisconnectDaqDevice(daqDeviceHandle);
結尾:
// 釋放數據采集設備的句柄
ulReleaseDaqDevice(daqDeviceHandle);
// 釋放掃描緩沖區
自由(緩沖);
如果(錯誤!= ERR_NO_ERROR)
{
字符 errMsg[ERR_MSG_LEN];
ulGetErrMsg(err, errMsg);
printf("錯誤代碼:%d \n", err);
printf("錯誤信息:%s \n", errMsg);
}
返回0;
}