第六课--Microduino 简单频率计(串口监视/zh)
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,即可看到结果。因为没有任何防干扰措施,出现偏差特别大的结果请自行忽略。 如果你愿意的话,也可以扩展一下这个电路的性能:
结果打开串口监视器,调波特率到57600,即可看到结果。 视频 |