Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Audio 如何转换arduino';s数字输出的频率_Audio_Arduino_Android Sensors_Arduino Uno - Fatal编程技术网

Audio 如何转换arduino';s数字输出的频率

Audio 如何转换arduino';s数字输出的频率,audio,arduino,android-sensors,arduino-uno,Audio,Arduino,Android Sensors,Arduino Uno,我使用的是模拟输出声音传感器模块,传感器模块的输出连接到arduino,可以看到arduino正在进行Ato D转换,并显示范围为0到1023的整数 但是我需要计算从传感器测量的声音的频率 所以,你能帮我,hwo从arduino的转换值计算频率吗。你真的不需要ADC转换,是吗?您所需要做的就是检测输入端的上升沿,然后对其进行计数。由于您的传感器将输出低-高-低序列,并且由于Arduino将在某个电压上记录为高,因此这应该足够了 从连接到电路板上数字引脚8的输入,该代码的测量值将高达200 kHz

我使用的是模拟输出声音传感器模块,传感器模块的输出连接到arduino,可以看到arduino正在进行Ato D转换,并显示范围为0到1023的整数

但是我需要计算从传感器测量的声音的频率


所以,你能帮我,hwo从arduino的转换值计算频率吗。

你真的不需要ADC转换,是吗?您所需要做的就是检测输入端的上升沿,然后对其进行计数。由于您的传感器将输出低-高-低序列,并且由于Arduino将在某个电压上记录为高,因此这应该足够了

从连接到电路板上数字引脚8的输入,该代码的测量值将高达200 kHz左右:

// Input: Pin D8 

volatile boolean first;
volatile boolean triggered;
volatile unsigned long overflowCount;
volatile unsigned long startTime;
volatile unsigned long finishTime;

// timer overflows (every 65536 counts)
ISR (TIMER1_OVF_vect) 
{
  overflowCount++;
}  // end of TIMER1_OVF_vect

ISR (TIMER1_CAPT_vect)
  {
  // grab counter value before it changes any more
  unsigned int timer1CounterValue;
  timer1CounterValue = ICR1;  // see datasheet, page 117 (accessing 16-bit registers)
  unsigned long overflowCopy = overflowCount;

  // if just missed an overflow
  if ((TIFR1 & bit (TOV1)) && timer1CounterValue < 0x7FFF)
    overflowCopy++;

  // wait until we noticed last one
  if (triggered)
    return;

  if (first)
    {
    startTime = (overflowCopy << 16) + timer1CounterValue;
    first = false;
    return;  
    }

  finishTime = (overflowCopy << 16) + timer1CounterValue;
  triggered = true;
  TIMSK1 = 0;    // no more interrupts for now
  }  // end of TIMER1_CAPT_vect

void prepareForInterrupts ()
  {
  noInterrupts ();  // protected code
  first = true;
  triggered = false;  // re-arm for next time
  // reset Timer 1
  TCCR1A = 0;
  TCCR1B = 0;

  TIFR1 = bit (ICF1) | bit (TOV1);  // clear flags so we don't get a bogus interrupt
  TCNT1 = 0;          // Counter to zero
  overflowCount = 0;  // Therefore no overflows yet

  // Timer 1 - counts clock pulses
  TIMSK1 = bit (TOIE1) | bit (ICIE1);   // interrupt on Timer 1 overflow and input capture
  // start Timer 1, no prescaler
  TCCR1B =  bit (CS10) | bit (ICES1);  // plus Input Capture Edge Select (rising on D8)
  interrupts ();
  }  // end of prepareForInterrupts


void setup () 
  {
  Serial.begin(115200);       
  Serial.println("Frequency Counter");
  // set up for interrupts
  prepareForInterrupts ();   
  } // end of setup

void loop () 
  {
  // wait till we have a reading
  if (!triggered)
    return;

  // period is elapsed time
  unsigned long elapsedTime = finishTime - startTime;
  // frequency is inverse of period, adjusted for clock period
  float freq = F_CPU / float (elapsedTime);  // each tick is 62.5 ns at 16 MHz

  Serial.print ("Took: ");
  Serial.print (elapsedTime);
  Serial.print (" counts. ");

  Serial.print ("Frequency: ");
  Serial.print (freq);
  Serial.println (" Hz. ");

  // so we can read it  
  delay (500);

  prepareForInterrupts ();   
}   // end of loop
//输入:引脚D8
易变布尔优先;
易失性布尔触发;
易失性无符号长溢出计数;
易失性无符号长起始时间;
易失性无符号长完成时间;
//计时器溢出(每65536次计数)
ISR(计时器1\u OVF\u vect)
{
溢出计数++;
}//计时器1\u OVF\u vect的结束
ISR(定时器1机长)
{
//抓取计数器值,然后再进行更改
无符号int timer1计数器值;
timer1CounterValue=ICR1;//参见数据表,第117页(访问16位寄存器)
无符号长溢出复制=溢出计数;
//如果只是错过了一个溢出
if((TIFR1&bit(TOV1))&TIMER1计数器值<0x7FFF)
overflowCopy++;
//等到我们注意到最后一个
如果(已触发)
返回;
如果(第一)
{

startTime=(overflowCopy正如我在另一个线程中建议的那样,最好是

  • 滤器
  • 放大
  • 应用阈值
  • 测量边缘之间的时间

  • 步骤1、2、3可以在软件中执行,但最好在硬件中执行。第四步是Nick Gammon解决方案的内容……但您必须首先在HW中执行步骤1、2、3,否则您将收到大量“嘈杂”读数

    您有传感器的数据表吗?