打印

8253测速不稳定问题??

[复制链接]
1404|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jakey0225|  楼主 | 2007-12-1 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define PORT_0 0x1e0
#define PORT_1 PORT_0+1
#define PORT_2 PORT_0+2
#define PORT_3 PORT_0+3
#define PORT_4 PORT_0+4
#define PORT_5 PORT_0+5      测转速的端口地址,其中D4位为转速光电    传感器信号
#define PORT_6 PORT_0+6
#define PORT_7 PORT_0+7
#define PORT_8 PORT_0+8      8253计数器0的地址
#define PORT_9 PORT_0+9           ...  1....
#define PORT_A PORT_0+0xa         ...  2 ...
#define PORT_B PORT_0+0xb        ....  控制字..
  由于计数器的溢出不能用,故采用光读计数器的办法,记到一半时,就重装
计数器。实验结果是大部分时间是在误差范围内,但是过一段时间就会出现一两次误差很大的数据,这种情况频繁出现,不知哪里出了问题,清高手指点。
#include <stdio.h>
#include <dos.h>

void   init8253()
{
    short iTemp8253;
     iTemp8253 = 0x30;
     outportb(PORT_B,iTemp8253);
     iTemp8253 = 0x70;
     outportb(PORT_B,iTemp8253);
}
unsigned int  read8253(int l)
{    unsigned int i,j;
     unsigned char c;
     c=l;
     outportb(PORT_B,0x00+0x40*c);
     c=inportb(PORT_8+l);
     i=c;

     c=inportb(PORT_8+l);
     j=c;

     j=j*256+i;
    return(j);
}
main()
{
  unsigned char k,count,status=0;
   unsigned int m,count1;
 float  time=0,times=0;
  printf(" Interval Time  ");
  init8253();
  read8253(0);
while(1)
    {
        k=inportb(PORT_5);
       if(k&0x10)
           {    if(status)
                      {   m=read8253(0);
                          time=(65535-m)/1000.0*4.47+times;
                          count1=(unsigned int) (60000/time);
                          printf("Sudu: %u ",count1);  转速输出



                       }
                 else   status=1;
                 outportb(PORT_8,0xff);
        outportb(PORT_8,0xff);
        times=0;

           do
         { k=inportb(PORT_5);
         }
           while(k&0x10);
              }
        else
               {   m=read8253(0);
                   if(m<=32767)
                    {
                        outportb(PORT_8,0xff);
            outportb(PORT_8,0xff);
                        times=times+(65535-m)/1000.0*4.47;
                       do
                        {
                          m=read8253(0);
                        }
                       while(m>32767);
                    }

               }
}
}

相关帖子

沙发
iC921| | 2007-12-2 11:20 | 只看该作者

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

使用特权

评论回复
板凳
jakey0225|  楼主 | 2007-12-3 09:16 | 只看该作者

回复8253测速问题

脉冲是装在转速轮旁边的光电开关传来的脉冲信号。轮子转一圈有一个脉冲。
这个脉冲经过一个光耦,直接接到输入端口。



这个程序的输出结果是这样的,如果实际转速为350
输出结果为
351
356
350
352
70        /中间会出现误差很大的
351
352

使用特权

评论回复
地板
lbx_00| | 2007-12-4 20:59 | 只看该作者

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

光耦后面建议加施密特整形,多次测量,去掉最大值和最小值(也可以考虑多去几个),然后平均。

检查你现在的程序,350转速,竟然测出个70,好像不是误差问题了,应该是有错误了

使用特权

评论回复
5
zwq.2| | 2007-12-5 14:32 | 只看该作者

可以试试用测周期的方法

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

45

帖子

0

粉丝