Спектр вибрации на базе ардуино
- Войдите на сайт для отправки комментариев
Вс, 28/03/2021 - 11:10
Здравствуйте. Мне нужно спроектировать анализатор спектра вибрации. План следующий. Создаю в маткаде запись сигнала, там же нахожу спектр, который в будущем должен получиться и на ардуино. Программа последнего должна будет получить сигнал, и вывести на экран его спектр. Возможно ли это на Ардуино?
Возможно.
Отлично. Тогда такой вопрос. Есть какие библиотеки для этого ? Или какая книга, где описано нахождение спектра на ардуино ?
Есть какие библиотеки для этого ? Или какая книга, где описано нахождение спектра на ардуино ?
Есть и то, и другое.
Так-так-так. Погодите, я весь - внимание!
Сигналы и спектры обычно описываются четкими числовыми параметрами. Без этого понимания разговор пустой.
разговор пустой
Зато кружка пива у графа полная. А чего ещё нужно-то?
Смотрите. Я создам сигнал в маткаде. Все его параметры мне будут известны. Соответственно, почему нельзя сделать спектр в ардуино ?
Почему нельзя ? Можно. Вам же сразу ответили )
1. Определитесь с частотами
2. Научитесь правильно оцифровывать сигнал с нужной частотой
3. Найдите библиотеку быстрого преобразования Фурье и попробуйте что то разумное от неё получить
Вот когда будут известны, тогда и приходите. А пока вопрос ни о чем.
почему нельзя сделать спектр в ардуино ?
действительно, почему нельзя? В Вам в #1 написал, что можно. Затем, в #3 написал, что необходимая литература и готовые библиотеки, чтобы поменьше самому писать - имеются. А Вы опять "нельзя".
Вы не умеете читать? Или просто почему-то не прочитали моих ответов?
Может лично Вам нельзя? Ну, там, мама запретила? Так Вы про это ничего не говорили.
подпишусь на тему, попкорн есть. Интересно все-таки какое ТЗ будет... что-то интересное будет, однозначно.
Посоветуйте, пожалуйста, экран, который будет нормально отображать спектр, но и который можно найти для проги протеус
Критерий нормальности - моделька в протеус )
Экран тут вообще дело десятое (если он не цветной), напишите с выводом результата в serial, потом присобачите экран.
Я совершенно запутался. Объясните, пожалуйста, как оно работает. Я создал с помощью Маткада сигнал, по сути - просто аудиозапись(далее просто "сигнал"). Именно от нее я буду получать спектр сигнала. Теперь к проге ардуино.
Первый вопрос. Правильно ли я понимаю саму последовательность действий? Последовательность следующая:
1) Задаю библиотеки, переменные для входного сигнала - x, переменную для выхода y.
2) После этого я должен сразу провести БПФ сигнала, то есть переменной х.
3) Присваиваю результат БПФ к переменной у.
Второй вопрос. Как собственно говоря проводить это самое БПФ ?! Подключаю библиотеку "#include <fix_fft.h>". Не нашел ни одного примера, который бы объяснил, что и зачем делается.
А Вы уверенно и твёрдо понимаете собственно сущность БПФ? Что и как там делается?
"А Вы уверенно и твёрдо понимаете собственно сущность БПФ? Что и как там делается?"
Если вы про понимание всей математики, то понимаю я ее скорее в целом, нежели во всех деталях
Второй вопрос. Как собственно говоря проводить это самое БПФ ?! Подключаю библиотеку "#include <fix_fft.h>". Не нашел ни одного примера, который бы объяснил, что и зачем делается.
Откройте fix_fft.cpp и почитайте.
Можно какой нибудь пример использования взять и поковырять:
https://microkontroller.ru/arduino-projects/analizator-spektra-zvukovyh-chastot-na-osnove-fft-i-arduino/
https://microkontroller.ru/arduino-projects/32-polosnyj-analizator-vizualizator-spektra-zvukovyh-chastot-na-arduino/
Второй вопрос. Как собственно говоря проводить это самое БПФ ?! Подключаю библиотеку "#include <fix_fft.h>". Не нашел ни одного примера, который бы объяснил, что и зачем делается.
Откройте fix_fft.cpp и почитайте.
Можно какой нибудь пример использования взять и поковырять:
https://microkontroller.ru/arduino-projects/analizator-spektra-zvukovyh-chastot-na-osnove-fft-i-arduino/
https://microkontroller.ru/arduino-projects/32-polosnyj-analizator-vizualizator-spektra-zvukovyh-chastot-na-arduino/
Да, я видел эти страницы. Но код не работает никак
Как вы это поняли ? Работает он.
Как вы это поняли ? Работает он.
Уже разобрался. Глюк какой-то был с библиотеками. Переустановил и заработало
Не получается никак нормальный спектр построить, объясните пожалуйста, где ошибся?
Собрал следующую схему:
На этой же схеме виден результат нахождения спектра
Весь код:
#include <math.h> // библиотека математических операций #include <fix_fft.h> #include <SPI.h> // библиотека работы с интерфейсом SPI #define SYNC_pin 6 // определяем пин для сигнала SYNC ЦАПа #define TD_pin 7 // определяем пин для выхода TD, по которому будем контролировать период дискретизации // инициализация переменных char im[128], data[128], lastpass[64]; int i=0,val; int analogPin = A1; // инициализация входа АЦП unsigned int xADC, yDAC; // переменные для целочисленных кодов АЦП и ЦАП //переменные для ФВЧ float xn1, y_out; bool flag_TD = 0; void setup() { pinMode(TD_pin, OUTPUT); // пин для удобства определения периода дискретизации но экрану осциллографа digitalWrite(TD_pin, LOW); pinMode(SYNC_pin, OUTPUT); // выход для сигнала SYNC для ЦАПа, период следования импульсов на этом выводе по сути равен периоду дискретизации digitalWrite(SYNC_pin, HIGH); // чтобы SYNC ЦАПа стал 1 // здесь настройка интерфейса SPI для работы с ЦАПом SPI.begin(); // инициализируем SPI SPI.setClockDivider(SPI_CLOCK_DIV2); // ставим максимальную скорость обмена по SPI SPI.setDataMode(SPI_MODE3); // ставим режим SPI: пауза синхро=1, запись данных по спаду синхро: SPI_MODE3 работает } void DAC_out(unsigned int DAC_data) // процедура записи отсчета данных в ЦАП { digitalWrite(SYNC_pin, 0); // чтобы SYNC ЦАПа стал 0 SPI.transfer16(DAC_data); // если верить протеусу, то данные - 2 байта - уходят за 10 микросекунд! то есть быстро. digitalWrite(SYNC_pin, 1); // чтобы SYNC ЦАПа стал 1 до следующей выдачи в ЦАП flag_TD = !flag_TD; digitalWrite(TD_pin, flag_TD); } // ****************** основной цикл программы ****************************** void loop() { // здесь должно быть запрограммировано БПФ преобразование: for (i=0; i < 128; i++) { xADC = analogRead(analogPin); // считывание кода с АЦП xn1 = (float)(xADC - 512.0); // компенсируем смещение нуля в аппаратной части на входе (приходится смещать вверх, поскольку АЦП однополярный) data[i] = xn1/4 -128; im[i] = 0; }; fix_fft(data,im,7,0); // БПФ преобразование: for (i=1; i< 64;i++) { data[i] = sqrt(data[i] * data[i] + im[i] * im[i]); } y_out = data[i]; // ---------------------------------------------------------------------------------------------------------------------- // выдача очередного одного отсчета выходного сигнала фильтра в ЦАП y_out = (float)(4.0 * (y_out + 512.0)); // добавляем смещение нуля с учетом особенностей аппаратной части - однополярный ЦАП // и сразу масштабируем результат в 4 раза - преобразуем выходной код фильтра в 12-разрядный формат ЦАП if (y_out > 4095) y_out = 4095; // учитываем ограничение диапазона выходных кодов ЦАП сверху if (y_out < 0) y_out = 0; // учитываем ограничение диапазона выходных кодов ЦАП снизу yDAC = (int)y_out; // преобразуем вещественное в целое DAC_out(yDAC); // отправка в ЦАП // delay(1); // Вносим задержку - здесь она выражается в миллисекундах, если нужно delayMicroseconds(190); // вносим задержку - здесь она выражается в микросекундах } // ****************** конец вечного цикла loop **************************Сигнал, который подаю на вход схему, прикрепить не получилось, но вообще туда можно подать любую синусоиду
маленький вопрос - какая максимальная частота на входе? ну и минимум какой подаете?
Что то я не уловил что мы такое делаем после вычисления амплитуды бинов. По факту на выход у нас уходит амплитуда старшего бина и все. Цикл забыли или что вообще должно попасть в ЦАП ?