多媒体定时器在工业控制中的应用.doc

多媒体定时器在工业控制中的应用.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
多媒体定时器在工业控制中的应用

多媒体定时器在工业控制中的应用_编程空间 浏览:4次 ?? 作者:企业库 ?? 时间:2010-1-9 16:19:04 随着自动控制技术的发展,以Windows为平台的实时控制系统得到广泛应用。在实时控制系统的控制过程中,采样时间的精确度是得以正常运行的关键。 对于以DOS为平台的控制系统,可以通过对硬件直接操作而得到精确的采样时间。而对于Windows平台,由于Windows9X是强占式多任务操作系统,系统接管全部硬件资源,用户无法直接同硬件打交道,时间控制离不开操作系统的支持。因此,在Windows9X平台下如何精确地控制采样频率是非常值得研究的。下面结合在造波机上控制系统研制中的具体方法加以探讨。 一、几种定时方法的比较 (1)普通定时器 普通定时器是简单的时间控制方法。首先由SetTimer()函数创建一个内存对象,设定间隔时间。此间隔时间被转换为IRQ 0中断请求的次数。当到达要求的次数时,计时器对象就发送一个WM_TIMER消息,由相应函数处理。由于系统定时器(8253定时器T/C0通道)的输入频率为1.1953180MHz,初始化为工作方式3,计数器初值为0(最大计数为65536),则其输出频率=1195318 / 65536≈18.2Hz,且直接连到IRQ 0。这样,CPU以18.2Hz的频率响应中断,周期为54.827ms。也就是说计数器的最短时间间隔约为55ms,转换成中断次数时还会产生舍入误差。另外,虽然中断是实时发生的,但由于WM_TIMER消息优先级不高,且易出现消息合并情况,即当消息队列中有一条WM_TIMER消息,而系统又向其中放入另一条WM_TIMER消息时,2条消息合并为1条消息。因此,普通定时器对消息处理在时间上和数目上存在不确定性,无法满足毫秒级控制要求。在工业实时控制系统中往往需要小于10ms的定时时钟,也就是说普通定时器在有较高要求的工业实时控制系统中不能满足要求。 (2)多媒体时钟 虽然多媒体时钟也是利用系统定时器工作的,但它的工作机理和普通定时器不同:①它可以通过函数TimeBeginPeriod()设置最小定时精度,即按精度要求设置8253的T/C0通道的计数初值,使计数器不在存在55ms的限制;②该顶时器并不倚赖消息机制,而是由函数TimeSetEvent()产生一个独立的线程,在一定的中断次数到达后,直接调用预先设置好的回调函数进行处理,而不必等应用程序的消息队列为空,从而保障了定时器得到实时响应。因此在基于Window9X平台的实时控制系统中,多媒体时钟是一种很理想的高精度定时器,它可以实现精度为1ms的高精度定时。 二、多媒体定时器的定制和使用 在造波机系统的实际研制中采用了多媒体定时器,其步骤如下: (1)利用函数TimeGetCaps()确定定时器服务所能提供的最小和最大事件周期。这一周期对不同的计算机、不同的硬件配置以及Windows的不同运行方式是不一样的的。 (2)用TimeBeginPeriod()函数建立想要使用的最小计时精度,由于精度较高的定时器消耗的系统资源就越多,因此在具体应用中应根据需要综合考虑。 (3)用TimeSetEvent()函数初始化和启动定时器事件,此时应给出定时器事件的周期、使用精度及调用函数的入口地址。其函数原型如下: MMRESULT timeSetEvent(UINT uDelay,UINT uResolution,LPTIMECALLBACK lpTimeProc,DWORD dwUser,UINT fuEvent); 其中,uDelay表示时间间隔;uResolution表示定时精度,其值越小,精度越高,为0时表示能达到的最高精度;lpTimeProc为回调用函数的地址;dwUser为用户自定义的参数值;fuEvent为定时器类型,可取TIME_ONESHOT、TIME_PERIODIC、TIME_CALLBACK_FUNCTION、TIME_CALLBACK_EVENT_SET、TIME_CALLBACK_EVENT_PULSE。其中TIME_PERIODIC表示事件每隔uDelay毫秒发生1次,TIME_CALLBACK_FUNCTION表示事件发生时调用回调函数(而非设置事件),本系统采用这两个值。 (4)回调函数是一个中断服务程序,它必须驻留在动态链接库中,或由开发者自己编写。回调函数可以定义成相应类的成员函数,也可以为全局函数。但要注意:因为C++编译器为类成员函数准备了一个隐藏参数this,使得当回调函数定义成类的普通成员函数时,函数类型与Windows callback函数的预设类型不符。此时必须定义成静态类型,以消除隐含的this指针。但静态成员函数只能访问静态成员,所以实际操作起来并不方便。因此多数

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档