Kann ein Arduino Beispiel-audio in Mikrosekunden für 1-4 kHz?
Habe ich nur angeschlossen eine Elektret-Mikrofon einem Arduino, und ich möchte eine Probe zwischen den Bereichen 1 kHz und 4 kHz.
Ich verstehe, das ist beschränkt auf den Maschinencode und die ADC, so bin ich versucht zu halten den Skizze einfach.
Ist es möglich, die Probe zwischen diesen Frequenzen mit der Skizze unten?
const int analogPin = 0;
int ledPin = 13;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
int mn = 1024;
int mx = 0;
for (int i = 0; i < 5; ++i) {
int val = analogRead(analogPin);
mn = min(mn, val);
mx = max(mx, val);
}
if (mx-mn >= 50) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}
- Welche Art von Arduino benutzt du?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Arduino ist eine prototyping-Plattform, bestehend aus einer Reihe von hardware-boards plus ein software-Abstraktions-Schicht. Für eine Frage wie diese, ist es sinnvoll, die Fähigkeiten der zugrunde liegenden hardware, so wie diese bieten die ultimative Grenze. Ich nehme an, Sie sind mit Arduino Uno/Nano, der Geschichte Wegen.
Laut Datenblatt, jeder ADC Lesen (außer das erste) braucht 13 ADC clock cycles. ADC-Uhr (verschiedene von der MCU) clock abgeleitet wird, durch die Aufteilung der system-Uhr um einen Faktor, mindestens 2. Also bei 16Mhz board dieser beläuft sich auf 0,6 Millionen samples pro Sekunde. So weit So gut. Doch das ist nicht das Ende der Geschichte, die Sie noch brauchen, um die Daten zu Lesen. Wenn Sie interrupts verwenden, auch wenn Sie etwas sehr einfach, wie die Erfahrung zeigt, dass Sie verlieren etwa 100 Uhr zur interrupt-Verarbeitung. Jetzt sind Sie unten, um 126K samples/Sekunde. Aber das ist ein theoretisches maximum.
Das Datenblatt besagt, dass für maximale Genauigkeit für den ADC benötigt 50kHz - 200kHz ADC-clock. In der Arduino-code (in
wiring.c
), einem teilungsfaktor von 128 gewählt:Dies bedeutet, dass jede Umstellung dauert 128*13 = 1764 Uhren, ergibt sich ein theoretisches maximum von 10K samples pro Sekunde. Es ist ein bisschen schlimmer als gegeben, dass die
readAnalog()
Funktion etwas tut, außer eben starten der ADC-Konvertierung und warten auf es zu beenden, aber es sollte nicht zu viel schlimmer. Dies nicht um Ihren code natürlich: jede Bearbeitung, die Sie auf die Ergebnisse derreadAnalog()
wird es schwieriger machen, um zu erfassen, dass mehr Proben. Aber ja, zu erfassen bei 4Khz, die Sie benötigen, um sicherzustellen, dass Sie den code verbringt weniger als 1,5 k clock Zyklen/sample, das sollte machbar sein. Beachten Sie, dass, wenn Sie tun, fünf Lesungen, wie Sie in dem code, den Sie geschrieben, ist die maximale Aufnahmerate wird 2kHz, ob dein code tut sehr wenig.Soweit, wie die Daten erfasst, die Sie brauchen, um mit der Tatsache auseinandersetzen, dass die Mikrofone, ohne Verstärkung wird es nicht geben Sie 0-5V Lesungen, die Sie erwarten, wenn Sie mit
analogRead()
. In der Tat, Mikrofon-Ausgang Spannungen swing von positiv zu negativ, aber die negativen Spannungen werden nicht abgeholt, die von der ADC, und zeigen sich als nur Nullen, es sei denn, Sie geben Ihr Mikrofon eine Spannung versetzt.Ich bin nicht genau sicher, was Ihren code, vergleicht minimale amplitude die maximale amplitude erreicht ist (eigentlich). Sind Sie wollen zu digitalisieren audio? In diesem Fall müssen Sie zum speichern der amplitude Lesungen, gesammelt von
analogRead()
, und dann können Sie run FFTs auf einem anderen computer: Arduino ist wahrscheinlich nicht schnell genug zu tun-Frequenz-Analyse auf die Daten.Habe ich gehört, oder eher gelesen, dass der ADC konnte mit bis zu 10k-samples pro Sekunde, so sollte es OK sein bis zu 5 kHz. Ich habe allerdings nicht versucht, diese noch habe ich einen link, um es wieder im moment.
Einfach ausprobieren und sehen.
Nun weiß ich, dass einige der Arduino-library-Funktionen sind langsam, vor allem die DigitalRead/Write-hat, overhead, Hunderte von Zyklen. Die meisten dieser ist, der Vernunft zu prüfen, dass ermöglicht es den Menschen nur führen DigitalRead/Write ohne viel zu denken über die Einstellung alles auf.
Jedoch, squeeze-out die maximale Leistung, die Sie konnte man in das schreiben Ihrer eigenen AnalogRead, optimiert für Ihren Anwendungsfall.
Zumindest einige links zum Thema:
Pin I/O-performance (JeeLabs)
C++ - Template-Methode für schnelleren Zugriff (JeeLabs)
Zufälligerweise habe ich gerade versucht, diese mit einem Arduino Uno und ähnlichen code zu verkaufen und ich in der Lage gewesen, um eine Probe von durchschnittlich 8000 mal in der Sekunde. Das ist die Nyquist-Frequenz bei 4 kHz, so dass Sie gut sind aber nicht viel Spielraum für Fehler.