广告合作
  • 今日头条

    今日头条

  • 百度一下

    百度一下,你就知道

  • 新浪网

    新浪网 - 提供新闻线索,重大新闻爆料

  • 搜狐

    搜狐

  • 豆瓣

    豆瓣

  • 百度贴吧

    百度贴吧——全球领先的中文社区

  • 首页 尚未审核订阅工具 订阅

    简单数字频率计设计

    来源:网络收集  点击:  时间:2024-01-23
    【导读】:
    基于单片机片内定时器的数字频率计设计。要求:(1)测频率范围:10Hz ~ 10K Hz。为保证测量精度分为三个频段: 10Hz ~ 100 Hz 100Hz ~ 1K Hz 1 K Hz ~ 10K Hz当信号频率超过规定的频段上限时,设有超量程指示。三个频段之间用手动切换。(2)输入波形:低频函数信号发生器输出的矩形波,幅度为3V 。(3)测量误差:σ≤±1%。(4)显示和响应时间:测量结果用三位半导体数码管显示,要求显示数码稳定清晰。三个频段的最大显示数分别为99.9 Hz,999. Hz,9.99 K Hz,为此需要控制小数点位置,并用两个发光二极管分别显示频率单位:Hz 或K Hz,详见表1。工具/原料more PC机、Keil uVision软件,C8051F330单片机,EC3在线仿真器。方法/步骤1/5分步阅读

    频率测量的方法常用的有测频法和测周法两种。

    测频法的基本思想是让计数器在闸门信号的控制下计数1秒时间,计数结果是1秒内被测信号的周期数,即被测信号的频率。若被测信号不是矩形脉冲,则应先变换成同频率的矩形脉冲。测频法的原理框图如图所示。

    图中,秒脉冲作为闸门信号,当其为高电平时,计数器计数;低电平时,计数器停止计数。显然,在同样的闸门信号作用下,被测信号的频率越高,测量误差越小。当被测频率一定时,闸门信号高电平的时间越长,测量误差越小。但是闸门信号周期越长,测量的响应时间也越长。

    2/5

    当被测信号频率较低时,为保证测量精度,常采用测周法。即先测出被测信号的周期,再换算成频率。测周法的实质是把被测信号作为闸门信号,在它的高电平的时间内,用一个标准频率的信号源作为计数器的时钟脉冲。若计数结果为N,标准信号频率为f1,则被测信号的周期为

    T = T1·N

    被测信号的频率为

    f = 1/T1·N = f1/N

    利用测周法所产生的最大绝对误差,显然也等于±1个标准信号周期。如果被测信号周期的真值为T真= T1·N,则T测= T1·(N±1)

    σmax= (f测-f真)/ f真= T真/T测 – 1=±1/(N±1)

    由上式可知,对于一定的被测信号,标准信号的频率越高,则N的值越大,因而相对误差越小。

    3/5

    低频段的测量

    鉴于上述困难,对于低频信号,为了达到规定的精度,要采取一些比较特殊的方法。例如,可考虑将被测信号倍频后再用测频法测量。或将闸门信号展宽。由于倍频电路比较复杂,所以一般采用后一种方法,实际上闸门信号展宽与被测信号倍频在效果上是相同的。闸门信号展宽比较容易做到,例如采用分频电路就可以实现。若闸门信号高电平时间从1秒展宽到10秒,则相对误差可以按比例下降,但响应时间也增大相同的比例。

    4/5

    显示方式:共用右边四个数码管,左三个显示数据,最右端一个显示单位,为0时单位为Hz,为1时单位为Khz

    5/5

    代码:

    //#includec8051F330.h

    #includeZLG7289.h

    #includeinit.h

    #define uint unsigned int

    uint a,b,c,d;

    unsigned long x;

    unsigned long count;

    unsigned char flag=0;

    void Timer0_Init()interrupt 1

    {

    TH0=(65535-10000)/256;

    TL0=(65535-10000)%256;

    if(++count==40)

    {

    count=0;

    TR1=0;

    x=TH1*256+TL1;

    TH1=0;

    TL1=0;

    TR1=1;

    flag=1;

    }

    }

    void show(void)

    {if(x=10x100)

    {

    a=0;

    b=x*10%100;

    c=x/10;

    d=x%10;

    ZLG7289_Download(1,7,0,a);

    ZLG7289_Download(1,6,0,b);

    ZLG7289_Download(1,5,1,d);

    ZLG7289_Download(1,4,0,c);

    }

    else if(x=100x1000)

    {

    a=0;

    b=x/100;

    c=x%100/10;

    d=x%10;

    ZLG7289_Download(1,7,0,a);

    ZLG7289_Download(1,6,1,d);

    ZLG7289_Download(1,5,0,c);

    ZLG7289_Download(1,4,0,b);

    }

    else if(x=1000x10000)

    {

    a=x/1000;

    b=x%1000/100;

    c=x%100/10;

    d=1;

    ZLG7289_Download(1,7,0,d);

    ZLG7289_Download(1,6,0,c);

    ZLG7289_Download(1,5,0,b);

    ZLG7289_Download(1,4,1,a);

    }

    }

    main(void)

    {

    system_init();

    systemclk_init();

    port_init();

    ZLG7289_Init(40);

    ZLG7289_Reset();

    timer_init();

    while(1)

    {

    if(flag==1)

    {

    show();

    flag = 0;

    }

    }}

    #include C8051F330.h

    #include port.h

    void system_init()

    {

    PCA0MD=~0x40;

    }

    void systemclk_init()

    {

    OSCICL=OSCICL+42; //设置内部振荡器为24MHZ

    OSCICN|=0x01; //内部振荡器4分频

    }

    void port_init()

    {

    P0SKIP=0x00; //跳过P0.0做INT0.P0.1做INT1(P0.6,P0.7模拟输出不跳)

    P1SKIP=0x00; //跳过P1.2,P1.3,P1.4

    XBR0=0x00; //交叉开关使能UART0

    XBR1=0x60; //打开交叉开关

    //IT01CF=0x10; //INT0配置在P0.0,INT1配置在P0.1

    P0MDIN=0xFF; //数字输入

    P1MDIN=0xFF;

    P0MDOUT=0xFF; //推挽

    P1MDOUT=0xFF;

    }

    void timer_init()

    {

    TMOD=0X51;

    TH0=(65535-2500)/256;

    TL0=(65535-2500)%256;

    EA=1;

    ET0=1;

    TR1=1;

    TR0=1;

    }

    #ifndef __port_H_

    #define __port_H_

    void system_init(void);

    void systemclk_init(void);

    void port_init(void);

    void timer_init(void);

    #endif

    注意事项

    掌握单片机片内定时器的使用方法

    掌握基于单片机片内定时器的数字频率计设计方法

    本文关键词:

    版权声明:

    1、本文系转载,版权归原作者所有,旨在传递信息,不代表看本站的观点和立场。

    2、本站仅提供信息发布平台,不承担相关法律责任。

    3、若侵犯您的版权或隐私,请联系本站管理员删除。

    4、文章链接:http://www.1haoku.cn/art_4249.html

    相关资讯

    ©2019-2020 http://www.1haoku.cn/ 国ICP备20009186号05-04 23:49:25  耗时:0.024
    0.0236s