8253测速不稳定问题??

[复制链接]
 楼主| jakey0225 发表于 2007-12-1 21:43 | 显示全部楼层 |阅读模式
#define&nbsp;PORT_0&nbsp;0x1e0<br />#define&nbsp;PORT_1&nbsp;PORT_0+1<br />#define&nbsp;PORT_2&nbsp;PORT_0+2<br />#define&nbsp;PORT_3&nbsp;PORT_0+3<br />#define&nbsp;PORT_4&nbsp;PORT_0+4<br />#define&nbsp;PORT_5&nbsp;PORT_0+5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;测转速的端口地址,其中D4位为转速光电&nbsp;&nbsp;&nbsp;&nbsp;传感器信号<br />#define&nbsp;PORT_6&nbsp;PORT_0+6<br />#define&nbsp;PORT_7&nbsp;PORT_0+7<br />#define&nbsp;PORT_8&nbsp;PORT_0+8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8253计数器0的地址<br />#define&nbsp;PORT_9&nbsp;PORT_0+9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;1....<br />#define&nbsp;PORT_A&nbsp;PORT_0+0xa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;2&nbsp;...<br />#define&nbsp;PORT_B&nbsp;PORT_0+0xb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;&nbsp;控制字..<br />&nbsp;&nbsp;由于计数器的溢出不能用,故采用光读计数器的办法,记到一半时,就重装<br />计数器。实验结果是大部分时间是在误差范围内,但是过一段时间就会出现一两次误差很大的数据,这种情况频繁出现,不知哪里出了问题,清高手指点。<br />#include&nbsp;&ltstdio.h&gt<br />#include&nbsp;&ltdos.h&gt<br /><br />void&nbsp;&nbsp;&nbsp;init8253()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;short&nbsp;iTemp8253;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iTemp8253&nbsp;=&nbsp;0x30;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outportb(PORT_B,iTemp8253);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iTemp8253&nbsp;=&nbsp;0x70;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outportb(PORT_B,iTemp8253);<br />}<br />unsigned&nbsp;int&nbsp;&nbsp;read8253(int&nbsp;l)<br />{&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;i,j;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c=l;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outportb(PORT_B,0x00+0x40*c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c=inportb(PORT_8+l);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=c;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c=inportb(PORT_8+l);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=c;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j=j*256+i;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(j);<br />}<br />main()<br />{<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;k,count,status=0;<br />&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;m,count1;<br />&nbsp;float&nbsp;&nbsp;time=0,times=0;<br />&nbsp;&nbsp;printf(&quot;&nbsp;Interval&nbsp;Time
&nbsp;&quot;);<br />&nbsp;&nbsp;init8253();<br />&nbsp;&nbsp;read8253(0);<br />while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k=inportb(PORT_5);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(k&0x10)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;if(status)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;m=read8253(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time=(65535-m)/1000.0*4.47+times;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count1=(unsigned&nbsp;int)&nbsp;(60000/time);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&quot;Sudu:&nbsp;%u
&quot;,count1);&nbsp;&nbsp;转速输出<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;status=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outportb(PORT_8,0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outportb(PORT_8,0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;times=0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;k=inportb(PORT_5);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(k&0x10);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;m=read8253(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(m&lt=32767)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outportb(PORT_8,0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outportb(PORT_8,0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;times=times+(65535-m)/1000.0*4.47;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m=read8253(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(m&gt32767);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />}
iC921 发表于 2007-12-2 11:20 | 显示全部楼层

说说脉冲的特点,如何来的?如何整形的?

  
 楼主| jakey0225 发表于 2007-12-3 09:16 | 显示全部楼层

回复8253测速问题

脉冲是装在转速轮旁边的光电开关传来的脉冲信号。轮子转一圈有一个脉冲。<br />这个脉冲经过一个光耦,直接接到输入端口。<br /><br /><br /><br />这个程序的输出结果是这样的,如果实际转速为350<br />输出结果为<br />351<br />356<br />350<br />352<br />70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/中间会出现误差很大的<br />351<br />352<br />
lbx_00 发表于 2007-12-4 20:59 | 显示全部楼层

一圈才出一个脉冲,有点儿少了

光耦后面建议加施密特整形,多次测量,去掉最大值和最小值(也可以考虑多去几个),然后平均。<br /><br />检查你现在的程序,350转速,竟然测出个70,好像不是误差问题了,应该是有错误了
zwq.2 发表于 2007-12-5 14:32 | 显示全部楼层

可以试试用测周期的方法

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

45

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

25

主题

45

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部