第六课--Microduino 简单频率计(串口监视/zh)

来自Microduino Wikipedia
跳转至: 导航搜索
Language English

目的

本教程将叫大家使用Microduino来测量一个声音的频率 想测量一个声音的频率或是占空比,但是又没频率计?我们可以用一块Microduino去搞定这事情。

特性:

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

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

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

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

设备

原理图

程序

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

调试

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

第六课-简单频率计.jpg

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

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


结果

打开串口监视器,调波特率到57600,即可看到结果。

视频