Быстрая обработка данных со скоростного счетчика
Быстрая обработка данных со скоростного счетчика
Приветствую!
Есть внешнее устройство, которое выдает ттл сигнал с частотой до 300кГц и длительностью импульса около 1мкс. Сигнал приходит в незапланированное время в виде пачки импульсов (ардуино работает в процессе ожидания входного сигнала) . Необходимо эти импульсы сосчитать.
Собрал схему на скоростном счетчике и компараторе. При условии >= заданному числу загорается светодиод и полученные данные, после нажатия кнопки на клавиатуре, высвечиваются на дисплее.
Постарался все медленные блоки во время работы скоростного счетчика убрать. Во время счета работает практически только сам счетчик и блок сравнения.
Результаты: на частоте до 10кГц все четко. Заданное число равно посчитанному. В диапазоне от 10 до 100кГц ошибка пересчета до 50 импульсов. Свыше 100 кГц пересчет более 100 импульсов.
Есть способ, как собрать схему для точного подсчета?
Может например использовать вторую ардуино, которая будет работать только на подсчет импульсов?
Использую Ардуино Мега2560
Есть внешнее устройство, которое выдает ттл сигнал с частотой до 300кГц и длительностью импульса около 1мкс. Сигнал приходит в незапланированное время в виде пачки импульсов (ардуино работает в процессе ожидания входного сигнала) . Необходимо эти импульсы сосчитать.
Собрал схему на скоростном счетчике и компараторе. При условии >= заданному числу загорается светодиод и полученные данные, после нажатия кнопки на клавиатуре, высвечиваются на дисплее.
Постарался все медленные блоки во время работы скоростного счетчика убрать. Во время счета работает практически только сам счетчик и блок сравнения.
Результаты: на частоте до 10кГц все четко. Заданное число равно посчитанному. В диапазоне от 10 до 100кГц ошибка пересчета до 50 импульсов. Свыше 100 кГц пересчет более 100 импульсов.
Есть способ, как собрать схему для точного подсчета?
Может например использовать вторую ардуино, которая будет работать только на подсчет импульсов?
Использую Ардуино Мега2560
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Быстрая обработка данных со скоростного счетчика
У Вас насчитывает больше, чем реально приходит?
Проверьте качество земли между устройствами.
Проверьте качество земли между устройствами.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
-
- Полковник
- Сообщения: 4009
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 153 раза
Быстрая обработка данных со скоростного счетчика
Если Вы соберете простой проект "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 кГц устойчивой работы у Вас для этого процессора не плохой результат.
bool _gtv1;
void setup()
{
pinMode(42, OUTPUT);
digitalWrite(42, 0);
}
void loop()
{
//Плата:1
_gtv1 = !(_gtv1);
digitalWrite(42, _gtv1);
}
то на 42 пине можете обнаружить меандры длительностью 4 мкс.
Т.е. на этом простейшем тесте ограничение обработки 250кгц (применение "быстрого" управления пином не сильно ускорит...).
Не стоит ожидать большего от процессора c частотой 16мГц.
10 кГц устойчивой работы у Вас для этого процессора не плохой результат.
-
- Полковник
- Сообщения: 1928
- Зарегистрирован: 28 окт 2015, 22:47
- Откуда: Ленобласть
- Имя: Игорь
- Поблагодарили: 2 раза
Быстрая обработка данных со скоростного счетчика
Да, только скоростной счетчик работает на прерывании и там нет "классического" чтения с пина...ecoins писал(а): 31 янв 2022, 20:16 Т.е. на этом простейшем тесте ограничение обработки 250кгц (применение "быстрого" управления пином не сильно ускорит...).
Не стоит ожидать большего от процессора c частотой 16мГц.
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
- Dryundel
- Полковник
- Сообщения: 2437
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 3 раза
- Поблагодарили: 31 раз
Быстрая обработка данных со скоростного счетчика
По идее должен считать.
Во имя счета, этого можно было и не делать. Скоростной счетчик работает по прерываниям. Все остальное ему особо не мешает. А вот сам счетчик, на больших частотах, может мешать основному циклу.Bupper писал(а): 31 янв 2022, 15:27 Постарался все медленные блоки во время работы скоростного счетчика убрать. Во время счета работает практически только сам счетчик и блок сравнения.
К стати блок сравнения, во время счета, тоже не работает, а работает он только в перерывах между счетом. (Запомним этот момент)
Я не особо вник в алгоритм, однако судя по описанию, что то здесь не так.Bupper писал(а): 31 янв 2022, 15:27 Собрал схему на скоростном счетчике и компараторе. При условии >= заданному числу загорается светодиод и полученные данные, после нажатия кнопки на клавиатуре, высвечиваются на дисплее.
Хотелось бы уточнить:
Вы считаете количество импульсов которое отослало некое устройство?
Есть ли уверенность, что данное устройство отослало именно нужное(точное) количество импульсов в пачке?
Или Вы считаете импульсы которые пришли до включения светодиода? "При условии >= заданному числу загорается светодиод..."
Если речь идет о последнем, то ситуация с пересчетом нормальная, т.к. Пока цикл добежит до компаратора, да еще с учетом того, что прерывания тормозят этот цикл, скоростной счетчик насчитает гораздо больше импульсов, чем то число, которым оперирует компаратор.
Быстрая обработка данных со скоростного счетчика
Да, насчитывает больше. Идет пересчет.Sancho писал(а): 31 янв 2022, 17:27 У Вас насчитывает больше, чем реально приходит?
Проверьте качество земли между устройствами.
Вроде где-то на форуме встречал что до 130кГц скоростной счетчик работает нормально. Вот только как получить вовремя с него данные.ecoins писал(а): 31 янв 2022, 20:16 10 кГц устойчивой работы у Вас для этого процессора не плохой результат.
С устройства в произвольный момент времени начинает поступать сигнал в виде прямоугольных импульсов (с хорошими фронтами) амплитудой 5В с частотой до 300кГц. Задача: подсчитать поступившие импульсы и в заданный момент (когда предварительно заданное число будет равно поступившему числу импульсов) подать сигнал на выходной пин. В моем случае просто зажечь светодиод.Dryundel писал(а): 01 фев 2022, 00:19 Хотелось бы уточнить:
Вы считаете количество импульсов которое отослало некое устройство?
Есть ли уверенность, что данное устройство отослало именно нужное(точное) количество импульсов в пачке?
Или Вы считаете импульсы которые пришли до включения светодиода? "При условии >= заданному числу загорается светодиод..."
У меня в скетче программы при срабатывании компаратора подается сигнал на выходной пин и булева переменная просто останавливает работу счетчика. Затем, когда я подключаю дисплей для просмотра результата, вижу, что есть пересчет. Может сигнал на выходной пин поступает вовремя, а просто запаздывает отключение счета скоростного счетчика?
Вот я и боюсь что с этим ничего не поделаешь.Dryundel писал(а): 01 фев 2022, 00:19 Если речь идет о последнем, то ситуация с пересчетом нормальная, т.к. Пока цикл добежит до компаратора, да еще с учетом того, что прерывания тормозят этот цикл, скоростной счетчик насчитает гораздо больше импульсов, чем то число, которым оперирует компаратор.
Я пока не могу понять на сколько стабильный пересчет. Если он достаточно постоянный, можно заблаговременно отключать счет скоростного счетчика и попадать "примерно" в нужное значение. Допустим пересчет до 10 имп.
Может такой вариант применить: например, одна ардуино работает только к режиме скоростного счетчика и передает значения счета параллельно на выходные пины. Т.е. например 10-12 бит параллельно передаются на вторую ардуино, которая просто опрашивает пины на совпадение бит.
По UART наверно медленнее будет?
-
- Полковник
- Сообщения: 4009
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 153 раза
Быстрая обработка данных со скоростного счетчика
В этом и проблема - ведь любая обработка данных занимает время.Bupper писал(а): 01 фев 2022, 11:19 Вроде где-то на форуме встречал что до 130кГц скоростной счетчик работает нормально. Вот только как получить вовремя с него данные.
Решать такую задачу проблематично на mega 2560 (лучше ESP32)и без логического анализатора (без него с такой задачей как "гадать").
-
- Полковник
- Сообщения: 4009
- Зарегистрирован: 12 фев 2016, 11:40
- Откуда: Шатура
- Имя: Энвер
- Благодарил (а): 137 раз
- Поблагодарили: 153 раза
Быстрая обработка данных со скоростного счетчика
Это все медленно, только через аппаратный SPI.Bupper писал(а): 01 фев 2022, 11:19 Может такой вариант применить: например, одна ардуино работает только к режиме скоростного счетчика и передает значения счета параллельно на выходные пины. Т.е. например 10-12 бит параллельно передаются на вторую ардуино, которая просто опрашивает пины на совпадение бит.
По UART наверно медленнее будет?
-
- Полковник
- Сообщения: 1928
- Зарегистрирован: 28 окт 2015, 22:47
- Откуда: Ленобласть
- Имя: Игорь
- Поблагодарили: 2 раза
Быстрая обработка данных со скоростного счетчика
Если число с которым сравнивают показания счетчика постоянно, можно ручками дописать в функцию обработчика прерывания сравнение. В IDE перед загрузкой. Но упадет верхний предел частоты.Bupper писал(а): 01 фев 2022, 11:19 Я пока не могу понять на сколько стабильный пересчет. Если он достаточно постоянный, можно заблаговременно отключать счет скоростного счетчика и попадать "примерно" в нужное значение. Допустим пересчет до 10 имп.
Может такой вариант применить: например, одна ардуино работает только к режиме скоростного счетчика и передает значения счета параллельно на выходные пины. Т.е. например 10-12 бит параллельно передаются на вторую ардуино, которая просто опрашивает пины на совпадение бит.
По UART наверно медленнее будет?
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.
Быстрая обработка данных со скоростного счетчика
Попробуйте закинуть сравнение прямо в функцию:
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);
}
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 раз
Быстрая обработка данных со скоростного счетчика
Ну вот с этого и надо было начинать. Как я и предполагал.Bupper писал(а): 01 фев 2022, 11:19 Задача: подсчитать поступившие импульсы и в заданный момент (когда предварительно заданное число будет равно поступившему числу импульсов) подать сигнал на выходной пин.
Это зависит от задачи выполняемой по прерыванию. С простым счётчиком ардуина 16мГц, с 500 кГц должна справляться.
Ну почему же, можно, но не штатными средствами. Вечерком постараюсь накидать блок под вашу задачу.
Быстрая обработка данных со скоростного счетчика
Да, согласен. Там тактовая частота 250Мгц.
Надо про это почитать, я не спец конечно
Ingwar писал(а): 01 фев 2022, 13:03 можно ручками дописать в функцию обработчика прерывания сравнение
Эх, если бы я все это умел. Я в СИ никакой. Поэтому и занялся FLPROG. Число с которым сравниваю всегда разное, задается каждый раз вручную перед началом счета.
Хотя насчет кода я вприницпе понял о чем вы, попробую подправить скетч. XXX - это мое значение только цифрами?
Спасибо! Очень надеюсь, что справиться.Dryundel писал(а): 01 фев 2022, 13:06 Ну почему же, можно, но не штатными средствами. Вечерком постараюсь накидать блок под вашу задачу.
Быстрая обработка данных со скоростного счетчика
Да. Можно использовать переменную. Ну и счетчик обнулить не забыть...
...
if (_SCT_1_CPOP >= XXX) {
Led_On (); // если зажигать ЛЕД. Можно еще добавить detachInterrupt (digitalPinToInterrupt (PIN No.))
_SCT_1_CPOP = 0;
}
...
Быстрая обработка данных со скоростного счетчика
[ref]AndrejK[/ref], код вставил. Работает. Диод загорается. Но как узнать сколько насчитал, не понятно. Это же надо параллельно с зажиганием диода останавливать счетчик и выводить данные на экран. А это я могу только через FLPROG
Быстрая обработка данных со скоростного счетчика
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; // или когда надо
}
{
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; // или когда надо
}
Быстрая обработка данных со скоростного счетчика
По первому варианту получилось так: счетчик досчитывает до 800 (ХХХ), диод загорается, счет сбрасывается и по новой, на большой частоте. Вообщем светомузыка). Не определить, есть пересчет или нет.
А второй вариант я боюсь не осилю.
if (!(_gtv18)) и _gtv18 = 1 это одно и тоже?
А второй вариант я боюсь не осилю.
if (!(_gtv18)) и _gtv18 = 1 это одно и тоже?
Быстрая обработка данных со скоростного счетчика
По коду, пока _gtv18 == 0, счетчик считает, а пока равно единице, не считает, но в прерывание заходит. Т.е. когда досчитал до ХХХ, _gtv18 делаем равной единице, а когда опять надо считать, где-то в программе меняем на ноль.
Отправлено спустя 2 минуты 49 секунд:
if (!(_gtv18)) - не равно единице: _gtv18 != 1. Равно единице (сравнение) _gtv18 == 1, присвоение _gtv18 = 1.
-
- Лейтенант
- Сообщения: 450
- Зарегистрирован: 26 фев 2018, 21:27
- Откуда: Haifa
- Имя: Alex
- Благодарил (а): 2 раза
- Поблагодарили: 5 раз
Быстрая обработка данных со скоростного счетчика
[ref]Bupper[/ref], Сделайте так,что бы во время счета работала только плата скоростного счетчика,а остальные платы не выполнялись.
Как это сделать,это уже другой вопрос.
У меня была задача была пропустить на выход заданное число импульсов (от 1- 999)длительностью 1 мкс и паузой 4 мкс.
Использовал esp32 на частоте 240 MHz,проверял логическим анализатором,все отрабатывалось четко.
Если интересно,кину в личку.
Использовал обыкновенный счетчик ,не скоростной.
Как это сделать,это уже другой вопрос.
У меня была задача была пропустить на выход заданное число импульсов (от 1- 999)длительностью 1 мкс и паузой 4 мкс.
Использовал esp32 на частоте 240 MHz,проверял логическим анализатором,все отрабатывалось четко.
Если интересно,кину в личку.
Использовал обыкновенный счетчик ,не скоростной.
- Sancho
- Полковник
- Сообщения: 4066
- Зарегистрирован: 25 дек 2015, 17:32
- Откуда: Ярославль.
- Имя: Александр
- Поблагодарили: 5 раз
- Контактная информация:
Быстрая обработка данных со скоростного счетчика
Ingwar писал(а): 01 фев 2022, 13:03 Если число с которым сравнивают показания счетчика постоянно, можно ручками дописать в функцию обработчика прерывания сравнение. В IDE перед загрузкой. Но упадет верхний предел частоты.
Берём аппаратный счетчик, при подготовке заносим нужное число в необходимое место, считаем по внешнему входу напрямую в счётчик.Dryundel писал(а): 01 фев 2022, 13:06 Это зависит от задачи выполняемой по прерываний. С простым счётчиком ардуина 16мГц, с 500 кГц должна справляться.
При сработке прерывания переполнения в обработчике делаем что нужно.
Вариантов много. Важно до конца понимать задачу, а ТС не всё озвучивает.
До 8 мгц.
мой ник в нете и почте omelchuk890, если что. запомните на всякий. многие знают номер тлф.
- Dryundel
- Полковник
- Сообщения: 2437
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 3 раза
- Поблагодарили: 31 раз
Быстрая обработка данных со скоростного счетчика
Скрывает наверное. На Нобеля поди замахнулся.Sancho писал(а): 01 фев 2022, 22:11 Вариантов много. Важно до конца понимать задачу, а ТС не всё озвучивает.

Ладно, как и обещал в посте #11, накидал блок. [ref]Bupper[/ref], тестируйте.
Внимание! Блок в этом проекте не корректен. Исправленный блок смотри в следующих постах.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя