Спектр вибрации на базе ардуино

pit-pol@mail.ru
Offline
Зарегистрирован: 28.03.2021

Здравствуйте. Мне нужно спроектировать анализатор спектра вибрации. План следующий. Создаю в маткаде запись сигнала, там же нахожу спектр, который в будущем должен получиться и на ардуино. Программа последнего должна будет получить сигнал, и вывести на экран его спектр. Возможно ли это на Ардуино? 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Возможно.

pit-pol@mail.ru
Offline
Зарегистрирован: 28.03.2021

Отлично. Тогда такой вопрос. Есть какие библиотеки для этого ? Или какая книга, где описано нахождение спектра на ардуино ?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

pit-pol@mail.ru пишет:

Есть какие библиотеки для этого ? Или какая книга, где описано нахождение спектра на ардуино ?

Есть и то, и другое.

 

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Так-так-так. Погодите, я весь - внимание!

rkit
Онлайн
Зарегистрирован: 23.11.2016

Сигналы и спектры обычно описываются четкими числовыми параметрами. Без этого понимания разговор пустой.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rkit пишет:

разговор пустой

Зато кружка пива у графа полная. А чего ещё нужно-то?

pit-pol@mail.ru
Offline
Зарегистрирован: 28.03.2021

Смотрите. Я создам сигнал в маткаде. Все его параметры мне будут известны. Соответственно, почему нельзя сделать спектр в ардуино ? 

Morroc
Offline
Зарегистрирован: 24.10.2016

Почему нельзя ? Можно. Вам же сразу ответили )

1. Определитесь с частотами

2. Научитесь правильно оцифровывать сигнал с нужной частотой

3. Найдите библиотеку быстрого преобразования Фурье и попробуйте что то разумное от неё получить

rkit
Онлайн
Зарегистрирован: 23.11.2016

Вот когда будут известны, тогда и приходите. А пока вопрос ни о чем.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

pit-pol@mail.ru пишет:

почему нельзя сделать спектр в ардуино ? 

действительно, почему нельзя? В Вам в #1 написал, что можно. Затем, в #3 написал, что необходимая литература и готовые библиотеки, чтобы поменьше самому писать - имеются. А Вы опять "нельзя".

Вы не умеете читать? Или просто почему-то не прочитали моих ответов?

Может лично Вам нельзя? Ну, там, мама запретила? Так Вы про это ничего не говорили.

Гриша
Offline
Зарегистрирован: 27.04.2014

подпишусь на тему, попкорн есть. Интересно все-таки какое ТЗ будет... что-то интересное будет, однозначно. 

pit-pol@mail.ru
Offline
Зарегистрирован: 28.03.2021

Посоветуйте, пожалуйста, экран, который будет нормально отображать спектр, но и который можно найти для проги протеус 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

pit-pol@mail.ru пишет:
нормально отображать спектр
Нормально - это как? Каковы критерии нормальности?

Morroc
Offline
Зарегистрирован: 24.10.2016

Критерий нормальности - моделька в протеус )

Экран тут вообще дело десятое (если он не цветной), напишите с выводом результата в serial, потом присобачите экран.

pit-pol@mail.ru
Offline
Зарегистрирован: 28.03.2021

Я совершенно запутался. Объясните, пожалуйста, как оно работает. Я создал с помощью Маткада сигнал, по сути - просто аудиозапись(далее просто "сигнал"). Именно от нее я буду получать спектр сигнала. Теперь к проге ардуино.

Первый вопрос. Правильно ли я понимаю саму последовательность действий? Последовательность следующая: 

1) Задаю библиотеки, переменные для входного сигнала - x, переменную для выхода y.

2) После этого я должен сразу провести БПФ сигнала, то есть переменной х.

3) Присваиваю результат БПФ к переменной у.

Второй вопрос. Как собственно говоря проводить это самое БПФ ?! Подключаю библиотеку "#include <fix_fft.h>".  Не нашел ни одного примера, который бы объяснил, что и зачем делается. 

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А Вы уверенно и твёрдо понимаете собственно сущность БПФ? Что и как там делается?

pit-pol@mail.ru
Offline
Зарегистрирован: 28.03.2021

"А Вы уверенно и твёрдо понимаете собственно сущность БПФ? Что и как там делается?"

Если вы про понимание всей математики, то понимаю я ее скорее в целом, нежели во всех деталях

Morroc
Offline
Зарегистрирован: 24.10.2016

pit-pol@mail.ru пишет:

Второй вопрос. Как собственно говоря проводить это самое БПФ ?! Подключаю библиотеку "#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/

pit-pol@mail.ru
Offline
Зарегистрирован: 28.03.2021

Morroc пишет:

pit-pol@mail.ru пишет:

Второй вопрос. Как собственно говоря проводить это самое БПФ ?! Подключаю библиотеку "#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/

 

Да, я видел эти страницы. Но код не работает никак

Morroc
Offline
Зарегистрирован: 24.10.2016

Как вы это поняли ? Работает он.

pit-pol@mail.ru
Offline
Зарегистрирован: 28.03.2021

Morroc пишет:

Как вы это поняли ? Работает он.

Уже разобрался. Глюк какой-то был с библиотеками. Переустановил и заработало 

 

pit-pol@mail.ru
Offline
Зарегистрирован: 28.03.2021

Не получается никак нормальный спектр построить, объясните пожалуйста, где ошибся?

Собрал следующую схему:

cJ7Z3r9xCLg.jpg?size=1047x691&quality=96

На этой же схеме виден результат нахождения спектра

Весь код:

#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 **************************

Сигнал, который подаю на вход схему, прикрепить не получилось, но вообще туда можно подать любую синусоиду

 

 

Гриша
Offline
Зарегистрирован: 27.04.2014

маленький вопрос - какая максимальная частота на входе? ну и минимум какой подаете?

Morroc
Offline
Зарегистрирован: 24.10.2016

Что то я не уловил что мы такое делаем после вычисления амплитуды бинов. По факту на выход у нас уходит амплитуда старшего бина и все. Цикл забыли или что вообще должно попасть в ЦАП ?