查看: 1576|回复: 3

[其他] 每天解决一个问题25:一个简单频率测量

[复制链接]

该用户从未签到

33

主题

292

帖子

0

高级会员

Rank: 4

积分
600
最后登录
2016-4-19
发表于 2015-9-27 17:06:10 | 显示全部楼层 |阅读模式
地址:https://www.eefocus.com/luo_xinli/blog/14-05/303260_bc217.html

单位由一个信号源的项目,其中由一个功能,即实现一个方波信号频率的测量。实际情况中,信号的频率一般在15-25Hz。占空比在10%-90%之间。可以说频率非常低。因为单位使用STC89C54的时间比较长,所以单位要求使用该单片机。这个项目非常简单。因为时间很久了,所以我稍微回忆一下。

    电路图逻辑上是这样的:

            

      我将信号经过比例缩小跟随后直接接到INT0管脚。具体想法是这样的,设定一个10uM的定时器计时。每两秒中作为一个测量周期。方波最会有下跳沿的,每一下跳沿作为一个周期的开始。两秒计时结束后查看一共采集到K个下跳沿。那么该方波的周期就是T=2/K秒。频率f=K/2。

   有一个同事提供了频率测量的思路。在三秒中时间范围内统计INT0下跳沿出现的个数,即可统计出方波脉冲的频率。因为下跳沿会触发外部中断,所以只需统计程序进入中断程序的次数。我们来看看代码实现的方法。

/*************************************/

//定时器初始化

//每1毫秒中断一次

/*************************************/

#define SYS_CLK     12000000L

#define TIME0_LOAD  -(SYS_CLK/12/1000)


typedef struct FREQ

{

        unsigned char start;

       unsigned int timer;

       unsigned int int_Count;

       unsigned int  T;

}FREQ;


FREQ   freq={0,0};


void Timer0_Init( )

{

        TMOD = TMOD | 0x01;

       TH0 = TIME0_LOAD>>8;

       TL0 = TIME0_LOAD&0x00FF;   

       EA =1;

       ET0 =1;

       TR0 =1;           

}


/*************************************/

//定时器串口中断程序

/*************************************/

void Timer0_isr( ) interrupt 1

{


       TH0 = TIME0_LOAD>>8;

       TL0 = TIME0_LOAD & 0x00FF;

       

      if(freq.start)

      {

             freq.timer++;

     }

   else

   {

        freq.timer=0;  

   }


}


void  exint0_init(  )

{

        IT0 =1;   //下降沿产生中断

        EX0 =1;   //使能外部中断

        EA  =1;   //使能全局中断


}


void  exint0(   ) interrupt 0

{


    if(freq.start)

    {

           freq.int_Count++;     //开始统计下跳沿

        }

    else

    {

           freq.int_Count=0;

        }       


}


void main( )

{

   Timer0_Init( );

   exint0_init(  );


   freq.start=1;


   while(1)

   {

       if(freq.timer>=3000)

           {

             freq.T=freq.timer/freq.int_Count;

                 freq.int_Count=0;

                 freq.timer=0;  

             display_freq(  );                 //显示周期的值

           }


   }        


}

     以上是该项目部分代码,主要可以看看定时器和外部中断的使用方法。







我知道答案 目前已有3人回答
回复

使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-9-28 11:12:38 | 显示全部楼层
    每天转载一篇,不错
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    33

    主题

    292

    帖子

    0

    高级会员

    Rank: 4

    积分
    600
    最后登录
    2016-4-19
     楼主| 发表于 2015-9-28 11:18:44 | 显示全部楼层
    JackieLaura 发表于 2015-9-28 11:12
    每天转载一篇,不错

    每天回复那么多,也不错
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20

    主题

    174

    帖子

    0

    高级会员

    Rank: 4

    积分
    770
    最后登录
    1970-1-1
    发表于 2015-9-28 15:30:56 | 显示全部楼层
    感谢分享
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 05:27 , Processed in 0.098040 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表