用NI的数据采集卡实现简单电子测试之7——用“硬件计数器+软件定时”的方法实现测频率 [原创cnblogs.com/helesheng]

作为一款入门级的数据采集卡,USB-6009无法直接实现测频率,只可以对外部脉冲进行简单的计数。但如果采用Windows下的软件定时,配合硬件计数功能,也可以实现"测频法"测频。虽然该方法受到Windows下的软件定时不太精确(非实时操作系统)的限制,测频结果不太精确,但对精度要求不太高的应用,还是具有一定应用价值。本文给出相关代码设计思路,并举例计算了这种方法的测频误差。以下内容供大家参考,欢迎转载,但请注明出处: https://www.cnblogs.com/helesheng

一、测频法

常见测频分为"测频法"(又称"计频法")和"测周法"(又称"计时法"),关于这两种方法的优缺点和对硬件的要求可以参见本人的另一篇博文(https://www.cnblogs.com/helesheng/p/14107012.html),这里不再详细复述。这里仅就本文要用到的测频法进行简要介绍,以方便读者理解。

测频法的思路,是对较长的一段"标准时间"内被测信号的脉冲数量进行计数。如下图所示,给出"标准时间"的标准信号周期为Tc1,频率为fc1;外部输入的被测信号周期为Tx1,频率为fx1。
图1 测频法测量原理 如果计数器测得标准时间内Tc1时间内,被测信号共出现了N1个脉冲,则被测信号的频率为: f_{x1} = \\frac{N_1}{T_{c1}} = N_1 f_{c1}\\qquad\\qquad \\tag 1

由于计数器只能进行整数计数,而在Tc1时间窗口内,却不一定刚好有整数个被测信号周期。因为计数器的起止沿和被测信号的相位没有对齐,窗口边界上可能多算或少算一个脉冲从而造成的最大测量误差为±1个被测信号。这属于测频法的固有误差,跟板卡好坏无关。

二、基于USB-6009和软件定时的测频法

由于USB-6009只有计数功能,不具备任何硬件定时的功能,用其测频率只能采用"测频法"。外部输入的脉冲作为图1中被测信号,由USB-6009的PF0输入进行计数;而图1中的标准信号,则只能由LabVIEW调用Windows的定时系统服务来实现。

作为一种非实时操作系统,Windows的系统定时器的定时误差在ms数量级(任务调度抖动一般在1-2ms)。造成测频法的测试误差,不仅会来源于上面提到的±1个脉冲的计数误差,还会来源于Windows定时造成的标准信号周期Tc1的误差。

增加标准信号周期Tc1的时长,不仅能够降低±1个脉冲的计数误差在总计数值N1中的相对误差比例;还能够降低Windows软件定时误差在总定时长度中的相对误差比例。另一方面,标准信号周期Tc1取得太长,还会造成测试结果响应时间过长------没有人会希望使用一个数十秒才显示一次测试结果频率的测频器;且Tc1 的上限还受计数器位宽和被测信号最高频率的约束。因此,Tc1的取值还需要在测试精度和测试时间之前进行折中处理。

三、测试程序

下图所示的是我使用上述测频思路编写的对低频压控振荡器(电路图参见https://www.cnblogs.com/helesheng/p/9833691.html)输出的脉冲进行测频的LabVIEW程序框图和前面板图。
图2 基于USB-6009和软件定时的测频程序框图和前面板图 其中整个程序框图的主要功能实现都放在事件结构中,这样做的目的是使测试只发生在每次单击"开始测试"按钮之后。测试过程的包括:

  • 初始化USB-6009的计数功能
  • 用软件产生一个时长为Tc1的测试"窗口",用USB-6009对该"窗口"内被测信号进行计数
  • 读取计数值N1,并用该值除以窗口时长Tc1,得到被测信号频率

其中测试窗口Tc1是由LabVIEW的等待函数产生的,该函数的输入为以ms为单位的延迟时间(图2中的程序使用了Tc1为500ms)。值得注意的是,程序并未试图采用单次读取的方法,来直接获取Tc1测试窗口中的脉冲数。而是使用了在Tc1开始时刻和结束时刻两次读取计数值,然后相减求"窗口"内脉冲数量的方法来获取所需的计数值,从而避免了每次测试前对计数值清零的操作。另外,为保证读取数据采集卡的计数值的线程只有在Tc1完成后,才执行第二次读取脉冲数量的操作,程序使用了顺序结构。

整个VI的使用流程是这样的:程序开始运行后不对数据采集卡进行任何操作;当"开始测试"按钮被单击后,程序才开始初始化USB-6009的计数操作;为实现测频法测频率,测试过程需要500ms的延时来对外部脉冲进行计数;为提升用户体验,程序在500ms测试时间内点亮"测试中......"LED等,防止用户认为程序失去响应;延迟结束后,程序计算并显示被测信号频率。

正如前面分析的,整体测试误差由±1计数误差,和测试窗口定时误差组成。以被测信号为100Hz左右,测试窗口500ms为例估算:计数误差上限约为2%(1σ ≈ 1.15%),窗口定时误差1倍标准差内约为0.3% (1σ),3倍标准差内约为0.9% (3σ)。合成 1σ总体误差估计:\(\sqrt{(1.15\%)^2+(0.3\%)^2}\approx 1.19\%\)。当然,这里的误差是指500ms内脉冲数的估计误差百分比,如果要如本题所示的方法一样,乘2得到1s内的脉冲数量,计数误差比例还要乘以2再和定时误差进行误差合成。

最后,需要提醒读者注意的是,USB-6009的计数脉冲只能由PF0引脚输入(程序框图中该引脚输入被标识为ctr0)。用户不可以由程序指定脉冲输入的引脚。

相关推荐
LabVIEW开发1 天前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序
LabVIEW开发1 天前
CMT 矢量网络分析仪 + LabVIEW 测S参数?
labview·测试·labview程序
szxinmai主板定制专家2 天前
ARM+FPGA 数控机床控制器:选 CODESYS SoftMotion CNC,还是基于 LinuxCNC 自研搭建?架构、授权、实时性、量产风险深度对比
arm开发·fpga开发·codesys·数据采集卡·linuxcnc·rk3576
LabVIEW开发2 天前
FlexRIO 在轨图像取舍:判决要跑在数据进内存之前
labview·fpga·labview功能·labview程序·flexrio
LabVIEW开发3 天前
PHD2000 注射泵通宵实验:LabVIEW 分段排程、堵针检测与断点续跑
串口通信·labview·仪器控制·实验室自动化
LabVIEW开发3 天前
用 LabVIEW 做故障注入:把起落架的「危险试验」变成可重复流程
串口通信·labview·仪器控制·labview功能·labview程序
LabVIEW开发4 天前
CLAD 例题精讲 2|数值与布尔:三个反直觉的地方
labview
LabVIEW开发5 天前
波音客机降噪验证系统:NI PXI 加 LabVIEW 怎么同时做到可扩展与低成本
labview·labview知识·labview功能·labview程序
LabVIEW开发5 天前
风洞 50 米/秒,LabVIEW 采哪几路信号
自动化测试·数据采集·labview