Даже не думал... Тем более, что частичную апробацию метода/решения/способа/идеи я только что провёл... всё работает!!! Доводить всё это до логического конца, конечно же, желания нет... но может когда потом и пригодится...
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
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 гонит, не разобравшись в вопросе", то "Все равно ничего не выйдет", то "Понятно. Получается, Вы тоже не знаете, как реализовать этот метод измерения частоты на 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... считать значение и т. д. ...
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
PWM input mode Нужен для определения длительности периода входного импульса (у меня на STM32F0xx это TIM2), померяли и запомнили...
Переводим таймер в режим PWM mode/One-pulse mode (Gate) На основе предыдущего измерения заносим в TIM2->ARR значение, которое бы в итоге давало импульс ~1сек. ...
в этом месте по подробнее
можно ли не измерять, а сформировать GATE импульс с заданным количеством периодов частоты Fref, равный длительности измерения?
возможно чтоб длительность измерения была пропорциональна целому числу измеряемых периодов? кривовато получается
Последний раз редактировалось vsky Пт ноя 30, 2012 18:36:41, всего редактировалось 1 раз.
Да можно всё что угодно... Здесь был вопрос... возможности реализации Reciprocal Counting на STM32... без внешних цепей и довесов и на минимуме таймеров... "Всё, что не запаивается - дописывается программно!" (С)
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Да можно всё что угодно... Здесь был вопрос... возможности реализации Reciprocal Counting на STM32... без внешних цепей и довесов и на минимуме таймеров... "Всё, что не запаивается - дописывается программно!" (С)
А если допустить возможность использования пары...тройки внешних логических вентилей? про минимум таймеров речи не было...
А с этим не ко мне... С этим к ЛИ... он неоднократный чемпион по "Mein Hertz'у"... А я тут... типа... "разрушитель легенд"... "Нельзя сделать Reciprocal Counting на STM32, ничего не получится"... можно!!!
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
А если допустить возможность использования пары...тройки внешних логических вентилей? про минимум таймеров речи не было...
Вот скажите... зачем что-то навешивать... привычка??? Или обязательно "должно быть много деталей"??? Это же 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-бит таймера... никаких дополнительных внешних элементов и соединений...
Оба варианта проверены и работают чудесно!!!
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Можно добавить обработку прерываний переполнения и тогда можно вообще оставить только 2 таймера. На том же втором таймере формировать 0.5 секунд. Ну и задержку в 1,5-2 секунды от начала я бы тоже отслеживал в прерывании второго таймера. Это на случай, если сигнал снимут в 0,75 секунд что бы хоть как то завершить текущее измерение, а не зависнуть навечно. Нет все таки нужен и третий таймер. Например системный. Вдруг сигнала совсем не будет. Нужно отследить, что за секунду или чуть больше пришел хотя бы один фронт сигнала. Иначе опять зависание навечно.
Можно добавить обработку прерываний переполнения и тогда можно вообще оставить только 2 таймера.
Вот я тоже в этом направлении думаю. Теоретически, нужен всего лишь небольшой таймер (8 - 16 бит), чтобы сделать поток прерываний более редким. Как для Fin, так и для Fref. В описанной реализации мне не очень нравится формирование интервала измерения через число периодов Fin. Пытался сделать через Output Compare (в начале интервала настраиваем на set, в конце - на clear), но пока ничего не получается.
Galizin писал(а):
Это на случай, если сигнал снимут в 0,75 секунд что бы хоть как то завершить текущее измерение, а не зависнуть навечно. ... Вдруг сигнала совсем не будет. Нужно отследить, что за секунду или чуть больше пришел хотя бы один фронт сигнала. Иначе опять зависание навечно.
Да, специальные ситуации в частотомере - это отдельная тема. У себя делал так: ожидание в течение измерительного интервала фронта входного сигнала. Если не приходит - частота = 0. Если пришел, начинаем счет. Если интервал закончился, а следующего фронта всё нет, ждем еще один интервал. Если не приходит - частота = 0. Ожидание еще одного интервала нужно для того, чтобы гарантированно обеспечить на интервале 1 с измерение сигнала 1 Гц.
Можно добавить обработку прерываний переполнения и тогда можно вообще оставить только 2 таймера. .......... ........... Нет все таки нужен и третий таймер. Например системный. Вдруг сигнала совсем не будет. Нужно отследить, что за секунду или чуть больше пришел хотя бы один фронт сигнала. Иначе опять зависание навечно.
Всё это... "тонкости конечной реализации"... "Или нет?" (С)
_________________ "Я не даю готовых решений, я заставляю думать!"(С)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения