Страница 1 из 3
Быстрая обработка данных со скоростного счетчика
Добавлено: 31 янв 2022, 15:27
Bupper
Приветствую!
Есть внешнее устройство, которое выдает ттл сигнал с частотой до 300кГц и длительностью импульса около 1мкс. Сигнал приходит в незапланированное время в виде пачки импульсов (ардуино работает в процессе ожидания входного сигнала) . Необходимо эти импульсы сосчитать.
Собрал схему на скоростном счетчике и компараторе. При условии >= заданному числу загорается светодиод и полученные данные, после нажатия кнопки на клавиатуре, высвечиваются на дисплее.
Постарался все медленные блоки во время работы скоростного счетчика убрать. Во время счета работает практически только сам счетчик и блок сравнения.
Результаты: на частоте до 10кГц все четко. Заданное число равно посчитанному. В диапазоне от 10 до 100кГц ошибка пересчета до 50 импульсов. Свыше 100 кГц пересчет более 100 импульсов.
Есть способ, как собрать схему для точного подсчета?
Может например использовать вторую ардуино, которая будет работать только на подсчет импульсов?
Использую Ардуино Мега2560
Быстрая обработка данных со скоростного счетчика
Добавлено: 31 янв 2022, 17:27
Sancho
У Вас насчитывает больше, чем реально приходит?
Проверьте качество земли между устройствами.
Быстрая обработка данных со скоростного счетчика
Добавлено: 31 янв 2022, 20:16
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 кГц устойчивой работы у Вас для этого процессора не плохой результат.
Быстрая обработка данных со скоростного счетчика
Добавлено: 31 янв 2022, 22:49
Ingwar
ecoins писал(а): 31 янв 2022, 20:16
Т.е. на этом простейшем тесте ограничение обработки 250кгц (применение "быстрого" управления пином не сильно ускорит...).
Не стоит ожидать большего от процессора c частотой 16мГц.
Да, только скоростной счетчик работает на прерывании и там нет "классического" чтения с пина...
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 00:19
Dryundel
Bupper писал(а): 31 янв 2022, 15:27
сигнал с частотой до 300кГц и длительностью импульса около 1мкс
По идее должен считать.
Bupper писал(а): 31 янв 2022, 15:27
Постарался все медленные блоки во время работы скоростного счетчика убрать. Во время счета работает практически только сам счетчик и блок сравнения.
Во имя счета, этого можно было и не делать. Скоростной счетчик работает по прерываниям. Все остальное ему особо не мешает. А вот сам счетчик, на больших частотах, может мешать основному циклу.
К стати блок сравнения, во время счета, тоже не работает, а работает он только в перерывах между счетом. (Запомним этот момент)
Bupper писал(а): 31 янв 2022, 15:27
Собрал схему на скоростном счетчике и компараторе. При условии >= заданному числу загорается светодиод и полученные данные, после нажатия кнопки на клавиатуре, высвечиваются на дисплее.
Я не особо вник в алгоритм, однако судя по описанию, что то здесь не так.
Хотелось бы уточнить:
Вы считаете количество импульсов которое отослало некое устройство?
Есть ли уверенность, что данное устройство отослало именно нужное(точное) количество импульсов в пачке?
Или Вы считаете импульсы которые пришли до включения светодиода? "При условии >= заданному числу загорается светодиод..."
Если речь идет о последнем, то ситуация с пересчетом нормальная, т.к. Пока цикл добежит до компаратора, да еще с учетом того, что прерывания тормозят этот цикл, скоростной счетчик насчитает гораздо больше импульсов, чем то число, которым оперирует компаратор.
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 11:19
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 наверно медленнее будет?
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 12:30
ecoins
Bupper писал(а): 01 фев 2022, 11:19
Вроде где-то на форуме встречал что до 130кГц скоростной счетчик работает нормально. Вот только как получить вовремя с него данные.
В этом и проблема - ведь любая обработка данных занимает время.
Решать такую задачу проблематично на mega 2560 (лучше ESP32)и без логического анализатора (без него с такой задачей как "гадать").
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 12:31
ecoins
Bupper писал(а): 01 фев 2022, 11:19
Может такой вариант применить: например, одна ардуино работает только к режиме скоростного счетчика и передает значения счета параллельно на выходные пины. Т.е. например 10-12 бит параллельно передаются на вторую ардуино, которая просто опрашивает пины на совпадение бит.
По UART наверно медленнее будет?
Это все медленно, только через аппаратный SPI.
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 13:03
Ingwar
Bupper писал(а): 01 фев 2022, 11:19
Я пока не могу понять на сколько стабильный пересчет. Если он достаточно постоянный, можно заблаговременно отключать счет скоростного счетчика и попадать "примерно" в нужное значение. Допустим пересчет до 10 имп.
Может такой вариант применить: например, одна ардуино работает только к режиме скоростного счетчика и передает значения счета параллельно на выходные пины. Т.е. например 10-12 бит параллельно передаются на вторую ардуино, которая просто опрашивает пины на совпадение бит.
По UART наверно медленнее будет?
Если число с которым сравнивают показания счетчика постоянно, можно ручками дописать в функцию обработчика прерывания сравнение. В IDE перед загрузкой. Но упадет верхний предел частоты.
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 13:04
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);
}
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 13:06
Dryundel
Bupper писал(а): 01 фев 2022, 11:19
Задача: подсчитать поступившие импульсы и в заданный момент (когда предварительно заданное число будет равно поступившему числу импульсов) подать сигнал на выходной пин.
Ну вот с этого и надо было начинать. Как я и предполагал.
Bupper писал(а): 01 фев 2022, 11:19
Вроде где-то на форуме встречал что до 130кГц
Это зависит от задачи выполняемой по прерыванию. С простым счётчиком ардуина 16мГц, с 500 кГц должна справляться.
Bupper писал(а): 01 фев 2022, 11:19
Вот я и боюсь что с этим ничего не поделаешь.
Ну почему же, можно, но не штатными средствами. Вечерком постараюсь накидать блок под вашу задачу.
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 13:55
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
Ну почему же, можно, но не штатными средствами. Вечерком постараюсь накидать блок под вашу задачу.
Спасибо! Очень надеюсь, что справиться.
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 14:25
AndrejK
Bupper писал(а): 01 фев 2022, 13:55
XXX - это мое значение только цифрами?
Да. Можно использовать переменную. Ну и счетчик обнулить не забыть...
...
if (_SCT_1_CPOP >= XXX) {
Led_On (); // если зажигать ЛЕД. Можно еще добавить detachInterrupt (digitalPinToInterrupt (PIN No.))
_SCT_1_CPOP = 0;
}
...
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 14:32
Bupper
[ref]AndrejK[/ref], код вставил. Работает. Диод загорается. Но как узнать сколько насчитал, не понятно. Это же надо параллельно с зажиганием диода останавливать счетчик и выводить данные на экран. А это я могу только через FLPROG
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 14:45
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; // или когда надо
}
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 15:00
Bupper
По первому варианту получилось так: счетчик досчитывает до 800 (ХХХ), диод загорается, счет сбрасывается и по новой, на большой частоте. Вообщем светомузыка). Не определить, есть пересчет или нет.
А второй вариант я боюсь не осилю.
if (!(_gtv18)) и _gtv18 = 1 это одно и тоже?
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 15:21
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.
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 15:23
Brand2
[ref]Bupper[/ref], Сделайте так,что бы во время счета работала только плата скоростного счетчика,а остальные платы не выполнялись.
Как это сделать,это уже другой вопрос.
У меня была задача была пропустить на выход заданное число импульсов (от 1- 999)длительностью 1 мкс и паузой 4 мкс.
Использовал esp32 на частоте 240 MHz,проверял логическим анализатором,все отрабатывалось четко.
Если интересно,кину в личку.
Использовал обыкновенный счетчик ,не скоростной.
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 22:11
Sancho
Ingwar писал(а): 01 фев 2022, 13:03
Если число с которым сравнивают показания счетчика постоянно, можно ручками дописать в функцию обработчика прерывания сравнение. В IDE перед загрузкой. Но упадет верхний предел частоты.
Dryundel писал(а): 01 фев 2022, 13:06
Это зависит от задачи выполняемой по прерываний. С простым счётчиком ардуина 16мГц, с 500 кГц должна справляться.
Берём аппаратный счетчик, при подготовке заносим нужное число в необходимое место, считаем по внешнему входу напрямую в счётчик.
При сработке прерывания переполнения в обработчике делаем что нужно.
Вариантов много. Важно до конца понимать задачу, а ТС не всё озвучивает.
До 8 мгц.
Быстрая обработка данных со скоростного счетчика
Добавлено: 01 фев 2022, 23:18
Dryundel
Sancho писал(а): 01 фев 2022, 22:11
Вариантов много. Важно до конца понимать задачу, а ТС не всё озвучивает.
Скрывает наверное. На Нобеля поди замахнулся.
Ладно, как и обещал в
посте #11, накидал блок. [ref]Bupper[/ref], тестируйте.
Внимание! Блок в этом проекте не корректен. Исправленный блок смотри в следующих постах.
Test.jpg
Тест.flp