有一个流行的业余爱好级别的数控机床控制,它在Windows XP中运行,它有一个定时器,以用户可选的速率运行,范围从25 kHz到100 kHz。
碰巧我也做数控机床控制器,但我一直在使用Galil运动控制公司的DMC1800系列数字信号处理器运动控制器板,它是由我的上层程序控制的。有一些潜在的买家买不起这种配置,所以我写了另一个应用程序,我计划将其作为基于软件的控制包提供。这个应用程序已经完成了,除了我没有计时器。(MS多媒体计时器是不够的。)
为了避免混淆,我指的是能够以100 kHz频率工作的周期性计时器,而不是秒表计时器。
发布于 2009-12-09 01:52:06
不可能。Windows上可用的最快计时器是1ms (1 kHz)。你需要一个实时操作系统或者一个专用的控制器。即使是在实时操作系统中,通常最高也只有20 kHz。
发布于 2009-12-09 02:27:01
这个计时器到底需要做什么?如果它只需要输出一个在25 kHz到100 kHz之间的方波,那么你将需要额外的硬件,但不是非常昂贵的硬件。例如,看看这个来自数据转换的DT-340。它甚至可以比你需要的更快,我相信它甚至可以触发中断。或者这个PCI 8255/8254 48 I/O。
如果你的预算能负担得起500美元左右,那么应该有很多硬件选择。实际的可编程定时器芯片应该比这便宜得多,所以如果你愿意把你自己的电路连接到电脑上,你可能会比500美元做得更好。
我曾经围绕Intel8253可编程时间间隔计时器芯片构建了一个电路,该芯片在最初的IBM PC内部用于从内部扬声器发出嘟嘟声。它被连接到一个1.193182 MHz的晶体上,并有一个16位分频器。这个芯片已经存在了几十年了。如果你需要更好的,我相信从那时起已经有了改进。
当我说PC内部的8253 (或8254)芯片用于驱动内置扬声器时,我并不完整。在维基百科上有更多关于Intel 8253的信息。这里解释了输出0用于产生时钟中断,输出1用于DRAM刷新时序,输出2用于驱动内部扬声器。
前两个时钟输出会生成中断,这正是您想要的,但上面对这些输出当前作用的描述应该会让您稍作停顿,以反映更改它们的行为可能会导致Windows XP注意到这一点。扬声器的第三个输出,基本上是无害的,但如果你需要的话,你需要找出一些方法将信号重定向到产生和中断的东西上。
马赫3可能使用的是High Performance Event Timer,根据here的说法,HPET是最近英特尔芯片组的一部分。定时器0和1用于8254仿真。
“ICH HPET定时器2中断可以通过TIM2_CONF寄存器路由到下列IRQ中的任何一个: 11、20、21、22和23。(注:此寄存器在英特尔®ICH5中称为TIM3_CONF。)”
发布于 2009-12-09 02:12:16
在当前的CPU上,使用循环中的QueryPerformanceCounter可以获得接近100 kHz的轮询。
例如:
typedef void ( *CallbackProc )();
void PollAtKhz( int khz, CallbackProc const &Callback )
{
int hz = khz * 1000;
LARGE_INTEGER li;
QueryPerformanceFrequency( &li );
if( li.QuadPart < hz )
return;
__int64 diff = li.QuadPart / hz;
LARGE_INTEGER NextStop;
LARGE_INTEGER CurStop;
QueryPerformanceCounter( &NextStop );
NextStop.QuadPart += diff;
while( true )
{
QueryPerformanceCounter( &CurStop );
if( CurStop.QuadPart >= NextStop.QuadPart )
{
Callback();
QueryPerformanceCounter( &NextStop );
NextStop.QuadPart += diff;
}
}
}在我的测试中,我得到了大约92-98 kHz的频率,使用以下代码来测试它:
void TestCallBack()
{
static int i = 0;
static time_t LastTime = time( NULL ) + 1;
++i;
if( time( NULL ) >= LastTime )
{
printf( "%d / sec\r\n", i );
LastTime = time( NULL ) + 1;
i = 0;
}
}显然,这段代码需要最大的CPU使用率,因此要获得这些结果,必须使用SMP机器。此外,将进程/线程优先级提升到实时也会有所帮助。
https://stackoverflow.com/questions/1868642
复制相似问题