下面的示例程序演示了(使用C ++)如何為正交編碼器輸入配置USB-QUAD08通道。關鍵是將cbCConfigScan Mode參數設置為 ENCODER | ENCODER_MODE_X1 | ENCODER_MODE_BIT_32(對于X1模式)。您還必須 在cbCInScan功能的“選項”中指定CTR32BIT。例如, 連續運行的Background | CONTINUOUS | CTR32BIT。
它還演示了無需用戶運行InstaCal的設備發現。必須仍然安裝InstaCal,因為這樣做會安裝設備驅動程序。在本文的底部,您將找到一個包含Visual Studio 2008項目的Zip文件。
// VC_2008_USB_QUAD08_Encoder.cpp:定義控制臺應用程序的入口點。
//
#include“ stdafx.h”
/ *包含文件* /
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include“ cbw.h”
#定義RATE 100
#定義ChanCount 1
#定義COUNT個
#定義MAXNUMDEVS 100
無效main()
{
/ *變量聲明* /
int i = 0;
long curCount = 0;
long curIndex = 0;
int ULStat = 0;
長率= RATE;
簡短狀態;
long halfbuf = COUNT / 2;
bool NextReadUpper = false;
int numberOfDevices = MAXNUMDEVS;
DaqDeviceDescriptor廣告資源[MAXNUMDEVS];
DaqDeviceDescriptor DeviceDescriptor;
int BoardNum = -1;
浮動Rev =(float)CURRENTREVNUM;
ULStat = cbDeclareRevision(&Rev);
cbErrHandling(PRINTALL,STOPALL);
printf(“背景模式下的cbConfigScan()的演示\ n \ n”);
//忽略InstaCal設備發現
cbIgnoreInstaCal();
//找到USB設備
ULStat = cbGetDaqDeviceInventory(USB_IFC,庫存,&numberOfDevices);
for(i = 0; i <numberOfDevices; i ++)
{
DeviceDescriptor =清單[i];
// USB-QUAD08的產品ID = 0xCA
//產品ID可以在位于以下位置的ULProps.txt中找到
// C:\ Program Files(x86)\ Measurement Computing \ DAQ
if(DeviceDescriptor.ProductID == 0xCA)
{
BoardNum = i;
ULStat = cbCreateDaqDevice(BoardNum,DeviceDescriptor);
printf(“設備名稱:%s \ n”,DeviceDescriptor.ProductName);
打破;
}
}
如果(BoardNum <0)
{
printf(“找不到USB設備...按任意鍵退出\ n”);
getch();
返回;
}
//分配緩沖區
HANDLE MemHandle = 0;
MemHandle = cbWinBufAlloc32(COUNT);
無符號長* DataArray =(無符號長*)MemHandle;
ULStat = cbCConfigScan(BoardNum,
0,
ENCODER | ENCODER_MODE_X1 | ENCODER_MODE_BIT_32,
CTR_DEBOUNCE500ns,
CTR_TRIGGER_AFTER_STABLE,
CTR_RISING_EDGE,
CTR_TICK208PT3ns,
0);
if(ULStat!= 0)
printf(“錯誤代碼%d \ n”,ULStat);
unsigned int選項=背景|連續| CTR32BIT;
//使用選項Background | CONTINUOUS | CTR32BIT讀取通道0;
ULStat = cbCInScan(BoardNum,
0,
0,
計數,
&率,
MemHandle,
選項);
if(ULStat!= 0)
printf(“錯誤代碼%d \ n”,ULStat);
while(!_ kbhit())
{
//此循環先讀取緩沖區的下半部分,然后連續讀取上半部分。
//它使用NextReadUpper標志,以便緩沖區的每一半被讀取一次
ULStat = cbGetStatus(BoardNum,&Status,&curCount,&curIndex,CTRFUNCTION);
if(ULStat!= 0){
printf(“錯誤代碼%d \ n”,ULStat);
打破;
}
if((curIndex> halfbuf)&&(NextReadUpper ==假))
{
NextReadUpper = true;
對于(i = 0; i <halfbuf; i ++)
printf(“%ld \ n”,DataArray [i]);
}
否則if((curIndex <halfbuf)&&(NextReadUpper == true))
{
NextReadUpper = false;
對于(i = 0; i <halfbuf; i ++)
printf(“%ld \ n”,DataArray [i]);
}
睡眠(10);
}
cbStopBackground(BoardNum,CTRFUNCTION);
cbWinBufFree(MemHandle);
cbReleaseDaqDevice(BoardNum);
printf(“已完成...按任意鍵退出\ n”);
getch();
}