我们从2011年坚守至今,只想做纯粹的技术论坛,请不要发布和技术无关的话题。  本站有两万多份高大上的PCB和原理图下载,每日更新中,欢迎常回来看看

 找回密码
 立即注册
搜索
查看: 2056|回复: 1

[转载DIY秀] Arduino学习笔记A13 - 最简单的Arduino频率计

[复制链接]
飞天小猪20 该用户已被删除
发表于 2015-10-7 07:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Arduino学习笔记A13 - 最简单的Arduino频率计


想测量一个声音的频率或是占空比,但是又没频率计?我们可以用一块arduino去搞定这事情。


需要的材料仅是一块普通arduino,无需外围元件。


特性:

1. 可以测量20~20kHz的信号,超过的话误差越来越大。

2. 误差大致是±5%。玩玩还行。

3. 输出的结果有:频率,占空比,周期,高电平时间,低电平时间。

4. 只能测量单频,复合波形就不行了。


步骤:

1.写下面程序到arduino里面


ARDUINO 代码复制打印下载

    [li]
    /*[/li][li]
    Arduino Frequency meter[/li][li]
    Ansifa[/li][li]
    2013/1/5[/li][li]
    */[/li][li]
    int divider[6] = {0, 1, 8, 64, 256, 1024};[/li][li]
    int prescaler = 5;[/li][li]
    double count = 0;[/li][li]
    double middle = 0;[/li][li]
    char x = 0;[/li][li]
    ISR(TIMER1_OVF_vect)[/li][li]
    {[/li][li]
        if (prescaler < 4)[/li][li]
        {[/li][li]
            prescaler++;[/li][li]
        }[/li][li]
    }[/li][li]
    void interrupt()[/li][li]
    {[/li][li]
        if (!x)[/li][li]
        {[/li][li]
            count = TCNT1;[/li][li]
            TCNT1 = 0x000;[/li][li]
            TCCR1B = prescaler;[/li][li]
            attachInterrupt(0, interrupt, FALLING);[/li][li]
        }[/li][li]
        else[/li][li]
        {[/li][li]
            middle = TCNT1;[/li][li]
            attachInterrupt(0, interrupt, RISING);[/li][li]
        }[/li][li]
        x = ~x;[/li][li]
    }[/li][li]
    void setup()[/li][li]
    {[/li][li]
        Serial.begin(57600);[/li][li]
        TIMSK1 = 0x01;[/li][li]
        TCCR1A = 0x00;[/li][li]
        attachInterrupt(0, interrupt, RISING);[/li][li]
    }[/li][li]
    void loop()[/li][li]
    {[/li][li]
        Serial.print("Freq: ");[/li][li]
        Serial.print(16000000.0 / divider[prescaler] / count);[/li][li]
        Serial.print(" Hz\t\tDuty: ");[/li][li]
        Serial.print(middle / count * 100);[/li][li]
        Serial.print(" %\t\tPeriod: ");[/li][li]
        Serial.print(0.0000625 * divider[prescaler]*count);[/li][li]
        Serial.print(" ms\t\tH-time: ");[/li][li]
        Serial.print(0.0000625 * divider[prescaler]*middle);[/li][li]
        Serial.print(" ms\t\tL-time: ");[/li][li]
        Serial.print(0.0000625 * divider[prescaler]*(count - middle));[/li][li]
        Serial.println(" ms");[/li][li]
        if (prescaler > 1)[/li][li]
        {[/li][li]
            prescaler--;[/li][li]
            delay(200);[/li][li]
        }[/li][li]
        delay(100);[/li][li]
    }[/li]



2. 将你的信号从D2和GND引脚输入。由于没有经过任何放大处理,信号必须满足开关arduino引脚的电平值,就是最好可以有0-5v的振幅。。


电路图太简单


                               
登录/注册后可看大图


3. 打开串口监视器,调波特率到57600,即可看到结果。因为没有任何防干扰措施,出现偏差特别大的结果请自行忽略。


                               
登录/注册后可看大图



4. 如果你愿意的话,也可以扩展一下这个电路的性能:

* 振幅不够的话,可以使用运放或者三极管进行预放大;

* 测量频率不够高,可以使用74HEF4060进行分频。74HEF4060可以支持高达2^14=16384级分频,理论可以将量程提高16384倍。但是由于74HEF4060性能限制,可以将输入频率提高到20MHz。但是分频之后就只能看到频率,而测不到波形的占空比了。并且注意不要使用CD4060,那是低速版本。

1

主题

128

回帖

250

积分

二级逆天

积分
250

社区居民终身成就奖

QQ
发表于 2015-11-18 08:56 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请举报投诉

本站所有资料仅限参考学习交流,PCB原理图源码等所有资料不保证准确没问题,请不要用作生产。否则后果自负。

闽公网安备35062302000276号 | 闽ICP备2024076463号-1 | 论坛技术支持QQ群171867948 | 论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表