Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Чт ноя 29, 2012 22:02:06

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

Даже не думал... :))
Тем более, что частичную апробацию метода/решения/способа/идеи я только что провёл... всё работает!!! :))
Доводить всё это до логического конца, конечно же, желания нет... но может когда потом и пригодится...

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

Чт ноя 29, 2012 22:16:21

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

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И позволяет это реализовать на любом микроконтроллере, имеющем у двух таймеров режим счета внешних событий. А как без логики?

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

Пт ноя 30, 2012 16:30:12

Леонид Иванович, что случилось??? :))
То "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... считать значение и т. д. ...

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

Пт ноя 30, 2012 17:42:25

Спасибо за разъяснения.

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

Пт ноя 30, 2012 18:20:20

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

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


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

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

возможно чтоб длительность измерения была пропорциональна целому числу измеряемых периодов?
кривовато получается
Последний раз редактировалось vsky Пт ноя 30, 2012 18:36:41, всего редактировалось 1 раз.

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

Пт ноя 30, 2012 18:34:20

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

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

Пт ноя 30, 2012 18:39:01

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


у ЛИ пара N и M (количество периодов измеряемой и количество периодов опроной частоты) получаются одновременно

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

Пт ноя 30, 2012 18:48:09

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

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

Пт ноя 30, 2012 18:53:47

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


а есть ли возможность в STM32 получить два независимых 32битных (24битных) счётчика с общим GATE?

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

Пт ноя 30, 2012 18:59:00

Да...
Только в случае Reciprocal Counting это ничего не даст...

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

Пт ноя 30, 2012 19:02:17

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

GATE делать с наружи JK триггером

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

Пт ноя 30, 2012 19:08:08

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

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

Пт ноя 30, 2012 19:37:34

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

Угу... как же!!! :)))
И попутно получаем измерение длительности и периода на низких частотах... бесплатно... :))
"Всё в одном флаконе и за те же деньги!" (С)

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

Пт ноя 30, 2012 22:56:42

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


Оригинально.

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

Сб дек 01, 2012 13:59:40

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


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

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

Сб дек 01, 2012 14:28:05

А с этим не ко мне...
С этим к ЛИ... он неоднократный чемпион по "Mein Hertz'у"... :))
А я тут... типа... "разрушитель легенд"... :)))
"Нельзя сделать Reciprocal Counting на STM32, ничего не получится"... можно!!! :)))

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

Пн дек 03, 2012 15:54:57

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-бит таймера... никаких дополнительных внешних элементов и соединений...

Оба варианта проверены и работают чудесно!!!
:))

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

Пн дек 03, 2012 19:37:51

Можно добавить обработку прерываний переполнения и тогда можно вообще оставить только 2 таймера. На том же втором таймере формировать 0.5 секунд. Ну и задержку в 1,5-2 секунды от начала я бы тоже отслеживал в прерывании второго таймера. Это на случай, если сигнал снимут в 0,75 секунд что бы хоть как то завершить текущее измерение, а не зависнуть навечно.
Нет все таки нужен и третий таймер. Например системный. Вдруг сигнала совсем не будет. Нужно отследить, что за секунду или чуть больше пришел хотя бы один фронт сигнала. Иначе опять зависание навечно.

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

Пн дек 03, 2012 20:02:36

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


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

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


Да, специальные ситуации в частотомере - это отдельная тема. У себя делал так: ожидание в течение измерительного интервала фронта входного сигнала. Если не приходит - частота = 0. Если пришел, начинаем счет. Если интервал закончился, а следующего фронта всё нет, ждем еще один интервал. Если не приходит - частота = 0. Ожидание еще одного интервала нужно для того, чтобы гарантированно обеспечить на интервале 1 с измерение сигнала 1 Гц.

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

Пн дек 03, 2012 20:23:17

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

Всё это... "тонкости конечной реализации"...
"Или нет?" (С)
Ответить