реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Счётчик десятинаносекундных импульсов на STM32F4
uu5jkb
сообщение Jun 1 2014, 05:23
Сообщение #1


Участник
*

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



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


Гуру
******

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



Цитата(uu5jkb @ Jun 1 2014, 13:33) *
Импульсы уже прямоугольные, сформированные, длительность 10 нс,... По прикидкам, STM32F4 может таткировать свои таймеры 168 МГц и регистрировать импульсы такой длительности.
Собственно, вопрос: может кто возился с подобным и есть ли какие противопоказания для такого использования СТМ?


На STM32F не считала, но обычно во всех случаях когда счетный вход таймера тактируется, максимальная измеряемая частота достигает лишь половины тактовой частоты. Т.е. для того, чтобы считать меандр, тактирование должно произойти в двух местах - последовательно на разных уровнях (высоком и низком). Иначе таймер не поймет, что это пошел второй импульс, а не продолжается первый.

Если STM32F позволяет считать асинхронно с частотой, превышающей половину тактируемой, то прошу отозваться тех, кому это удалось практически осуществить. Меня такая возможность тоже сильно интересует.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 1 2014, 06:01
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Xenia @ Jun 1 2014, 13:48) *
позволяет считать асинхронно с частотой

А есть ли вообще асинхронные таймеры хоть в каком-то МК. Мне кажется в таком случае невозможно побороть метастабильность.
Взять тот же модуль RTC - танцы еще те.
Кста, это, пожалуй, единственный пример асинронного таймера, но ограничения по частотам наложены суровые.
Вроде в AVR есть асинхронный таймер (для часовых целей?).
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 1 2014, 07:18
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Что-ж Вы кроме как в лоб ничего и придумать не можете? blink.gif

Поставьте на каждый источник импульсов по делителю (D-триггеру). Если таймеры CPU смогут работать на частоте ядра, то такую частоту
они уже посчитать смогут (так как она уже более чем в 2 раза ниже тактовой). А в конце интервала по состоянию уровня после делителя сможете
досчитать последний нечётный импульс.

То что у вас есть "слипшиеся импульсы", говорит что у вас что-то не так спроектировано в системе в целом.
Как вариант решения - ждущий мультибиратор на каждый источник импульсов, с периодом ==10нс и на счётные входы подавать уже выходы
этих мультивибраторов. Т.е. - если вместо импульса длиной 10нсек, придёт что-то более длинное, то мультивибратор успеет за это время сгенерить
не один, а два или более имульсов, в зависимости от длительности.
Другой вариант - в МК сигнал подавать не на счётные входы счётчиков, а на входы разрешения счёта импульсов от внутреннего генератора
(не знаю умеют-ли такое счётчики STM32?).
Но тут наверное нужно чтобы частота этого генератора была кратна длительности ваших импульсов (10нсек).

PS: А почему-бы просто не поставить внешние счётчики и опрашивать их периодически?
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jun 1 2014, 07:42
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 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,
тоже самое для второго режима.

А вот майкрочип может считать асинхронно.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 1 2014, 07:46
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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 импульсов -
таким образом определяем остаток в счётчиках на момент окончания счёта внешних импульсов.
Go to the top of the page
 
+Quote Post
uu5jkb
сообщение Jun 1 2014, 09:33
Сообщение #7


Участник
*

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



Цитата(Xenia @ Jun 1 2014, 13:48) *
...максимальная измеряемая частота достигает лишь половины тактовой частоты.

Э, да, как бы очевидная вещь, а я что-то не подумал. Спасибо.

Цитата(jcxz @ Jun 1 2014, 15:28) *
Что-ж Вы кроме как в лоб ничего и придумать не можете? blink.gif

Лентяи мы rolleyes.gif

Цитата(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
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 1 2014, 09:51
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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 уже хватит.
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Jun 1 2014, 10:28
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 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 МГц, например..


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
HHIMERA
сообщение Jun 1 2014, 11:41
Сообщение #10


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 1 2014, 11:45
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



CPLD лучше ставить. Всяко лучше чем на рассыпухе собирать, или счетчики ставить. А то и FPGA какую мелкую подтянуть...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jun 2 2014, 02:10
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Непосредственно по вопросу, если это спасёт, то делитель на ETR МК асинхронный. То есть, предельная частота поступающая на вход может быть выше чем CLK/2.
Но есть и ещё один вопрос. При подключении цепочки таймеров, если нет механизма включения/ отключения входной частоты (счёт на лету), сложно контролировать точность счёта, при переполнении, так как нет механизма параллельной фиксации значений нескольких таймеров.
Короче лучше такую вещь сделать внешей, по отношению к МК. По крайней мере, за минусом последнего таймера в цепочке.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 2 2014, 02:43
Сообщение #13


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Как альтернативный вариант:
Запустить ДМА по первому событию на чтение порта, складывать всё в буфер (да, его размер должен быть достаточным) по прошествии пачки импульсов уже не в реальном времени проводить пост-обработку данных.
PS: Это всего лишь сиюминутная идея.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 2 2014, 03:52
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jun 2 2014, 04:26
Сообщение #15


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(jcxz @ Jun 2 2014, 12:02) *
Не хватит быстродействия. Тем более для 5-и каналов работающих на частоте близкой к тактовой CPU.
Количество каналов при таком способе не важно, т.к. за раз читается весь порт сразу и могут быть сохранены состояния аж 16 дискретных каналов ввода.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 17:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01603 секунд с 7
ELECTRONIX ©2004-2016