STM32 - частотомер.

Кто любит RISC в жизни, заходим, не стесняемся.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 - частотомер.

Сообщение HHIMERA »

SergeBS писал(а):Не бери в голову.

Даже не думал... :))
Тем более, что частичную апробацию метода/решения/способа/идеи я только что провёл... всё работает!!! :))
Доводить всё это до логического конца, конечно же, желания нет... но может когда потом и пригодится...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: STM32 - частотомер.

Сообщение Леонид Иванович »

Так поделитесь, как сделали?

upd: для конкретики привожу свой алгоритм, реализованный в ПЛИС (логику интерполятора не рассматриваю):

1. Микроконтроллером программно формируется сигнал Gate.
2. По ближайшему фронту входной частоты Fin устанавливается сигнал FinGate, который разрешает работу счетчика FinCnt, считающего количество периодов входной частоты.
3. После установки сигнала FinGate по ближайшему фронту опорной частоты Fref устанавливается сигнал FrefGate, который разрешает работу счетчика FrefCnt, считающего количество периодов частоты заполнения.
4. Когда проходит время, приблизительно равное желаемому времени измерения, микроконтроллер снимает сигнал Gate.
5. По ближайшему фронту входной частоты Fin сбрасывается сигнал FinGate, который запрещает работу счетчика FinCnt.
6. После сброса сигнала FinGate по ближайшему фронту опорной частоты Fref сбрасывается сигнал FrefGate, котрый запрещает работу счетчика FrefCnt.
7. Микроконтроллер считывает содержимое счетчиков FinCnt и FrefCnt, на основе этих значений вычисляется входная частота Fin = Fref * FinCnt / FrefCnt.

Как это переложить на таймеры STM32? Использование двух внешних триггеров и двух логических элементов 2И позволяет это реализовать на любом микроконтроллере, имеющем у двух таймеров режим счета внешних событий. А как без логики?
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 - частотомер.

Сообщение HHIMERA »

Леонид Иванович, что случилось??? :))
То "HHIMERA гонит, не разобравшись в вопросе", то "Все равно ничего не выйдет", то "Понятно. Получается, Вы тоже не знаете, как реализовать этот метод измерения частоты на STM32", а теперь, вдруг...
Леонид Иванович писал(а):поделитесь, как сделали?

Где логика??? :))


Как это всё работает...
Для Reciprocal Counting понадобится PWM input mode, PWM mode/One-pulse mode (Gate) и Slave timer in Gated mode... никаких прерываний...


PWM input mode
Нужен для определения длительности периода входного импульса (у меня на STM32F0xx это TIM2), померяли и запомнили...

Переводим таймер в режим
PWM mode/One-pulse mode (Gate)
На основе предыдущего измерения заносим в TIM2->ARR значение, которое бы в итоге давало импульс ~1сек. ...

Slave timer in Gated mode (у меня были TIM3 и TIM15 соединённые цепочкой и управляемые TIM2)
Здесь и производим подсчёт ref импульсов...

Получаем...
Fin = Fref * FinCnt / FrefCnt.
Fref известна изначально...
FinCnt - значение, которое занесли в TIM2->ARR (с учётом CCR1)...
FrefCnt - извлекаем из TIM3->CNT и TIM15->CNT по остановке/перезапуску TIM2...
Вуаля!!! :))
Итого: один 32-бит таймер и два 16-бит таймера...

Есть ещё вариант... основывается на том, что TIM2->ARR изначально задать по максимуму, запустить таймер, а по истечению 1сек. скорректировать TIM2->ARR "на лету" для завершения Gate... считать значение и т. д. ...
"Я не даю готовых решений, я заставляю думать!"(С)
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: STM32 - частотомер.

Сообщение Galizin »

Спасибо за разъяснения.
Аватара пользователя
vsky
Открыл глаза
Сообщения: 63
Зарегистрирован: Пн апр 06, 2009 18:32:14

Re: STM32 - частотомер.

Сообщение vsky »

PWM input mode
Нужен для определения длительности периода входного импульса (у меня на STM32F0xx это TIM2), померяли и запомнили...

Переводим таймер в режим
PWM mode/One-pulse mode (Gate)
На основе предыдущего измерения заносим в TIM2->ARR значение, которое бы в итоге давало импульс ~1сек. ...


в этом месте по подробнее

можно ли не измерять, а сформировать GATE импульс с заданным количеством периодов частоты Fref, равный длительности измерения?

возможно чтоб длительность измерения была пропорциональна целому числу измеряемых периодов?
кривовато получается
Последний раз редактировалось vsky Пт ноя 30, 2012 18:36:41, всего редактировалось 1 раз.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 - частотомер.

Сообщение HHIMERA »

Вы не поняли... :))
В Reciprocal Counting Gate это N-ое количество периодов измеряемого сигнала... а не Fref...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
vsky
Открыл глаза
Сообщения: 63
Зарегистрирован: Пн апр 06, 2009 18:32:14

Re: STM32 - частотомер.

Сообщение vsky »

HHIMERA писал(а):Вы не поняли... :))
В Reciprocal Counting Gate это N-ое количество периодов измеряемого сигнала... а не Fref...


у ЛИ пара N и M (количество периодов измеряемой и количество периодов опроной частоты) получаются одновременно
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 - частотомер.

Сообщение HHIMERA »

У ЛИ не STM32... :)))
Вы в состоянии отличить... метод измерения от реализации метода измерения??? :))
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
vsky
Открыл глаза
Сообщения: 63
Зарегистрирован: Пн апр 06, 2009 18:32:14

Re: STM32 - частотомер.

Сообщение vsky »

HHIMERA писал(а):У ЛИ не STM32... :)))
Вы в состоянии отличить... метод измерения от реализации метода измерения??? :))


а есть ли возможность в STM32 получить два независимых 32битных (24битных) счётчика с общим GATE?
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 - частотомер.

Сообщение HHIMERA »

Да...
Только в случае Reciprocal Counting это ничего не даст...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
vsky
Открыл глаза
Сообщения: 63
Зарегистрирован: Пн апр 06, 2009 18:32:14

Re: STM32 - частотомер.

Сообщение vsky »

HHIMERA писал(а):Да...
Только это ничего не даст...

GATE делать с наружи JK триггером
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 - частотомер.

Сообщение HHIMERA »

Да можно всё что угодно... :))
Здесь был вопрос... возможности реализации Reciprocal Counting на STM32... без внешних цепей и довесов и на минимуме таймеров... :))
"Всё, что не запаивается - дописывается программно!" (С)
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 - частотомер.

Сообщение HHIMERA »

vsky писал(а):кривовато получается

Угу... как же!!! :)))
И попутно получаем измерение длительности и периода на низких частотах... бесплатно... :))
"Всё в одном флаконе и за те же деньги!" (С)
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: STM32 - частотомер.

Сообщение Леонид Иванович »

HHIMERA писал(а):Нужен для определения длительности периода входного импульса (у меня на STM32F0xx это TIM2), померяли и запомнили...


Оригинально.
Аватара пользователя
vsky
Открыл глаза
Сообщения: 63
Зарегистрирован: Пн апр 06, 2009 18:32:14

Re: STM32 - частотомер.

Сообщение vsky »

HHIMERA писал(а):Да можно всё что угодно... :))
Здесь был вопрос... возможности реализации Reciprocal Counting на STM32... без внешних цепей и довесов и на минимуме таймеров... :))
"Всё, что не запаивается - дописывается программно!" (С)


А если допустить возможность использования пары...тройки внешних логических вентилей?
про минимум таймеров речи не было... :))
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 - частотомер.

Сообщение HHIMERA »

А с этим не ко мне...
С этим к ЛИ... он неоднократный чемпион по "Mein Hertz'у"... :))
А я тут... типа... "разрушитель легенд"... :)))
"Нельзя сделать Reciprocal Counting на STM32, ничего не получится"... можно!!! :)))
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 - частотомер.

Сообщение HHIMERA »

vsky писал(а):А если допустить возможность использования пары...тройки внешних логических вентилей?
про минимум таймеров речи не было... :))

Вот скажите... зачем что-то навешивать... привычка??? Или обязательно "должно быть много деталей"???
Это же STM32!!! "Это же бубле-гум!!!" (С)
Включите воображение...
"Всё гениальное - просто!"(С)
"Просто добавь воды!" (С)
Есть ещё вариант... основывается на том, что TIM2->ARR изначально задать по максимуму, запустить таймер, а по истечению 1сек. скорректировать TIM2->ARR "на лету" для завершения Gate... считать значение и т. д. ...

Слегка подумав... модифицируем его...

Воркароунд...

Вариант 1

PWM mode/One-pulse mode (Gate)
Заносим в TIM2->ARR значение по максимуму...

Slave timer in Gated mode (у меня были TIM3 и TIM15 соединённые цепочкой и управляемые TIM2)
Здесь и производим подсчёт ref импульсов...

Возьмём ещё один таймер (TIM1), настроим как One-pulse mode на 0,5сек. и привяжем его к TIM2...
Запускаем TIM2, по прерыванию TIM1 (через 0,5сек.) считываем значение TIM2->CNT, умножаем на 2 (один сдвиг влево)
и заносим в TIM2->ARR (на лету)...
По окончанию Gate считаем по формуле и выводим... Всё!!!

Итого: один 32-бит таймер и три 16-бит таймера... никаких дополнительных внешних элементов и соединений...



Вариант 2

PWM mode/One-pulse mode (Gate)
Заносим в TIM2->ARR значение по максимуму...

Slave timer in Gated mode (у меня были TIM3 и TIM15 соединённые цепочкой и управляемые TIM2)
Здесь и производим подсчёт ref импульсов...

Запускаем TIM2... Внимание!!! Просто делаем задержку на 0,5сек. (можно даже программную!!!)...
считываем значение TIM2->CNT, умножаем на 2 (один сдвиг влево) и заносим в TIM2->ARR (на лету)...
По окончанию Gate считаем по формуле и выводим... Всё!!!

Итого: один 32-бит таймер и два 16-бит таймера... никаких дополнительных внешних элементов и соединений...

Оба варианта проверены и работают чудесно!!!
:))
"Я не даю готовых решений, я заставляю думать!"(С)
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: STM32 - частотомер.

Сообщение Galizin »

Можно добавить обработку прерываний переполнения и тогда можно вообще оставить только 2 таймера. На том же втором таймере формировать 0.5 секунд. Ну и задержку в 1,5-2 секунды от начала я бы тоже отслеживал в прерывании второго таймера. Это на случай, если сигнал снимут в 0,75 секунд что бы хоть как то завершить текущее измерение, а не зависнуть навечно.
Нет все таки нужен и третий таймер. Например системный. Вдруг сигнала совсем не будет. Нужно отследить, что за секунду или чуть больше пришел хотя бы один фронт сигнала. Иначе опять зависание навечно.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

Re: STM32 - частотомер.

Сообщение Леонид Иванович »

Galizin писал(а):Можно добавить обработку прерываний переполнения и тогда можно вообще оставить только 2 таймера.


Вот я тоже в этом направлении думаю. Теоретически, нужен всего лишь небольшой таймер (8 - 16 бит), чтобы сделать поток прерываний более редким. Как для Fin, так и для Fref. В описанной реализации мне не очень нравится формирование интервала измерения через число периодов Fin. Пытался сделать через Output Compare (в начале интервала настраиваем на set, в конце - на clear), но пока ничего не получается.

Galizin писал(а):Это на случай, если сигнал снимут в 0,75 секунд что бы хоть как то завершить текущее измерение, а не зависнуть навечно. ... Вдруг сигнала совсем не будет. Нужно отследить, что за секунду или чуть больше пришел хотя бы один фронт сигнала. Иначе опять зависание навечно.


Да, специальные ситуации в частотомере - это отдельная тема. У себя делал так: ожидание в течение измерительного интервала фронта входного сигнала. Если не приходит - частота = 0. Если пришел, начинаем счет. Если интервал закончился, а следующего фронта всё нет, ждем еще один интервал. Если не приходит - частота = 0. Ожидание еще одного интервала нужно для того, чтобы гарантированно обеспечить на интервале 1 с измерение сигнала 1 Гц.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: STM32 - частотомер.

Сообщение HHIMERA »

Galizin писал(а):Можно добавить обработку прерываний переполнения и тогда можно вообще оставить только 2 таймера.
..........
...........
Нет все таки нужен и третий таймер. Например системный. Вдруг сигнала совсем не будет. Нужно отследить, что за секунду или чуть больше пришел хотя бы один фронт сигнала. Иначе опять зависание навечно.

Всё это... "тонкости конечной реализации"...
"Или нет?" (С)
"Я не даю готовых решений, я заставляю думать!"(С)
Ответить

Вернуться в «ARM»