Arduino学习笔记A13 - 最简单的Arduino频率计
想测量一个声音的频率或是占空比,但是又没频率计?我们可以用一块arduino去搞定这事情。 |
需要的材料仅是一块普通arduino,无需外围元件。 |
1. 可以测量20~20kHz的信号,超过的话误差越来越大。 |
3. 输出的结果有:频率,占空比,周期,高电平时间,低电平时间。 |
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,那是低速版本。 |
|