|
|
  |
Счётчик десятинаносекундных импульсов на STM32F4 |
|
|
|
Jun 1 2014, 05:23
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 4-02-09
Пользователь №: 44 400

|
Приветствую всех. Стоит задача вести счёт импульсов, приходящих по пяти каналам. Импульсы уже прямоугольные, сформированные, длительность 10 нс, интервал между импульсами скачет случайным образом, в худшем случае два импульса "слипаются в один". Измерять надо в течение 20 мс, за это время может набежать до 500 тыс. импульсов. По прикидкам, STM32F4 может таткировать свои таймеры 168 МГц и регистрировать импульсы такой длительности. Два 32-разрядных таймеров запустить напрямую, ещё три 16-битных - по прерываниям увеличивать програмный счётчик, чтобы вместилось 500 тыс. импульсов. Собственно, вопрос: может кто возился с подобным и есть ли какие противопоказания для такого использования СТМ? Спасибо.
|
|
|
|
|
Jun 1 2014, 05:38
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(uu5jkb @ Jun 1 2014, 13:33)  Импульсы уже прямоугольные, сформированные, длительность 10 нс,... По прикидкам, STM32F4 может таткировать свои таймеры 168 МГц и регистрировать импульсы такой длительности. Собственно, вопрос: может кто возился с подобным и есть ли какие противопоказания для такого использования СТМ? На STM32F не считала, но обычно во всех случаях когда счетный вход таймера тактируется, максимальная измеряемая частота достигает лишь половины тактовой частоты. Т.е. для того, чтобы считать меандр, тактирование должно произойти в двух местах - последовательно на разных уровнях (высоком и низком). Иначе таймер не поймет, что это пошел второй импульс, а не продолжается первый. Если STM32F позволяет считать асинхронно с частотой, превышающей половину тактируемой, то прошу отозваться тех, кому это удалось практически осуществить. Меня такая возможность тоже сильно интересует.
|
|
|
|
|
Jun 1 2014, 06:01
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(Xenia @ Jun 1 2014, 13:48)  позволяет считать асинхронно с частотой А есть ли вообще асинхронные таймеры хоть в каком-то МК. Мне кажется в таком случае невозможно побороть метастабильность. Взять тот же модуль RTC - танцы еще те. Кста, это, пожалуй, единственный пример асинронного таймера, но ограничения по частотам наложены суровые. Вроде в AVR есть асинхронный таймер (для часовых целей?).
|
|
|
|
|
Jun 1 2014, 07:18
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(uu5jkb @ Jun 1 2014, 15:33)  Стоит задача вести счёт импульсов, приходящих по пяти каналам. Импульсы уже прямоугольные, сформированные, длительность 10 нс, интервал между импульсами скачет случайным образом, в худшем случае два импульса "слипаются в один". Измерять надо в течение 20 мс, за это время может набежать до 500 тыс. импульсов. По прикидкам, STM32F4 может таткировать свои таймеры 168 МГц и регистрировать импульсы такой длительности. Два 32-разрядных таймеров запустить напрямую, ещё три 16-битных - по прерываниям увеличивать програмный счётчик, чтобы вместилось 500 тыс. импульсов. Собственно, вопрос: может кто возился с подобным и есть ли какие противопоказания для такого использования СТМ? Что-ж Вы кроме как в лоб ничего и придумать не можете? Поставьте на каждый источник импульсов по делителю (D-триггеру). Если таймеры CPU смогут работать на частоте ядра, то такую частоту они уже посчитать смогут (так как она уже более чем в 2 раза ниже тактовой). А в конце интервала по состоянию уровня после делителя сможете досчитать последний нечётный импульс. То что у вас есть "слипшиеся импульсы", говорит что у вас что-то не так спроектировано в системе в целом. Как вариант решения - ждущий мультибиратор на каждый источник импульсов, с периодом ==10нс и на счётные входы подавать уже выходы этих мультивибраторов. Т.е. - если вместо импульса длиной 10нсек, придёт что-то более длинное, то мультивибратор успеет за это время сгенерить не один, а два или более имульсов, в зависимости от длительности. Другой вариант - в МК сигнал подавать не на счётные входы счётчиков, а на входы разрешения счёта импульсов от внутреннего генератора (не знаю умеют-ли такое счётчики STM32?). Но тут наверное нужно чтобы частота этого генератора была кратна длительности ваших импульсов (10нсек). PS: А почему-бы просто не поставить внешние счётчики и опрашивать их периодически?
|
|
|
|
|
Jun 1 2014, 07:42
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(jcxz @ Jun 1 2014, 07:28)  Другой вариант - в МК сигнал подавать не на счётные входы счётчиков, а на входы разрешения счёта импульсов от внутреннего генератора (не знаю умеют-ли такое счётчики STM32?). Умеют. Вообще лучше конечно такое делать на CPLD. Набрать 5 счетчиков 8 разрядных, например, выход завести на таймеры или даже больше разрядов и на GPIO пины через прерывания считать. Или на рассыпухе сделать. Цитата(Xenia @ Jun 1 2014, 05:48)  Если STM32F позволяет считать асинхронно с частотой, превышающей половину тактируемой, то прошу отозваться тех, кому это удалось практически осуществить. Меня такая возможность тоже сильно интересует. STM32F103 асинхронно не может, как я понял из figure 122 RM008, тоже самое для второго режима. А вот майкрочип может считать асинхронно.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jun 1 2014, 07:46
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(A. Fig Lee @ Jun 1 2014, 17:40)  Умеют. Вообще лучше конечно такое делать на CPLD. Набрать 5 счетчиков 8 разрядных, например, выход завести на таймеры или даже больше разрядов и на GPIO пины через прерывания считать. Или на рассыпухе сделать. Больше не надо, хватит и 4-х разрядов: счётчики - делители частоты, их выходы переполнения - на таймеры CPU, по завершении интервала счёта (20мсек), считываем содержимое счётчиков по отдельной шине. Даже вобще-то и шины отдельной не надо, чтобы не городить много лишних дорог на плате - достаточно одной с GPIO CPU. После окончания интервала счёта, заводим её через элемент ИЛИ на счётные входы всех счётчиков, даём с CPU 16 импульсов - таким образом определяем остаток в счётчиках на момент окончания счёта внешних импульсов.
|
|
|
|
|
Jun 1 2014, 09:33
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 4-02-09
Пользователь №: 44 400

|
Цитата(Xenia @ Jun 1 2014, 13:48)  ...максимальная измеряемая частота достигает лишь половины тактовой частоты. Э, да, как бы очевидная вещь, а я что-то не подумал. Спасибо. Цитата(jcxz @ Jun 1 2014, 15:28)  Что-ж Вы кроме как в лоб ничего и придумать не можете?  Лентяи мы  Цитата(jcxz @ Jun 1 2014, 15:28)  То что у вас есть "слипшиеся импульсы", говорит что у вас что-то не так спроектировано в системе в целом. Это нормально, импульсы идут от ФЭУ, а там пришёл фотон или два, или не пришло вообще - не предскажешь. Цитата(jcxz @ Jun 1 2014, 15:28)  PS: А почему-бы просто не поставить внешние счётчики и опрашивать их периодически? Придётся. Цитата(jcxz @ Jun 1 2014, 15:56)  Больше не надо, хватит и 4-х разрядов: счётчики - делители частоты, их выходы переполнения - на таймеры CPU, по завершении интервала счёта (20мсек), считываем содержимое счётчиков по отдельной шине. Даже вобще-то и шины отдельной не надо, чтобы не городить много лишних дорог на плате - достаточно одной с GPIO CPU. После окончания интервала счёта, заводим её через элемент ИЛИ на счётные входы всех счётчиков, даём с CPU 16 импульсов - таким образом определяем остаток в счётчиках на момент окончания счёта внешних импульсов. Этой дорогой и пойду, если ничего другого не придумаю. Только импульсы от ФЭУ в перерывах между счётом не исчезают, надо будет регистр поставить, который в нужный момент будет их состояния запоминать. Подскажите вполне себе доступный 16-битный (или 8-битный, а лучше оба) счётчик, который до таких частот (300-400 МГц минимум) сможет работать.
Сообщение отредактировал uu5jkb - Jun 1 2014, 09:36
|
|
|
|
|
Jun 1 2014, 09:51
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(uu5jkb @ Jun 1 2014, 19:43)  Это нормально, импульсы идут от ФЭУ, а там пришёл фотон или два, или не пришло вообще - не предскажешь. Тогда Вам нужен вариант с ждущим мультивибратором, чтобы такие случаи хотя-бы частично решать. Цитата(uu5jkb @ Jun 1 2014, 19:43)  Этой дорогой и пойду, если ничего другого не придумаю. Только импульсы от ФЭУ в перерывах между счётом не исчезают, надо будет регистр поставить, который в нужный момент будет их состояния запоминать. Можно не регистр, а для уменьшения зоопарка комплектации - на каждый поток импульсов по паре счётчиков и на входе перед ними демультиплексор. Каждые 20мсек - перключаете их, и неактивный в это время считываете. Цитата(uu5jkb @ Jun 1 2014, 19:43)  Подскажите вполне себе доступный 16-битный (или 8-битный, а лучше оба) счётчик, который до таких частот (300-400 МГц минимум) сможет работать. Зачем 8бит? Достаточно 4. После деления на 16 для этой частоты таймера CPU уже хватит.
|
|
|
|
|
Jun 1 2014, 10:28
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Я бы поначалу глянул, хватит ли таймеров у СТМ32. Для STM32F103 External могут считать, например, каналы 1 и 2. Причем 1 работает через XOR с другими каналами, не знаю, можно ли запустить только от канала 1. Канал 2 может иметь тот же пин для 2х разных таймеров. Например TIM2_CH2/TIM2_CH5.. Цитата(jcxz @ Jun 1 2014, 10:01)  Тогда Вам нужен вариант с ждущим мультивибратором, чтобы такие случаи хотя-бы частично решать. Лучше вход тактировать частотой 200 МГц, например..
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Jun 1 2014, 11:41
|
Местный
  
Группа: Участник
Сообщений: 226
Регистрация: 10-07-09
Пользователь №: 51 126

|
Цитата(A. Fig Lee @ Jun 1 2014, 14:52)  STM32F103 асинхронно не может, как я понял из figure 122 RM008,
А вот майкрочип может считать асинхронно. И STM может... и STM8 и STM32... по входу ETR... В этом они ничем от Микрочипа не отличаются...
Сообщение отредактировал HHIMERA - Jun 1 2014, 11:42
|
|
|
|
|
Jun 2 2014, 02:10
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Непосредственно по вопросу, если это спасёт, то делитель на ETR МК асинхронный. То есть, предельная частота поступающая на вход может быть выше чем CLK/2. Но есть и ещё один вопрос. При подключении цепочки таймеров, если нет механизма включения/ отключения входной частоты (счёт на лету), сложно контролировать точность счёта, при переполнении, так как нет механизма параллельной фиксации значений нескольких таймеров. Короче лучше такую вещь сделать внешей, по отношению к МК. По крайней мере, за минусом последнего таймера в цепочке.
|
|
|
|
|
Jun 2 2014, 03:52
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(SasaVitebsk @ Jun 2 2014, 12:20)  Но есть и ещё один вопрос. При подключении цепочки таймеров, если нет механизма включения/ отключения входной частоты (счёт на лету), сложно контролировать точность счёта, при переполнении, так как нет механизма параллельной фиксации значений нескольких таймеров. В чём сложность-то? Код uint i, i1, i2 = timerLow; do { i1 = i2; i = timerHigh; i2 = timerLow; } while (i1 > i2); return i << N | i2; Цитата(demiurg_spb @ Jun 2 2014, 12:53)  Запустить ДМА по первому событию на чтение порта, складывать всё в буфер (да, его размер должен быть достаточным) по прошествии пачки импульсов уже не в реальном времени проводить пост-обработку данных. Не хватит быстродействия. Тем более для 5-и каналов работающих на частоте близкой к тактовой CPU.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|