Jump to content

    

АндрейЦ

Участник
  • Posts

    328
  • Joined

  • Last visited

Everything posted by АндрейЦ


  1. Естественно, но у нас есть ведь и допустимая погрешность. Которая и определяет момент, когда уже можно остановиться. Точно так же, как и написанном мною "произвольном количестве точек". Оно то произвольное, но не более некоего максимально заложенного количества звеньев.
  2. Конечно же вы правы. Только вот понимаете какая штука с этим типом правоты... Ну вот, к примеру, я могу взять руками пары точек от калибратора и занести в Exсel. Построить график и натравить на него инструмент аппроксимации. Если результат меня не устроит, я могу добавить точек в наиболее кривой области. Полученный полином, подсказанный мне Excel, я могу перенести в прибор. Но всё это руками. А хочется, чтобы прибор делал это самостоятельно.
  3. Поняли, похоже, правильно. Но каналы прибора не симметричны. Строго говоря канал там один, именно тот который нужно лианеризовать. Второй вспомагательный на время калибровки. Вот пытаюсь рисовать на бумажке как можно без участия оператора пересчитывать корректировочный полином для произвольном количестве исходных точек. Но пока ничего красивого в голову не приходит.
  4. Название топика несколько совсем не правильное, скорей всего. Не смог придумать в обьёме заголовка. Суть вопроса вот в чём. Есть некий прибор, имеющий два входных канала. Для простоты X и Y. Каналы аналоговые. Прибор выполняет некоторые действия над каналами. Упрощённо считаем, что вычисляется функция Z = Y(X). Канал Х условно считаем опорным, линейным и т.д. А вот АЧХ канала Y нужно корректировать. И есть задача сделать это следующим образом: прибор переводится в режим калибровки и на его входы подаются эталонные сигналы. На вход X изменяющийся, на вход Y эталонный, соответствующий поданному Х так, чтобы Z было равно некоей заданной величине. К примеру 1. Прибор при этом вычислит некоторое Z, которое будет отличатся от 1. Так же для синхронизации в этот момент оператор будет нажимать кнопку. Собственно основная идея - минимизировать требования к квалификации оператора при проведении калибровки. Т.е. на стол приходит прибор. Подключается калибратор, который может выдавать пары сигналов. Оператор смотрит АЧХ и выбирает пары калибровочных сигналов в самой "кривой" зоне до тех пор, пока АЧХ не станет приемлемо линейной. Коррекция АЧХ предполагается неким полиномом, коэффициенты которого должны вычисляться прибором и записываться затем во флешку. Вот, собственно и вопрос: как по произвольному количеству пар входных сигналов вычислять эти коэффициенты полинома внутри прибора. Может кто сталкивался с подобной задачей.
  5. Поиск частоты с максимальной амплитудой - только один из режимов. Для других режимов используется полный амплитудный спектр. Так что таки пока БПФ.
  6. Вы правы, это так. Но я нигде не встречал отображения rms виброускорения или виброперемещения. Зато есть упоминание именно о пиковых хначениях: Виброускорение – это значение вибрации, прямо связанное с силой, вызвавшей вибрацию. Виброускорение характеризует то силовое динамическое взаимодействие элементов внутри агрегата, которое вызвало данную вибрацию. Обычно отображается амплитудой (Пик, Peak) - максимальное по модулю значение ускорения в сигнале. Применение виброускорения теоретически идеально, т. к. пъезодатчик (акселерометр) измеряет именно ускорение и его не нужно специально преобразовывать. Недостатком является то, что для него нет практических разработок по нормам и пороговым уровням, нет общепринятого физического и спектрального толкования особенностей проявления виброускорения. Успешно применяется при диагностике дефектов, имеющих ударную природу - в подшипниках качения, редукторах. И тут же: Виброскорость Виброскорость – это скорость перемещения контролируемой точки оборудования во время её прецессии вдоль оси измерения. В практике измеряется обычно не максимальное значение виброскорости, а ее среднеквадратичное значение, СКЗ (RMS). Физическая суть параметра СКЗ виброскорости состоит в равенстве энергетического воздействия на опоры машины реального вибросигнала и фиктивного постоянного, численно равного по величине СКЗ. Использование значения СКЗ обусловлено ещё и тем, что раньше измерения вибрации велись стрелочными приборами, а они все по принципу действия являются интегрирующими, и показывают именно среднеквадратичное значение переменного сигнала.
  7. Конечно могу и ошибаться. Давайте подумаем совместно. Вижу на Ваших диаграммах, к примеру область с тремя частотами 18, 19, 20. Сегодня амплитуда 20 выше, вчера 19. Оконная функция даст мне 19Гц для обоих случаев. Что это значит практически? Я подхожу к агрегату с приборчиком, который умеет оконную функцию. И вчера и сегодня он покажет 19. Приборчик, который оконную функцию не умеет на дисплее вчера выведет 19, а сегодня 20. Больше ничего приборчик показать не сможет. Ни дисплейчик не позволит ни(тут относительно) производительность внутреннего микроконтроллера. Важно ли мне это? Пока что кажется, что нет. Особенно, если учесть паспортные погрешности подобных приборов.
  8. В среднем, описание измеряемых подобными приборами параметров выглядит так: Виброускорение (амплитуда), Виброскорость (СКЗ), Виброперемещение (размах), Диапазон измеряемых частот: Т.е. rms детектор там есть однозначно. Но единственный rms параметр - это виброскорость. Хотя вот попалось: Виброускорение – это значение вибрации, прямо связанное с силой, вызвавшей вибрацию. Виброускорение характеризует то силовое динамическое взаимодействие элементов внутри агрегата, которое вызвало данную вибрацию. Обычно отображается амплитудой (Пик, Peak) - максимальное по модулю значение ускорения в сигнале.
  9. Извините, что с таким вопросом в серьёзном разделе. Суть вопроса вот в чём. Есть у меня массив некоторой длинны(допустим 1024) с АЦП отсчётами. Поле БПФ у меня так же есть массив с амплитудами по получившимся частотам/гармоникам. Каков масштаб этих амплитуд по отношению к входным отсчётам? Беглое гугление дало варианты Авых/Авх= 1:1, 512 к 1(половина длинны входного массива) и 1024 к 1. Так же попался вариант, в котором перед вычислением амплитуды - корня квадратного из суммы квадратов действительных и мнимых отсчётов, эти отсчёты нужно разделить на коэффициент. Свой для действительной части и свой для мнимой.
  10. Вот тут то и порылась собака. Не могу найти внятного описания что именно отображают виброметры в данном случае. В качестве идеи вот такое: мы контролируем состояние некоего вращающегося механизма. К примеру. Основная гармоника будет связана с частотой вращения. Остальные будут кратны. Либо это шарики подшипника будут стучать на частоте выше в количество шариков, либо зубья шестерни будут добавлять чего то. И т.д. Т.е. встретить случай с 8 и 9Гц рядом практически маловероятно. Также, скорее всего основной вклад в энергетику вибраций будет вносить основная вибрирующая масса. Т.е. вклад от вращающегося вала на 50Гц будут поболее от обоймы с шариками на 500Гц. Так же скорее шпиндель с деталью будет раскачивать токарный станок, чем подшипник шпинделя. Индикация среднеквадратического значения виброскорости в диапазоне частот как раз охватывает некий диапазон, куда попадает и основная частота и вклад от высших производных. Дохлый подшипник мы должны увидеть там. Но вместе с тем даже простенькие приборы, которые не показывают спектр за неимением подходящего индикатора, показывают и виброускорение и виброперемещение. Для каких частот? Вот картинка для иллюстрации. 4,07 для какой частоты?
  11. Можно небольшой коммент с точки зрения метрологии моим мыслям? ) Итак, получили мы массив значений ускорений. Посчитали Фурье и получили массив амплитуд ускорений по частотам. Дальше. Нам хочется узнать СКЗ виброскорости. Подглядываем вот сюда https://vibrocenter.ru/vibroacc_vel.htm и строим ещё ещё один массив, получая из виброускорения виброскорость : Vi = Ai /(2*3.14*fi) *1000 Затем мы считаем сумму квадратов полученных виброскоростей в диапазоне частот 10 -1000Гц и из половины этой суммы вычисляем корень квадратный. И получаем СКЗ виброскорости. rms2 вот отсюда: https://vibrocenter.ru/rms.htm Затем хотелось бы выдавать и виброускорение с виброперемещением. А вот с этим немного неясно. Я предполагаю, что речь идёт о значениях для частоты с наибольшей амплитудой. Т.е. в массиве виброускорений мы находим наибольшее значение. Это виброускорение. Для этой частоты мы получаем виброперемещение и индицируем все полученные параметры. Так?
  12. Немножко ещё почитал. Правильно ли я понимаю, что полученные амплитуды промасштабированы относительно исходного сигнала на величину половины числа отсчётов. Т.е. вот у меня есть выделяющаяся частота под номером 436 величиной 615. И если я её поделю на 1024/2 = 512, то получу что то порядка 1,2. И это будет амплитуда в масштабе входного сигнала. Т.е. её амплитуда 1,2 МЗР АЦП?
  13. Он даже вполне себе работает. Вот огроменное спасибо! Осталось разобраться как полученные значения привести к реальному масштабу.
  14. Честно говоря, используя Ваш с комментариями буду пробовать самообучаться. Т.е. разбирать как именно оно работает. А под проектом из последней ссылки я имел в виду проект спектроанализатора. Который практически готов к употреблению.
  15. Как работает ДПФ я можно сказать почти понимаю. По крайней мере улавливаю физический смысл. Меня в ужас приводят свёртки - бабочки БПФ. Если бы это было делом всей моей жизни, да вариантов нет. А под конкретную задачу была надежда обойтись малой кровью. Исходник из последней ссылки коллеги kovigor очень даже и очень. Я пока разбираюсь с тем как автор проекта корректировал его под свои нужды. Исходник изначально под 1024 точки. Таблица синусов осталась нетронутой, а проект под 64 точки.
  16. Частота заранее неизвестна. Собственно нужно в произвольном сигнале найти "палку" максимальной амплитуды и определить частоту. По порядковому номеру, как я понимаю. ПыСы пасиб, изучу.
  17. Есть задача: микроконтроллер (PIC32MM) складывает в массив на 1024 отсчёта оцифрованный некий входной сигнал. Нужно выделить частоту/гармонику с максимальной амплитудой. Провёл за гуглением несколько дней. Скажу честно, далёк я от самостоятельной реализации БПФ на основе просто алгоритмов и графов. Попробовал ДПФ, которое гораздо попроще, но скорость не просто не устраивает, а сильно не устраивает. Нашлась относительно простая реализация https://www.silabs.com/documents/public/application-notes/an142.pdf Которую в данный момент изучаю. Но очень она громоздкая. Может кто подскажет более компактную реализацию.
  18. Частота на SPI укладывается в параметры слейва. Мусор на шине, судя по даташиту, тоже. К сожалению у меня одна платка и чтобы снять осциллограммы работы макета с PIC18, нужно помахать паяльником и кусачками. Но, снова таки, код работает, хоть и не нравится мне абсолютно.
  19. Похоже, что мой код родившийся в ночном угаре всё таки работает. Датчику нужно было передёрнуть питание. Замучил я его мусором на шине. Но остаётся вопрос почему работает именно так и не сломается ли работа по мере дописывания программы. МСС предлагает код, который я спрятал под спойлером. Я пробовал использовать оттуда SPI2_Exchange8bit.
  20. Не работает так :). Я немножко представляю как работает SPI, у меня есть макет на PIC18, на котором всё это дело более менее работает. Сейчас я переношу проект на PIC32, который и будет в дальнейшем использоваться. Ни PIC32 ни MPLAB я ранее не использовал, посему и некоторая степень тупизны в моих вопросах. Наверное. В качестве "облегчалки" на старте я пользуюсь ещё и МСС, хотя от этого нужно уходить, похоже. Т.е. в том числе я смотрю и тот код, который предлагает МСС. К сути. Вставка нулевой посылки для генерации пачки клока чтения и проверка битов готовности буфера не работает. Сначала нужно очистить буфер чтением. Дальше происходит непонятное мне. Проверка битов готовности не проходит. Программа останавливается в этом месте. Как то работает вот такой вариант. LATBbits.LATB6 = 0; //ADXL_CS SPI2BUF = (internal); while( SPI2STATbits.SRMT == false ); // while ( SPI2STATbits.SPIRBE == true); internal = SPI2BUF; SPI2BUF = 0x00; // dummy write for read !!! while( SPI2STATbits.SRMT == false ); // while ( SPI2STATbits.SPIRBE == true); internal = SPI2BUF; LATBbits.LATB6 = 1; //ADXL_CS Но работает неправильно. При вычитывании нескольких регистров через один получаю нули. Т.е. цепочка регистров 32 - 33 - 34 - 35(B2 - B3 - B4 - B5 с битом чтения) даёт ЗНАЧЕНИЕ - НОЛЬ - ЗНАЧЕНИЕ - НОЛЬ. И вот почему так и что не так, я уже и не знаю, потому что визуально в обмене всё так как и должно быть. ПыСы, забавно попробовал прочитать не 32 - 33, а 33 - 32. Получил НОЛЬ - ЗНАЧЕНИЕ. Т.е. при чтении нечётных регистров слейв отдаёт нули.
  21. Внимательно посмотрел на процедуру передачи и всё получилось. С приёмом увы. И при использовании сгенерированной SPI2_Exchange8bit и с "самодельными" попытками я вижу передачу адреса регистра и на этом всё. Второй, читающей, пачки клока нет. unsigned short ADXL345_Read(unsigned short address) { unsigned short internal = 0; internal = address | _SPI_READ; LATBbits.LATB6 = 0; //ADXL_CS SPI2BUF = (internal); while( SPI2STATbits.SRMT == false ){} while ( SPI2STATbits.SPIRBE == true){} internal = SPI2BUF; //while( SPI2STATbits.SPIRBE == true ){} //internal = SPI2_Exchange8bit(address | _SPI_READ); //while( SPI2STATbits.SPIRBE == true ){} LATBbits.LATB6 = 1; //ADXL_CS return internal; }
  22. Сразу извиняюсь за чайниковость. >>PPS. Если я правильно понял вопрос, то да. Пины назначены. Если этого недостаточно, подскажите где смотреть ещё. На осциллограмме. Желтый луч SS, голубой SCK, розовый MOSI и синий MISO. Картинка в целом - попытка прочитать 6 регистров. Синхронизация по желтому каналу. Остальные "дрожат". Т.е. мало того, что есть смещение так оно ещё и непостоянное.
  23. День добрый, помогите плиз, а то как то всё не так:) Старый добрый mikroC не поддерживает серию ММ, посему вместо работы над проектом воюю и осваиваю MPLAB и MCC. Пытаюсь запустить обмен по SPI. Пытался и полностью самописно и с использованием МССшных функций. Основная беда на сей момент в несинхронности клока и выходных данных с сигналом выборки слейва. Видно на осциллограмме. Слейв сейчас управляется ручками. Назначал в МСС пин для SS2OUT, но он всегда в единице. Как сделать правильно? void ADXL345_Write(unsigned short address, unsigned short data1) { unsigned short internal = 0; internal = address | _SPI_WRITE; // Register and Write bit LATBbits.LATB6 = 0; //ADXL_CS while( SPI2STATbits.SPITBF == true ){} SPI2BUF = (internal); while ( SPI2STATbits.SPIRBE == true){} SPI2BUF = (data1); while( SPI2STATbits.SPITBF == true ){} // SPI1_Write(internal); // SPI1_Write(data1); LATBbits.LATB6 = 1; //ADXL_CS } ///////////////////////////////////////////// unsigned short ADXL345_Read(unsigned short address) { unsigned short internal = 0; //internal = address | _SPI_READ; // Register and Read bit LATBbits.LATB6 = 0; //ADXL_CS internal = SPI2_Exchange8bit(address | _SPI_READ); LATBbits.LATB6 = 1; //ADXL_CS return internal; }
  24. Проблема решилась полным переходом под MPLAB