Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/fft adc serial

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Применение БПФ на данных от АЦП и отправка результата посредством println()[1]

Это скетч для библиотеки FFT, который при помощи платы Arduino считывает данные с АЦП (аналогово-цифрового преобразователя), а затем обрабатывает их при помощи алгоритма БПФ (быстрое преобразование Фурье).

Для передачи данных по последовательному порту используется цикл for() и функция println().

Код

  1.  
  2. /*
  3. Применение БПФ на данных от АЦП и отправка результата через printIn()
  4.  
  5. Создан пользователем guest на openmusiclabs.com
  6. Дата создания – 7 июля 2014 года.
  7. Скетч предназначен для тестирования библиотеки FFT.
  8.  
  9. Он берет данные у adc0 (0—ой аналоговый контакт), а затем 
  10. обрабатывает их при помощи БПФ. Данные отправляются 
  11. по последовательному порту на скорости 115,2 килобит.
  12. */
  13.  
  14. #define LOG_OUT 1 // включаем функцию для логарифмического формата
  15. #define FFT_N 256 // задаем количество выходных отсчетов на 256
  16.  
  17. #include <FFT.h> // подключаем библиотеку
  18.  
  19. void setup() {
  20.   Serial.begin(115200); // запускаем последовательный порт
  21.   TIMSK0 = 0; // выключаем timer0, чтобы уменьшить джиттер
  22.   ADCSRA = 0xe5; // задаем для АЦП автономный режим работы
  23.   ADMUX = 0x40; // используем adc0
  24.   DIDR0 = 0x01; // выключаем цифровой вход для adc0
  25. }
  26.  
  27. void loop() {
  28.   while(1) { // уменьшаем джиттер
  29.     cli();  // на Arduino 1.0 со снижением хорошо справляются прерывания UDRE 
  30.     for (int i = 0 ; i < 512 ; i += 2) { // сохраняем 256 отчетов
  31.       while(!(ADCSRA & 0x10)); // ждем, когда АЦП будет готов
  32.       ADCSRA = 0xf5; // перезапускаем АЦП
  33.       byte m = ADCL; // считываем данные АЦП
  34.       byte j = ADCH;
  35.       int k = (j << 8) | m; // конвертируем в данные типа int
  36.       k -= 0x0200; // конвертируем в данные типа int со знаком
  37.       k <<= 6; // конвертируем в 16-битные данные типа int со знаком
  38.       fft_input[i] = k; // сохраняем действительные значения в четные отсчеты
  39.       fft_input[i+1] = 0; // задаем нечетным отсчетам значение «0»
  40.     }
  41.     fft_window(); // функция-окно, повышающая частотное разрешение
  42.     fft_reorder(); // реорганизовываем данные перед запуском БПФ
  43.     fft_run(); // обрабатываем данные в БПФ
  44.     fft_mag_log(); // извлекаем данные, обработанные БПФ
  45.     sei();
  46.     Serial.println("start");  //  "Старт"
  47.     for (byte i = 0 ; i < FFT_N/2 ; i++) { 
  48.       Serial.println(fft_log_out[i]); // отсылаем данные
  49.     }
  50.   }
  51. }

См.также

Внешние ссылки

  1. wiki.openmusiclabs.com - fft_adc_serial.pde