Jump to content

    
Sign in to follow this  
Haamu

STM32: Синхронизация таймеров

Recommended Posts

Контроллер STM32L151. Стоит необходимость очень точного (до тика контроллера) измерения времени между некоторыми событиями. Последовательность событий такая:

1) Дергаю ногой 1, в этот момент надо начать отсчет времени.

2) В момент появления сигнала на ноге 2 нужно сохранить посчитанный временой интервал, дернуть ногой 3 и стартонуть отсчет второго интервала, при этом сделать это всё максимально синхронно!

3) В момент появления сигнала на ноге 4 сохранить второй временой интервал. На этом всё.

Собственно вопрос в том, как так по хитрому настроить срабатывание таймеров, чтобы сделать всё этом максимально синхронно? Сразу уточню, что ноги подключена как попало, поэтому использовать их как внешний триггер не получится.

Edited by Haamu

Share this post


Link to post
Share on other sites
Сразу уточню, что ноги подключена как попало, поэтому использовать их как внешний триггер не получится.

Тушите свет, сливайте воду, все расходимся.

Для начала надо придумать схему синхронизации таймеров (внутри STM32 их много, они хитрые и дают множество вариантов взаимодействия). Потом распределить ноги, потом рисовать схему и плату.

А вот так задним числом - без вариантов.

 

Нет, кто-то там наверху мог помочь и сделать "как попало" так, чтобы получилось "как должно быть", но так не бывает.

Share this post


Link to post
Share on other sites
Собственно вопрос в том, как так по хитрому настроить срабатывание таймеров, чтобы сделать всё этом максимально синхронно?

Ну, в случае если запуск точности не требует - то можно. Весь смысл - не вылезать из прерывания, а лишь переходить из одного - в другое. Код прерывания разместить в памяти. Не в курсе - но если есть CCRAM - то только там. Только таким способом можно быть 100% уверенным в нулевой латентности событий.

 

Share this post


Link to post
Share on other sites

Достаточно одного таймера с двумя input capture. Настраиваете параметры триггера и прерывание на второй таймер ставите. В прерывании считаете разность в регистрах, что и есть точное время между событиями. Обязательно считать в беззнаковой арифметике, тогда переполнение таймера между срабатываниями не исказит результат.

Share this post


Link to post
Share on other sites
2) В момент появления сигнала на ноге 2 нужно сохранить посчитанный временой интервал, дернуть ногой 3 и стартонуть отсчет второго интервала, при этом сделать это всё максимально синхронно!

Ну как бы уже видно, что "до тика процессора" у вас не получится.

Share this post


Link to post
Share on other sites

А в случае, если все-же завести эти сигналы на нужные ноги контроллера, как тогда это можно настроить и какие сигнала на какие ноги заводить?

Share this post


Link to post
Share on other sites
А в случае, если все-же завести эти сигналы на нужные ноги контроллера, как тогда это можно настроить и какие сигнала на какие ноги заводить?

Ну так Tarbal рассказал, как надо:

Достаточно одного таймера с двумя input capture. Настраиваете параметры триггера и прерывание на второй таймер ставите. В прерывании считаете разность в регистрах, что и есть точное время между событиями. Обязательно считать в беззнаковой арифметике, тогда переполнение таймера между срабатываниями не исказит результат.

Даташит вроде бы говорит, что таймеры TIM2, TIM3 и TIM4 могут тактироваться на частоте процессора. Выбирайте любой из них, подключайте 2 канала - и вперёд.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this