Быстрая обработка данных со скоростного счетчика

Как организовать быструю обработку результата счета скоростного счетчика

Вопросы от новичков
Bupper
Рядовой
Сообщения: 25
Зарегистрирован: 16.09.2021{, 13:47}
Репутация: 0
Имя: Алексей

Быстрая обработка данных со скоростного счетчика

#1

Сообщение Bupper » 31.01.2022{, 15:27}

Приветствую!
Есть внешнее устройство, которое выдает ттл сигнал с частотой до 300кГц и длительностью импульса около 1мкс. Сигнал приходит в незапланированное время в виде пачки импульсов (ардуино работает в процессе ожидания входного сигнала) . Необходимо эти импульсы сосчитать.
Собрал схему на скоростном счетчике и компараторе. При условии >= заданному числу загорается светодиод и полученные данные, после нажатия кнопки на клавиатуре, высвечиваются на дисплее.
Постарался все медленные блоки во время работы скоростного счетчика убрать. Во время счета работает практически только сам счетчик и блок сравнения.
Результаты: на частоте до 10кГц все четко. Заданное число равно посчитанному. В диапазоне от 10 до 100кГц ошибка пересчета до 50 импульсов. Свыше 100 кГц пересчет более 100 импульсов.
Есть способ, как собрать схему для точного подсчета?
Может например использовать вторую ардуино, которая будет работать только на подсчет импульсов?
Использую Ардуино Мега2560
Вложения
test3v1.flp
(958.61 КБ) 46 скачиваний

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Быстрая обработка данных со скоростного счетчика

#2

Сообщение Sancho » 31.01.2022{, 17:27}

У Вас насчитывает больше, чем реально приходит?
Проверьте качество земли между устройствами.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

ecoins
Полковник
Сообщения: 2941
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 453
Откуда: Шатура
Имя: Энвер

Быстрая обработка данных со скоростного счетчика

#3

Сообщение ecoins » 31.01.2022{, 20:16}

Если Вы соберете простой проект "blink"
bool _gtv1;
void setup()
{
pinMode(42, OUTPUT);
digitalWrite(42, 0);
}
void loop()
{
//Плата:1
_gtv1 = !(_gtv1);
digitalWrite(42, _gtv1);
}
то на 42 пине можете обнаружить меандры длительностью 4 мкс.
Т.е. на этом простейшем тесте ограничение обработки 250кгц (применение "быстрого" управления пином не сильно ускорит...).
Не стоит ожидать большего от процессора c частотой 16мГц.
10 кГц устойчивой работы у Вас для этого процессора не плохой результат.

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Быстрая обработка данных со скоростного счетчика

#4

Сообщение Ingwar » 31.01.2022{, 22:49}

ecoins писал(а):
31.01.2022{, 20:16}
Т.е. на этом простейшем тесте ограничение обработки 250кгц (применение "быстрого" управления пином не сильно ускорит...).
Не стоит ожидать большего от процессора c частотой 16мГц.
Да, только скоростной счетчик работает на прерывании и там нет "классического" чтения с пина...
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Быстрая обработка данных со скоростного счетчика

#5

Сообщение Dryundel » 01.02.2022{, 00:19}

Bupper писал(а):
31.01.2022{, 15:27}
сигнал с частотой до 300кГц и длительностью импульса около 1мкс
По идее должен считать.
Bupper писал(а):
31.01.2022{, 15:27}
Постарался все медленные блоки во время работы скоростного счетчика убрать. Во время счета работает практически только сам счетчик и блок сравнения.
Во имя счета, этого можно было и не делать. Скоростной счетчик работает по прерываниям. Все остальное ему особо не мешает. А вот сам счетчик, на больших частотах, может мешать основному циклу.
К стати блок сравнения, во время счета, тоже не работает, а работает он только в перерывах между счетом. (Запомним этот момент)
Bupper писал(а):
31.01.2022{, 15:27}
Собрал схему на скоростном счетчике и компараторе. При условии >= заданному числу загорается светодиод и полученные данные, после нажатия кнопки на клавиатуре, высвечиваются на дисплее.
Я не особо вник в алгоритм, однако судя по описанию, что то здесь не так.

Хотелось бы уточнить:
Вы считаете количество импульсов которое отослало некое устройство?
Есть ли уверенность, что данное устройство отослало именно нужное(точное) количество импульсов в пачке?
Или Вы считаете импульсы которые пришли до включения светодиода? "При условии >= заданному числу загорается светодиод..."

Если речь идет о последнем, то ситуация с пересчетом нормальная, т.к. Пока цикл добежит до компаратора, да еще с учетом того, что прерывания тормозят этот цикл, скоростной счетчик насчитает гораздо больше импульсов, чем то число, которым оперирует компаратор.

Bupper
Рядовой
Сообщения: 25
Зарегистрирован: 16.09.2021{, 13:47}
Репутация: 0
Имя: Алексей

Быстрая обработка данных со скоростного счетчика

#6

Сообщение Bupper » 01.02.2022{, 11:19}

Sancho писал(а):
31.01.2022{, 17:27}
У Вас насчитывает больше, чем реально приходит?
Проверьте качество земли между устройствами.
Да, насчитывает больше. Идет пересчет.
ecoins писал(а):
31.01.2022{, 20:16}
10 кГц устойчивой работы у Вас для этого процессора не плохой результат.
Вроде где-то на форуме встречал что до 130кГц скоростной счетчик работает нормально. Вот только как получить вовремя с него данные.
Dryundel писал(а):
01.02.2022{, 00:19}
Хотелось бы уточнить:
Вы считаете количество импульсов которое отослало некое устройство?
Есть ли уверенность, что данное устройство отослало именно нужное(точное) количество импульсов в пачке?
Или Вы считаете импульсы которые пришли до включения светодиода? "При условии >= заданному числу загорается светодиод..."
С устройства в произвольный момент времени начинает поступать сигнал в виде прямоугольных импульсов (с хорошими фронтами) амплитудой 5В с частотой до 300кГц. Задача: подсчитать поступившие импульсы и в заданный момент (когда предварительно заданное число будет равно поступившему числу импульсов) подать сигнал на выходной пин. В моем случае просто зажечь светодиод.
У меня в скетче программы при срабатывании компаратора подается сигнал на выходной пин и булева переменная просто останавливает работу счетчика. Затем, когда я подключаю дисплей для просмотра результата, вижу, что есть пересчет. Может сигнал на выходной пин поступает вовремя, а просто запаздывает отключение счета скоростного счетчика?
Dryundel писал(а):
01.02.2022{, 00:19}
Если речь идет о последнем, то ситуация с пересчетом нормальная, т.к. Пока цикл добежит до компаратора, да еще с учетом того, что прерывания тормозят этот цикл, скоростной счетчик насчитает гораздо больше импульсов, чем то число, которым оперирует компаратор.
Вот я и боюсь что с этим ничего не поделаешь.
Я пока не могу понять на сколько стабильный пересчет. Если он достаточно постоянный, можно заблаговременно отключать счет скоростного счетчика и попадать "примерно" в нужное значение. Допустим пересчет до 10 имп.
Может такой вариант применить: например, одна ардуино работает только к режиме скоростного счетчика и передает значения счета параллельно на выходные пины. Т.е. например 10-12 бит параллельно передаются на вторую ардуино, которая просто опрашивает пины на совпадение бит.
По UART наверно медленнее будет?

ecoins
Полковник
Сообщения: 2941
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 453
Откуда: Шатура
Имя: Энвер

Быстрая обработка данных со скоростного счетчика

#7

Сообщение ecoins » 01.02.2022{, 12:30}

Bupper писал(а):
01.02.2022{, 11:19}
Вроде где-то на форуме встречал что до 130кГц скоростной счетчик работает нормально. Вот только как получить вовремя с него данные.
В этом и проблема - ведь любая обработка данных занимает время.
Решать такую задачу проблематично на mega 2560 (лучше ESP32)и без логического анализатора (без него с такой задачей как "гадать").

ecoins
Полковник
Сообщения: 2941
Зарегистрирован: 12.02.2016{, 11:40}
Репутация: 453
Откуда: Шатура
Имя: Энвер

Быстрая обработка данных со скоростного счетчика

#8

Сообщение ecoins » 01.02.2022{, 12:31}

Bupper писал(а):
01.02.2022{, 11:19}
Может такой вариант применить: например, одна ардуино работает только к режиме скоростного счетчика и передает значения счета параллельно на выходные пины. Т.е. например 10-12 бит параллельно передаются на вторую ардуино, которая просто опрашивает пины на совпадение бит.
По UART наверно медленнее будет?
Это все медленно, только через аппаратный SPI.

Ingwar
Полковник
Сообщения: 1929
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 223
Откуда: Ленобласть
Имя: Игорь

Быстрая обработка данных со скоростного счетчика

#9

Сообщение Ingwar » 01.02.2022{, 13:03}

Bupper писал(а):
01.02.2022{, 11:19}
Я пока не могу понять на сколько стабильный пересчет. Если он достаточно постоянный, можно заблаговременно отключать счет скоростного счетчика и попадать "примерно" в нужное значение. Допустим пересчет до 10 имп.
Может такой вариант применить: например, одна ардуино работает только к режиме скоростного счетчика и передает значения счета параллельно на выходные пины. Т.е. например 10-12 бит параллельно передаются на вторую ардуино, которая просто опрашивает пины на совпадение бит.
По UART наверно медленнее будет?
Если число с которым сравнивают показания счетчика постоянно, можно ручками дописать в функцию обработчика прерывания сравнение. В IDE перед загрузкой. Но упадет верхний предел частоты.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

AndrejK
Сержант
Сообщения: 119
Зарегистрирован: 20.02.2020{, 13:16}
Репутация: 14
Откуда: Вильнюс
Имя: Андрей

Быстрая обработка данных со скоростного счетчика

#10

Сообщение AndrejK » 01.02.2022{, 13:04}

Попробуйте закинуть сравнение прямо в функцию:
void _SCT_1positiveCoutFunction()
{
if (!(_gtv18))
{
_SCT_1_CPOP = _SCT_1_CPOP +1;
if (_SCT_1_CPOP >= XXX) Led_On (); // если зажигать ЛЕД. Можно еще добавить detachInterrupt (digitalPinToInterrupt (PIN No.));
}
}

// если зажигать ЛЕД
void Led_On () {
digitalWrite (PIN, HIGHT);
}

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Быстрая обработка данных со скоростного счетчика

#11

Сообщение Dryundel » 01.02.2022{, 13:06}

Bupper писал(а):
01.02.2022{, 11:19}
Задача: подсчитать поступившие импульсы и в заданный момент (когда предварительно заданное число будет равно поступившему числу импульсов) подать сигнал на выходной пин.
Ну вот с этого и надо было начинать. Как я и предполагал.
Bupper писал(а):
01.02.2022{, 11:19}
Вроде где-то на форуме встречал что до 130кГц
Это зависит от задачи выполняемой по прерыванию. С простым счётчиком ардуина 16мГц, с 500 кГц должна справляться.
Bupper писал(а):
01.02.2022{, 11:19}
Вот я и боюсь что с этим ничего не поделаешь.
Ну почему же, можно, но не штатными средствами. Вечерком постараюсь накидать блок под вашу задачу.

Bupper
Рядовой
Сообщения: 25
Зарегистрирован: 16.09.2021{, 13:47}
Репутация: 0
Имя: Алексей

Быстрая обработка данных со скоростного счетчика

#12

Сообщение Bupper » 01.02.2022{, 13:55}

ecoins писал(а):
01.02.2022{, 12:30}
лучше ESP32
Да, согласен. Там тактовая частота 250Мгц.
ecoins писал(а):
01.02.2022{, 12:31}
аппаратный SPI
Надо про это почитать, я не спец конечно
Ingwar писал(а):
01.02.2022{, 13:03}
можно ручками дописать в функцию обработчика прерывания сравнение
AndrejK писал(а):
01.02.2022{, 13:04}
Попробуйте закинуть сравнение прямо в функцию:
Эх, если бы я все это умел. Я в СИ никакой. Поэтому и занялся FLPROG. Число с которым сравниваю всегда разное, задается каждый раз вручную перед началом счета.
Хотя насчет кода я вприницпе понял о чем вы, попробую подправить скетч. XXX - это мое значение только цифрами?
Dryundel писал(а):
01.02.2022{, 13:06}
Ну почему же, можно, но не штатными средствами. Вечерком постараюсь накидать блок под вашу задачу.
Спасибо! Очень надеюсь, что справиться.

AndrejK
Сержант
Сообщения: 119
Зарегистрирован: 20.02.2020{, 13:16}
Репутация: 14
Откуда: Вильнюс
Имя: Андрей

Быстрая обработка данных со скоростного счетчика

#13

Сообщение AndrejK » 01.02.2022{, 14:25}

Bupper писал(а):
01.02.2022{, 13:55}
XXX - это мое значение только цифрами?
Да. Можно использовать переменную. Ну и счетчик обнулить не забыть...

...
if (_SCT_1_CPOP >= XXX) {
Led_On (); // если зажигать ЛЕД. Можно еще добавить detachInterrupt (digitalPinToInterrupt (PIN No.))
_SCT_1_CPOP = 0;
}
...

Bupper
Рядовой
Сообщения: 25
Зарегистрирован: 16.09.2021{, 13:47}
Репутация: 0
Имя: Алексей

Быстрая обработка данных со скоростного счетчика

#14

Сообщение Bupper » 01.02.2022{, 14:32}

AndrejK, код вставил. Работает. Диод загорается. Но как узнать сколько насчитал, не понятно. Это же надо параллельно с зажиганием диода останавливать счетчик и выводить данные на экран. А это я могу только через FLPROG

AndrejK
Сержант
Сообщения: 119
Зарегистрирован: 20.02.2020{, 13:16}
Репутация: 14
Откуда: Вильнюс
Имя: Андрей

Быстрая обработка данных со скоростного счетчика

#15

Сообщение AndrejK » 01.02.2022{, 14:45}

void _SCT_1positiveCoutFunction()
{
if (!(_gtv18))
{
_SCT_1_CPOP = _SCT_1_CPOP +1;
if (_SCT_1_CPOP >= XXX) {
Led_On ();
_SCT_1_CPOP = 0;
}
}
}

Как то так, ... или использовать в этой функции условие _gtv18...

void Led_On () {
// _gtv18 = 1;
detachInterrupt (digitalPinToInterrupt (18));
digitalWrite (PIN, HIGHT);
Serial.println (_SCT_1_CPOP);
attachInterrupt (digitalPinToInterrupt (18), _SCT_1positiveCoutFunction, RISING);
// и опять _gtv18 = 0; // или когда надо
}

Bupper
Рядовой
Сообщения: 25
Зарегистрирован: 16.09.2021{, 13:47}
Репутация: 0
Имя: Алексей

Быстрая обработка данных со скоростного счетчика

#16

Сообщение Bupper » 01.02.2022{, 15:00}

По первому варианту получилось так: счетчик досчитывает до 800 (ХХХ), диод загорается, счет сбрасывается и по новой, на большой частоте. Вообщем светомузыка). Не определить, есть пересчет или нет.
А второй вариант я боюсь не осилю.
if (!(_gtv18)) и _gtv18 = 1 это одно и тоже?

AndrejK
Сержант
Сообщения: 119
Зарегистрирован: 20.02.2020{, 13:16}
Репутация: 14
Откуда: Вильнюс
Имя: Андрей

Быстрая обработка данных со скоростного счетчика

#17

Сообщение AndrejK » 01.02.2022{, 15:18}

Bupper писал(а):
01.02.2022{, 15:00}
if (!(_gtv18)) и _gtv18 = 1 это одно и тоже?
По коду, пока _gtv18 == 0, счетчик считает, а пока равно единице, не считает, но в прерывание заходит. Т.е. когда досчитал до ХХХ, _gtv18 делаем равной единице, а когда опять надо считать, где-то в программе меняем на ноль.

Отправлено спустя 2 минуты 49 секунд:
Bupper писал(а):
01.02.2022{, 15:00}
if (!(_gtv18)) и _gtv18 = 1 это одно и тоже?
if (!(_gtv18)) - не равно единице: _gtv18 != 1. Равно единице (сравнение) _gtv18 == 1, присвоение _gtv18 = 1.

Brand2
Лейтенант
Сообщения: 414
Зарегистрирован: 26.02.2018{, 21:27}
Репутация: 42
Откуда: Haifa
Имя: Alex

Быстрая обработка данных со скоростного счетчика

#18

Сообщение Brand2 » 01.02.2022{, 15:23}

Bupper, Сделайте так,что бы во время счета работала только плата скоростного счетчика,а остальные платы не выполнялись.
Как это сделать,это уже другой вопрос.
У меня была задача была пропустить на выход заданное число импульсов (от 1- 999)длительностью 1 мкс и паузой 4 мкс.
Использовал esp32 на частоте 240 MHz,проверял логическим анализатором,все отрабатывалось четко.
Если интересно,кину в личку.
Использовал обыкновенный счетчик ,не скоростной.

Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 590
Откуда: Ярославль.
Имя: Александр
Контактная информация:

Быстрая обработка данных со скоростного счетчика

#19

Сообщение Sancho » 01.02.2022{, 22:11}

Ingwar писал(а):
01.02.2022{, 13:03}
Если число с которым сравнивают показания счетчика постоянно, можно ручками дописать в функцию обработчика прерывания сравнение. В IDE перед загрузкой. Но упадет верхний предел частоты.
Dryundel писал(а):
01.02.2022{, 13:06}
Это зависит от задачи выполняемой по прерываний. С простым счётчиком ардуина 16мГц, с 500 кГц должна справляться.
Берём аппаратный счетчик, при подготовке заносим нужное число в необходимое место, считаем по внешнему входу напрямую в счётчик.
При сработке прерывания переполнения в обработчике делаем что нужно.
Вариантов много. Важно до конца понимать задачу, а ТС не всё озвучивает.
До 8 мгц.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.

Аватара пользователя
Dryundel
Полковник
Сообщения: 2401
Зарегистрирован: 22.05.2017{, 23:15}
Репутация: 783
Откуда: Ярославль
Имя: Андрей
Контактная информация:

Быстрая обработка данных со скоростного счетчика

#20

Сообщение Dryundel » 01.02.2022{, 23:18}

Sancho писал(а):
01.02.2022{, 22:11}
Вариантов много. Важно до конца понимать задачу, а ТС не всё озвучивает.
Скрывает наверное. На Нобеля поди замахнулся. :)

Ладно, как и обещал в посте #11, накидал блок. Bupper, тестируйте.
Внимание! Блок в этом проекте не корректен. Исправленный блок смотри в следующих постах.
Test.jpg
Test.jpg (15.35 КБ) 768 просмотров
Тест.flp
(440.96 КБ) 38 скачиваний

Ответить

Вернуться в «Начинающим»