精确计算两次时间问题(100分)

  • 主题发起人 主题发起人 兰凌
  • 开始时间 开始时间

兰凌

Unregistered / Unconfirmed
GUEST, unregistred user!
我接收脉冲,现在需要计算两次脉冲间隔时间,要求精确到微秒,用定时器存在误差。我查过以前的问题,发现几乎全部都是讲定时器的,我要做的是一个计时器,两次时间相减不知道误差有多少,我用减的查不出误差,因为单位是秒,我没办法精确计算,谁有做过的,或者有相同经验的帮下忙,谢谢了。
 
用GetTickCount():取当前时刻(不是时间) <br>这样,在FormCreate中取一次,记住,在现在再取一次,相减得一个毫秒数,将其换算成 <br>你所需的时间格式就行了。 <br>这种方法比用Now()好,因为中途万一由于什么原因改了当前时间(比如:改成上个月了) <br>计算的就不准了 <br><br>begin_time:=GetTickCount(): <br>end_time:=GetTickCount(): <br>所用时间:=end_time-begin_time ;
 
再告诉你一个精度为微秒级的计时方法: <br>unit Unit1; <br><br>interface <br><br>uses <br> Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, <br> Dialogs, StdCtrls, Buttons; <br><br>type <br> TForm1 = class(TForm) <br> &nbsp; Edit1: TEdit; <br> &nbsp; BitBtn1: TBitBtn; <br> &nbsp; Label1: TLabel; <br> &nbsp; Button1: TButton; <br> &nbsp; Edit2: TEdit; <br> &nbsp; Label2: TLabel; <br> &nbsp; Label3: TLabel; <br> &nbsp; Edit3: TEdit; <br> &nbsp; procedure BitBtn1Click(Sender: TObject); <br> &nbsp; procedure Button1Click(Sender: TObject); <br> private <br> &nbsp; { Private declarations } <br> public <br> &nbsp; TimeB, TimeE: Int64; &nbsp;//开始时间,结束时间 <br> end; <br><br>var <br> Form1: TForm1; <br><br>implementation <br><br>{$R *.dfm} <br><br>procedure TForm1.BitBtn1Click(Sender: TObject); <br>var <br> F: Int64; //频率 <br>begin <br> QueryPerformanceCounter(TimeE); &nbsp;//计时结束 &nbsp;QueryPerformanceCounter() 获得当前时钟经过的振动数 <br><br> QueryPerformanceFrequency(F); &nbsp;//时钟频率 <br> Edit1.Text := IntToStr(F); <br><br> Edit2.Text := FloatToStr((TimeE - TimeB)/F*1000000); &nbsp;//计时时长(微秒) <br> Edit3.Text := FloatToStr((TimeE - TimeB)/F); // 计时时长(秒) <br>end; <br><br>procedure TForm1.Button1Click(Sender: TObject); <br>begin <br> QueryPerformanceCounter(TimeB); &nbsp;//计时开始 <br> Edit2.Text := '0'; <br> Edit3.Text := '0'; <br>end; <br><br>end.
 
哪这中间的存在的误差有多少呢?<br>因为我要根据这来计算速度,误差要用ms来计算的,误差较大的话计算的结果会差好多
 
使用API 函数 GetTickCount可以得到系统运行的毫秒数<br>两次GetTickCount的数据相减就是这段时间的毫秒数<br>微妙恐怕Delphi没有这样的计算能力吧<br>毕竟处理器本身的计算也需要时间啊
 
同意使用这种方法<br> QueryPerformanceCounter(TimeE); &nbsp;//计时结束 &nbsp;QueryPerformanceCounter() 获得当前时钟经过的振动数 <br><br> QueryPerformanceFrequency(F); &nbsp;//时钟频率
 
我认为用 MMSystem 中的 timeGetTime 精度就够高了.
 
to 兰凌,<br>那个已经是微秒级的精度计算了,用来计算MS级的应该够了吧。
 
除了用gettickcount外,要想提高定时的精度,只有用中断方式。<br>但是,想要达到微秒级的定时精度,在windows下肯定是不行的。因为windows系统不是一个<br>实时操作系统。就算是用了中断方式,windows操作系统本身的中断响应通常也在几十个毫<br>秒或更长的时间,且这个响应时间是不固定的。根本无法达到微秒级的精度。<br>可以考虑采用硬件来采集脉冲的时间间隔,然后通过并口或其他方式来读取数据。
 
补充:<br>分辨率和精度不是同一个概念。用某些方面虽然可以达到微秒级的分辨率,但并不是说精度<br>就可以达到微秒级了。再高的分辨率,在普通的widows操作系统的控制下,也只能达到几十<br>毫秒甚至更低的精度。<br>就算是实时的嵌入式系统,恐怕也没有能够达到这样的精度。<br>毕竟一个多任务的操作系统是用分时的方法来分配CPU的资源的。
 
如果想要十分精确的计算的话,恐怕在windows上是真的有点问题了。<br>不过先试试weiliu的方法,看看到底误差会有多少。实在不行的只能用单片机来控制了。
 
后退
顶部