Подсчет импульсов

Простейшие вопросы в области инженерной разработки
Ответить
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Подсчет импульсов

Сообщение jane_wild »

Доброго всем здравия ребята. Прошу помощи. Кратко суть. На вал мотора наклеена отражающая лента, на которую направлен лазерный датчик и выход этого датчика заведен на аналоговый вход. В итоге имеется аналоговый массив состоящий из импульсов. Каждый импульс соответствует одному обороту мотора. Возникла необходимость в подсчете этих самых импульсов. Я понимаю, что по большому счету необходимо задействовать аппаратный счетчик DAQ, но не хочется переделывать весь проект. В итоге пытаюсь программно подсчитать количество импульсов. Посмотрите вложенный VI. Чувствую что есть более рациональное (простое) решение. К тому же массив состоит из около 5000 элементов. В итоге я проверяю все 5000 элементов, сравнивая значение с пороговым значением. Вот чувствую что неправильно это и процессору это явно не нравиться..... Спасибо
Вложения
Counter.vi
(18.99 КБ) 167 скачиваний
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: Подсчет импульсов

Сообщение Vitekkz88 »

Количество сравнений можно уменьшить путём предварительной сортировки данных.
Однако, функция сортировки в LabVIEW использует алгоритм быстрой сортировки и это не всегда оптимально с точки зрения принимаемых данных(лучший и худший случай).
Я проверил Ваш алгоритм на массиве из 10000 элементов. Время отработки = 3-5 мс. В целом не так уж и много.
Если добавить сортировку, то время работы 15-17 мс ( всё время занимает сортировка, т.к. если этот блок вытащить за фрейм, то время работы меньше 1 мс).
Так же можно построить поиск на использовании Threshold Detector VI. В данном случае быстродействие высокое(используется Си-функция), но возможно потребуется так же настраивать. Время отработки ~ 1 мс(плюс минус)
Если необходимо автоматически задавать порог - то используйте функцию AC & DC Estimator VI(но это так же добавит немного времени для обработки, ведь порог будет вычисляться для каждой пачки данных). Получите 1-3 мс в итоге.
Так же попробуйте у графика отключить сглаживание(ПКМ по графику, снять галочку Anti-Aliesed). Проверьте другие участки кода на производительность. Возможно Вы используете много подложек на GUI - это тоже приводит к тормозам работы программы. Лечится c помощью использования Enable/Disable Front Panel Updates (DeferPanelUpdates).
Вложения
Test.png
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: Подсчет импульсов

Сообщение jane_wild »

Vitekkz88 писал(а): Возможно Вы используете много подложек на GUI - это тоже приводит к тормозам работы программы.
Вы имеете ввиду декорации? У меня да - их много
Я как то не догадалась провести тест на скорость выполнения - спасибо. Пару мс меня вполне устраивает.
Сейчас озадачилась другим... Нужно еще и частоту вращения мерять. Идея простая - сложив количетсво выборок межу фронтами и умножив на время одной (частота дискретизации то известна), получим частоту импульов в секундах. Далее умножив результат на 60 получим желаемое RPM.
Вот тут то собака и порылась... Это в принципе будет работать если в прилетевшем массиве от DAQ есть хотя бы два импульса. При частоте опроса DAQ 100мс мотор должен крутится не менее 1200 оборотов в минуту. А если он вращается 100 об/мин. Тогда как? Именно по этой причине Pulse Measurement.vi выдает ощибку - потому как в массиве может и не быть импульсов. Вообщем воюю теперь с этим - пытаюсь как то при помощи FGV запоминать предыдущее колличество отсчетов...
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: Подсчет импульсов

Сообщение Vitekkz88 »

jane_wild, я имею ввиду подложки, т.е. сторонние картинки, добавленные при кастомизации контролов, например. Или, например, в качестве фона используется какая-то картинка.
Пусть будет 1200 оборотов, это не должно быть проблемой. Либо частоту обновления меняйте в бОльшую или меньшую сторону(я так понял речь о программном таймере).
Можете скинуть кусок данных, на которых возникает ошибка? Укажите пожалуйста частоту, которая должна быть измерена(для проверки сходимости). Можете несколько срезов данных скинуть, не проблема. Разберемся :-)
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: Подсчет импульсов

Сообщение jane_wild »

Когда мотор не вращается и импульсов нет и вышеуказанный Vi возвращает ошибку. Поэтому сейчас я пытаюсь придумать свой VI, который бы позволял измерять бОльшие периоды между импульсами. Скажем при вращении мотора 60 об/мин мы имеем период в одну секунду между импульсами. И если с DAQ я получаю данные 10 раз в секунду, значит в одной посылке из десяти фронт возрастет а в какой то другой спадет. Вот я и пытаюсь выловить эти изменения и измерить время между ними, что бы потом вычислить частоту вращения
Вложения
Error.vi
(20.03 КБ) 120 скачиваний
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: Подсчет импульсов

Сообщение Vitekkz88 »

jane_wild, а Вам нужно буферезировать данные. Как только накопили определенное количество - отправляете на обработку.
По части ошибки: Вам нужно задать верные пороги для определения периода, ошибка об этом и говорит. Сделаем по классическому способу: найдём максимальное значение сигнала, вычислим полный размах. А далее относительно максимум будем брать некоторый процент для задания верхнего, среднего и низкого порогов. Я взял в соотношениях 80%, 50%, 20%. Однако, может возникать ошибка, когда Вы захватили много шума и всего 2 периода. В таком случае потребуется дополнительная обработка сигнала по выделению полезной части сигнала.Пример и исходник прикрепил. Проверил и на Вашем тестовом примере - всё работает. Достаточно заменить цикл сбора данных на Ваши данные и всё :-)
Вложения
Pict.png
Error (2).vi
(27.64 КБ) 109 скачиваний
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: Подсчет импульсов

Сообщение taras_33 »

Женя а какой датчик используется? Положительные импульсы или отрицательные? Center Drive UA собрались тестировать?
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: Подсчет импульсов

Сообщение jane_wild »

to:Vitekkz88 Спасибо, немного не то что нужно. Нет, оно работать будет, только переделывать структуру проекта нужно.

to:taras_33 Датчик вот этот http://monarchserver.com/Files/pdf/manu ... 4-118R.pdf
Ну да Center Drive. Откуда информация?!
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: Подсчет импульсов

Сообщение Vitekkz88 »

jane_wild писала::Нет, оно работать будет, только переделывать структуру проекта нужно.
Любопытно, а какая сейчас у Вас структура проекта, что проблематично встроить потоки по накоплению данных и по их обработке? :crazy:
jane_wild писала:Когда мотор не вращается и импульсов нет и вышеуказанный Vi возвращает ошибку. Поэтому сейчас я пытаюсь придумать свой VI, который бы позволял измерять бОльшие периоды между импульсами.
Зачем? :think: Если уже существующий .vi настраивается и всё нормально считает. К тому же Pulse Measurments.vi реализован с использованием Си-функции...Что-то вы недоговариваете, jane_wild. Не, мне просто интересно, что там за хитрая обработка такая или сигнал.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: Подсчет импульсов

Сообщение taras_33 »

Любопытно, а какая сейчас у Вас структура проекта,

Если я правильно понимаю, то структура проекта досталать по наследсву от предыдущего программиста... :wink: И если это так, то там наворочено будь здоров и так просто очереди с циклами туда не воткнешь. Вывод либо делать stand alone application. Либо разработать VI, который получив массив данных и частоту дискритизации, сможет в реальном времени вычислять все сам.
Что и желает в итоге получить Женя. Я доброту помню, вот держи.
Краткие пояснения к коду. Поскольку импульсы отрицательные, то вылавливать будем нисходящие фронты. Далее будем вычилять сколько сэмплов между фронтами, а дальше все просто - время -> герцы -> обороты.
Данный VI прогонял как на симуляции ( кстати FGV Hysteresis добален именно для этого случая, для работы от датчика смело можно выкидывать) так и на реальном железе (использовал генератор вместо датчика с мотором). Делал на скорую руку, возможны глюки, но вроде как мной замечено не было.
Теперь мои соображения. На медленных оборотах все чудесно, чем выше обороты, тем меньшее количество сэмплов приходится на один импульс. В итоге высоких скоростях плюс минус один отсчет приводит к заметным скачкам RPM на индикаторе. Вывод: либо нужно максимально увеличивать частоту дискретизации, либо делать скользящее среднее, что бы увеличить стабильность показаний.
Правда для случая с Center Drive это не подойдет. Там нужно ловить максимальные обороты... Если мне не изменяет память на 470-ом обороте скорость вращения должна быть не менее 22000 оборотов в минуту или что то около того. А теперь считаем 22000/60 = 366.6 импульса в секунду. Другими словами 366 Герц или период 2.73 mS Но у нас то цифровое измерение! И точность зависит от дискретизации. При sample rate 10000 выборка = 0.0001 сек. Не может быть 0.00273 - Будет либо 0.0027 либо 0.0028. Отсюда и скачки на индикаторе - для данного случая либо 22222 либо 21428. Поэтому один канал DAQ настраивать на максимальную частоту дискретизации и вперед.... Удачи
Вложения
RPM_Counter.zip
(47.96 КБ) 126 скачиваний
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Re: Подсчет импульсов

Сообщение Vitekkz88 »

taras_33 писал(а):И если это так, то там наворочено будь здоров и так просто очереди с циклами туда не воткнешь. Вывод либо делать stand alone application.Либо разработать VI, который получив массив данных и частоту дискритизации, сможет в реальном времени вычислять все сам.
Можно и не добавлять очереди, обработчик в отдельном цикле сидит и на вход требует массива данных и Fs(можем назвать это отдельным VI). Вопрос: зачем залазить в дом через трубу, если двери и так открыты? Мне просто интересно, может есть какая-то причина брезговать Pulse Measurments.vi? Сэмплы от фронта до фронта считать...ну фииииг знает. Не, это будет работать, просто опять заходим через зад почему-то. Я не стал сравнивать быстродействие работы того или иного алгоритма, но результаты RPM они дают одинаковые(плюс-минус на высоких оборотах). Результаты колбасить начинают - вы правы. В моём случае от постоянного изменяющегося периода в сотых-тысячных долях, в Вашем случае это связано с неверным подсчетом сэмплов между фронтами.
Однако, если мы будем считать RPM опираясь на количество фронтов - то получим самый точный результат.
Знаем Fs, знаем общее количество отчетов, знаем количество фронтов = можем рассчитать RPM. Я проверил, результат годный и статичный даже на грязных сигналах с завалеными фронтами(в рамках разумного).
Разумеется следует повышать частоту дискретизации с увеличением оборотов и не нужно пытаться обмануть теорему Котельникова :rtfm:
И Боже Вас упаси использовать скользящее среднее для этой задачи - это алгоритм грубой подгонки и требует многократного повторения для получения более-менее приемлемого результата. Используйте другие алгоритмы :brows:
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Аватара пользователя
jane_wild
master
master
Сообщения: 459
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 83 раза
Поблагодарили: 15 раз
Контактная информация:

Re: Подсчет импульсов

Сообщение jane_wild »

Это у меня одной так? Или это связано с работой на портале, в связи с переездом.
Error.png
Error.png (7.15 КБ) 5307 просмотров
На форум не зайти.
Я доброту помню, вот держи

Спасибо огромное - то что нужно! Работает как часы, использую два канала частота дискретизации 500кГц. :thank:
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Подсчет импульсов

Сообщение dadreamer »

jane_wild писал(а):Это у меня одной так? Или это связано с работой на портале, в связи с переездом.
Error.png
На форум не зайти.
Это уже давно не переезд, это вот такое: http://labviewportal.org/viewtopic.php?f=141&t=9642
Аватара пользователя
taras_33

Activity
professional
professional
Сообщения: 391
Зарегистрирован: 31 окт 2009, 18:25
Награды: 1
Версия LabVIEW: 2019
Поблагодарили: 13 раз
Контактная информация:

Re: Подсчет импульсов

Сообщение taras_33 »

Мне просто интересно, может есть какая-то причина брезговать Pulse Measurments.vi?
Так никто и не брезгует. Просто это специфика теста. Датчик в состоянии покоя имеет высокий уровень, когда луч попадает на кусочек ленточки - низкий. Поэтому и считать нужно инверсные импульсы. И не только что бы знать RPM, там еще куча всякого, которое требует колличество оборотов и не только - с этим "не только" Женя думаю сама разберется. Установили приблуду в начальное положение, наклеили отражающий стикер и поехали... А Pulse Measurments что меряет? отрицательные или положительные импульсы? Что там закопано в DLL? А здесь все на виду - простые понятные элементарные математические функции. Впрочем каждому свое....

Кстати Jane с 8 Марта поздравляю!!! Жаль что Клара Цеткин до США не добралась - не знают тут такого...
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»