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

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

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

Сообщение Bupper »

Приветствую!
Есть внешнее устройство, которое выдает ттл сигнал с частотой до 300кГц и длительностью импульса около 1мкс. Сигнал приходит в незапланированное время в виде пачки импульсов (ардуино работает в процессе ожидания входного сигнала) . Необходимо эти импульсы сосчитать.
Собрал схему на скоростном счетчике и компараторе. При условии >= заданному числу загорается светодиод и полученные данные, после нажатия кнопки на клавиатуре, высвечиваются на дисплее.
Постарался все медленные блоки во время работы скоростного счетчика убрать. Во время счета работает практически только сам счетчик и блок сравнения.
Результаты: на частоте до 10кГц все четко. Заданное число равно посчитанному. В диапазоне от 10 до 100кГц ошибка пересчета до 50 импульсов. Свыше 100 кГц пересчет более 100 импульсов.
Есть способ, как собрать схему для точного подсчета?
Может например использовать вторую ардуино, которая будет работать только на подсчет импульсов?
Использую Ардуино Мега2560
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

У Вас насчитывает больше, чем реально приходит?
Проверьте качество земли между устройствами.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
ecoins
Полковник
Сообщения: 4009
Зарегистрирован: 12 фев 2016, 11:40
Откуда: Шатура
Имя: Энвер
Благодарил (а): 137 раз
Поблагодарили: 153 раза

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

Сообщение ecoins »

Если Вы соберете простой проект "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
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

ecoins писал(а): 31 янв 2022, 20:16 Т.е. на этом простейшем тесте ограничение обработки 250кгц (применение "быстрого" управления пином не сильно ускорит...).
Не стоит ожидать большего от процессора c частотой 16мГц.
Да, только скоростной счетчик работает на прерывании и там нет "классического" чтения с пина...
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2437
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 31 раз

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

Сообщение Dryundel »

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

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

Если речь идет о последнем, то ситуация с пересчетом нормальная, т.к. Пока цикл добежит до компаратора, да еще с учетом того, что прерывания тормозят этот цикл, скоростной счетчик насчитает гораздо больше импульсов, чем то число, которым оперирует компаратор.
Bupper
Рядовой
Сообщения: 25
Зарегистрирован: 16 сен 2021, 13:47
Имя: Алексей

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

Сообщение Bupper »

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

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

Сообщение ecoins »

Bupper писал(а): 01 фев 2022, 11:19 Вроде где-то на форуме встречал что до 130кГц скоростной счетчик работает нормально. Вот только как получить вовремя с него данные.
В этом и проблема - ведь любая обработка данных занимает время.
Решать такую задачу проблематично на mega 2560 (лучше ESP32)и без логического анализатора (без него с такой задачей как "гадать").
ecoins
Полковник
Сообщения: 4009
Зарегистрирован: 12 фев 2016, 11:40
Откуда: Шатура
Имя: Энвер
Благодарил (а): 137 раз
Поблагодарили: 153 раза

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

Сообщение ecoins »

Bupper писал(а): 01 фев 2022, 11:19 Может такой вариант применить: например, одна ардуино работает только к режиме скоростного счетчика и передает значения счета параллельно на выходные пины. Т.е. например 10-12 бит параллельно передаются на вторую ардуино, которая просто опрашивает пины на совпадение бит.
По UART наверно медленнее будет?
Это все медленно, только через аппаратный SPI.
Ingwar
Полковник
Сообщения: 1928
Зарегистрирован: 28 окт 2015, 22:47
Откуда: Ленобласть
Имя: Игорь
Поблагодарили: 2 раза

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

Сообщение Ingwar »

Bupper писал(а): 01 фев 2022, 11:19 Я пока не могу понять на сколько стабильный пересчет. Если он достаточно постоянный, можно заблаговременно отключать счет скоростного счетчика и попадать "примерно" в нужное значение. Допустим пересчет до 10 имп.
Может такой вариант применить: например, одна ардуино работает только к режиме скоростного счетчика и передает значения счета параллельно на выходные пины. Т.е. например 10-12 бит параллельно передаются на вторую ардуино, которая просто опрашивает пины на совпадение бит.
По UART наверно медленнее будет?
Если число с которым сравнивают показания счетчика постоянно, можно ручками дописать в функцию обработчика прерывания сравнение. В IDE перед загрузкой. Но упадет верхний предел частоты.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
AndrejK
Сержант
Сообщения: 120
Зарегистрирован: 20 фев 2020, 13:16
Откуда: Вильнюс
Имя: Андрей

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

Сообщение AndrejK »

Попробуйте закинуть сравнение прямо в функцию:
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
Полковник
Сообщения: 2437
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 31 раз

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

Сообщение Dryundel »

Bupper писал(а): 01 фев 2022, 11:19 Задача: подсчитать поступившие импульсы и в заданный момент (когда предварительно заданное число будет равно поступившему числу импульсов) подать сигнал на выходной пин.
Ну вот с этого и надо было начинать. Как я и предполагал.
Bupper писал(а): 01 фев 2022, 11:19 Вроде где-то на форуме встречал что до 130кГц
Это зависит от задачи выполняемой по прерыванию. С простым счётчиком ардуина 16мГц, с 500 кГц должна справляться.
Bupper писал(а): 01 фев 2022, 11:19 Вот я и боюсь что с этим ничего не поделаешь.
Ну почему же, можно, но не штатными средствами. Вечерком постараюсь накидать блок под вашу задачу.
Bupper
Рядовой
Сообщения: 25
Зарегистрирован: 16 сен 2021, 13:47
Имя: Алексей

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

Сообщение Bupper »

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

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

Сообщение AndrejK »

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

...
if (_SCT_1_CPOP >= XXX) {
Led_On (); // если зажигать ЛЕД. Можно еще добавить detachInterrupt (digitalPinToInterrupt (PIN No.))
_SCT_1_CPOP = 0;
}
...
Bupper
Рядовой
Сообщения: 25
Зарегистрирован: 16 сен 2021, 13:47
Имя: Алексей

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

Сообщение Bupper »

[ref]AndrejK[/ref], код вставил. Работает. Диод загорается. Но как узнать сколько насчитал, не понятно. Это же надо параллельно с зажиганием диода останавливать счетчик и выводить данные на экран. А это я могу только через FLPROG
AndrejK
Сержант
Сообщения: 120
Зарегистрирован: 20 фев 2020, 13:16
Откуда: Вильнюс
Имя: Андрей

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

Сообщение AndrejK »

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 сен 2021, 13:47
Имя: Алексей

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

Сообщение Bupper »

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

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

Сообщение AndrejK »

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

Отправлено спустя 2 минуты 49 секунд:
Bupper писал(а): 01 фев 2022, 15:00 if (!(_gtv18)) и _gtv18 = 1 это одно и тоже?
if (!(_gtv18)) - не равно единице: _gtv18 != 1. Равно единице (сравнение) _gtv18 == 1, присвоение _gtv18 = 1.
Brand2
Лейтенант
Сообщения: 450
Зарегистрирован: 26 фев 2018, 21:27
Откуда: Haifa
Имя: Alex
Благодарил (а): 2 раза
Поблагодарили: 5 раз

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

Сообщение Brand2 »

[ref]Bupper[/ref], Сделайте так,что бы во время счета работала только плата скоростного счетчика,а остальные платы не выполнялись.
Как это сделать,это уже другой вопрос.
У меня была задача была пропустить на выход заданное число импульсов (от 1- 999)длительностью 1 мкс и паузой 4 мкс.
Использовал esp32 на частоте 240 MHz,проверял логическим анализатором,все отрабатывалось четко.
Если интересно,кину в личку.
Использовал обыкновенный счетчик ,не скоростной.
Аватара пользователя
Sancho
Полковник
Сообщения: 4066
Зарегистрирован: 25 дек 2015, 17:32
Откуда: Ярославль.
Имя: Александр
Поблагодарили: 5 раз
Контактная информация:

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

Сообщение Sancho »

Ingwar писал(а): 01 фев 2022, 13:03 Если число с которым сравнивают показания счетчика постоянно, можно ручками дописать в функцию обработчика прерывания сравнение. В IDE перед загрузкой. Но упадет верхний предел частоты.
Dryundel писал(а): 01 фев 2022, 13:06 Это зависит от задачи выполняемой по прерываний. С простым счётчиком ардуина 16мГц, с 500 кГц должна справляться.
Берём аппаратный счетчик, при подготовке заносим нужное число в необходимое место, считаем по внешнему входу напрямую в счётчик.
При сработке прерывания переполнения в обработчике делаем что нужно.
Вариантов много. Важно до конца понимать задачу, а ТС не всё озвучивает.
До 8 мгц.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2437
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 31 раз

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

Сообщение Dryundel »

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

Ладно, как и обещал в посте #11, накидал блок. [ref]Bupper[/ref], тестируйте.
Внимание! Блок в этом проекте не корректен. Исправленный блок смотри в следующих постах.
Test.jpg
Тест.flp
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя