Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 2875|回復: 1
打印 上一主題 下一主題

用arduino做吉他調音器頻率的問題(急)

[複製鏈接]
跳轉到指定樓層
1#
發表於 2015-3-1 02:27:37 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
我正在做一個吉他的調音器
我在網路上找到了一個計頻器,說也可以測聲音頻率
所以我用他改寫成一個吉他條音器

我硬體部分 我麥克風模組直接輸入ARDUINO 判斷準度輸出LED


程式如下
int divider[6] = {0, 1, 8, 64, 256, 1024};
int prescaler = 5;
double count = 0;
double middle = 0;
char x = 0;
int a;
int led1G=3;
int led1R=5;
int led1B=6;
int led2G=9;
int led2R=10;
int led2B=11;
int led3G=A0;
int led3R=A1;
int led3B=A2;
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);
    pinMode(led1G,OUTPUT);
    pinMode(led1R,OUTPUT);
    pinMode(led1B,OUTPUT);
    pinMode(led2G,OUTPUT);
    pinMode(led2R,OUTPUT);
    pinMode(led2B,OUTPUT);
    pinMode(led3G,OUTPUT);
    pinMode(led3R,OUTPUT);
    pinMode(led3B,OUTPUT);
}
void loop()
{
    Serial.print("Freq: ");
    a=16000000.0 / divider[prescaler] / count;
    Serial.print(a);
    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(100);
    }
     if (81<=a && a<=83)  //E音準確
    {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,LOW);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,HIGH);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,LOW);
   digitalWrite(led3B,LOW);
   delay(1000);


    }
    if(a>=75 && a<=80)  //E音偏低
    {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,HIGH);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,LOW);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,LOW);
   digitalWrite(led3B,LOW);
   delay(1000);
    }


    if(a>=84 && a<=90) //E音偏高
    {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,LOW);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,LOW);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,HIGH);
   digitalWrite(led3B,LOW);
      delay(1000);
    }

    if (109<=a && a<=111 )  //A音準確
    {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,LOW);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,HIGH);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,LOW);
   digitalWrite(led3B,LOW);
   delay(1000);

    }
    if(a>=105 && a<=108)  //A音偏低
    {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,HIGH);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,LOW);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,LOW);
   digitalWrite(led3B,LOW);
   delay(1000);
    }


    if(a>=112 && a<=116) //A音偏高
    {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,LOW);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,LOW);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,HIGH);
   digitalWrite(led3B,LOW);
      delay(1000);
    }

  if(a>=145 && a<=150) //D音準確
  {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,LOW);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,HIGH);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,LOW);
   digitalWrite(led3B,LOW);
  delay(1000);
  }

  if(a>=140 && a<=144) //D音偏低
  {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,HIGH);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,LOW);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,LOW);
   digitalWrite(led3B,LOW);
   delay(1000);
  }
  if(a>=151 &&a<=155) //D音偏高
  {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,LOW);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,LOW);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,HIGH);
   digitalWrite(led3B,LOW);
      delay(1000);
  }

  if(a>=194 && a<=198) //G音準確
  {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,LOW);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,HIGH);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,LOW);
   digitalWrite(led3B,LOW);
   delay(1000);

   if(a>=189 && a<=193)
   {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,HIGH);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,LOW);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,LOW);
   digitalWrite(led3B,LOW);
   delay(1000);
   }
   if(a>=198 && a<=202)
   {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,LOW);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,LOW);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,HIGH);
   digitalWrite(led3B,LOW);
   delay(1000);
   }
  }
    else
    {
   digitalWrite(led1G,LOW);
   digitalWrite(led1R,LOW);
   digitalWrite(led1B,LOW);
   digitalWrite(led2G,LOW);
   digitalWrite(led2R,LOW);
   digitalWrite(led2B,LOW);
   digitalWrite(led3G,LOW);
   digitalWrite(led3R,LOW);
   digitalWrite(led3B,LOW);
    }

}



測出來頻率卻是這樣,而且要彈很多次才會出現正常一點的頻率,大部分都是很奇怪的數字,每條弦都一樣
請問是哪裡出問題?
順便問 這個程式輸出腳是2腳,要怎麼改成別的輸出點?
2#
發表於 2015-3-1 18:24:41 | 只看該作者
本帖最後由 pizg 於 2015-3-5 09:53 編輯

1.原始程式沒問題, 被你改到錯誤了。
2.因你的變數a型態設為int, 其值若超過32767會變成負值, 建議改成 unsigned int 或 double。
3.有雜訊, 會影響輸出結果。
4.輸入端沒有帶緩衝放大,所以輸入信號的幅值要接近5V才能測量。
5.這個程式使用到外部中斷0, 其輸出腳位在 D2, 所以你想改變到其他腳位輸出是沒辦法的。
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-6-9 17:57 , Processed in 0.132076 second(s), 13 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表