這是一個特定于產(chǎn)品的 C 示例,它使用一個計數(shù)器來劃分輸入頻率,并使用第二個計數(shù)器來測量新頻率。為此,它啟用計數(shù)器輸出并使用范圍限制計數(shù)。計數(shù)器將計數(shù)到指定值,將輸出線設(shè)置為高電平。然后在第二個值上將輸出線設(shè)置為低電平。此示例設(shè)置為輸出 50% 的占空比,但如果您使用輸出寄存器值,您可以獲得其他占空比。下面列出了完整的程序,并附在文章的底部。
/*
UL 調(diào)用演示: ulCInConfigScan()
目的:執(zhí)行連續(xù)掃描
指定頻道
演示:輸出開啟和范圍限制開啟
腳步:
1.調(diào)用ulGetDaqDeviceInventory()獲取可用DAQ設(shè)備列表
2. 調(diào)用 ulCreateDaqDevice() 來獲取第一個 DAQ 設(shè)備的句柄
3. 調(diào)用 ulConnectDaqDevice() 建立與 DAQ 設(shè)備的 UL 連接
4.調(diào)用ulCConfigScan()配置通道
5. 調(diào)用 ulCInScan() 開始頻道掃描
6.調(diào)用ulCInScanStatus()查看后臺操作狀態(tài)
7.顯示每個通道的數(shù)據(jù)
8.調(diào)用ulCInScanStop()停止后臺操作
9. 退出進(jìn)程前調(diào)用 ulDisconnectDaqDevice() 和 ulReleaseDaqDevice()。
***** 測試信號由 TMR0 提供。將其連接到計數(shù)器 0 輸入
***** 將計數(shù)器 0 輸出連接到計數(shù)器 1 輸入,用于測量分頻
*/
#include <stdio.h>
#include <stdlib.h>
#include “uldaq.h”
#include “實用程序.h”
#define MAX_DEV_COUNT 100
#define MAX_SCAN_OPTIONS_LENGTH 256
#define ActualTickSize 0.00000002083
詮釋主要(無效)
{
整數(shù)描述符索引 = -1;
DaqDeviceDescriptor devDescriptors[MAX_DEV_COUNT];
DaqDeviceInterface interfaceType = USB_IFC;
DaqDeviceHandle daqDeviceHandle = 0;
無符號整數(shù) numDevs = MAX_DEV_COUNT;
// 設(shè)置一些用于獲取數(shù)據(jù)的變量
int FirstChannel = 1;
整數(shù)最后通道 = 1;
int ChannelCount = 1;
常量 int samplesPerCounter = 100;
雙采樣率 = 100;
整數(shù)索引 = 0;
無符號長長*緩沖區(qū)=空;
UlError 錯誤 = ERR_NO_ERROR;
詮釋 i = 0;
int __attribute__((未使用)) ret;
字符 c;
// 獲取所有可用 DAQ 設(shè)備的描述符
err = ulGetDaqDeviceInventory(interfaceType, devDescriptors, &numDevs);
如果(錯誤!= ERR_NO_ERROR)
轉(zhuǎn)到結(jié)束;
// 驗證至少檢測到一個 DAQ 設(shè)備
如果 (numDevs == 0)
{
printf("沒有檢測到數(shù)據(jù)采集設(shè)備\n");
轉(zhuǎn)到結(jié)束;
}
printf("找到 %d 個 DAQ 設(shè)備\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正在連接設(shè)備 %s - 請稍候...\n", devDescriptors[descriptorIndex].devString);
// 創(chuàng)建到設(shè)備的連接
錯誤 = ulConnectDaqDevice(daqDeviceHandle);
如果(錯誤!= ERR_NO_ERROR)
轉(zhuǎn)到結(jié)束;
// 為有范圍限制的計數(shù)配置通道
錯誤 = ulCConfigScan(daqDeviceHandle,
0,
CMT_COUNT,
CMM_OUTPUT_ON |CMM_RANGE_LIMIT_ON,
CED_RISING_EDGE,
CTS_TICK_20PT83ns,
CDM_TRIGGER_AFTER_STABLE,
CDT_DEBOUNCE_500ns,
CF_DEFAULT);
如果(錯誤!= ERR_NO_ERROR)
轉(zhuǎn)到結(jié)束;
錯誤 = ulCLoad(daqDeviceHandle,0,CRT_MIN_LIMIT, 0);
錯誤 = ulCLoad(daqDeviceHandle,0,CRT_MAX_LIMIT, 99);
如果(錯誤!= ERR_NO_ERROR)
轉(zhuǎn)到結(jié)束;
//將輸入頻率除以100;輸出將從 0-49 低,從 50-99 高
錯誤 = ulCLoad(daqDeviceHandle,0, CRT_OUTPUT_VAL0, 49);
錯誤 = ulCLoad(daqDeviceHandle, 0, CRT_OUTPUT_VAL1, 99);
//改變占空比修改CRT_OUPUT_VAL0
如果(錯誤!= ERR_NO_ERROR)
轉(zhuǎn)到結(jié)束;
// 為周期模式配置通道
錯誤 = 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)
{
轉(zhuǎn)到結(jié)束;
}
// 分配一個緩沖區(qū)來接收數(shù)據(jù)
buffer = (unsigned long long*) malloc(ChannelCount * samplesPerCounter * sizeof(unsigned long long));
如果(緩沖區(qū) == NULL)
{
printf("\n內(nèi)存不足,無法創(chuàng)建掃描緩沖區(qū)\n");
轉(zhuǎn)到結(jié)束;
}
printf("\n%s 準(zhǔn)備好了\n", devDescriptors[descriptorIndex].devString);
printf("函數(shù)演示:ulCConfigScan()\n");
printf("計數(shù)器: %d - %d\n", FirstChannel, LastChannel);
printf("每個通道的樣本數(shù):%d\n", samplesPerCounter);
printf("速率:%.2f S/s\n", SampleRate);
printf("\n按 ENTER 繼續(xù)\n");
ret = scanf("%c", &c);
ret = 系統(tǒng)(“清除”);
雙頻 = 100000;
雙重職責(zé) = 0.5;
雙延遲 = 0.0;
//***** 定時器輸出用作測試信號,將 TMR0 連接到計數(shù)器 0
錯誤 = ulTmrPulseOutStart(daqDeviceHandle, 0, &freq, &duty, 0, &delay, TMRIS_LOW, PO_DEFAULT);
如果(錯誤!= ERR_NO_ERROR)
{
轉(zhuǎn)到結(jié)束;
}
//***** 還將計數(shù)器 0 輸出連接到計數(shù)器 1 輸入
錯誤 = ulCInScan(daqDeviceHandle,
第一頻道,
最后一個頻道,
samplesPerCounter,
&采樣率,
SO_DEFAULTIO | SO_CONTINUOUS,
CINSCAN_FF_CTR32_BIT ,
緩沖);
如果(錯誤 == ERR_NO_ERROR)
{
掃描狀態(tài)狀態(tài);
轉(zhuǎn)移狀態(tài)轉(zhuǎn)移狀態(tài);
詮釋 i = 0;
// 獲取獲取的初始狀態(tài)
ulCInScanStatus(daqDeviceHandle, &status, &transferStatus);
而(狀態(tài) == SS_RUNNING && 錯誤 == ERR_NO_ERROR && !enter_press())
{
// 獲取當(dāng)前采集狀態(tài)
錯誤 = ulCInScanStatus(daqDeviceHandle, &status, &transferStatus);
如果(錯誤 == ERR_NO_ERROR)
{
// 將光標(biāo)重置到顯示的頂部并
// 顯示終止消息
重置游標(biāo)();
printf("按回車鍵終止進(jìn)程\n\n");
printf("活動數(shù)據(jù)采集設(shè)備:%s (%s)\n\n", devDescriptors[descriptorIndex].productName, devDescriptors[descriptorIndex].uniqueId);
printf("測試頻率 = %.1f Hz\n", freq);
printf("除以 100\n\n");
index = transferStatus.currentIndex;
printf("currentScanCount = %-10llu \n", transferStatus.currentScanCount);
printf("currentTotalCount = %-10llu \n", transferStatus.currentTotalCount);
printf("currentIndex = %-10d \n\n", index);
如果(索引 >= 0)
{
// 顯示數(shù)據(jù)
浮動周期 = (float)((buffer[index] * ActualTickSize));
清除EOL();
//0 到 100 個計數(shù)
printf("新頻率:\t= %2.3f Hz\n", 1/period );
睡眠(100000);
}
}
}
// 如果仍在運(yùn)行,則停止采集
如果(狀態(tài) == SS_RUNNING && 錯誤 == ERR_NO_ERROR)
{
錯誤 = ulCInScanStop(daqDeviceHandle);
}
}
// 斷開與 DAQ 設(shè)備的連接
ulDisconnectDaqDevice(daqDeviceHandle);
結(jié)尾:
// 釋放 DAQ 設(shè)備的句柄
ulReleaseDaqDevice(daqDeviceHandle);
// 釋放掃描緩沖區(qū)
免費(fèi)(緩沖區(qū));
如果(錯誤!= ERR_NO_ERROR)
{
字符 errMsg[ERR_MSG_LEN];
ulGetErrMsg(err, errMsg);
printf("錯誤代碼: %d \n", err);
printf("錯誤信息: %s \n", errMsg);
}
返回0;
}