Частотомер на stm32: Частотомер на STM32F10x / STM32 / Сообщество EasyElectronics.ru

Содержание

Stm32 частотомер

Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь. Страницы: QRA: KP67lx. Цитата: Дмитрий Макаров от 13 Февраль , Novgorod R3TGM.


Поиск данных по Вашему запросу:

Схемы, справочники, даташиты:

Прайс-листы, цены:

Обсуждения, статьи, мануалы:

Дождитесь окончания поиска во всех базах.

По завершению появится ссылка для доступа к найденным материалам. ПОСМОТРИТЕ ВИДЕО ПО ТЕМЕ: Самодельный измеритель емкости и индуктивности на микроконтроллере PIC 16F628A / PIC16F84

Микроконтроллеры STM32 и отладочные платы для них


Таймер — очень важное периферийное устройство в наборе внутренней аппаратуры микроконтроллера. Количество таймеров и их функциональных возможностей отличается от одного семейства микроконтроллеров STM32 к другому, однако все же у большинства таймеров есть общие функции и рабочие режимы.

Таймер STM32 разрабатывался как краеугольный камень большинства встраиваемых приложений: он используется для самых разных задач от управления двигателями до генерации периодических событий в приложениях. Спецификации таймера доступны во всех руководствах STM32, и информации по таймерам очень много из-за их широких функциональных возможностей. Назначение этого руководства перевод [1] — дать простое и ясное описание базовых функций и рабочих режимов таймеров STM32 общего назначения.

Это так называемые general-purpose таймеры сокращенно GP. Этот документ сопровождает спецификации периферийных устройств таймеров STM32, доступных в руководстве по каждой конкретной серии микроконтроллеров STM Примечание: расшифровку некоторых непонятных терминов и сокращений можно найти в статье [5].

Здесь будет предоставлено более глубокое описание основных функций таймера STM32, используемых для создания демонстрационного приложения. Здесь также будет описана архитектура используемого исходного кода.

В этом документе обсуждаются только простые вопросы, и не будут затронуты такие сложные темы, как приложения управления двигателями. Информация, представленная здесь, применима к следующим сериям микроконтроллеров STM Общая информация по таймерам STM Микроконтроллеры STM32 имеют несколько таймеров, которые используются для генерации отсчета времени, подсчета импульсов, измерения длительности импульсов и периодов сигналов, генерации сигналов ШИМ, переключения внешних устройств.

Перед тем, как начать рассматривать таймеры STM32, следует заметить, что они слишком сложны, чтобы в одной статье рассмотреть все их функции. Поэтому здесь мы рассмотрим базовые вопросы работы с таймерами, что позволит начать их использовать.

Полную информацию ищите в даташите на конкретную модель микроконтроллера. Из этих трех типов таймеров первые два будут общими для всех моделей STM Последний третий тип доступен только в старших моделях.

Количество таймеров определенного класса также меняется в зависимости от емкости или размера микроконтроллера STM Библиотека STM32CubeMX может использоваться для определения того, какие таймеры доступны в имеющейся модели микроконтроллера, если Вы не хотите заблудиться в большом массиве документации.

General purpose GP таймеры имеют все функции стандартного модуля таймера-счетчика, они почти такие же, как в большинстве 8-битных микроконтроллеров. GP-таймеры могут использоваться для любых связанных с отсчетом времени и подсчетом событий целей, в том числе и генерация ШИМ и захват импульсов. Изучение GP-таймеров позволяет лучше понять базовые концепции. Базовые таймеры доступны только в старших моделях STM32, и это самый простой класс таймеров.

Продвинутые таймеры в основном похожи на GP-таймеры, но имеют дополнительные возможности по генерации комплементарных сигналов ШИМ, а также формировать сигнал торможения и фазы ШИМ с «мертвым» интервалом, предотвращающим сквозные токи силового моста dead-time. Эти функции полезны для приложений, связанных с управлением двигателями, с силовыми инверторами, системами SMPS и другими задачами, связанными с источниками питания электроники и управлением мощностью.

В большинстве микроконтроллеров STM32 есть как минимум один такой таймер. В старших моделях STM32, продвинутых таймеров может быть два. Каждый таймер в микроконтроллере STM32 не зависит от других, и поэтому не использует никакие общие ресурсы.

Единственное, что общее между таймерами, это типы регистров, принципы именования регистров и общий принцип работы. С очень малыми исключениями модули таймеров более или менее совместимы по всем семействам микроконтроллеров STM Обычно большинство таймеров STM32 состоит из битного счетчика с автоматической загрузкой и битного прескалера.

Прескалер отвечает за деление приходящего тактового сигнала согласно потребностям приложения. Функция автоматической загрузки счетчика работает почти так же, как мы привыкли видеть в 8-битных микроконтроллерах, с единственным исключением.

В 8-битных MCU старой школы нам нужно было перезагрузить таймер после каждого прерывания или после каждого переполнения таймера. Это не требуется в таймерах STM32, так как обрабатывается автоматически. Однако в большинстве приложений традиционно и предпочтительно используется счет вверх.

Они могут использоваться следующим образом:. Таймеры могут тактироваться либо от внутреннего источника тактов тактового генератора RC или от генератора, стабилизированного внешним кварцем , или от внешнего источника тактов.

Внешние источники тактирования:. Из всей этой информации видна универсальность таймеров STM32, и по этой причине они не очень просты для освоения начинающими программистами. Перед тем, как мы начнем программировать, следует обратить внимание на возможно наиболее сложный набор регистров микроконтроллера STM32, относящийся к модулям таймера-счетчика. В конкретном приложении все эти регистры могут не понадобиться, и чтобы упростить их использование, мы просто обсудим их назначение для определенной задачи.

Еще одна важная вещь, которую стоить заметить — все регистры в ядре микроконтроллера ARM имеют разрядность 32 бита, и для модулей таймеров и многих других периферийных устройств многие биты в этих регистрах зарезервированы т.

Это упрощает обработку бит. Чтобы еще больше упростить кодирование, в этом руководстве будут использоваться собственные определения и функции, подобные тем, что находятся в библиотеке SPL от ST. Библиотеки MikroC также используют похожий подход к кодированию. Работа отдельных счетчиков, функций DMA и прерываний разрешается после настройки всего остального. Для регистров таймера значение по умолчанию это все нули, что означает запрет всех функций.

Таким образом, не нужно эти биты принудительно очищать при старте точно так же обстоят дела и с любым другим периферийным устройством STM Однако если Вам нужно поменять кое-что на лету, то лучше всего сначала сбросить все настройки, чтобы не попасть в ситуацию непредсказуемого поведения таймеров и обслуживающего их кода. Если точность не очень важна, то таймеры могут использоваться в качестве обычного средства отслеживания реального времени в программе.

Без сомнений таймеры более точны и эффективны, чем тупые пустые циклы задержки, но они не очень хороши для использования вместо выделенной аппаратуры RTC. Блок AFIO должен быть разрешен даже если переназначение не используется. Однако все равно не рекомендуется не превышать уровень напряжения питания VDD, который обычно составляет 3.

Очень важно, чтобы ток через вывод микроконтроллера не превышал предел, указанный в спецификации на микроконтроллер. Если выходной ток недостаточен, то применяйте усиливающие транзисторные ключи и микросхемы буфера. Утилита Timer Calculator от MikroElektronika MikroE позволит учитывать эти факторы для реальной тактовой частоты микроконтроллера.

Отсчет текущего времени в программе — основной режим таймера. В этом режиме работы таймер программируется так, чтобы он вызывал периодически генерируемые события с равными интервалами времени так называемый генератор временной базы. Для этой цели мы можем использовать любой таймер, однако лучше всего использовать или базовый таймер если он присутствует , или GP-таймер. Для создания генератора временной базы рационально использовать метод прерываний.

Сначала надо определиться, какой таймер использовать, и какая должна быть частота прерываний таймера. Затем нужно будет рассчитать значения для прескалера PSC , регистра автоперезагрузки auto-reload register, ARR и регистра счетчика повторений repetition counter register, RCR , если последний присутствует. Счетчики повторений доступны только в продвинутых таймерах. Можно использовать следующую формулу для определения частоты срабатывания прерываний:.

RCR будет нулевым кроме случаев, когда он доступен и используется, тогда формула будет следующей:. Для настройки таймера в качестве генератора базового времени нужно использовать следующие регистры вместо x подставляется номер таймера :.

Все микроконтроллеры STM32 оборудованы как минимум одним таймером, и многие из них имеют в своем составе периферии таймеры нескольких типов.

В этом документе рассматриваются обычные таймеры general purpose, GP-таймеры. GP-таймеры можно отличить от таймеров других типов по имени в руководстве микроконтроллера STM В документации микроконтроллеров STM32 GP-таймер именуется как «TIMx timer», где «x» может быть любым числом, и это не отражает количество таймеров, встроенных в этот микроконтроллер.

Например, микроконтроллеры серии STM32F имеют на борту таймер TIM17, однако общее количество таймеров в этом микроконтроллере меньше В основном через все семейства микроконтроллеров STM32 соблюдается принцип, что таймеры с одинаковым именем имеют один и тот же набор функциональных возможностей, но из этого правила есть несколько исключений. GP-таймеры, встроенные в микроконтроллеры STM32, используют одинаковую основную структуру; они отличаются только уровнем функций, встроенных в определенный таймер.

Блок базы времени. Блок каналов таймера. Блок функции Break. Этот блок в основном предоставляет управляющие сигналы для блока базового времени. Этот блок может быть сконфигурирован для вывода сигнала синхронизации сигнал TRGO рядом с определенным внутренним событием таймера. Он может быть сконфигурирован также для управления счетчиком базового времени в функции внешних событий наподобие внутренних событий других таймеров или внешних сигналов.

Можно сконфигурировать один slave-таймер для инкремента своего счетчика, базируясь на событиях master-таймера, таких как его обновление.

Этот управляющий блок использует сигнал выхода master-таймера TRGO. Нельзя их тактировать ни от другого источника тактов, ни от внутренних тактов. Блок базы времени сделан на основе счетчика вместе с каскадом прескалера и счетчиком повторений. Тактовый сигнал поступает в блок базы времени, проходя через каскад прескалера перед тем, как достичь счетчика базы времени.

Сигнал на выходе прескалера является тактовым сигналом счета, который поступает на каскад счетчика. Автоматическая перезагрузка счетчика работает следующим образом. Каждый раз, когда начинается новый цикл счета, срабатывает «событие обновления» таймера, пока счетчик повторений repetition counter равен 0. Если счетчик повторений не равен 0, то событие обновление не сработает, но перезапустится новый цикл счета, и содержимое счетчика повторений уменьшится на 1.

Не у всех таймеров STM32 есть счетчик повторений. Если его нет, то таймер ведет себя так, как если бы счетчик повторений был всегда равен 0. Блок канала таймера. Каналы таймера это рабочие элементы таймера, с помощью них таймер взаимодействует с внешним аппаратным окружением.

Канал таймера, отображенный на вывод микроконтроллера STM32, может использоваться либо как вход, либо как выход. Когда вывод сконфигурирован как выход, канал используется для генерации сигналов.

На основе этого постоянного логического сравнения и сконфигурированного подрежима выхода наподобие PWM1 mode или Inactive mode , канал таймера либо устанавливает, либо сбрасывает флаг OCyREF, и его значение поступает на каскад выхода канала. Каскад выхода применяет набор уточняющих операций к сигналу OCyREF, базируясь на наборе сконфигурированных параметров наподобие полярности канала или генерации интервала dead-time, и других параметров.


Частотомер на STM32F10x

Войти через. Найдите лучшие предложения hot stm32 частотомер. Защита Покупателя. Помощь Служба поддержки Споры и жалобы Сообщить о нарушении авторских прав.

суть делителя в том — что он ставиться вдобавок к частотомеру на свч Идея частотомера пока такая- STM32, АЦП оцифорвывает ПЧ.

STM32: Урок 6.2 — Таймеры общего назначения и продвинутые

Перейти к содержимому. Отправлено 24 Январь — Игорь Бутывский 24 Январь — писал:. MAZ 24 Январь — писал:. Отправлено 31 Октябрь — Отправлено 09 Ноябрь — Система для сообществ IP.

Частотомер на STM32F050F4

Вход Регистрация Восстановление пароля Вход Запомнить меня. Получить ссылку на изменение пароля. Частотомер на микроконтроллере stm Статья описывает способ измерения какой-либо внешней частоты с помощью микроконтроллера stm32 , а заодно является косвенным продолжением статей о таймерах.

Захват у STM

Частотомер + ШИМ на STM8L

Среда разработки Здравствуйте, у меня такой вопрос, можно ли с помощью STM8L, сгенерировать определенное количество Частотомер Привет всем, есть программа таймера частотомера написана на ассемблере, в протеусе проверил сам Сбоит частотомер Доброго времени суток! Проблема: считаю период входного прямоугольного импульса с помощью захвата Тут появилась задача сделать частотомер.

STM Урок 5. Библиотека HAL. STM32 CUBE MX. Таймеры

Логин или эл. Войти или Зарегистрироваться. Авторизация Логин или эл. How it all began… Как-то появилась у меня задача — померять частоту сигнала с некого датчика, который по сути являлся кварцевым резонатором с внешней схемой возбуждения. Об этом я узнал позднее, а до того момента пришлось откинуть разные варианты реализации, погрешность которых выходила больше — например с делителями входного сигнала.

STM32 CUBE MX. Таймеры Сегодня мы попробуем поработать с таймерами также с помощью библиотеки HAL. У нашего контроллера.

Частотомер до 1ГГц на STM32

В одной программе работает отлично, но вызывается правда постоянно с одним и тем же значением. В другой то ли работает криво, то ли не работает вообще:. Не пойму почему не выдерживается задержка?

Измерительная техника

Данные таймеры — это таймеры с расширенным управлением. Таких таймеров всего два. Это таймеры общего назначения. У них функционал очень ограничен, зато их у нас целых шесть. Далее идем в пункт

Войдите или зарегистрируйтесь как работодатель, чтобы увидеть контактную информацию.

Частотомер для ГПД на STM32F100

Запросить склады. Перейти к новому. Частотомер на stm Подскажите, пожалуйста, как настроить таймер 3 для измерения частоты входного сигнала в stm32f Меню пользователя Batisto4ka Посмотреть профиль Отправить личное сообщение для Batisto4ka Найти ещё сообщения от Batisto4ka.

Авторизация Зарегистрироваться Логин или эл. Напомнить пароль Пароль. Войти Запомнить меня. Продолжаем тему таймеров в STM


Дайте немного космоса или микроконтроллер как частотомер

Все знают о спутниковых системах определения координат. Они также позволяют узнать скорость и текущее время. На основе таких систем строят серверы точного времени, о которых уже много раз здесь говорилось, и не только здесь. Точность этих систем растет, цена падает, короче, прогресс не стоит на месте. Совсем, казалось бы, недавно речь шла о миллисекундах, и вот уже микросекунды никого не удивляют. И недалек тот день, когда…

Честно говоря, этот день уже настал для меня. Не так давно попалась на глаза информация о том, что один из производителей для своих модулей обещает точность интервала выходного сигнала PPS порядка десятков наносекунд.

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

На всякий случай я посмотрел, как идут дела у других производителей подобной продукции и обнаружил примерно такие же технические характеристики. “Тенденция, однако” — пронеслась мысль в моей голове, примерно, как у Штирлица. Надо было что-то делать.

Те из читателей, кто знает, как отпаять резистор от печатной платы или как припаять микросхему и даже умеют это делать, мысленно согласятся со мной, что иметь в хозяйстве частотомер, который обеспечивает точность 7-8 знаков, никогда не помешает. Особенно, если он будет занимать мало места, а вам не придется занимать много денег на его покупку. А те, у кого мысль не любит останавливаться могут подумать о часах, которые ошибаются на несколько секунд в год (в седьмом знаке, Клара). Поклонники любительской радиосвязи вспомнят, наверное, о конструировании хорошего самодельного узкополосного фильтра на кварцевых резонаторах.

Первое, что надо было сделать — это найти подходящее “железо”. Мне приглянулась простая оценочная плата с небольшим модулем Teseo-LIV3F от известной компании. Ниже показано, как она выглядит.

Эта штука продается с выносной активной антенной, которую можно установить ближе к окну, чтобы хорошо “видела” спутники. Перемычки (jumpers) выставлены на плате так, как требуется для нашего дальнейшего повествования и успешного программирования. На фото также присутствуют схемотехнические доработки в виде одного диода с хорошим быстродействием.

Схема доработок будет показана ниже. Производителем предусмотрено, что эту плату можно вставить в подходящую оценочную плату Nucleo с микроконтроллером на борту (на самом деле это разъемы для Arduino, но с 32-ух бит не хочется уходить). В описании самого GPS/GNSS модуля я нашел следующее.

Это весьма неплохо и может послужить первым приближением к хорошему частотомеру. Теперь у меня есть очень точный секундный интервал, и я могу подсчитать частоту колебаний, например, своего, собственноручно термостатированного, кварцевого генератора. И даже, возможно, подстроить ее в нужную для себя сторону. Это будет потом, наверное. А пока что захотелось замерить частоты кварцевых резонаторов, скопившихся в хозяйстве.

Подходящая плата из серии Nucleo построена на STM32L476RG. Она поставляется без кварцевого резонатора (часовой – не в счет). Ниже на фото показаны стрелками места, куда пришлось припаять недостающие элементы.

Этот вариант платы выбран по трем соображениям. Первое, генератор микроконтроллера с внешним резонатором работает от 4 до 48 МГц. Такие допуски есть не у всех микроконтроллерных плат Nucleo. Этот генератор мы и будем запускать с нашими кварцами. Второе, последовательный порт (UART) можно тактировать от отдельного встроенного RC-генератора с точностью 1% на частоте 16 МГц. Следовательно, не надо будет менять настройки и делители в конфигурации UART с изменением частоты внешнего генератора. И самое главное, для кварцевого резонатора предусмотрено место под навесной монтаж, куда можно установить разъемы, чтобы не припаивать каждый раз очередной резонатор.

Последовательный порт уже соединен с виртуальным USB портом в бортовом отладчике. Значит можно воспользоваться эмулятором терминала для вывода информации. После доработки и установки для кварца двух обрезков от цангового разъема, плата выглядит следующим образом.

Теперь надо запускать таймер ровно на одну секунду, а считать он будет импульсы своего системного тактового генератора, то есть частоту нашего кварцевого резонатора. К счастью, в таймере предусмотрен режим, при котором он одновременно сбрасывается и запускается от нарастающего фронта внешнего импульса.

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

На следующих диаграммах показано, как из секундного интервала сделать десятисекундный.

Сигнал PPS подается на таймер через диод, а на дополнительный вход внешнего прерывания – напрямую. В прерывании от таймера разрешается внешнее прерывание, которое, досчитав до десяти, запрещает себя и меняет подтягивающий резистор с верхнего на нижний.

Красными стрелками показаны моменты срабатывания прерывания таймера, а зелеными отмечены моменты запуска внешнего прерывания, по которому считаются требуемые секундные интервалы. Синим показано включение-выключение подтягивающих резисторов. Проект сделан в IAR и посмотреть его можно здесь. На фото ниже показан результат работы программы контроллера совместно с эмулятором терминала, на котором видно установившееся состояние.

Чтобы увидеть график, а не сухие строчки значений частоты, пришлось сочинить небольшую утилиту под Windows. Ее тушка находится там же где и проект прошивки.

Все эксперименты проходили по одинаковому сценарию. Перед измерениями плату оставляли на пятнадцать — двадцать минут в холодильнике, где было чуть ниже нуля. Затем она естественным путем нагревалась до комнатной температуры в течение получаса. Потом плата и резонатор получали от фена теплый воздух на несколько минут (тут одинаковых условий не получилось).

Хорошие резонаторы вели себя хорошо, то есть в соответствии с графиком температурной зависимости AT среза кристалла. Эти графики (или многочисленные копии?) легко отыскать в сети. Ниже показаны результаты измерений трех резонаторов на 16 МГц.

Потом оказалось, что бывают исключения из привычной картины поведения. Ниже показаны данные двух кварцев одинакового вида и, скорее всего, одного происхождения, которые повели себя по-разному.

На резонатор, который ведет себя привычно, я просто подышал немного, а второй решил нагреть сильнее, поскольку он показал себя иначе. Как легко видеть зависимость от температуры у него или сдвинута, или просто другая.

Еще одно интересное наблюдение. После воздействия по температуре, резонатор не возвращается к прошлым значениям частоты, или у меня не хватило терпения дождаться. В любом случае, это не важно, если вас не волнуют знаки после шестого.

Вот еще одно наблюдение. Это один и тот же резонатор, который пришлось замерить дважды, поскольку он вызвал удивление. Я пока объяснения такому поведению не нашел и не придумал.

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

Автор: Сергей

Источник

Рис. 1. Блок-схема частотомера, использующего метод прямого счета.

1 Интерполирующий частотомер FC-510 (черновик) Частотомер является одним из самых распространенных измерительных приборов. Существует много разных по принципу действия частотомеров, но в последнее время все они практически полностью вытеснены электронно-счетными частотомерами. Современные частотомеры имеют встроенный микропроцессор и кроме измерения частоты сигнала могут осуществлять другие измерения: периода сигнала, длительности импульсов, скважности импульсов, количества импульсов, суммы, разности и отношения частот двух сигналов, разности фаз между ними и многого другого. Иногда сам частотомер может осуществлять статистическую обработку результатов измерений: поиск минимума и максимума, среднего значения, стандартного отклонения и т.д. с выводом значений на дисплей или в порт. Таким образом, современный частотомер представляет собой сложный измерительный прибор с широкими возможностями. Электронно-счетный частотомер может использовать разные методы измерения частоты. Каждому методу присущи свои достоинства и недостатки. Ниже будут рассмотрены основные из этих методов. Метод прямого счета Самым простым способом измерения частоты является метод прямого счета. Метод заключается в подсчете количества периодов входного сигнала за известный промежуток времени. Поскольку частота сигнала это количество периодов за единицу времени, то если выбрать промежуток времени, равный 1 сек., то полученное количество периодов будет численно равно частоте входного сигнала в герцах. Полученное значение счетчика можно сразу выводить на индикатор, никаких математических операций не требуется. Благодаря этой особенности частотомеры прямого счета без труда могут быть построены на простой логике, и они получили широкое распространение. Блок-схема такого частотомера приведена на рис. 1. Fref Gate T IN Fin & Counter N Рис. 1. Блок-схема частотомера, использующего метод прямого счета. Для получения измерительного интервала T используется сигнал опорной частоты, который подается на вход счетчика Gate. В течение измерительного интервала на второй счетчик Counter N пропускаются импульсы входной частоты Fin. Значение N, полученное в счетчике после окончания измерительного интервала, позволяет определить частоту входного сигнала: Fin = N / T. При T = 1 сек. частота Fin = N, поэтому значение счетчика Counter N можно непосредственно выводить на индикатор.

2 Поскольку измерительный интервал не синхронизирован с входным сигналом, в начале и в конце измерительного интервала возникает погрешность Tb и Te соответственно (рис. 2). Fref Gate Fin Tb Te N Рис. 2. Возникновение погрешности счета. Интервалы Tb и Te являются независимыми случайными величинами, каждая из которых лежит в интервале 0 Tin, где Tin период входного сигнала (Tin = 1 / Fin). Реальная длительность N периодов входной частоты равна N Tin = T + Tb Te. С учетом возможных диапазонов интервалов получаем N Tin = T ± Tin, или T = Tin (N ± 1). Отсюда Fin = (N ± 1) / T. Возникает погрешность, известная как ±1 единица счета. На рис. 3 показано, как небольшое изменение частоты входного сигнала (или даже изменение момента переключения входного компаратора, вызванное шумами) может привести к изменению показаний в диапазоне от 3 до 5. Gate Fin N = 4 Tb Te Gate Fin N = 3 Gate Fin N = 5 Рис. 3. Погрешность ±1 единица счета.

3 Поскольку при уменьшении частоты число N будет уменьшаться, то относительная погрешность измерения, связанная с ошибкой N на ±1, будет расти. Или, с другой стороны, количество значащих цифр результата измерения будет уменьшаться с уменьшением частоты. На рис. 4 приведен график зависимости разрешения (количества значащих цифр) для метода прямого счета в зависимости от частоты для интервала счета 1 сек. (для других значений интервала счета график будет пропорционально сдвигаться вверх или вниз). Digits k 10k 100k 1M 10M 100M 1G Fin, Hz Рис. 4. Зависимость разрешения от частоты для метода прямого счета. На рис. 4 видно, что с понижением частоты разрешение у частотомеров прямого счета падает. Для работы с сигналами высокой частоты такие приборы еще подходят, а вот на низких частотах разрешение оказывается совершенно недостаточным. Допустим, требуется измерить частоту около 1 кгц. При интервале измерения 1 сек. получим одно из следующих значений: 999 Гц, 1000 Гц, 1001 Гц. Относительная погрешность измерения составит ±0.1%, а это довольно плохо. Еще хуже обстоит дело с измерением более низких частот. На частоте 100 Гц погрешность составит ±1%, а на частоте 10 Гц ±10%. Уменьшить погрешность можно увеличением измерительного интервала, но устанавливать его больше 10 сек. не является практичным. С повышением частоты разрешающая способность метода прямого счета растет, достигая весьма высоких значений. Например, при измерении частоты 10 МГц при длительности измерительного интервала 1 сек. частотомер может показать Гц, Гц, или Гц. Относительная погрешность измерения составит ± %, что весьма неплохо. На более высоких частотах разрешение будет еще выше. Но на практике существует ограничение, связанное с ограниченным быстродействием логических схем, на которых построена схема частотомера. Как правило, верхняя граница частоты, которую можно непосредственно подавать на вход частотомера, лежит в пределах МГц. Для более высоких частот применяют предварительные делители частоты (прескалеры). Использование прескалера снижает разрешение частотомера прямого счета пропорционально коэффициенту деления. На рис. 4 серой линией показан ход графика разрешения реального частотомера, у которого на высоких частотах включается прескалер с коэффициентом деления 100.

4 Измерение периода Чтобы исправить ситуацию при измерении низких частот, в некоторых частотомерах реализован режим измерения периода. Тогда в качестве интервала измерения используется один период входного сигнала Tin. В течение этого интервала производится счет импульсов M опорной частоты Fref. Частоту входного сигнала можно вычислить по формуле Fin = Fref / M, но для этого требуется операция деления. Для частотомеров на жесткой логике реализовать ее затруднительно, поэтому они обычно индицируют длительность периода в единицах времени. Например, если выбрать Fref = 1 МГц, то результат получится в микросекундах. Перевод значения периода в значение частоты предоставляется пользователю. Для метода измерения периода тоже будет присутствовать погрешность счета в виде M ± 1. Но поскольку значение M с уменьшением частоты входного сигнала увеличивается, то относительная погрешность измерения с уменьшением частоты будет падать. Надо отметить, что измерительный интервал для этого метода не является постоянным, он равен длительности периода измеряемого сигнала. На рис. 5 приведен график зависимости разрешения для метода измерения периода в зависимости от частоты входного сигнала (синий график). Digits k 10k 100k 1M 10M 100M 1G Fin, Hz Рис. 5. Зависимость разрешения от частоты при измерении периода. Для сравнения на рис. 5 показано разрешение для метода прямого счета (серый график). Видно, что для низких частот имеет преимущество метод измерения периода, а для высоких частот метод прямого счета. Комбинируя эти два метода, можно получить неплохое разрешение для любых частот. Хотя в районе звуковых частот разрешение все равно остается недостаточным.

5 Метод обратного счета (Reciprocal Counting) Существует метод измерения частоты, когда относительная погрешность измерения не зависит от значения входной частоты. Блок-схема такого частотомера приведена на рис. 6. Fref Tc Gate D C T Fin = Fref N / M Fref & Counter M IN Fin & Counter N Рис. 6. Блок-схема частотомера обратного счета (Reciprocal Counting). Сигнал опорной частоты Fref используется для получения желаемого интервала измерения Tс с помощью счетчика Gate. Этот интервал напрямую не используется для подсчета импульсов, а лишь разрешает формирование настоящего измерительного интервала T, который начинается и заканчивается синхронно с началом периодов входного сигнала. В течение этого интервала с помощью двух счетчиков производится счет количества входных импульсов N и количества импульсов опорной частоты M. Значение частоты входного сигнала можно вычислить по следующей формуле: Fin = Fref N / M. Для реализации таких вычислений частотомер должен содержать микропроцессор, но для современных приборов это трудностей не представляет. Временная диаграмма работы частотомера обратного счета показана на рис. 7. Fref Gate Fin CntEn N Tb Te M Рис. 7. Временная диаграмма частотомера обратного счета.

6 Поскольку интервал T синхронизирован с входным сигналом, ошибки счета N не возникает. Но зато по-прежнему присутствует ошибка счета M ± 1. На рис. 6. серым цветом выделены случайные интервалы времени Tb и Te, которые приводят к этой ошибке. Интервал измерения T всегда остается приблизительно постоянным (это округленный до целого значения периодов входной частоты интервал Tc), поэтому вклад этой ошибки также остается приблизительно постоянным. Разрешающая способность частотомера обратного счета не зависит от значения входной частоты. Если описать метод обратного счета пошагово, то получится следующая последовательность: 1. Начинается формирование интервала измерения Tc. Этот интервал будет определять скорость обновления показаний и погрешность измерения (чем больше интервал, тем погрешность меньше). Сам интервал Tc можно формировать приблизительно, можно даже не использовать для его формирования опорную частоту. В случае реализации частотомера на микроконтроллере, для формирования Tc достаточно программно таймера. 2. После начала измерительного интервала Tc по ближайшему фронту входного сигнала начинает формироваться интервал счета T. В течение этого интервала разрешается счет входных импульсов N и импульсов опорной частоты M. Для этого требуются два счетчика. 3. Ожидание окончания интервала измерения Tc. 4. После окончания измерительного интервала Tc по ближайшему фронту входного сигнала завершается интервал счета T. При этом счет входных импульсов N и импульсов опорной частоты M прекращается. 5. По формуле Fin = Fref N / M вычисляется частота входного сигнала. В реальном частотомере к этой последовательности надо добавить обработку нештатных ситуаций, связанных с исчезновением входного сигнала во время измерения или с его слишком низкой частотой. В пункте 2 ожидание фронта входного сигнала имеет смысл делать только до окончания интервала Tc. Если фронт так и не был обнаружен, значит, входная частота слишком низкая для выбранного интервала измерения. В такой ситуации логично индицировать 0 Гц. Так же и с обнаружением фронта входного сигнала при окончании счета. После окончания интервала Tc имеет смысл ожидать фронт в течение времени не более Tc. Если фронт не приходит, это значит, что входной сигнал исчез во время измерения. В такой ситуации также логично индицировать 0 Гц. Если фронт входного сигнала был обнаружен с большой задержкой относительно начала интервала Tc, то на фактическое измерение останется слишком мало времени. Это приведет к потере разрешающей способности. Поэтому имеет смысл в момент обнаружения фронта входной частоты продлевать интервал Tc до его номинального значения. Эти дополнения нужны при реализации универсальных частотомеров. Если диапазон входных частот ограничен, и когда точно известно, что период входного сигнала всегда меньше измерительного интервала, таких проверок можно не делать. Выше было показано, что при измерении входного сигнала частотой 1 кгц относительная погрешность измерения для частотомера прямого счета с интервалом измерения 1 сек. составляет ±0.1%. У частотомера обратного счета при Fref = 10 МГц в тех же условиях получится N = 1000, M = , или При этом результат будет Гц, Гц или Гц. Относительная погрешность составляет ± %, что на 4 порядка лучше. Причем такая же погрешность сохранится для любой измеряемой частоты. На рис. 8 приведен график зависимости разрешения для метода обратного счета с интервалом счета 1 сек. в зависимости от частоты (зеленый график). Как и

7 для метода прямого счета, длительность интервала измерения будет пропорционально влиять на разрешение. Digits k 10k 100k 1M 10M 100M 1G Fin, Hz Рис. 8. Зависимость разрешения от частоты для метода обратного счета. Для сравнения на рис. 8 показано также разрешение частотомера прямого счета (серый график). При входной частоте, равной опорной частоте Fref, разрешение частотомеров становится одинаковым. На более высоких частотах у частотомера прямого счета появляется преимущество (серая область). Однако у реальных частотомеров прямого счета, которые на высоких частотах используют прескалеры, преимущество будет проявляться только в узком диапазоне частот (светло-серая область). Частотомер обратного счета тоже может использовать прескалер на высоких частотах, но в отличие от частотомера прямого счета это не приведет к падению разрешающей способности. В большинстве случаев у частотомера обратного счета имеется существенное преимущество. Особенно, если речь идет об измерении частот в звуковом диапазоне. Тем не менее, в подавляющем большинстве любительских частотомеров используется метод прямого счета. И это несмотря на то, что почти в каждом из них есть микроконтроллер. Проекты, в которых реализован метод обратного счета, можно пересчитать по пальцам []. Повышение разрешающей способности частотомеров обратного счета Для дальнейшего повышения разрешающей способности частотомеров обратного счета можно повышать значение опорной частоты Fref. Так сделано в некоторых промышленных приборах, но сложность этого решения оказывается довольно высокой. Дело в том, что опорная частота должна обладать высокой стабильностью. В качестве источника Fref применяют образцовые генераторы, которые, как правило, работают на относительно невысокой частоте. Типичным является значение частоты 10 МГц. Поэтому дальнейшее повышение частоты предусматривает ее умножение. При этом требуется как можно меньше ухудшить значение фазового шума, иначе появится дополнительная погрешность измерения. Для умножения иногда используют высококачественные схемы PLL, но чаще используется выделение высших гармоник из опорного сигнала с последующим их усилением и фильтрацией. Конструктивно такое решение оказывается довольно громоздким. Например, в частотомере SR-620 фирмы Standford Research выделяется 9-я гармоника опорной частоты 10 МГц, которая затем усиливается и фильтруется кварцевым фильтром.

8 Еще один способ повышения разрешающей способности состоит в уменьшении погрешности счета импульсов опорной частоты M. Как было показано на рис. 7, погрешность возникает из-за наличия двух случайных интервалов времени в начале и в конце счета. Если эти интервалы измерить и учесть при вычислении частоты, то погрешность можно значительно уменьшить. Каждый из интервалов имеет длительность в диапазоне от нуля до одного периода опорной частоты. При значении Fref = 10 МГц, длительность интервалов лежит в диапазоне нс. Для измерения малых интервалов времени может применяться ряд методов, таких как верьньерный метод, метод совпадений, основанный на использовании малых задержек, метод преобразования времени в напряжение, метод растяжки длительности импульса. Существуют интегральные решения для таких измерений, называемые TDC (Time to Digital Converter). Но они недостаточно распространены и имеют высокую стоимость. Аналоговый интерполятор Устройства, которые позволяют измерять интервалы времени внутри одного периода опорной частоты, часто называют интерполяторами. Наиболее распространенный способ построения такого устройства заключается в преобразовании длительности импульса в напряжение. В течение времени измеряемого импульса включается генератор тока I1 (рис. 9), который по линейному закону заряжает емкость интерполятора Cint. Когда импульс заканчивается, генератор тока выключается, а емкость продолжает хранить свой заряд. Уровень напряжения, до которого окажется заряженной емкость, пропорционален измеряемой длительности. Это напряжение можно измерить с помощью АЦП, выходной цифровой код которого будет пропорционален длительности импульса. После измерения конденсатор нужно разрядить с помощью ключа K, и интерполятор снова готов к работе. Если значение зарядного тока и емкости конденсатора выбрать так, чтобы при максимальной длительности измеряемого импульса (а это один период опорной частоты) напряжение на конденсаторе было равным полной шкале АЦП, то, например, при 10- разрядном АЦП можно получить разрешение по времени примерно 1/1000 периода опорной частоты. Для Fref = 10 МГц это разрешение составит 100 пс. Если с таким разрешением измерить интервалы Tb и Te, а затем вычислить полный интервал T и подставить его в формулу для расчета частоты, то получим разрешение, эквивалентное разрешению частотмера с опорной частотой 10 ГГц. Но на практике улучшение разрешающей способности будет несколько ниже, так как на работу интерполятора оказывают влияние шумы и помехи, как и на любую другую аналоговую схему. К тому же, процесс зарядки емкости интерполятора обладает некоторой нелинейностью. Но получить практическое улучшение примерно в 100 раз относительно несложно. Рис. 9. Аналоговый интерполятор с использованием АЦП.

9 Применение АЦП не является единственным способом реализации аналогового интерполятора. С помощью конденсатора и двух источников тока можно осуществить растяжку длительности импульса, после чего можно выполнить ее измерение методом заполнения опорной частотой. Рис. 10. Аналоговый интерполятор с растяжкой импульса. В схеме интерполятора с растяжкой длительности импульса имеются два генератора тока. Генератор разрядного тока I2 включен постоянно (рис. 10). Генератор зарядного тока I1 включается течение времени измеряемого импульса. При этом емкость интерполятора Cint заряжается по линейному закону током, равным I1 I2. Как только импульс заканчивается, генератор зарядного тока I1 выключается, и начинается разряд емкости током I2. Одновременно запускается счетчик, который измеряет длительность разрядки путем заполнения импульсами опорной частоты. По окончанию разрядки срабатывает компаратор, который останавливает счет. В счетчике будет содержаться число, которое представляет собой длительность растянутого импульса, выраженную в периодах опорной частоты. Коэффициент растяжки определяется отношением зарядного и разрядного токов. Обычно ток I1 выбирается в 100 и более раз больше тока I2. В результате разрешающая способность измерения длительности импульса повышается в 100 и более раз. Digits k 10k 100k 1M 10M 100M 1G Fin, Hz Рис. 10a. Зависимость разрешения от частоты.

10 На рис. 10a показана зависимость разрешения от частоты для всех методов: прямого счета (черный график), измерения периода (синий график), обратного счета (зеленый график) и обратного счета с интерполятором (красный график). Как видно, частотомер обратного счета с интерполятором превосходит по разрешающей способности все другие варианты реализации. Fref Gate Fin CntEn N Tb Te M Tb, Te Cint IntEn Nb, Ne Рис. 11. Временная диаграмма частотомера обратного счета с интерполятором. Временная диаграмма работы частотомера обратного счета с интерполятором приведена на рис. 11. С помощью логических схем формируются импульсы Tb и Te, которые подлежат растяжке. Эти импульсы включают генератор зарядного тока, в результате емкость интерполятора Cint заряжается до некоторого напряжения. После окончания импульса зарядного тока емкость начинает линейно разряжаться. В это время формируется сигнал IntEn, разрешающий работу счетчика интерполятора, который измеряет длительность процесса разрядки. По окончанию разрядки срабатывает компаратор, который снимает сигнал IntEn и запрещает дальнейшую работу счетчика. В результате после измерения микроконтроллер считывает значения N, M, Nb, Ne и вычисляет частоту входного сигнала по формуле Fin = Fref N / M + (Nb Ne) / k, где k коэффициент растяжки интерполятора. Разрешающая способность такого измерения повышается в k раз по сравнению с вариантом без интерполятора. На практике измерение длительности импульса от 0 до Tref представляет сложности, так как может потребовать сформировать очень короткий импульс Tb или Te. Быстродействие ключа тока зарядки является ограниченным, поэтому в случае очень короткого импульса схема будет обладать высокой нелинейностью или станет вовсе неработоспособной. Вместо

11 измерения длительности в интервале 0 Tref на практике используют измерение в интервале Tref 2Tref (рис. 12). Логика частотомера построена таким образом, что автоматически формирует импульсы, увеличенные по длительности на Tref. Поскольку при вычислении частоты требуется разность длительностей импульсов Tb и Te, удлинение их на одинаковую величину на результате не сказывается. M Tb Cint Tb + Tref IntEn Nb Рис. 12. Временная диаграмма работы реального интерполятора. Поскольку интерполятор является аналоговым устройством, ему свойственны различного рода нестабильности, например, временная и температурная. Если изменится какой-то из параметров схема, например, значение тока I1 или I2, значение емкости Cint, величина напряжения смещения компаратора и т.д., изменится и коэффициент растяжки k. А это приведет к погрешности измерения. Для устранения такой погрешности используется процедура калибровки интерполятора. В процессе калибровки логика частотомера вместо импульсов случайной длительности Tb и Te подает на вход интерполятора импульсы фиксированной длительности Tref и 2Tref. Эти значения как раз являются границами рабочего диапазона интерполятора. Сделав измерения для двух таких импульсов, можно вычислить значение k. Калибровка интерполятора проводится полностью автоматически и не требует много времени, поэтому ее можно проводить довольно часто, что позволит устранить влияние дрейфа аналоговых компонентов. На практике ограничивающими факторами повышения точности остаются лишь нелинейность и шум интерполятора. Continuous time stamping Нелинейность интерполятора может быть уменьшена с помощью определенных схемотехнических приемов []. Для уменьшения шума интерполятора можно использовать усреднение его показаний, что фактически является низкочастотной фильтрацией. Но в обычном понимании усреднение использовать нельзя, так как при каждом измерении на интерполятор поступает интервал случайной длительности, выходной код интерполятора тоже меняется по случайному закону. Чтобы полностью использовать потенциал аппаратной части частотомера с интерполятором, лучше задействовать интерполятор не только в начале и в конце измерительного интервала, а как можно чаще. Фактически, в конце измерения мы получаем пару значений: это значение количества входных импульсов N и момент времени, в который это значение получено. Момент времени выражается в количестве периодов опорной

12 частоты M и уточняется с помощью интерполятора. Такие пары значений можно получать не только в конце измерения, но и в его процессе. Если входная частота в процессе измерения остается неизменной, все полученные значения N должны лежать на некоторой прямой, имеющей определенный наклон. Этот наклон определяется значением входной частоты. В реальности из-за шума интерполятора значения будут иметь некоторое хаотическое отклонение от этой прямой. Применяя метод линейной регрессии (linear regression), можно определить наклон этой прямой по совокупности всех полученных точек. При этом эффективное значение шума будет уменьшено. Такой метод измерения получил название «Continuous time stamping» и применяется в некоторых современных частотмерах []. Для измерительных интервалов от 0.1 до 10 сек. этот метод дает улучшение разрешающей способности около 10 раз. Реализация метода требует возможности защелкивания счетчиков «на лету» в специальные регистры, которые микропроцессор может прочитать, не прерывая измерения. Это несколько усложняет логику частотомера. Другие методы повышения разрешающей способности Для частотомеров прямого счета тоже существуют методы повышения разрешающей способности. Счетчик такого частотомера подсчитывает количество импульсов входной частоты, которое укладывается внутри измерительного интервала. Округление количества импульсов до целого значения приводит к появлению ошибки квантования. Фактически, в процессе измерения производится определение среднего значения последовательности импульсов с помощью П-образной весовой функции (усредняющего окна Дирихле). Но это окно не является оптимальным []. Может быть найдено оптимальное окно с точки зрения минимизации среднеквадратической ошибки квантования. Для применения в цифровом частотомере подходят ступенчатые окна. Коэффициенты оптимального окна с числом ступеней N будут вычисляться по формуле a n = (n + 1)(N n). Эффективность применения окна будет увеличиваться с ростом числа N участков весовой функции. Процесс измерения частоты разбивается на N этапов. Результат, полученный на каждом этапе, умножается на свой весовой коэффициент. Затем все результаты складываются. В конце производится деление результата на площадь окна. При переходе к оптимальной весовой функции при N >> 1 среднеквадратическая относительная погрешность квантования будет составлять (6 / N) 1/2 от ошибки с П-образным окном. Вместо оптимального окна можно использовать треугольное окно (окно Бартлетта) или трапецеидальное окно. Такие окна совсем незначительно проигрывают оптимальному, зато они довольно просто реализуются на основе кода счетчика, формирующего измерительный интервал. Как вариант, формирование измерительного интервала можно реализовать с помощью реверсивного счетчика, который до половины интервала увеличивает свое значение, а затем уменьшает. Вместо подсчета входных импульсов по приходу каждого из них нужно прибавлять к значению накапливающего сумматора текущий код счетчика. Это будет эквивалентно применению треугольного окна. Применение весовых окон уменьшает погрешность квантования, но при этом усложняет реализацию частотомера, особенно в случае жестких требований по быстродействию. Поколения частотомеров Современные универсальные частотомеры представляют собой многофункциональные измерительные устройства, но все же основной функцией является измерение частоты. Фирма «Pendulum» делит частотомеры по используемому принципу измерения частоты на 4 поколения (таблица 1).

13 Таблица 1. Поколения частотомеров. Поколение Год Метод измерения Разрешение (для интервала 1 сек.) Прямой счет 2-8 разрядов Обратный счет 7-9 разрядов Обратный счет с интерполятором 9-11 разрядов Continuous time stamping 12 разрядов Согласно этой классификации частотомер FC-510 относится к приборам 3-го поколения. В то же время подавляющее большинство любительских частотомеров являются приборами 1-го поколения. Реализация частотомера обратного счета Как было показано выше, для реализации частотомера обратного счета требуются два счетчика. Один из них должен вести счет входных импульсов, а другой импульсов опорной частоты. При реализации частотомера на основе микроконтроллера в качестве счетчиков обычно используют встроенные таймеры. Как правило, все внешние сигналы микроконтроллера при переходе в домен внутренней тактовой частоты проходят через синхронизаторы. Поэтому максимальная частота счета внешних событий обычно ограничена величиной 1/2Fclk, где Fclk тактовая частота микроконтроллера. Если в качестве тактовой частоты используется опорная частота Fref = 10 МГц, то такой частотомер сможет измерять частоты до 5 МГц. Для измерения более высоких частот потребуется дополнительный делитель. Счет импульсов опорной частоты в режиме счета внешних событий невозможен, но без этого можно обойтись. Второй счетчик фактически осуществляет измерение временного интервала, что можно реализовать с использованием схемы захвата. При этом автоматически решается вопрос запуска и остановки счетчика синхронно с фронтами входного сигнала. Если на вход захвата таймера подать входной сигнал, то разница соседних захваченных значений будет соответствовать одному периоду входной частоты. Подобным образом можно измерить длительность любого количества периодов входной частоты, нужно только их подсчитать. Сделать это можно программно в обработчике прерывания по захвату. Но при этом максимальная частота входного сигнала ограничена возможностями программного счета импульсов и не превышает нескольких сотен кгц. Хотя в некоторых случаях этого может оказаться достаточно. Таким способом можно реализовать частотомер обратного счета на микроконтроллере семейства AVR. Пример такого частотомера показан на рис. 13. Входной сигнал подается на вход ICP1, никаких внешних схем или соединений не требуется. Результат выводится в порт в виде строки символов на скорости 9600 бод и может быть принят любой терминальной программой. Максимальная измеряемая частота составляет 500 кгц. Измерительный интервал задан равным 1сек., что при опорной частоте 10 МГц обеспечивает относительную погрешность измерения для любой частоты не более 0.1 ppm, что превосходит стабильрность большинства TCXO генераторов. Рис. 13. Пример частотомера обратного счета без внешней логики.

14 Для повышения максимальной входной частоты до 1/2Fclk заманчиво использовать для подсчета входных импульсов еще один таймер в режиме счета внешних событий. Однако при практической реализации этой идеи возникает проблема синхронизации двух таймеров. Дело в том, что в микроконтроллере отсутствует возможность разрешения или запрещения работы двух таймеров строго одновременно. В результате может появиться ошибка счета входных импульсов N ± 1, что приведет к значительной ошибке результата. Надо сказать, что даже такая развитая периферия, какой обладают микроконтроллеры семейства STM32, не позволяет простыми способами реализовать на внутренних таймерах частотомер обратного счета. В полной мере проблема решается лишь применением внешней логики, с помощью которой возможно корректное формирование измерительного интервала. Если появляется внешняя логика, тогда нет смысла ограничиваться максимальной входной частотой 1/2Fclk. Добавив внешний триггер или счетчик, можно повысить максимальную входную частоту до значения, определяемого лишь возможностями примененной логики. Таким же способом можно реализовать логику интерполятора и дополнительные режимы работы частотомера. Но сложность внешней логики при этом может превысить разумные пределы. В таких случаях оптимальным решением будет применение микросхемы CPLD. Фактически, можно реализовать всю цифровую часть частотомера внутри CPLD, но стоимость одного триггера в виде ячейки ОЗУ внутри микроконтроллера намного ниже, чем стоимость триггера внутри CPLD. В то же время, жесткие требования по быстродействию предъявляются лишь к незначительной части схемы частотомера. Это позволяет сочетать ресурсы CPLD и микроконтроллера таким образом, чтобы обойтись CPLD минимального размера (и стоимости). Поскольку измеряемая частота Fin и опорная частота Fref могут быть высокими, первые каскады счетчиков должны быть размещены в CPLD. Необходимая разрядность этих счетчиков должна выбираться исходя из максимальных значений частот Fin и Fref и максимальной входной частоты таймеров микроконтроллера. Вслед за первыми каскадами счетчиков можно включить таймеры микроконтроллера. Общая разрядность счетчиков частотомера должна быть высокой, чтобы обеспечить работу в широком диапазоне входных частот и измерительных интервалов. Поэтому разрядности аппаратных счетчиков обычно недостаточно. Но эту разрядность можно неограниченно наращивать за счет программных счетчиков, которые подсчитывают переполнения таймеров и хранят свои значения в ОЗУ. Переполнения являются редкими событиями, поэтому их обработка почти не загружает микроконтроллер. Получаются такие многоступенчатые счетчики: CPLD таймер микроконтроллера ОЗУ микроконтроллера. Суммарная разрядность счетчиков определяется максимальными значениями частот Fin и Fref и максимальной длительностью измерительного интервала. Рис. 14. Принципиальная схема цифровой части частотомера FC-510.

15 Схема цифровой части частотомера FC-510 показана на рис. 14. Микроконтроллер с помощью программного таймера формирует измерительный интервал и в виде сигнала Gate подает его на CPLD. После появления сигнала Gate ближайший фронт входного сигнала запускает счетный интервал. После снятия сигнала Gate ближайший фронт входного сигнала завершает счетный интервал. С началом счетного интервала разрешается работа счетчиков входных имульсов и импульсов опорной частоты. С выхода последнего разряда счетчиков сигнал поступает на входы таймеров микроконтроллера, которые осуществляют счет переполнений. По окончанию счета микроконтроллер считывает значения счетчиков из CPLD по трехпроводному последовательному интерфейсу, который использует сигналы SDATA, SCLOCK и FSYNC. При использовании метода обратного счета реальный интервал счета не совпадает с измерительным интервалом, формируемым микроконтроллером. Когда измеряемая частота относительно высокая, эти интервалы почти совпадают. Но когда период измеряемой частоты становится соизмеримым с длительностью измерительного интервала, ситуация меняется. Например, после того, как микроконтроллер сформировал сигнал Gate, фронт входного сигнала может появиться только в середине или даже в конце измерительного интервала, что вызовет сильный сдвиг начала интервала счета. Фронт входного сигнала в течение измерительного интервала T может не прийти вовсе, это должно расцениваться как попытка измерить частоту ниже 1/T и приводить к индикации нуля. Если реальный измерительный интервал задержан на какое-то время, для сохранения точности измерений микроконтроллер должен продлить сигнал Gate на такое же время. Аналогичная ситуация возникает и с окончанием интервала для этого требуется фронт входного сигнала, который может и не прийти. Поэтому микроконтроллер не просто формирует сигнал Gate заданной длительности, а работает по более сложному алгоритму. Микроконтроллер получает информацию о реальном измерительном интервале. Для опроса текущего состояния, которое требуется только во время счета, для экономии портов используется линия последовательного порта SDATA. Установив сигнал Gate, микроконтроллер ждет начала интервала счета. Если в течение измерительного интервала подтверждения начала счета нет, это означает, что входная частота слишком низкая или входной сигнал отсутствует. В таком случае индицируется ноль. Если подтверждение получено, микроконтроллер заново начинает отсчет измерительного интервала. По окончанию этого интервала микроконтроллер снимает сигнал Gate и ждет подтверждения окончания счетного интервала. Если подтверждение не появляется в течение еще одного счетного интервала, индицируется ноль. Если подтверждение есть, микроконтроллер считывает содержимое счетчиков CPLD, а также содержимое своих внутренних таймеров и переменных, в которых производился счет их переполнений. Из этих значений формируется число входных импульсов N и число импульсов опорной частоты M, на основе которых потом вычисляется частота входного сигнала. Реализация аналогового интерполятора Аналоговый интерполятор, примененный в частотомере FC-510, работает по принципу растяжки длительности импульса. Его схема приведена на рис. 15. Длительность растянутого импульса измеряется с помощью счетчика, который реализован в CPLD. В качестве компаратора используется входной логический элемент CPLD, порог которого составляет примерно 1.3 В. Генераторы зарядного и разрядного тока емкости интерполятора выполнены на транзисторах VT4 и VT5. Чтобы избежать переходных процессов, генераторы тока работают постоянно. Для выключения зарядного тока служит ключ на транзисторе VT3, который переключает зарядный ток на землю. Генератор разрядного тока при напряжении на емкости ниже некоторого значения выходит из линейного режима и перестает работать, но эта точка лежит ниже порога компаратора и на работоспособность схемы не влияет. В результате, внешняя схема, реализованная всего на трех транзисторах, дает увеличение разрешающей способности частотомера на два порядка. Если не считать, конечно,

16 задействованных для интерполятора ресурсов CPLD и фрагмента программы микроконтроллера. Рис. 15. Принципиальная схема интерполятора FC-510. Генератор разрядного тока, выполненный на транзисторе VT5, включен постоянно и обеспечивает ток разрядки около 400 мка. В исходном состоянии конденсатор интерполятора C3 разряжен до значения, соответствующего напряжению насыщения VT5. Генератор зарядного тока выполнен на транзисторе VT4 и также включен постоянно. Вместе с транзистором VT3 он образует переключатель тока. На базу транзистора VT3 через делитель R7R8 поступает импульс, подлежащий растяжке. Когда на выходе CPLD PulseOut присутствует логический ноль, транзистор VT3 открыт, а VT4 закрыт. Тока зарядки конденсатора при этом отсутствует. Когда на выходе PulseOut появляется единица, транзистор VT3 закрывается. При этом включается ток зарядки конденсатора интерполятора C3, в результате напряжение на нем начинает линейно нарастать. Когда импульс на выходе PulseOut заканчивается, ток зарядки прекращается. Поскольку генератор разрядного тока на VT5 работает всегда, тут же начинается процесс линейной разрядки конденсатора C3. Одновременно внутри CPLD запускается счетчик интерполятора. Как только напряжение на входе CPLD PulseIn становится ниже логического порога, счет прекращается. Конденсатор продолжает разряжаться дальше, причем по мере приближения к насыщению VT5 этот процесс становится нелинейным. Но это никак не влияет на работу интерполятора, к этому времени счетчик уже содержит значение измеренного интервала. При работе частотомера появляются два интервала случайной длительности, которые необходимо измерить. Один из этих интервалов (Tb) появляется в начале интервала счета, другой (Te) в конце. Поскольку длительность интервала счета достаточно большая (для FC-510 она лежит в пределах 1 мс 10 с), для измерения интервалов Tb и Te можно использовать одну схему аналогового интерполятора. За время интервала счета растянутый импульс Tb заведомо успеет закончиться, и интерполятор будет готов к измерению интервала Te. Как было сказано выше, интервалы времени Tb и Te, подлежащие измерению, лежат в диапазоне от 0 до Tref, т.е. они могут быть очень короткими. Короткие импульсы не в состоянии включить генератор зарядного тока, быстродействие которого ограничено.

17 Поэтому возле нуля будет наблюдаться заметная нелинейность. Чтобы избежать этой проблемы, управляющая логика, реализованная в CPLD, удлиняет управляющие импульсы для генераторов тока ровно на один период опорной частоты Tref. Это осуществить очень просто, так как окончание интервалов Tb и Te как раз приходится на фронт сигнала Fref. В результате, длительность импульсов, подлежащих растяжке, лежит в диапазоне от Tref до 2Tref. Как и любая аналоговая схема, аналоговый интерполятор подвержен действию различных дестабилизирующих факторов, таких как колебания температуры, нестабильность напряжения питания, дрейф параметров компонентов. Кроме того, компоненты аналогового интерполятора имеют некоторые начальные отклонения номиналов. Все это делает обязательным процесс калибровки. В результате калибровки необходимо определить точное значение коэффициента растяжки импульса. Калибровка не требует каких-либо дополнительных аппаратных затрат и может быть полностью автоматизирована. При калибровке логика интерполятора, реализованная в CPLD, формирует импульсы PulseOut длительностью Tref и 2Tref. Полученные результаты считываются из счетчика интерполятора и в дальнейшем используются при расчетах длительности интервалов. Калибровка интерполятора несколько усложняется тем, что заряд конденсатора начинается не от нуля, а от неизвестного значения (напряжения насыщения VT5). К тому же, точный порог срабатывания компаратора тоже неизвестен. Тем не менее, замерив две калибровочные точки, можно узнать все необходимые характеристики интерполятора. Рис. 16. Калибровка интерполятора. Пусть длительность импульса, подлежащего растяжке, равна Tx. За время S напряжение на конденсаторе C3 увеличится от своего начального значения до порога компаратора. Преодолев этот порог, напряжение продолжит рост и к моменту окончания импульса достигнет некоторого значения. После окончания импульса напряжение на конденсаторе начнет линейно уменьшаться и через время N достигнет порога компаратора. Время N мы измеряем с помощью счетчика, реализованного в CPLD. Время N связано с временем Tx соотношением: N = k (Tx S), где k отношение зарядного тока к разрядному. На этапе калибровки на интерполятор по очереди подаются импульсы длительностью Tref и 2Tref. В результате имеем систему из двух уравнений, решив которую, можно найти значения двух неизвестных k и S. На практике это делать не нужно. Дело в том, что при измерении частоты не стоит задача измерения отдельно взятых интервалов времени, а требуется измерить лишь разницу интервалов Tb Te. В этом случае неизвестную S можно исключить.

18 Пусть при калибровке на интервале 2Tref получилось значение длительности N1, а на интервале Tref значение N2. Учитывая, что N1 = k (2Tref S), а N2 = k (Tref S), разность результатов N1 N2 = k ((2Tref S) (Tref S)) = k Tref. Откуда k = (N1 N2) / Tref. Для запуска процедуры калибровки микроконтроллер формирует специальный сигнал, который поступает на вход CPLD CalibIn. Этот сигнал во многом аналогичен сигналу GateIn, но только не запускает измерение входной частоты. В начале сигнала CalibIn логика интерполятора производит измерение интервала 2Tref, а после окончания сигнала интервала Tref. После чего микроконтроллер может прочитать значение N1 N2. Длительность процесса калибровки не превышает двух циклов работы интерполятора, каждый из которых при Fref = 10 МГц длится не более 30 мкс. Поэтому калибровку можно проводить довольно часто. В FC-510 она проводится в начале и в конце каждого цикла измерения частоты. Полученные два значения коэффициента k усредняются. При измерении частоты с помощью полученной разности кодов счетчика интерполятора Nb Ne и полученного при калибровке коэффициента k можно определить разность интервалов Tb Te = (Nb Ne) / k. Теперь достаточно добавить полученную разность к значению измеренного интервала счета M, чтобы получить в k раз более точное значение этого интервала и во столько же раз повысить разрешающую способность частотомера. Поскольку и при калибровке, и при измерении используется только разница длительностей растянутых импульсов, нет необходимости передавать в микроконтроллер отдельно величины Nb и Ne. Счетчик, реализованный в CPLD и служащий для измерения длительности растянутого импульса, сделан реверсивным. При измерении Tb он работает на сложение, а при измерении Te на вычитание. Так можно обойтись всего одним счетчиком и в конце измерения передать в микроконтроллер готовую разность Nb Ne. Надо отметить, что это возможно только при измерении частоты, а также длительности больших временных интервалов, когда измерения коротких импульсов Tb и Te разнесены по времени. Если требуется точно измерить длительность короткого одиночного импульса, то понадобятся два отдельных аналоговых интерполятора, для каждого из которых в процессе калибровки нужно будет определить коэффициенты k и S. Выбор опорного генератора Метод обратного счета совместно с аналоговым интерполятором позволяют добиться очень высокого разрешения частотомера. При этом на первое место выходит погрешность, связанная с источником опорной частоты. Начальная погрешность частоты опорного генератора может быть учтена при калибровке частотомера. Но его временная и температурная нестабильность будут в полной мере сказываться на результате измерения частоты. Существуют различные варианты реализации опорного генератора, начиная с обычного кварцевого генератора, заканчивая квантовыми эталонами частоты. Они существенно отличаются по стоимости, габаритам, энергопотреблению. Сравнительные характеристики опорных генераторов разных типов приведены в таблице 2.

19 Таблица 2. Характеристики опорных генераторов. Тип опорного генратора Обычный кварцевый генератор (XO) Термокомпенсированный кварцевый генератор (TCXO) Термостабилизированный кварцевый генератор (OCXO) Генератор с синхронизацией от GPS Рубидиевый генератор Начальное отклонение частоты, ppm Температурная стабильность, ppm/ C Для любительского частотомера достаточной будет стабильность, которую обеспечивает термокомпенсированный кварцевый генератор (TCXO). При эксплуатации прибора в лабораторных условиях у хороших TCXO отклонение частоты не превышает 0.1 ppm. При желании можно применить и термостатированный генератор (OCXO), но его габариты и энергопотребление значительно выше. Применение более точных генераторов внутри частотомера вряд ли оправдано. Как вариант, можно предусмотреть возможность подключения внешней опорной частоты. Некоторый интерес представляет идея, используемая в генераторах с микропроцессорной стабилизацией (MCXO). В них в тепловом контакте с кварцевым резонатором находится датчик температуры. Для каждого значения температуры микроконтроллер по таблице компенсирует частоту генератора. Для таких генераторов типичный температурный коэффициент частоты обычно не превышает ppm/ C. В вычислительном частотомере ситуация еще проще не обязательно иметь точную и стабильную опорную частоту. Достаточно в каждый момент времени эту частоту знать. Поэтому для частотомера существует возможность пассивной термостабилизации, когда для каждого значения температуры микроконтроллер использует свое значение опорной частоты, взятой из таблицы. Достоинством метода перед активной термостабилизацией является нулевое время готовности к работе и отсутствие затрат энергии на нагрев элементов опорного генератора. Недостатком пассивной термостабилизации является необходимость построения таблицы температурной зависимости частоты для конкретного генератора. Базовый вариант частотомера FC-510 использует термокомпенсированный опорный генератор (TCXO). Частота этого генератора может лежать в широких пределах, конкретное значение частоты задается в меню. Наиболее распространенной является опорная частота 10 МГц. Именно такую выходную частоту имеют многие рубидиевые генераторы и генераторы, синхронизированные от GPS. В случае необходимости их можно использовать в качестве внешнего источника опорной частоты. Среди распространенных TCXO можно еще назвать генераторы на частоту 12.8 МГц и 13 МГц. Их тоже можно использовать в качестве опорного генератора частотомера. Чаще всего TCXO имеют синусоидальную форму выходного сигнала, поэтому частотомер FC-510 содержит формирователь опорного сигнала, собранный на транзисторах VT1 и VT2. С выхода формирователя сигнал поступает на CPLD, для этого задействован вход глобального клока GCLK2. Тактирование микроконтроллера может осуществляться этим же сигналом, который с CPLD подается на вход XTAL1. Но при этом в программе все константы должны соответствовать выбранной опорной частоте. Намного универсальнее вариант тактирования микроконтроллера от встроенного RC-генератора частотой 8 МГц. Тогда опорную частоту можно менять без перепрошивки микроконтроллера.

20 Входной тракт частотомера В зависимости от назначения частотомера требования к его входной части различаются. Универсальные частотомеры, способные работать в очень широком диапазоне частот, часто имеют два, а иногда и три раздельных входных разъема. Входной формирователь частотомера должен обеспечивать заданную чувствительность и заданное входное сопротивление. Первый вход обычно является низкочастотным. Он используется в полосе частот от DC до МГц. На таких частотах согласование входного импеданса частотомера и волнового сопротивления кабеля еще не требуется, так как кабель для таких длин волн представляет собой короткую линию. Поэтому обычно такой вход делают высокоомным. Предпочтительным является выбор таких же параметров входного импеданса, как у входов осциллографов (типично 1 МОм параллельно с пф). Тогда совместно с частотомером можно использовать стандартные осциллографические щупы с делителями. Второй вход обычно используется для измерения высоких частот, от десятков мегагерц до единиц или десятков гигагерц. Такой вход обычно имеет входное сопротивление 50 Ом. Низкочастотный вход В наиболее простых частотомерах низкочастотный вход обычно имеет связь по переменному току и нулевой порог, а его чувствительность задается гистерезисом компаратора. Такой вход подходит для многих случаев, но в более универсальных частотомерах есть возможность связи по постоянному току и регулировки порога. Особенно это актуально для частотомеров, предназначенных для работы в низкочастотном диапазоне. Рис. 17. Принципиальная схема входной части частотомера FC-510.

21 Входной формирователь FC-510 собран на отдельной плате, которая закреплена параллельно передней панели. Входной разъем низкочастотного входа частотомера имеет импеданс 1 МОм 30 пф, что типично для входов осциллографов. Сигнал с входного разъема поступает на переключатель S1 «AC/DC», который позволяет выбрать закрытый (accoupled) и открытый (dc-coupled) вход. Закрытый вход необходим для измерения частоты сигналов, которые имеют значительную постоянную составляющую. В то же время, он может не подойти для сигналов с изменяющейся скважностью, так как при этом будет меняться уровень нулевой линии. Входной динамический диапазон частотомера определяется как область линейной работы входного усилителя. Для частотомера высокая линейность входного усилителя не является настолько важной, как, например, для осциллографа. Однако из-за эффектов насыщения усилителя его скоростные характеристики могут ухудшиться, что может привести к искажениям счета. Кроме того, любой усилитель имеет ограниченный диапазон допустимых входных напряжений, поэтому всегда должна применяться защита от перенапряжений. Нужно иметь в виду, что при срабатывании защиты может упасть входное сопротивление. Для возможности измерения сигналов большой амплитуды и чтобы избежать перегрузок входного усилителя, входной блок частотомера имеет аттенюатор 1:10, отключаемый кнопкой S2 «1:10/1:1». Кроме устранения перегрузок усилителя, аттенюатор уменьшает влияние шумов. На самом деле, аттенюатор переключается между значениями 1:2 и 1:20. Это вызвано тем, что при напряжении питания аналоговой части ±5 В диапазон входных напряжений довольно мал. А с аттенюатором 1:2 он достигает ±5 В, что является наиболее практичным. С аттенюатором 1:20 входной диапазон составляет ±50 В, что тоже достаточно для большинства случаев. При измерении частоты более высоковольтных сигналов можно использовать стандартный осциллографический щуп с делителем 1:10. Другой положительной стороной использования аттенюаторов 1:2 и 1:20 является повышение надежности защиты от перенапряжений. В случае аттенюатора 1:1 входной разъем связан с входом усилителя через низкоомную цепь. При перегрузке по напряжению по ней будет протекать значительный ток. А для аттенюатора 1:2 с входным сопротивлением 1 МОм последовательно с входом усилителя оказывается включенным сопротивление 500 ком. Это существенно упрощает реализацию защиты, достаточно диодной сборки VD1. В качестве VD1 применена сборка BAV199, имеющая малый ток утечки. Недостатком применения аттенюаторов 1:2 и 1:20 является необходимость их частотной компенсации (аттенюатор 1:1 ее не требует). Это удваивает количество подстроечных элементов во входной цепи. Надо признаться, схемотехника входного аттенюатора в частотомере FC-510 не очень удачная. Причина кроется в том, что на первоначальном этапе проектирования ставилась задача переключать аттенюатор одной контактной группой. Для таких условий задача решена хорошо. Но использованные кнопочные переключатели имеют две контактные группы. Вполне можно было сделать два полностью независимых аттенюатора и коммутировать их по входу и выходу. Это сделало бы полностью независимой регулировку частотной компенсации. С другой стороны, в частотомере не требуется получения идеально плоской АЧХ, как, например, в осциллографе. С выхода аттенюатора сигнал поступает на вход буферного усилителя, который часто называют каскадом преобразования импедансов. Фактически он представляет собой истоковый повторитель на полевом транзисторе VT1, за которым следует эмиттерный повторитель на транзисторе VT3. Поскольку частотомер имеет режим открытого входа (dccoupled), то становится важным неискаженная передача постоянной составляющей. Сами по себе транзисторные каскады справляются с этим довольно плохо, поэтому введена сервопетля на ОУ U1, которая выравнивает постоянную составляющую на входе и выходе

Разработка простого частотомера на базе FPGA

На выходных

Прежде всего, я желаю всем вам счастливого китайского Нового года.

Справочник статей

Одна из больших работ в маленьких классах.

Я делал это раньше, потому что это был вопрос национального конкурса, а затем я искал в Интернете полдня. Все материалы измеряются с одинаковой точностью. Затем я просто выбрал другой …

Принцип измерения частоты

Существует три наиболее распространенных метода измерения частоты.

Прямое измерение

Измерьте количество импульсов измеренного сигнала в течение заданного времени затвора (обычно 1 с) и преобразуйте, чтобы получить частоту измеренного сигнала.

Периодическое измерение

Измеряя количество импульсов измеряемого сигнала за один цикл, частота измеряемого сигнала затем преобразуется.

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

Комплексное измерение

Предположим, что фактическое время затвора равно t, а число циклов измеренного сигнала равно Nx, затем он измеряет частоту измеренного сигнала в течение нескольких циклов, а затем преобразует частоту измеренного сигнала, чтобы преодолеть зависимость точности измерения от измеренного сигнала. Основная идея алгоритма состоит в том, чтобы синхронизировать сигнал затвора с тестируемым сигналом и управлять временем затвора t до целого числа, кратного периоду тестируемого сигнала. Во время измерения предварительно установленный вентиль открывается первым. Когда обнаруживается, что тестируемый вентиль закрыт, стандартный сигнал не прекращает отсчет немедленно. Вместо этого он останавливается, когда поступает обнаруженный импульс сигнала, и завершает целое число циклов тестируемого сигнала. измерения. Фактическое измеренное время затвора может не совпадать с заданным временем затвора, но максимальная разница не превышает одного цикла тестируемого сигнала.

Процесс измерения частоты

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

Между прочим, я также написал процесс, который я использовал, чтобы выполнить национальный вопрос F чемпионата 2015 года

Формирование схемы

Он состоит в том, чтобы сформировать измеряемый сигнал в импульсный сигнал (прямоугольная волна), который может быть распознан счетчиком. Это немного сложнее. Многие люди думают, что нужно только реализовать высокоскоростной компаратор, но на самом деле, для измерения сигнала каждой амплитуды, сигнал должен быть Ограничение, AGC (автоматическая регулировка усиления), поднятие и последующее сравнение (прослушивание заявления г-на Чжу о снижении шума). Ожидание различных операций, но на самом деле оборудование написано другим небольшим партнером @ , поэтому Не волнуйтесь слишком сильно … Кажется, что есть чип, который напрямую реализует вышеуказанную обработку.

Общая рамка ПЛИС

Предыдущее заявление:

  1. Модуль последовательного порта, использованный в этом дизайне, был заменен старшим братом из Black Gold … либо продавать рекламу, либо просто объявлять …
  2. Версия кода v0.1, которая может быть реализована примерно, но не оптимизирована и не удалена. Оптимизированная версия сигнала будет использоваться в качестве следующего назначения малого класса …
  3. При первом чтении не рекомендуется читать исходный код

Описание порта

  1. ensig — это вывод управления внешним ключом, используемый для открытия шлюза (для отладки)
  2. sig — это входной сигнал
  3. rx — управляющий сигнал, возвращаемый последовательным портом 32
  4. tx — значение выходной частоты

Таймер 1с

Запись немного избыточна, в основном потому, что операций на две больше, чем внешних:

  1. Я не использовал асинхронный для запуска этого таймера (в противном случае я всегда писал его всегда @ensig, я решил использовать трехступенчатый синхронный сигнал запуска
  2. Две контрольные линии (сигналы) изолированы, start_up и op_reg.
module timer_1s(
     clk,rst_n,en_sig,
     gate_control      //Выходной сигнал управления
);
input 	 clk; 
input 	 rst_n; 
input  	 en_sig; 

output 	 gate_control; 

reg [1:0] en_sig_edge;
reg [1:0] en_sig_edge_n;
reg start_up;
reg [31:0]  count;
reg op_reg;
always @(posedge clk or negedge rst_n)
begin
     if(!rst_n)
     begin
        en_sig_edge  <= 2'b0;
     end
     else
     begin
        en_sig_edge <= en_sig_edge_n;
     end
end

always @(*)
begin
     if(!rst_n)
     begin
       en_sig_edge_n = 2'b0;
     end
     else
     begin
        en_sig_edge_n = {en_sig_edge[0],en_sig};
     end
end

always @(posedge clk or negedge rst_n)
begin
     if(!rst_n)
     begin
         count <= 31'b0;
         op_reg <= 1'b0;
     end
     else
     begin
         if(start_up && count!= 31'd49999999)   
         begin
           count  <= count + 1'b1;
           op_reg <= 1'b1;
         end
         else
         begin
           count  <= 31'b0;
           op_reg <= 1'b0;
         end
     end
end


always @(posedge clk or negedge rst_n)
begin
   if(!rst_n)
     begin
         start_up <= 1'b0;
     end
	else if(count == 31'd49999999)
		begin 
			start_up <= 1'b0;
		end
   else if(start_up == 1'b1)
     begin
         start_up <= start_up;
     end
   else if(count == 31'b0)
     begin
         start_up <= en_sig_edge[0]^en_sig_edge[1];
     end
     else
         begin
         start_up <= start_up;
        end

end

assign gate_control = op_reg;

endmodule

Модуль измерения частоты

Первый взгляд на Excel

Метод прямого измерения слишком прост, не говоря уже о счетчике …
Использование двусторонних ребер фактически позволяет каждому записать регистр двустороннего сдвига ребра, фактически достаточно подсчитать одно ребро.

Видно, что мой модуль измерения частоты и сигнал затвора могут быть неактуальными, но из-за требований проблемы я продолжу выводить эти номера циклов, а затем выполню обработку данных для stm32, потому что это приведет к гораздо большему количеству результатов. Иметь дело с.

Основными задачами являются:

  1. Создайте часы 200M с PLL для подсчета и обнаружения краев
  2. Я написал сдвиговый регистр, срабатывающий по обоим краям
  3. Используется двухэтапный цикл расчета конвейера (то есть формула выше)
  4. Написать демо (duty_count) измерения рабочего цикла

module FRE_SINE_CHECK_MODULE(
     clk,rst_n,gate,sig,
     fre_count,duty_count
);
input 	 clk; 
input 	 rst_n; 
input 	 	gate; 
input 	 	sig; 
output 	[31:0] 	fre_count; 
output	[31:0]	duty_count;

wire clk_200;
wire locked;

pll_200 pll_module(
    . en_sig_edge[1];        //Обнаружить двусторонние края

reg [31:0] time_record[3:0];
always @(posedge clk_200 or negedge rst_n)
begin
    if(!rst_n)
    begin
        time_record[0] <= 32'b0;
        time_record[1] <= 32'b0;
        time_record[2] <= 32'b0;
        time_record[3] <= 32'b0;
    end

    else if(gate == 1'b0 )
    begin
        time_record[0] <= 32'b0;
        time_record[1] <= 32'b0;
        time_record[2] <= 32'b0;
        time_record[3] <= 32'b0;
    end

    else
    begin
        if(edge_turn)
            begin
            time_record[0] <= counter;
            time_record[1] <= time_record[0];
            time_record[2] <= time_record[1];
            time_record[3] <= time_record[2];
            end 
        else
            begin
            time_record[0] <= time_record[0];
            time_record[1] <= time_record[1];
            time_record[2] <= time_record[2];
            time_record[3] <= time_record[3];
            end
    end
end

reg [31:0] pipe_add_1;
reg [31:0] pipe_add_2;
reg [31:0] pipe_result;

always @(posedge clk or negedge rst_n)
begin
     if(!rst_n)
     begin
        pipe_add_1 <= 32'b0;
        pipe_add_2 <= 32'b0;
     end
     else
     begin
        pipe_add_1 <= time_record[0] + time_record[1];
        pipe_add_2 <= time_record[2] + time_record[3];
     end
end

always @(posedge clk or negedge rst_n)
begin
     if(!rst_n)
     begin
        pipe_result  <= 32'b0 ;
     end
     else
     begin
        pipe_result <= pipe_add_1 - pipe_add_2;
     end
end

reg [31:0] duty_count_reg;
always @(posedge sig or negedge rst_n)
begin
     if(!rst_n)
     begin
        duty_count_reg  <= 32'b0 ;
     end
     else
     begin
			if(gate == 1'b1)
				duty_count_reg <= time_record[0] - time_record[1];
			else
				duty_count_reg <= 32'b0;
     end
end

assign duty_count = duty_count_reg;
assign fre_count = pipe_result;

endmodule

Последовательный порт + часть stm32

Отвечает за отображение на дисплее и преобразование цикла вывода fpga в частоту. Поскольку последовательный порт использует черное золото, stm32 не входит в мои обязанности, поэтому я не буду здесь останавливаться на этом.

Вывод

Если вы случайно прочитали исходный код, а затем расстроились и проскользнули до конца, вы можете захотеть взглянуть на исходный код и взглянуть на слова и картинки … в конце концов, это оригинальный исходный код, который не был упорядочен (или даже искусственно созданные грамматические ошибки)

Как вы можете видеть, на самом деле его принцип чрезвычайно прост, подходит новичкам для начала и знаком с грамматикой verilog. Маленькие одноклассники и младшие старые собаки, кажется, начинают изучать этот язык. Возможно, попытайтесь объединить книгу профессора Ся Юйвэня, чтобы попытаться

Небольшое продвинутое домашнее задание: разбирайтесь в исходном коде (небольшая часть исходного кода и большинство комментариев было удалено для вас), избыточные части логики и ошибки удаляются

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

Еще раз настоятельно рекомендую, чтобы редактор cddn md мог добавить поддержку языка verilog …

Канал благодарности

ЧАСТОТОМЕР


   У многих радиолюбителей в закромах валяется немало старых микросхем серии К155, в связи с чем возникает вопрос об их использовании. Как вариант предлагается для сборки неплохой частотомер с цифровой индикацией. Собранный частотомер позволяет измерять частоту синусоидальных гармонических и импульсных электрических колебаний от единиц Герц до десятков мегагерц и амплитудой от 0,15 до 10 В, а также считать импульсы сигнала. Структурная схема частотомера показана на рис. 1 Работа прибора основана на подсчете числа импульсов в течении определенного – образцового интервала времени. 


   Исследуемый сигнал подается на вход формирователя импульсного напряжения. На его выходе формируются электрические колебания прямоугольной формы, соответствующие частоте входного сигнала, которые далее поступают на электронный ключ. Сюда же через устройство управления поступают и импульсы образцовой частоты, открывающие ключ на определенное время. На выходе электронного ключа появляется пачка импульсов. Число импульсов в пачке подсчитывает двоично-десятичный счетчик Его состояние после закрывания ключа отображает блок цифровой индикации, работающий в течение длительности образцового импульса, т.е. одной секунды. 
В режиме счета импульсов управляющее устройство блокирует источник образцовой частоты, двоично-десятичный счетчик ведет непрерывный счет поступающих на его вход импульсов, а блок цифровой индикации отображает результаты счета.


   Принципиальная схема частотомера показана на рис. 2. Формирователь импульсов напряжения собран на микросхеме К155ЛД1 (DD1) и представляет собой усложненный триггер Шмитта. Резистор R1 ограничивает входной ток, а диод VD1 защищает микросхему от перепадов входного напряжения отрицательной полярности. Резистор R3 ограничивает нижний предел напряжения входного сигнала. С выхода формирователя (вывод 9 микросхемы) импульсы прямоугольной формы поступают на один из входов логического элемента DD11.1, выполняющего функцию электронного ключа. 


   В блок образцовых частот входят генератор на элементах DD2.1 – DD2.3, частота импульсов которого стабилизирована кварцевым резонатором ZQ1 и семи ступенчатый делитель частоты на микросхемах DD3 – DD9. Частота кварцевого резонатора равна 8 МГц. Микросхема DD3 делит частоту на 8, а микросхемы каждой последующей ступени делят частоту на 10. Частота импульсов на выходе DD9 равна 1 Гц. Диапазон измеряемых частот устанавливается переключателем SA1. Для более точного измерения частоты сигнала переключателем SA1 необходимо выбирать соответствующий диапазон измерения, переходя от более высокочаcтотного участка к низкочастотному. Управляющее устройство состоит из триггера DD10.1 и DD10.2 инверторов DD11.3, DD11.4 и транзистора VT1, образующих ждущий мультивибратор. На вход С триггера DD10.1 поступают импульсы с блока образцовой частоты и он переключается в единичное состояние и сигналом логической 1 открывает электронный ключ DD11.1 С этого момента импульсы измеряемой частоты проходит через ключ и инвертор D11.2 и поступают на вход счетчика DD12. По фронту следующего импульса DD10.1 принимает исходное состояние и переключает в единичное состояние триггер DD10.2.


   В свою очередь триггер DD10.2 уровнем логического нуля на инверсном выходе блокирует вход управляющего устройства от воздействия импульсов образцовой частоты, а уровнем логической единицы на прямом выходе запускает ждущий мультивибратор. Электронный ключ закрывается, уровнем логического 0 на прямом выходе DD10.1. Начинается индикация числа импульсов в пачке, поступающих на вход счетчика. С появлением уровня логической 1 на прямом выходе триггера DD10.2 через резистор R9 начинает заряжаться конденсатор C3. По мере его зарядки увеличивается напряжение на базе транзистора VT1. Когда оно достигает 0.6 В, транзистор откроется и напряжение на его коллекторе уменьшится почти до нуля. Появляющийся при этом на выходе элемента DD11.3 сигнал логической 1 воздействует на вход R0 микросхем DD12, DD14, DD16, в результате чего счетчик сбрасывается на 0. Индикация измерения прекращается. Одновременно сигнал логического 0 появляется на выводе 11 инвертора DD11.4, переключает триггер DD10.2 и ждущий мультивибратор в исходное состояние. Конденсатор C3 разряжается через диод VD2 и микросхему DD10.2. С появлением на входе DD10.1 очередного импульса образцовой частоты, начинается следующий цикл работы прибора в режиме измерения. Чтобы частотомер перевести в режим непрерывного счета импульсов, переключатель SA2 установить в положение «счет». В этом случае триггер DD11.1 переключается и на его прямом выходе появляется 1. Ключ DD11.1 оказывается открытым и через него непрерывно поступают импульсы на вход счетчика импульсов. Показания счетчика сбрасываются нажатием кнопки «сброс». Блок питания частотомера (рис.3) состоит из трансформатора Т1, выпрямителя VD3, стабилизатора напряжения VD5, VT2 и фильтра на конденсаторах С9 – С11, обеспечивает напряжение 5 В для питания микросхем.


   Напряжение с обмотки III трансформатора через диод VD5 подается в цепи питания газоразрядных цифровых индикаторов. Конструкция и детали. Детали частотомера смонтированы на печатных платах. В качестве индикаторов применены газоразрядные индикаторы ИН1. Трансформатор блока питания Т1 выполнен на магнитопроводе ШЛ 20х32. Обмотка 1 содержит 111650 витков провода ПЭВ-1 0.1, обмотка 2 содержит 55 витков ПЭВ-1 0.47, обмотка 3 – 1500 витков провода ПЭВ-1 0.1. Транзистор Т2 установлен на радиаторе. Вместо формирователя импульсов на микросхеме К155ЛД1 можно собрать формирователь по схеме рис. 4

   Кроме того в конструкции увеличено количество цифровых индикаторов до пяти и соответственно количество микросхем счетчика К155ИЕ2 и дешифраторов К155ИД1. Расширение цифровой индикации дает более удобное отображение информации. Налаживание прибора сводится к проверке правильности монтажа и измерении питающих напряжений. Правильно собранный частотомер уверенно выполняет свои функции. Естественно вакуумные индикаторы можно заменить на более современные, светодиодные типа АЛС, а микросхемы на аналогичные новых серий.

   Форум по измерительной технике

   Форум по обсуждению материала ЧАСТОТОМЕР



MINILED И MICROLED ДИСПЛЕИ

Что такое OLED, MiniLED и MicroLED телевизоры — краткий обзор и сравнение технологий.



МИКРОФОНЫ MEMS

Микрофоны MEMS — новое качество в записи звука. Подробное описание технологии.


ПРОВОДНИКИ И ИЗОЛЯТОРЫ

Что такое изолятор и чем он отличается от токопроводящего материала. Занимательная теория радиоэлектроники.


STM32. Настройка RCC в «железе».

Как и обещал, перехожу к вопросам настройки тактирования микроконтроллера STM32F100C4. Эта статья родилась из ковыряния в носу с простейшим макетом и многосерийными танцами вокруг вопросов настройки узлов МК.
Прежде всего, распечатайте себе структурную схему (дерево) системы тактирования из документа RM0041 Reference manual STM32F100xx advanced ARM-based 32-bit MCUs (стр.71).
Это позволит наглядно отслеживать «путь» тактовых импульсов от источников по всему контроллеру, анализировать делители, разветвители и пр. Причём рассмотрение структурной схемы полезно, и даже необходимо для всех субблоков и узлов микроконтроллера.
?так, прошлые опыты мне показали, что ядро контроллера работает на частоте 36 МГц, несмотря на утверждение техдокументации о максимальной частоте 24 МГц для STM32F100C4. Нужно разобраться в причинах этого явления…
Вдумчивое чтение юзермануала обнажило очень полезную «фишку» в микроконтроллерах рассматриваемого семейства. В них имеется вывод MCO (смотрим на структурную схему, зеленая птичка), на который возможно подавать один из 4-х тактирующих сигналов: — делённый на 2 выходной сигнал умножителя PLL; — выход внутреннего RC-генератора HSI; — выход внешнего кварцевого генератора HSE; — системный тактовый сигнал SYSCLK. «Полезность» же вывода MCO заключается в возможности использовать его для тактирования внешних устройств аппаратно, без задействования программных ресурсов, ну, и, конечно, в возможности вывода на него различных клоков МК и контроля их осциллографом. Напишем пару строчек кода чисто для «погонять сигналы».
Подключаем осциллограф, выбрав сигнал SYSCLK входным для MCO (раскомментировав соответствующую строку). Да, реально частота 36 МГц.
Прохожу в симуляторе пошагово  инициализацию камня и причина находится без особого труда. Смотрим скриншот ниже
При выполнении функции SetSysClockTo24 установки частоты 24 МГц (максимальной в зависимости от типа выбранного нами семейства контроллера) оная рассчитывается по формуле  PLL configuration  = (HSE / 2) * 6 = 24 MHz , подразумевая, что внешний кварц  HSE  — 8 МГц. У нас же HSE  — 12 МГц, естественно, что 12/2 * 6 = 36. Как видите, при частоте ядра контроллера большей чем максимальная на треть, работа вполне стабильна!!! Хотя на некоторых форумах я встречал посты в которых народ пишет о нестабильной работе узлов микроконтроллера в таком режиме. Однако, разработчики почему-то ограничили максимальную частоту для STM32F100C4 на уровне 24 МГц, и, наверное, имели все для этого основания! Поэтому множитель PLLMULL и мы изменим с 6 на 4 (смотрите скриншот). После таких изменений частота становится, как и должна быть — 24 МГц.
Согласно инициализации микроконтроллера, которую я отслеживал в режиме отладки, «путь» тактового сигнала от его источника (внешнего кварца) до потребителей отмечен на структурной схеме в начале статьи красным сплошным, а красным пунктиром —  вывод его на МСО.
Для закрепления своих знаний по настройкам тактирования STM32F100C4 советую в приведённом проекте в файле инициализации поизменять различные настройки тактового сигнала: источники, коэффициенты делителей, умножителей и пр., и пронаблюдать на экране осциллографа, как изменения в программе меняют тактирование в «железе». Если при этом перед глазами будут распечатанная структурная схема и описания управляющих регистров — то процесс уяснения, несомненно, пройдёт гораздо плодотворнее.

Запись опубликована в рубрике ARM с метками Keil, STM, измерения. Добавьте в закладки постоянную ссылку. Пример режима счетчика

STM32 — счетчик частоты с модулем таймера Как настроить таймер как счетчик, и какие возможны варианты настройки. И мы сделаем пару практических лабораторных работ, первая из которых представляет собой базовый цифровой счетчик, а вторая — мини-проект счетчика частоты. Давайте погрузимся в это!


   Необходимые компоненты для лабораторных работ    

 

Все примеры кода/лабораторных работ/проектов в курсе будут выполняться с использованием указанных ниже плат.

★ Ознакомьтесь со списком комплектов полного курса

Некоторое чрезвычайно полезное тестовое оборудование для устранения неполадок:

Раскрытие партнерской информации: Если вы нажмете на ссылку в этом разделе и сделаете покупку, это может привести к тому, что этот сайт заработает комиссию. Партнерские программы и членство включают, помимо прочего, партнерскую сеть eBay (EPN) и Amazon.com.


   Лаборатория режима счетчика STM32 Предисловие          

 

Как мы обсуждали в предыдущем руководстве, модули таймера могут работать в режиме счетчика.Где таймер тактируется от внешнего источника (входной контакт) и подсчитывает количество импульсов. Однако модули таймера STM32 имеют несколько режимов для самого режима подсчета. Вот краткое описание каждого из них, но в конце дня мы будем использовать режим прямого счета.

1 Режим обратного счета

В режиме обратного счета счетчик считает от 0 до значения автоматической перезагрузки (содержимое регистра TIMx_ARR), затем перезапускается с 0 и генерирует событие переполнения счетчика.Событие Update может генерироваться при каждом переполнении счетчика или установкой бита UG в регистре TIMx_EGR (с помощью программного обеспечения или с помощью контроллера ведомого режима).

2 Режим обратного счета

В режиме обратного счета счетчик ведет отсчет от значения автоматической перезагрузки (содержимое регистра TIMx_ARR) до 0, затем перезапускается со значения автоматической перезагрузки и генерирует потерю значения счетчика. мероприятие. Событие Update может генерироваться при каждом опустошении счетчика или путем установки бита UG в регистре TIMx_EGR (с помощью программного обеспечения или с помощью контроллера ведомого режима).

3 Режим с выравниванием по центру (вверх/вниз)

В режиме с выравниванием по центру счетчик считает от 0 до значения автоперезагрузки (содержимое регистра TIMx_ARR) – 1, генерирует событие переполнения счетчика, затем считает от значения автоматической перезагрузки до 1 и генерирует событие опустошения счетчика. Затем он перезапускает счет с 0. В этом режиме бит направления (DIR из регистра TIMx_CR1) не может быть записан. Он обновляется аппаратно и выдает текущее направление счетчика.


STM32 Counter LAB9 Задачи

Counter Mode — Базовый цифровой счетчик
  • Настройка общих целевого таймера (TIM2) для работы в режиме счетчика
  • Установите значение предварительной загрузки на 20, чтобы счетчик переполнялся после 20 тиков и генерировал прерывание
  • Установите вход GPIO таймера
  • Настройте модуль USART1 для печати тиков счетчика значение для его мониторинга
  • Вывести специальное сообщение в процедуре ISR (событие переполнения счетчика), чтобы проверить, правильно ли выполняются функции срабатывания и обработки прерывания
  •  


     

    6

    Шаг1: Открыть CubeMx & Создать новый проект

    Шаг2: Выберите цель MCU и дважды щелчок его имени

    STEP3: Настройка Timer2 Perifigrable для работы в Counter Mode

    Примечание. что теперь источником синхронизации является внешний контакт (входной контакт timer2 ETR2), который, как вы можете видеть, выделен как A0 . Мы также можем настроить цифровой фильтр для этого входного канала, чтобы подавлять шум из-за дребезга переключателя.Значение фильтра может варьироваться от 0 до 15. И последнее, но не менее важное: выбор края для счетчика. Я хочу, чтобы счетчик подсчитывал каждый нарастающий фронт входного контакта.

    Я также включу функцию автоматической перезагрузки и установлю верхний предел счета на 20 «значение предварительной загрузки». Теперь всякий раз, когда счетчик считает 20 тиков, он переполняется и генерирует сигнал прерывания!

    9002

    STEP4: Включить сигнал прерывания таймера в NVIC Tab

    STEP5: Configure Module USArt1 Для работы в Async Mode с 9600BPS

    STEP6: Установить внешний источник RCC Source

    Шаг 7. Перейдите к настройке часов

    Шаг 8. Установите системные часы на 72 МГц или любое другое значение

    . Использование

     

    Затем откройте проект в используемой среде IDE.И перейдите к файлу main.c. Итак, мы можем начать писать код приложения и взглянуть на код инициализации, сгенерированный инструментом STM32 CubeMX.


    Прикладной код в Cubeide

    Вот сгенерированный код инициализации в Main.cile

    1

    2

    3

    4

    5

    6

    7

    7

    8

    8

    9

    10

    12

    11

    13

    12

    13

    12

    14

    13

    15

    16

    17

    18

    19

    20

    19

    21

    20

    21

    22

    23

    24

    #include «main.h «

    tim_handletypedef htim2;

    uart_handletypedef huart1;

    void systemclock_config (void);

    Статическая пустота mx_gpio_init (void);

    Статическая пустота mx_tim2_init (void);

    статическая пустота mx_usart1_uart_init void);

    int main (void)

    {

    hal_init ();

    systemclock_config ();

    mx_gpio_init ();

    mx_tim2_init ();

    mx_usart1_uart_init ();

    (1)

        {

     

        }

    }

    Теперь приложение, которое мы сейчас разрабатываем, предназначено для многократного считывания строки с терминала Timer2 для подсчета тактов через UART1 и вывода значения мониторинг.И всякий раз, когда он достигает 20, срабатывает прерывание. И это тот же сигнал прерывания из предыдущего урока, и у него будет та же функция-обработчик.

    Итак, откройте файл stm32f1xx_it.c, чтобы найти обработчик прерывания таймера, которым является функция TIM2_IRQHandler(). Наведите указатель мыши на функцию HAL_TIM_IRQHandler() и щелкните правой кнопкой мыши, чтобы перейти к ее реализации.

    void TIM2_IRQHandler(void)

    {

     

      HAL_TIM_IRQHandler(&htim2);

     

    }

    После перехода к процедуре обработки прерывания таймера вы найдете следующую реализацию.В этом коде мы ищем имя функции обратного вызова, которая вызывается при возникновении прерывания по переполнению. Вы можете заметить, что все источники имеют одинаковый выход сигнал прерывания.

    9

    10

    10

    11

    12

    13

    13

    14

    15

    16

    17

    16

    18

    17

    18

    20

    19

    20

    21

    22

    23

    22

    23

    void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)

    {

      // Другой таймер прерывает события..

    // ..

    // ..

    // ..

    // ..

    // ..

    / * TIM Обновление события * /

    Если (__hal_tim_get_flag (htim, tim_flag_eupdate)! = Сброс)

    {

    , если (__hal_tim_get_it_source ( htim, TIM_IT_UPDATE) != RESET)

        {

          __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE);

          #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1)

            htim->PeriodElapsedCallback(htim);

          #else

            HAL_TIM_PeriodElapsedCallback(htim);

          #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */

        }

      }

      //..

      //..

      // Другие события прерывания таймера..

    }

    Теперь у нас есть имя функции обратного вызова, которая вызывается всякий раз, когда происходит переполнение таймера. Это HAL_TIM_PeriodElapsedCallback(). Итак, напишем для него свою реализацию в файле приложения (main.c). И стоит упомянуть, что вы также должны включить (запустить) таймер, чтобы он синхронизировался и начал считать, иначе он останется бездействующим.

    Полный код LAB (главн.C)

    1

    2

    3

    4

    6

    5

    6

    7

    8

    70002 9

    8

    9

    10

    11

    12

    13

    12

    13

    14

    15

    16

    170002 16

    17

    18

    19

    19

    21

    20

    22

    21

    23

    22

    21

    23

    25

    24

    25

    240002 26

    25

    27

    28

    27

    28

    29

    30

    31

    32

    32

    33

    34

    35

    35

    36

    37

    37

    38

    39

    39

    40

    41

    #include «Main.h»

     

    TIM_HandleTypeDef htim2;

     

    UART_HandleTypeDef huart1;

     

    uint8_t END_MSG[35] = «Переполнение достигнуто! Сброс счетчика! \ N \ r «;

    void systemclock_config (void);

    Статическая пустота mx_gpio_init (void);

    Статическая пустота mx_tim2_init (void);

    Статическая пустота mx_usart1_uart_init (void);

    INT MAIN (void)

    {

    uint8_t msg [20] = {‘\ 0’};

    uint16_t counterticks = 0;

    hal_init ();

    systemclock_config ();

    mx_gpio_init ();

    MX_TIM2_INIT ();

    MX_USART1_UART_INIT ();

    HAL_TIM_BASE_START_IT (& HTIM2);

    В то время как (1)

    {

    // Читайте счетчик щипновений щипцов

    counterticks = TIM2-> CNT;

    // Распечатать количество тиков через UART1

            sprintf(MSG, «Ticks = %d\n\r», CounterTicks);

            HAL_UART_Transmit(&huart1, MSG, sizeof(MSG), 100);

    (

         _) ;

    }

    }

    }

    // Счетчик переполнения ISR обработчик ISR

    void hal_tim_periodelapsedcallback (tim_handletypedef * htim)

    {

    hal_uart_transmit (& huart1, end_msg, sizeof (end_msg), 100);

    }

     

    Соберите и запишите код и давайте проверим результаты!

     

    Примечание : стоит отметить, что вы должны запускать таймер в режиме прерывания, чтобы он синхронизировался и запускал сигнал прерывания при переполнении и так далее.В противном случае таймер вообще не будет работать.

    HAL_TIM_Base_Start_IT(&htim2);



    2

    0

    0

    Шаг1: Подключите ST-Link на USB Port & SWD Pins На плате

    Шаг 2: Нажмите кнопку отладки, чтобы скомпилировать код, записать его на плату и начать сеанс отладки

    Шаг 3: Вы можете остановить сеанс отладки или продолжить его.Но вам нужно перезапустить MCU один раз, чтобы запустить новое приложение в процессе загрузки.

    Загрузка Countermode Lab9 Project

    Результаты для этой лаборатории

    Push-кнопка -> A0

    USArt1 -> USB-TTL Pins

    Тестовые видео

    Примечание : даже при установке фильтра входного канала на максимальное значение, контакт все еще улавливает некоторый дребезжащий шум от кнопки, а значение счетчика иногда перескакивает на несколько делений.Таким образом, может потребоваться внешний RC-фильтр на входном контакте или какие-либо средства аппаратного подавления дребезга.

    0 1 STM32 Counter — LAB10

    10
    Lab Labout 10
    Лабораторное название Модуль таймера в Counter Mode — частота счетчик мини-проекта
    • Настройте TIM2 в качестве счетчика и подключите его входной контакт к источнику сигнала. циклов в ISR TIM3, считывая тики счетчика TIM2 и умножая это значение на 20, вы получите фактическую частоту сигнала.
    • Configure USART1 в Async Mode с скоростью передачи данных = 9600бин
    • Распечатать вычисляемую частоту к последовательному порту клемма



    STM32 CHASTACT CHANTER Project Lab

    в этой лаборатории, наша цель — построить система, измеряющая частоту цифрового сигнала с помощью модуля таймера в режиме счетчика. Основная идея этого метода состоит в том, чтобы настроить другой таймер в режиме таймера и заставить его переполнять каждый конкретный интервал времени.Скажем, 50 мс ради этого эксперимента. Каждые 50 мс таймер переполняется и запускает сигнал прерывания, а в ISR мы проверим количество тиков в регистре счетчика. Это значение представляет собой количество полных циклов сигнала каждые 1/20 секунды. Таким образом, фактическая частота сигнала равна значению счетчика CNT, умноженному на 20.

    Примечание : это не лучший способ измерения частоты. Тем не менее, это должно быть доказательством концепции и дать вам представление о том, как совместно настроить несколько периферийных устройств для выполнения конкретной задачи.Недостатки этого метода будут упомянуты в конце лабораторной работы после просмотра окончательных результатов.

    Шаг 1: Открыть cubexx & Создать новый проект

    STEP2: Выберите цель MCU и дважды щелчок его имени

    Шаг 3. Настройка Timer2 Perifigrabe для работы в Counter Mode

    Step4: Configure Периферийное устройство Timer3 для работы в режиме таймера (Tout = 0,05 с)

    F CLK равно 72 МГц, я буду использовать прескалер со значением 100.Итак, найдя значение регистра предварительной загрузки. Получается 36000. Поэтому пропишем это значение во вкладке конфигурации.

    Включить прерывания Timer3 на вкладке управления NVIC.

    STEP5: Configure USART1 Модуль для работы в Async Mode с 9600BPS

    Шаг6: установить RCC внешний источник часов

    STEP7: Перейти к конфигурации часов

    STEP8: Установите системные часы Чтобы быть 72 МГц

    STEP9: Имя и генерировать код инициализации проекта для кубиджа или IDE, вы используете

    Вот прикладной код для этой лаборатории

    1

    2

    3

    4

    5

    5

    6

    7

    8

    8

    10

    11

    12

    13

    14

    13

    14

    15

    16

    17

    18

    17

    18

    19

    20

    21

    22

    22

    23

    240002 23

    25

    25

    26

    27

    28

    29

    30

    31

    32

    32

    33

    34

    34

    35

    36

    38

    38

    39

    40

    3

    41

    40

    41

    42

    43

    44

    #include «главный.h «

    uint32_t gu32_counterticks = 0x00;

    uint32_t gu32_freq = 0x00;

    uint8_t gu8_msg [40] = {‘\ 0’};

    tim_handletypedef htim2;

    tim_handletypedef htim3;

    uart_handletypedef huart1;

    Void SystemClock_config (void);

    Статическая пустота mx_gpio_init (void);

    Статическая пустота mx_tim2_init (void);

    Статическая пустота mx_tim3_init (void);

    Статическая пустота mx_usart1_uart_init (void);

    INT Main (void)

    {

    hal_init ();

    systemclock_config ();

    mx_gpio_init ();

    mx_tim2_init ();

    mx_tim3_init ();

    mx_usart1_uart_init ();

    hal_tim_base_start (& htim2) ;

        HAL_TIM_Base_Start_IT(&htim3);

        в то время как (1)

        {

     

        2

    0

    3  

    }

    }

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)

    {

        if(htim->Instance == TIM3)

        {

            gu32_CounterT

            gu32_Freq = gu32_CounterTicks * 20;

            sprintf(gu8_MSG, «Частота = %d Гц\n\r», gu32_Freq);

            HAL_UART_Transmit(&huart1, gu8_MSG, sizeof(gu8_MSG), 100);

            TIM3->CNT = 0;

            TIM2->CNT = 0;

    }

    }

    }

    Полученные сообщения UART могут быть декодированы DSO

    , как вы можете увидеть на моем экране DSO, декодированное сообщение показывает 2020 Гц для сигнала 2 кГц, что довольно близко.

     

    Полученные сообщения UART на терминале последовательного порта (тестовое видео) ценность. Это не постоянная фиксированная ставка, поэтому мы можем легко компенсировать ее в коде. А также характер ошибки предполагает, что она повторяема и может быть вызвана несколькими причинами. Прежде всего, прерывание таймера (каждые 50 мс) является асинхронным сигналом.Он поступает не синхронно с входным сигналом, поэтому следует ожидать небольшой дрейф в измерении.

    Другой момент заключается в том, что задержка прерывания также может способствовать небольшому увеличению количества тиков. И очистка обоих TIM2,3 в конце ISR может немного помочь. Мы действительно можем устранить этот процент ошибок с помощью некоторых калибровок. Однако у этой техники есть и будет много ограничений. Период таймера (50 мс) определяет минимально допустимый входной сигнал, который может быть обнаружен и измерен.

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

     


     

     

    Следите за выходом новых руководств и не забывайте ДЕЛИТЬСЯ ими.И подумайте о ПОДДЕРЖКЕ этой работы, чтобы продолжать публиковать бесплатный контент!

     

     

    Подобно этому:

    Нравится Загрузка…

    Связанные

    Сеть обмена стеками

    Сеть Stack Exchange состоит из 179 сообществ вопросов и ответов, включая Stack Overflow, крупнейшее и пользующееся наибольшим доверием онлайн-сообщество, где разработчики могут учиться, делиться своими знаниями и строить свою карьеру.

    Посетите биржу стека
    1. 0
    2. +0
    3. Войти
    4. Зарегистрироваться

    Электротехника Stack Exchange — это сайт вопросов и ответов для специалистов в области электроники и электротехники, студентов и энтузиастов.Регистрация занимает всего минуту.

    Зарегистрируйтесь, чтобы присоединиться к этому сообществу

    Любой может задать вопрос

    Любой может ответить

    Лучшие ответы голосуются и поднимаются на вершину

    спросил

    Просмотрено 8к раз

    \$\начало группы\$

    Этот вопрос в основном является запросом совета.

    Пытаюсь реализовать частотомер на STM32F4. На данный момент у меня есть работающий преобразователь АЦП с DMA и таймером, который проверяет текущее значение напряжения и ловит пересечение нуля (с запасом) и считает счетчик.

    Теперь, как лучше всего определить фактическую частоту? В смысле — полагаться на скорость таймера или использовать RTC?

    Или есть способ лучше определить частоту?

    спросил 19 марта 2013 в 12:38

    Артурс ВанкансАртурс Ванканс

    72311 золотой знак1212 серебряных знаков2222 бронзовых знака

    \$\конечная группа\$ \$\начало группы\$

    Я бы использовал схему детектора перехода через ноль (погуглите — их множество, очень просто), а затем (в зависимости от частоты, которую вы пытаетесь измерить) либо использовал таймер/счетчик захвата ввода для автоматизации подсчета, просто читая & сброс счетчика с заданными интервалами измерения (намного меньше нагрузка на ЦП) или использование входных импульсов для стробирования быстрого счетчика (для подсчета НИЗКОЙ частоты) и вычисления обратного (для низких частот проще измерить время, затрачиваемое на импульс, а не чем количество импульсов, накопленных за период времени).

    Любой из них должен оставить вашему процессору очень мало тяжелой работы.

    Добавить комментарий

    Ваш адрес email не будет опубликован.