打印

请教频率检测的问题

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

相关帖子

沙发
awey| | 2008-6-9 11:34 | 只看该作者

谁知道你的程序是怎么写的?

U2是多余的

使用特权

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

回楼上

现在是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;}
  
}

使用特权

评论回复
地板
fei| | 2008-6-9 11:48 | 只看该作者

我用过可以的啊。采用下降沿触发的话,中断就TR=!TR。

使用特权

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

回楼上

可以将你的图和程序让我参考一下吗?

使用特权

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

实际烧到板上来就差得很远

大家好,程序经修改,在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;}
  
}

使用特权

评论回复
7
sjl2006| | 2008-6-17 11:04 | 只看该作者

re楼主:定时器溢出考虑了吗?

在每次定时器溢出中断中把一个寄存器加一,把该寄存器+TH+TL作为三个字节整体考虑,脉冲时间用三字节相减。

使用特权

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

本版积分规则

42

主题

148

帖子

0

粉丝