下面的示例程序演示(使用 C++)如何為正交編碼器輸入配置USB-QUAD08通道。關(guān)鍵是將cbCConfigScan Mode參數(shù)設(shè)置為 ENCODER|ENCODER_MODE_X1|ENCODER_MODE_BIT_32(對(duì)于X1模式)。您還必須 在 cbCInScan 函數(shù)的選項(xiàng)中指定 CTR32BIT。例如, 背景|連續(xù)|CTR32BIT用于連續(xù)操作。
它還演示了不需要用戶運(yùn)行 InstaCal 的設(shè)備發(fā)現(xiàn)。InstaCal 仍必須安裝,因?yàn)檫@樣做會(huì)安裝設(shè)備驅(qū)動(dòng)程序。在本文的底部,您將找到一個(gè)包含 Visual Studio 2008 項(xiàng)目的 Zip 文件。
// VC_2008_USB_QUAD08_Encoder.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
/* 包含文件 */
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include "cbw.h"
#define 率 100
#define ChanCount 1
#define 計(jì)數(shù) 100
#define MAXNUMDEVS 100
無效主()
{
/* 變量聲明 */
int i=0;
長curCount=0;
長curIndex=0;
int ULStat = 0;
長率 = 率;
短狀態(tài);
長半緩沖 = COUNT/2;
bool NextReadUpper = false;
int numberOfDevices = MAXNUMDEVS;
DaqDeviceDescriptor 庫存[MAXNUMDEVS];
DaqDeviceDescriptor DeviceDescriptor;
int BoardNum = -1;
float Rev = (float)CURRENTREVNUM;
ULStat = cbDeclareRevision(&Rev);
cbErrHandling(打印,停止);
printf ("后臺(tái)模式下 cbConfigScan() 的演示\n\n");
//忽略 InstaCal 設(shè)備發(fā)現(xiàn)
cbIgnoreInstaCal();
//定位USB設(shè)備
ULStat = cbGetDaqDeviceInventory(USB_IFC,庫存,&numberOfDevices);
for( i = 0; i < numberOfDevices; i++)
{
DeviceDescriptor = 庫存[i];
// USB-QUAD08 的產(chǎn)品 ID = 0xCA
//產(chǎn)品 ID 可以在位于的 ULProps.txt 中找到
// C:\Program Files (x86)\Measurement Computing\DAQ
if(DeviceDescriptor.ProductID == 0xCA)
{
BoardNum = i;
ULStat = cbCreateDaqDevice(BoardNum, DeviceDescriptor);
printf("設(shè)備名稱:%s\n", DeviceDescriptor.ProductName);
休息;
}
}
if(BoardNum < 0)
{
printf("找不到USB設(shè)備...按任意鍵退出\n");
獲取();
返回;
}
//分配緩沖區(qū)
句柄 MemHandle = 0;
MemHandle = cbWinBufAlloc32(COUNT);
unsigned long *DataArray = (unsigned long*)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);
如果(ULStat != 0)
printf("錯(cuò)誤代碼 %d\n",ULStat);
ULStat = cbCConfigScan(BoardNum,
1、
總計(jì) | BIT_32,
CTR_DEBOUNCE500ns,
CTR_TRIGGER_AFTER_STABLE,
CTR_RISING_EDGE,
CTR_TICK208PT3ns,
0);
如果(ULStat!= 0)
printf("錯(cuò)誤代碼 %d\n", ULStat);
unsigned int Options = Background|CONTINUOUS|CTR32BIT;
//使用選項(xiàng)Background|CONTINUOUS|CTR32BIT讀取通道0;
ULStat = cbCInScan(BoardNum,
0,
1、
數(shù)數(shù),
&速度,
內(nèi)存句柄,
選項(xiàng));
如果(ULStat != 0)
printf("錯(cuò)誤代碼 %d\n",ULStat);
while(!_kbhit())
{
//此循環(huán)讀取緩沖區(qū)的下半部分,然后連續(xù)讀取上半部分。
// 它使用 NextReadUpper 標(biāo)志,以便緩沖區(qū)的每一半都被讀取一次
ULStat = cbGetStatus(BoardNum,&Status,&curCount,&curIndex,CTRFUNCTION);
如果(ULStat != 0){
printf("錯(cuò)誤代碼 %d\n",ULStat);
休息;
}
if((curIndex > halfbuf) && (NextReadUpper == false))
{
NextReadUpper = true;
//打印下半部分的第一個(gè)值
printf("%ld\t %ld\n", DataArray[0], DataArray[1]);
}
else if((curIndex < halfbuf) && (NextReadUpper == true))
{
NextReadUpper = false;
//從上半部分打印第一個(gè)值
printf ("%ld\t %ld\n",DataArray[halfbuf], DataArray[halfbuf+1]);
}
睡眠(100);
}
cbStopBackground(BoardNum,CTRFUNCTION);
cbWinBufFree(MemHandle);
cbReleaseDaqDevice(BoardNum);
printf("完成...按任意鍵退出\n");
獲取();
}