[Home] [Donate!] [Контакты]

Частотомер на основе микроконтроллера STM32 с конвейерным измерением частоты - 2

Рассматриваемый здесь частотомер выполняет измерения методом обратного счёта с конвейеризацией.

Частотомер построен на микроконтроллере STM32F100RB (тактовая частота 24 МГц), но подойдут микроконтроллеры STM32 и многих других типов (возможно, потребуется небольшая адаптация программы). Желательно выбирать микроконтроллер с высокой максимальной тактовой частотой для получения высокого верхнего предела измерения.

Внешний вид частотомера (макетная плата).
Рис. %img:ph0

Основные характеристики:

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

Дополнительные функции:

Отображаемая информация:

Кнопки управления:

Величины для интервала измерения и интервала отсчёта могут быть изменены путём модификации программы. Допустимы значения в пределах от порядка 100 мкс (или даже десятков мкс) до примерно 178 с (при тактовой частоте 24 МГц); в данном приборе предусмотрена возможность выбора одного из трёх значений: 0.2, 0.5 или 1 с (с помощью кнопки выбора интервала измерения). Малый интервал измерения делает прибор более отзывчивым и позволяет отследить более быстрые изменения частоты; зато, с увеличением интервала, снижается относительная погрешность счёта. В то же время, слишком малый интервал бесполезен при визуальном считывании информации, т.к. пользователь не будет успевать отследить быстро изменяющиеся показания; а слишком большой интервал затрудняет работу тем, что прибор становится слишком инерционным. Исходя из этих соображений, и был выбран небольшой набор значений для интервала, которые можно выбирать в процессе измерений.

Оглавление
Частотомер на основе микроконтроллера STM32 с конвейерным измерением частоты - 2
Введение
Устройство частотомера
Программа частотомера
Дальнейшее совершенствование прибора
Смотрите также
Частотомер на основе микроконтроллера STM32 [Измерения по запросу]
Частотомер на основе микроконтроллера STM32. Конвейерный принцип измерения частоты
Таймеры в микроконтроллерах STM

Введение

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

Однако рассмотренный там частотомер является скорее примером для демонстрации принципов метода цифрового измерения частоты (конвейерного метода обратного счёта) и малопригоден для применения на практике из-за ряда серьёзных недостатков. Самый неприятный из них - наличие строгих ограничений на временные характеристики сигнала (ограничения на длительность импульсов и длительность пауз между импульсами), в результате чего даже невозможно точно указать верхний предел измерения, т.к. максимально допустимая частота сигнала зависит от скважности импульсов. Второй существенный недостаток - не гарантируется успешность каждого измерения в области низких частот (вблизи нижнего предела измерения), при этом вероятности "неуспешности" увеличивается по мере снижения частоты. Неуспех проявляется в том, что измерение даёт нулевой результат для частоты, несмотря на то, что в действительности частота сигнала превышает нижний предел измерения для метода при выбранном интервале измерения.

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

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

Устройство частотомера

В качестве основы для частотомера выбрана оценочная плата STM32VLDISCOVERY с микроконтроллером STM32F100RB. Для отображения информации используется недорогой дисплей LCD с контроллером ST7735s; разрешение дисплея составляет 128*160. Дисплей имеет несколько вариантов исполнения с разными типами интерфейса, здесь выбран вариант с 4-х проводным последовательным интерфейсом, являющимся модификацией интерфейса SPI.

Для построения частотомера необходимо просто соединить два указанных компонента (схема изображена на рисунке %img:interc); требуемое количество дополнительных элементов минимально (несколько необязательных резисторов и две кнопки управления режимами работы).

Схема частотомера.
Рис. %img:interc

Для питания, программирования и отладки устройства можно пользоваться возможностями встроенного отладчика оценочной платы. Если отключить встроенный отладчик (в STM32VLDISCOVERY для этого надо убрать перемычки с разъёма CN3), то можно воспользоваться внешними средствами программирования и отладки (подключаются через PA13, PA14 - линии SWDIO, SWCLK интерфейса SWD). После того, как программа записана во FLASH-память микроконтроллера, частотомер может использоваться автономно, если подать на него питание от внешнего источника с напряжением 3.3 В.

Для управления режимами работы частотомера используются две кнопки на оценочной плате ("USER button" - кнопка "Mode" частотомера; "RESET" - кнопка "Reset" частотомера). Кроме того, имеется две внешние кнопки, подключаемые соответственно к PC0 (кнопка "Interval") и PC1 (кнопка "Hold"). Кнопка "Mode" при нажатии устанавливает высокий уровень на входе микроконтроллера, к которому подключена кнопка (PA0). Остальные кнопки при нажатии устанавливают низкий уровень на соответствующих выводах микроконтроллера. Когда эти кнопки отпущены, высокий уровень на соответствующих выводах микроконтроллера формируется встроенными подтягивающими резисторами (для вывода сброса он всегда включен; для остальных выводов подтягивающий резистор должен быть включен в процессе конфигурирования выводов).

Дисплей подключён через интерфейс SPI микроконтроллера (устройство SPI1). Кроме того, для управления дополнительными линиями (RES, RS), которых нет в интерфейсе SPI, используются выводы PB6 и PB7 микроконтроллера. Вывод CS дисплея подключён к выводу PA4/SPI1_NSS микроконтроллера, который здесь используется как вывод порта общего назначения (не как линия SPI). Такое решение связано с тем, что в выбранном микроконтроллере аппаратное управление линией SPI_NSS реализовано откровенно слабо.

Заметим, что дисплей допускает постоянное подключение вывода CS к общему проводу (тогда дисплей будет всегда в состоянии "выбран"). В этом случае вывод PA4 микроконтроллера остаётся свободным, а подключения дисплея немного упрощается (потребуется на одну линию меньше).

Приведённая выше схема необходима для сборки прибора, но она не объясняет используемый принцип измерения частоты. Поэтому перейдём к рассмотрению структурной схемы частотомера (рис. %img:bd).

Структурная схема частотомера с конвейерным измерением частоты методом обратного счёта.
Рис. %img:bd

Структурная схема показывает, как организовано взаимодействие таймеров микроконтроллера, входящих в состав системы измерения частоты. Взаимодействие таймеров осуществляется за счёт их внутренних входов/выходов, для чего достаточно лишь настроить таймеры соответствующим образом; какие-либо внешние соединения не требуются, система из таймеров с требуемой структурой формируется чисто программно.

В качестве входа частотомера используется вход ETR (PD2) таймера TIM3. Таймер TIM3 у нас работает как делитель частоты входного сигнала. Важная особенность входов ETR в таймерах микроконтроллеров STM состоит в наличии асинхронного делителя (с управляемым коэффициентом деления), в то время как на других входах таймеров устанавливаются схемы ресинхронизации. Схема ресинхронизации есть и на входе ETR, но она расположена уже после асинхронного делителя. Благодаря такому построению входной цепи таймера, удаётся снять дополнительные ограничения на входной сигнал, обусловленные наличием схемы ресинхронизации (смотрите также подробнее о входных цепях таймеров). Это при условии, что коэффициент деления для асинхронного делителя выбран таким образом, что частота сигнала на выходе делителя не превышает половины тактовой частоты таймера (системного тактового сигнала в нашем случае).

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

Сигнал с выхода асинхронного делителя таймера TIM3 выбран в качестве входного сигнала для счётчика этого таймера. Коэффициент пересчёта для счётчика задан минимальным, равным 2 (регистр TIM3_ARR = 1). Сигнал переполнения счётчика используется в качестве внутреннего выходного сигнала таймера TRGO, частота которого и измеряется далее подключённым к нему измерителем частоты. Итого, частота сигнала на TIM3_TRGO в 8 раз меньше частоты входного сигнала (что должно быть учтено при вычислении конечного результата измерения).

Наличие делителя частоты на входе частотомера увеличивает верхний предел измерения, но, одновременно с этим происходит увеличение нижнего предела (для заданного интервала измерения). При коэффициенте деления 8, нижний предел измерения составит $$ f_{min} = 8 / \tau, $$ где \( \tau \) - интервал измерения, в то время как без делителя, нижний предел равен \( 1 / \tau \).

Если возникает необходимость в измерении очень низких частот, имеет смысл программно снизить коэффициент деления входного асинхронного делителя частоты до 2 (общий коэффициент деления таймера тогда составит 4, а нижний предел измерения \( 4 / \tau \)).

Собственно схема измерения частоты образована двумя однотипными, синхронно работающими линиями измерения. Первая линия построена на таймерах TIM4, TIM1; вторая - на таймерах TIM15, TIM2.

Каждая из линий измерения работает таким же образом, как это подробно описано в статье "Частотомер на основе микроконтроллера STM32. Конвейерный принцип измерения частоты". Не будем повторять здесь то же самое. Отметим лишь те особенности, которые связаны с использованием двух линий измерения.

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

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

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

Рисунки поясняют процесс измерения при наличии двух линий. Рассматриваемый промежуток времени включает момент фиксации по последнему (перед выполнением отсчёта) фронту сигнала и процесс выполнения отсчёта. Момент отсчёта обозначен вертикальной стрелкой. Отсчёт включает в себя две фазы: отсчёт в первой линии и отсчёт во второй линии, которые образуют единую последовательность и на основании которых определяется окончательный результат. Сначала отключаются фиксации в первой линии и считываются результаты из неё, затем линия включается, после чего те же действия выполняются для второй линии (отключение фиксации, чтение, включение фиксации). Промежутки времени, когда фиксация в таймерах линии отключена для выполнения отсчёта, показаны заштрихованными прямоугольниками. Маленькими красными кружочками отмечены моменты фиксации в линиях измерения (если фиксация в этой линии произошла).

Выполнение отсчёта при использовании двух линий измерения частоты.
Рис. %img:l1

Если фронт сигнала приходится на момент, когда в обеих линиях разрешены фиксации (рис. %img:l1), то при выполнении отсчёта получим одинаковые результаты для обоих каналов.

Выполнение отсчёта при использовании двух линий измерения частоты.
Рис. %img:l2

Если фронт сигнала попадает в промежуток времени, когда выполняется отсчёт для первой линии и там фиксация отключена (рис. %img:l2), то это гарантирует, что в данный момент разрешены фиксации во второй линии. Затем, когда будет выполняться отсчёт во второй линии, фиксация будет выявлена и её результаты будут использованы в качестве итогового результата отсчёта.

Выполнение отсчёта при использовании двух линий измерения частоты.
Рис. %img:l3

Если фронт сигнала попадает в промежуток времени, когда фиксация отключена во второй линии, а, значит, в первой фиксации разрешены (рис. %img:l3), то в первой линии будет выполнена фиксация по этому фронту. Но учтены её результаты будут уже при следующем отсчёте (если они не будут обновлены новыми фиксациями), а в качестве результата данного отсчёта будет принят результат самой последней фиксации, произошедшей перед началом выполнения данного отсчёта.

Единственная проблема, которую остаётся решить, чтобы описанная схема измерений оказалась работоспособной - обеспечить синхронный запуск двух линий измерения частоты. С таймерами TIM4, TIM15 (входные таймеры линий измерения) всё просто - пока отключен счётчик входного для частотомера таймера TIM3, эти таймеры не получают счётный сигнал. Поэтому для их начальной синхронизации достаточно установить одинаковые значения для счётчиков этих таймеров и включить их до того, как будет разрешён счёт для таймера TIM3.

С таймерами TIM1, TIM2 дело обстоит немного сложнее. Они считают импульсы тактового сигнала, т.е. начинают счёт сразу после того, как счёт будет разрешён. Поэтому необходимо обеспечить их одновременный запуск. Для этого, непосредственно перед запуском, структурная схема частотомера перестраивается таким образом, как это изображено на рисунке %img:bds (благо такая перестройка выполняется чисто программными средствами).

Схема соединения таймеров частотомера для их синхронного запуска.
Рис. %img:bds

Оба таймера (TIM1, TIM2) настраиваются для работы в подчинённом режиме с управлением по внутренним входам ITR3, которые подключены к внутреннему выходу TRGO таймера TIM4. Для таймеров TIM1, TIM2 выбирается режим "Trigger Mode", который предполагает запуск входным импульсом, после чего счёт продолжается независимо от состояния входа. Так как запускающий импульс таймеры получают от общего источника (выход TIM4_TRGO), то гарантируется одновременность запуска счётчиков обоих таймеров; далее они будут работать синхронно, т.е. значения счётчиков этих таймеров в любой момент будут совпадать (конечно, если они стартовали с одинаковых начальных значений). Формирование выходного импульса TIM4_TRGO выполняется программно.

После запуска TIM1, TIM2, перестраиваем структуру соединений между таймерами в соответствии со схемой частотомера в рабочем режиме. Такие перестройки допустимы даже при работающих таймерах.

Программа частотомера

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

Вся функциональность, связанная с измерением частоты реализуется в файле main.cpp. Этот код можно использовать отдельно, в других проектах.

main.cpp

Другие файлы проекта:

control.h
control.cpp
Отвечают за координацию всей работы устройства. Файл control.cpp содержит обработчик прерываний от системного таймера, который с заданными интервалами запрашивает последние результаты измерения частоты сигнала, обновляет информацию на дисплее, контролирует состояние кнопок и обрабатывает их нажатия.
display.h
display.cpp
Содержат код, отвечающий за вывод результатов измерений на дисплей (первоначальный вывод статичной информации; преобразование чисел в строку и последующий вывод строкового представления чисел на экран).
font.h
font8x8.h
font8x8.cpp
Файлы определяют таблицу символов, которая необходимая для вывода текстовой информации на графический дисплей.
st7735s.h
st7735s.cpp
Упрощённая библиотека с минимальным набором функций для вывода информации на LCD.

Эти, а также другие (служебные) файлы можно найти в следующем архивном файле с проектом:

fc_001.zip

Дальнейшее совершенствование прибора

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

Отметим некоторые изменения, которые следует внести для совершенствования рассмотренного частотомера.

Что касается аппаратной части, то, прежде всего, напрашиваются следующие изменения:

Требует совершенствования интерфейс прибора (большинство усовершенствований являются программными):

Если говорить о программной реализации, то было бы полезно перейти от чисел типа float к типу double. Использование типа float уменьшает размер программы и увеличивает скорость вычислений (по крайней мере, если в микроконтроллере отсутствует аппаратная поддержка чисел с плавающей точкой). Однако точность, обеспечиваемая типом float, оказывается недостаточной даже для приборов начального уровня.

Смотрите также
Частотомер на основе микроконтроллера STM32 [Измерения по запросу]
Частотомер на основе микроконтроллера STM32. Конвейерный принцип измерения частоты
Таймеры в микроконтроллерах STM

hamper, 2021-03-23
  Рейтинг@Mail.ru