英创信息技术主板EM9160测频功能的使用介绍

描述

英创公司的主流产品EM9160是一款功能强大的嵌入式工控主板,其主要应用是作为工业智能设备的核心平台。EM9160预装了Window CE5.0(正版)或Linux-2.6操作系统,并为常规的标准通讯接口配置了驱动程序,这些接口包括以太、串口、USB、SPI、I2C、PWM、AD、GPIO以及精简ISA扩展总线等。客户的应用程序可利用标准驱动程序的API函数,就可方便地操作接口,实现所需的功能。

本文主要介绍采用EM9160实现对外部信号实时频率测量的使用方法。EM9160可支持最多2路外部输入信号的频率测量。由于该功能是针对客户的需求新近开发的,客户在使用该功能时需遵循以下方法:

1. 硬件方面,被测频率信号需整形为标准的 3.3V TTL电平信号,信号接入管脚为CN1.25#,即COM4口的RXD4管脚;若需要测试2路,则第2路信号可接到CN1.26#,即COM4口的TXD4管脚。这意味着若要使用测频功能,COM4口就不能再用。输入脉冲的下降沿被作为一个周期的开始。

2. 若同时对两路信号进行测频,本方案还将占用1路内部的定时器资源,相应的GPIO12不能再作为PWM脉冲输出,或作为脉冲周期、脉冲占空比的输入通道。若仅对1路信号进行测频,GPIO12的脉冲计数功能不受影响,且输入信号必须接到CN1.25#管脚。

3. 软件方面,应用程序打开驱动程序“FRQ1:”,通过DevIoControl设置测频的采样间隔并启动测量过程(命令码为IOCTL_FRQ_START)。然后通过标准的read函数读取测量的频率值序列。应用程序也可以用DevIoControl来关闭测频的功能(命令码为IOCTL_FRQ_STOP)。

4. 频率测量间隔以ms为单位,尽管最小测量间隔可以为1ms,但建议应用选择5ms以上的测量间隔,以避免对CPU造成过重的负载。应用程序读取的频率值是该测量间隔内输入脉冲频率的平均值。应用程序通过以下数据结构来设置输入通道和采样率:

typedef struct __FREQ_SETUP
        {
                DWORD dwCh2Enable; // = 1:通道2使能,= 0:禁止 
                DWORD dwMillisecondPerSample; // 采样间隔,单位为ms
        } FREQ_SETUP, *PFREQ_SETUP;

5. 应用程序需要使用以下数据结构来读取测量的频率数据:

typedef struct __FREQ_DATA
        {
                DWORD dwFreq1; // 通道1频率值,单位为0.01Hz
                DWORD dwFreq2; // 通道2频率值,单位为0.01Hz
                DWORD dwTimeStamp; // 测量该频率值的系统时间,单位为ms
        } FREQ_DATA, *PFREQ_DATA;

6. 注意,在双通道测量中,由于是在同一采样间隔进行的测量,两个通道的频率不能相差太大,否则可能会影响低频通道的测量精度。

以下是典型的应用程序代码:

1. 打开驱动程序

HANDLE hFREQ; hFREQ = CreateFile( L”FRQ1:”, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

2. 设置采样间隔并启动频率测量

FREQ_SETUP SetupPar;
        SetupPar.dwCh2Enable = 1; // 使能通道2
        SetupPar. dwMillisecondPerSample = 10; // 设置采样间隔为10ms
        if (!DeviceIoControl (hFREQ,
                IOCTL_FRQ_START,
                &SetupPar, sizeof(FREQ_SETUP), // 输入参数
                NULL, 0, // 无输出参数
                NULL, // 无返回值
                NULL ))
        {
                // 出错处理。。。
        }

3. 读取测量数据,一次可读取多个数据点

FREQ_DATA FreqDatBuf[100]; // 最长一次读取100个点 
        DWORD dwActualLen = 0; 
        if(!ReadFile(hFREQ,
                FreqDatBuf, // 数据缓冲区
                100*sizeof(FREQ_DATA), // 缓冲区大小,字节为单位
                &dwActualLen, // 实际读取的数据长度,字节为单位
                0 )
        {
                // 出错处理。。。
        } 
        // 实际读取到的频率值数量为:
        DWORD dwReturnNumData = dwActualLen / sizeof(FREQ_DATA);

4. 停止频率测量

if (!DeviceIoControl (hFREQ,
                IOCTL_FRQ_STOP,
                NULL, 0, // 无输入参数
                NULL, 0, // 无输出参数
                NULL, // 无返回值
                NULL ))
        {
                // 出错处理。。。
        }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分