该方法通过WinAPl函数访问计算机高速系统计数器实现级计时,相对当前常用的几种其他方法来说,此方法具有精度更高、实现更方便、程序更简单的优点。后,讨论了使用高速计时器可能出现的计数值上跳现象及解决方法。
86:A收穑日期:2002―随着Windows2000的普及,使得在Win-dow2000平台上开发工业实时控制系统的应用软件成为大势所趋。但是,在Windows2000平台上开发工控软件,常常必须解决高精度计时方面的问题。
目前常用的解决方法为:⑴使用Windows中提供的常规定时器Timer控件。这种方法相对简单直接使用Windows的定应用程序中设置一个或多个定时时钟。但是,由于受系统时钟的限制,这种方法的精度很低,多能达到55ms.而且,此方法所建立的定时器是由定时器消息WM-Timer驱动的;但WM -Timer在串行消息队列中的优先级很低,往往额外造成无法预料的较大定时误差。因此,此方法弊端较多,在要求高精度或高实时性的工控程序设计中较少使用。
(2)使用多媒体定时器,调用用于多媒体定时的WindowsAPI函数来实现。使用Windows的多媒体扩展库中的几个定时函数:(3)编写驱动程序实现计时。这种方法精度较高,但涉及到VxD或WDM方面的专门知识,有较大难度。
还有利用系统定时中断,利用多线程机制等等方法,这些方法比较复杂,而且精度并未得到较大提高。所以,本文介绍利用Windows和QueryPerform―anceCounter两个函数,方便简单地实现Ms级高精度计时。
1函数介绍如果计算机硬件支持,QueryPerformanceFie―quency函数可读取计算机系统的计时器的频率。
此频率值依不同处理器而得到不同值,但在计算机运行时是稳定不变的。
率的变量。如果计算机硬件不支持,这个参数可能值为0.返回值:如果计算机硬件支持,函数返回值为非0;如果机硬件不支持,函数返回值为0.如果计算机硬件支持,QueryPerformanceCou―nter函数读取计算机系统计数器中的当前计数值。
器当前值的变量。如果计算机硬件不支持,这个参数可能值为0.返回值:如果计算机硬件支持,函数返回值为非0;如果计算机硬件不支持,函数返回值为0.函数,这两个函数有高得多的计时精度。
2程序设计这里以一高速电机瞬时转速测量为实例,用VC++6.0编写了一个简单的应用程序来说明如何在Windows2000平台上实现级高精度计时。
高速电机通过变速箱带动一采样盘转动,采样盘一周均匀分布了1000条采样栅,变速箱速率比为1:10.即电机每转动一周,外围高速采样电路就产生10000个计数脉冲,经整形后送至电路上的累加器单元计数。
应用程序如下,主要给出高精度计时的实现部分,其他部分从简。
前的计数值//计时结束后的计数值//换算后的计时Ms值发请求命令至外围采样电路,将累加器清零并开始计采样脉冲数发请求命令至外围采样电路,停止累加器计数发请求命令至外围采样电路,返回累加器计数值至变量nTotal //输出计时结果//输出转速结果Cstngstr2;表示从AA处运行到BB处共用时579Ms,电机的瞬间转速为5636.8转/min.外围采样电路设计合理且采用高速元件,那么,两次请求外围电路的响应延迟时间所引起的计时误差正负相反,基本可以抵消,总体误差可以忽略。否则,必须经过反复实际测试,得到一个补偿常数e,在程序中对计时加以补偿以减少误差。
请求外围电路的程序语句好采用汇编语