英創(chuàng)公司的主流產(chǎn)品EM9160是一款功能強大的嵌入式工控主板,其主要應(yīng)用是作為工業(yè)智能設(shè)備的核心平臺。EM9160預(yù)裝了Window CE5.0(正版)或Linux-2.6操作系統(tǒng),并為常規(guī)的標(biāo)準(zhǔn)通訊接口配置了驅(qū)動程序,這些接口包括以太、串口、USB、SPI、I2C、PWM、AD、GPIO以及精簡ISA擴展總線等??蛻舻膽?yīng)用程序可利用標(biāo)準(zhǔn)驅(qū)動程序的API函數(shù),就可方便地操作接口,實現(xiàn)所需的功能。
本文主要介紹采用EM9160實現(xiàn)對外部信號實時頻率測量的使用方法。EM9160可支持最多2路外部輸入信號的頻率測量。由于該功能是針對客戶的需求新近開發(fā)的,客戶在使用該功能時需遵循以下方法:
1. 硬件方面,被測頻率信號需整形為標(biāo)準(zhǔn)的 3.3V TTL電平信號,信號接入管腳為CN1.25#,即COM4口的RXD4管腳;若需要測試2路,則第2路信號可接到CN1.26#,即COM4口的TXD4管腳。這意味著若要使用測頻功能,COM4口就不能再用。輸入脈沖的下降沿被作為一個周期的開始。
2. 若同時對兩路信號進行測頻,本方案還將占用1路內(nèi)部的定時器資源,相應(yīng)的GPIO12不能再作為PWM脈沖輸出,或作為脈沖周期、脈沖占空比的輸入通道。若僅對1路信號進行測頻,GPIO12的脈沖計數(shù)功能不受影響,且輸入信號必須接到CN1.25#管腳。
3. 軟件方面,應(yīng)用程序打開驅(qū)動程序“FRQ1:”,通過DevIoControl設(shè)置測頻的采樣間隔并啟動測量過程(命令碼為IOCTL_FRQ_START)。然后通過標(biāo)準(zhǔn)的read函數(shù)讀取測量的頻率值序列。應(yīng)用程序也可以用DevIoControl來關(guān)閉測頻的功能(命令碼為IOCTL_FRQ_STOP)。
4. 頻率測量間隔以ms為單位,盡管最小測量間隔可以為1ms,但建議應(yīng)用選擇5ms以上的測量間隔,以避免對CPU造成過重的負(fù)載。應(yīng)用程序讀取的頻率值是該測量間隔內(nèi)輸入脈沖頻率的平均值。應(yīng)用程序通過以下數(shù)據(jù)結(jié)構(gòu)來設(shè)置輸入通道和采樣率:
typedef struct __FREQ_SETUP
{
DWORD dwCh2Enable; // = 1:通道2使能,= 0:禁止
DWORD dwMillisecondPerSample; // 采樣間隔,單位為ms
} FREQ_SETUP, *PFREQ_SETUP;
5. 應(yīng)用程序需要使用以下數(shù)據(jù)結(jié)構(gòu)來讀取測量的頻率數(shù)據(jù):
typedef struct __FREQ_DATA
{
DWORD dwFreq1; // 通道1頻率值,單位為0.01Hz
DWORD dwFreq2; // 通道2頻率值,單位為0.01Hz
DWORD dwTimeStamp; // 測量該頻率值的系統(tǒng)時間,單位為ms
} FREQ_DATA, *PFREQ_DATA;
6. 注意,在雙通道測量中,由于是在同一采樣間隔進行的測量,兩個通道的頻率不能相差太大,否則可能會影響低頻通道的測量精度。
以下是典型的應(yīng)用程序代碼:
1. 打開驅(qū)動程序
HANDLE hFREQ; hFREQ = CreateFile( L”FRQ1:”, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
2. 設(shè)置采樣間隔并啟動頻率測量
FREQ_SETUP SetupPar;
SetupPar.dwCh2Enable = 1; // 使能通道2
SetupPar. dwMillisecondPerSample = 10; // 設(shè)置采樣間隔為10ms
if (!DeviceIoControl (hFREQ,
IOCTL_FRQ_START,
&SetupPar, sizeof(FREQ_SETUP), // 輸入參數(shù)
NULL, 0,// 無輸出參數(shù)
NULL, // 無返回值
NULL ))
{
// 出錯處理。。。
}
3. 讀取測量數(shù)據(jù),一次可讀取多個數(shù)據(jù)點
FREQ_DATA FreqDatBuf[100]; // 最長一次讀取100個點
DWORD dwActualLen = 0;
if(!ReadFile(hFREQ,
FreqDatBuf, // 數(shù)據(jù)緩沖區(qū)
100*sizeof(FREQ_DATA), // 緩沖區(qū)大小,字節(jié)為單位
&dwActualLen, // 實際讀取的數(shù)據(jù)長度,字節(jié)為單位
0 )
{
// 出錯處理。。。
}
// 實際讀取到的頻率值數(shù)量為:
DWORD dwReturnNumData = dwActualLen / sizeof(FREQ_DATA);
4. 停止頻率測量
if (!DeviceIoControl (hFREQ,
IOCTL_FRQ_STOP,
NULL, 0, // 無輸入?yún)?shù)
NULL, 0, // 無輸出參數(shù)
NULL, // 無返回值
NULL ))
{
// 出錯處理。。。
}
-
Linux
+關(guān)注
關(guān)注
87文章
11312瀏覽量
209708 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35402
發(fā)布評論請先 登錄
相關(guān)推薦
評論