打印

急:频率检测的问题

[复制链接]
2213|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
51yao|  楼主 | 2008-6-9 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位高手帮个忙,看看这程序,我想实现一个低频率检测的功能,利用周期测量法。但是测出来的周期比预期的要小很多,不知道是哪里出错了?假如我输入一个100HZ的方波,但测出其周期不是10000us,而是180us,差这么多。

相关帖子

沙发
ayb_ice| | 2008-6-9 11:07 | 只看该作者

不用这么复杂,直接接到INT0即可

不准肯定是软件问题了

使用特权

评论回复
板凳
xwj| | 2008-6-9 11:17 | 只看该作者

周期法的话检测两个下降沿之间的间隔时间即可

使用特权

评论回复
地板
51yao|  楼主 | 2008-6-9 11:29 | 只看该作者

回楼上

回楼上:周期法的话检测两个下降沿之间的间隔时间即可
我现在是INT1为高时开始计数,为低时进入中断停止计数,并取计数值。这样可以吗?
#include<reg52.h>
#define uint unsigned char
sbit P1_0=P2^0;
sbit LED=P1^1;
sbit int1=P3^3;
uint count;
double period;
bit rflag=0;
void control(void)
{
  // LED=0;
  TMOD=0x90;    //定时器1方式1
  IT1=1;        //下降沿触发
  TH1=0;TL1=0;  //
  EX1=1;
  P1_0=0;
  LED=0;
  P1_0=1;      //触发器清零
  TR1=1;
  ET1=1;EA=1;  //启动T/C1开中断
}
void int_0(void) interrupt 2 using 1
{
  EA=0;TR1=0;
  count=TL1+TH1*256;    //取计数值
  rflag=1;              //设标志
  EX1=0;
  EA=1;

}
void main(void)
{
  control();
  while(rflag==0);      //等待一周期
  
   period=(double)count/11.0592*12;//period为实际的周期
  if(count>=8000) P1=0xff;
  else P1=0x00;
  while(1){EA=0;}
  
}

使用特权

评论回复
5
jt4117| | 2008-6-9 12:05 | 只看该作者

用捕捉功能啊!!

使用特权

评论回复
6
51yao|  楼主 | 2008-6-9 13:37 | 只看该作者

回楼上

51单片机没捕捉功能吧?

使用特权

评论回复
7
huangqi412| | 2008-6-9 13:57 | 只看该作者

52的t2有啊,

使用特权

评论回复
8
51yao|  楼主 | 2008-6-9 14:26 | 只看该作者

回2,3楼

我直接直接接到INT1,检测两个下降沿之间的间隔时间.这是我的程序,但测到的时间还是差太远,程序我检查不出有什么错误。望大家指点指点。
//没触发器
#include<reg52.h>
#define uint unsigned char
sbit P1_0=P2^0;
sbit LED=P1^1;
sbit int1=P3^3;
uint count;
uint i;
double period;
bit rflag=0;
void control(void)
{
  TMOD=0x10;    //定时器1方式1,不受GATE影响
  IT1=1;        //下降沿触发
  TH1=0;TL1=0;  //
  EX1=1;
  ET1=1;  //启动T/C1开中断
}
void int_1(void) interrupt 2 using 1
{
  if(i==0)
  {TR1=1;i++;}//启动定时器计数
  else 
  {EA=0;TR1=0;
   count=TL1+TH1*256;    //取计数值
   rflag=1;              //设标志
   EX1=0;}
}
void main(void)
{
  control();
  
  P1=0xf0;
  EA=1;
  while(rflag==0);      //等待一周期 
  period=(double)count/11.0592*12;//period为实际的周期
  if(count>=300) P1=0xff;
  else P1=0x00;
  while(1){EA=0;}
  
}

使用特权

评论回复
9
jt4117| | 2008-6-9 15:25 | 只看该作者

你的main主循环??

死循环!!

使用特权

评论回复
10
51yao|  楼主 | 2008-6-10 13:49 | 只看该作者

烧到板上来就差得很远

大家好,程序经修改,在PROTEUS仿真的时候测量的数据挺准确的,如70KHZ时COUNT值为14,但实际烧到板上来就差得很远,而且无法测出是哪个值?这是为什么?
//有触发器和没触发器两种方法都试过。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0=P3^4;
sbit LED=P1^1;
sbit int1=P3^3;
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
uint count;
uint i;
double period;
bit rflag=0;
void control(void)
{
  TMOD=0x10;    //定时器1方式1,不受GATE影响
  IT1=1;        //下降沿触发
  TH1=0;TL1=0;  //
  P1_0=0;
  P1_0=1;
  EX1=1;
  ET1=1;  //启动T/C1开中断
}
void int_1(void) interrupt 2 using 1
{
  if(i==0)
  {TR1=1;i++;}//启动定时器计数
  else 
  {EA=0;TR1=0;
   count=TL1+TH1*256;    //取计数值
   //count=TH1;
   //count=count<<8;
   rflag=1;              //设标志
   EX1=0;}
}
void main(void)
{
  control();
  P2=0xf0;
  P1=0xf0;
  EA=1;
  //TH1=8;
  //count=TH1;
  //count=count<<8;
  //TH1=2;TL1=3;
  //count=TH1*256+TL1;
  while(rflag==0);      //等待一周期 
  period=(double)count/11.0592*12/2;//period为实际的周期
  //if(count>=(3645)) P1=0xff;  //500HZ:不对
  //if(count<=(3649))  P2=0xff;
    if(count>=14) LED1=1;// 70KHZ,p1.0
    if(count<=15) LED2=1;//p1.1
  else LED3=1;//p1.2
  while(1){EA=0;}
  
}
 

使用特权

评论回复
11
51yao|  楼主 | 2008-6-13 12:53 | 只看该作者

3楼: 周期法的话检测两个下降沿之间的间隔时间即可

请问,我测INTO两个下降沿之间的间隔时间,需要注意什么问题?
      主函数里; 
       while(1)    
       {   EA=1;        //开启中断,使得单片机开始对输入信号做出检测
           while(rflag==0);      //等待第二个下降沿到来
           display();     //计算频率和液晶显示
        }  
     中断里:
void int_0(void) interrupt 0 using 1
{
  if(i==0)
  {i++;TR1=1;}//启动定时器计数
  else 
  {
   TR1=0;
   count=TL1+TH1*256;    //取计数值
   EA=0;
   i=0;
   TL1=0;
   TH1=0;
   rflag=1;              //设标志
   }
}
我的计数是从第一个沿开始计,第二个沿结束的。用不用考虑什么定时误差啊?

使用特权

评论回复
12
xwj| | 2008-6-13 13:04 | 只看该作者

要考虑前面的那些指令的时间

可能的话还是用捕捉吧

使用特权

评论回复
13
51yao|  楼主 | 2008-6-13 13:06 | 只看该作者

请问楼上

你指的是从开始计数到结束计数间指令的时间呢,还是结束计数到重新启动计数间指令的时间?

使用特权

评论回复
14
51yao|  楼主 | 2008-6-13 13:17 | 只看该作者

请指教

如果考虑从开始计数到结束计数间指令的时间,我这个程序应该不会有太大的误差,因为就那么几条指令。但我在液晶上看频率的值,是不断的跳变,而且误差很大。我认为是定时器的问题,但不知从何入手!如果考虑结束计数到重新启动计数间指令的时间,这个不知道有没道理?

使用特权

评论回复
15
emailli| | 2008-6-13 13:42 | 只看该作者

去我的博客看看如何测量频率吧

有详细的介绍

使用特权

评论回复
16
51yao|  楼主 | 2008-6-13 13:52 | 只看该作者

网址呢?

网址呢?

使用特权

评论回复
17
emailli| | 2008-6-14 23:35 | 只看该作者

我 的签名 那里不是有吗?

看我的签名啊

有链接的

使用特权

评论回复
18
51yao|  楼主 | 2008-6-16 10:12 | 只看该作者

周期法的话检测两个下降沿之间的间隔时间即可

请问用这种方法可以去到检测多少频率范围?我计到65K左右就会出错了,但此时定时器也就计几十次,不知道为什么就出错了。其他范围内都是挺准的。

使用特权

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

本版积分规则

42

主题

148

帖子

0

粉丝