Arduino to platforma prototypowania składa się z szeregu z kartami sprzętowymi plus warstwa abstrakcji oprogramowania. W przypadku takich pytań warto wziąć pod uwagę możliwości podstawowego sprzętu, ponieważ zapewniają one ostateczne ograniczenia. Zakładam, że używasz Arduino Uno/Nano, historia jest inna dla Due.
Zgodnie z arkuszem danych każdy odczyt ADC (poza pierwszym) zajmuje 13 cykli zegara ADC. Zegar ADC (inny niż MCU) otrzymuje się dzieląc zegar systemowy przez jakiś czynnik, co najmniej 2. Tak więc na płytce 16MHz ilość ta wynosi 0,6 miliona próbek na sekundę. Jak na razie dobrze. Jednak to nie koniec historii, nadal musisz przeczytać dane. Jeśli używasz przerwań, nawet jeśli zrobisz coś bardzo prostego, doświadczenie sugeruje, że stracisz około 100 zegarów, aby przerwać przetwarzanie. Teraz jesteś do 126K próbek/sekundę. Ale to jest teoretyczne maksimum.
Arkusz informacyjny podaje, że dla maksymalnej dokładności ADC wymagany jest zegar ADC 50kHz - 200kHz. W kodzie Arduino (w wiring.c
), czynnik podział 128 jest wybrana:
sbi(ADCSRA, ADPS2);
sbi(ADCSRA, ADPS1);
sbi(ADCSRA, ADPS0);
Oznacza to, że każda konwersja odbywa 128 * 13 = 1764 zegary, co daje teoretyczną maksymalną 10K próbek na sekundę. Jest nieco gorszy od tego, biorąc pod uwagę, że funkcja readAnalog()
robi coś więcej niż tylko rozpoczęcie konwersji ADC i czekanie na jej zakończenie, ale nie powinno być gorzej. Nie dotyczy to oczywiście Twojego kodu: każde przetwarzanie, które wykonujesz na wynikach readAnalog()
, utrudni przechwycenie większej ilości próbek.Ale tak, aby uchwycić 4Khz, musisz upewnić się, że kod wydaje mniej niż 1,5 tys. Cykli/próbki, co powinno być wykonalne. Zauważ, że jeśli wykonujesz pięć odczytów, tak jak robisz w opublikowanym przez ciebie kodzie, maksymalna szybkość przechwytywania będzie wynosić 2 kHz, jeśli twój kod będzie bardzo mały.
W miarę jak do przechwytywania danych, czego potrzebujesz, aby poradzić sobie z faktem, że mikrofony bez wzmocnienia nie daje 0-5V odczyty że można się spodziewać, jeśli używasz analogRead()
. W rzeczywistości napięcie wyjściowe mikrofonu zmienia się z dodatniej na ujemną, jednak napięcia ujemne nie będą odbierane przez ADC i będą wyświetlane jako same zera, chyba że podasz mikrofonowi napięcie.
Nie jestem dokładnie pewien, co powinien robić twój kod, który porównuje minimalną amplitudę do maksymalnej amplitudy. Czy chcesz zdigitalizować dźwięk? W tym przypadku musisz zapisać wszystkie odczyty amplitudy zebrane z analogRead()
, a następnie możesz uruchomić na nich FFT na innym komputerze: Arduino najprawdopodobniej nie będzie wystarczająco szybki, aby przeprowadzić analizę częstotliwości danych.
Jakiego rodzaju Arduino używasz? – angelatlarge