Оглавление:
- Шаг 1: Цифровое частотное разделение
- Шаг 2: Рекомендуемое оборудование
- Шаг 3: Схема
- Шаг 4: Код и измерение низких частот
Видео: Как измерить высокую частоту и рабочий цикл одновременно с помощью микроконтроллера: 4 шага
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:52
Я знаю, что вы думаете: «А? Есть много инструкций о том, как использовать микроконтроллеры для измерения частоты сигнала. Зевок». Но подождите, в этом есть новинка: я описываю метод измерения частот намного выше, чем может выдержать микроконтроллер (MCU), и рабочий цикл сигнала - и все это одновременно!
Диапазон частот устройства составляет от ~ 43 Гц до ~ 450 кГц, а рабочий цикл составляет от 1% до 99%.
Позвольте мне объяснить часть «может выдержать»: MCU измеряет период прямоугольного сигнала T, отслеживая время между двумя последующими переходными событиями. Например, на одном из контактов ввода-вывода происходит скачок напряжения с низкого на высокое. Он делает это путем подсчета количества импульсов собственных внутренних часов. Наивно, что верхний предел измеряемых частот должен подчиняться теореме выборки Найквиста-Шеннона; то есть она будет примерно равна половине тактовой частоты микроконтроллера. На самом деле предел намного, намного ниже, потому что MCU должен выполнять код для обработки прерываний, сохранения переменных, выполнения арифметических операций, отображения результатов и т. Д. В моих экспериментах с MCU 48 МГц минимальное количество тактовых циклов между измеримыми переходами было около 106. Следовательно, верхний предел измеряемого диапазона частот в этом случае будет 48 000/212/2 = 226,4 кГц.
В то время как MCU измеряет период сигнала, он также может определять ширину его импульса P: время, в течение которого напряжение сигнала остается высоким. Другими словами, время между переходами от низкого к высокому и от высокого к низкому. Затем рабочий цикл сигнала определяется как следующий процент:
Пошлина = 100% * P / T
Как и в случае с частотой, существует практический предел ширины импульса. Используя приведенный выше пример, 106 тактовых циклов ограничивают ширину импульса не менее 2,21 микросекунды. Или не менее 50% при 226,4 кГц.
Одним из способов повышения верхнего предела частоты прямоугольных сигналов является применение цифровых делителей, использующих триггеры. Разделение входной частоты на n расширит измеряемый верхний диапазон в n раз. Это отличная новость, у цифровых делителей есть один фундаментальный недостаток: разделенный сигнал теряет информацию о ширине импульса (и рабочем цикле)! Из-за принципа работы делителей их выходной цикл всегда составляет 50%. Облом…
Однако на следующих страницах я покажу, как разделить частоту в цифровом виде и сохранить исходную ширину импульса, что позволит мне измерять сигналы, выходящие далеко за пределы, налагаемые прямым счетом.
Шаг 1: Цифровое частотное разделение
В традиционных цифровых делителях частоты используются триггеры; в этом руководстве подробно объясняются принципы создания разделителей с использованием стандартных триггеров JK. Это решает проблему слишком высоких входных частот для микроконтроллера, но имеет один существенный недостаток: разделенный сигнал имеет коэффициент заполнения 50% независимо от коэффициента заполнения входного сигнала! Чтобы понять, почему это так, посмотрите на первые два рисунка. Исходный сигнал с периодом T и шириной импульса P подается на тактовый вывод триггера JK, в то время как его выводы J и K постоянно удерживаются на высоком уровне (первый рисунок). Логика 3.3V предполагается повсюду. Предположим, что триггер запускается положительным (т. Е. Нарастающим) фронтом часов. В этих условиях изменения состояния выходного вывода (отдельные «перевороты» и «флопы») происходят каждый раз, когда тактовый вывод переходит с низкого уровня на высокий. Переход часов от высокого к низкому уровню (то есть отрицательный фронт) полностью игнорируется. См. Второй рисунок. Выходной вывод Q излучает сигнал, период которого в два раза больше исходного периода, то есть его частота уменьшается вдвое. Ширина выходного импульса всегда равна T. Следовательно, исходная ширина импульса P теряется.
Добавление еще одного триггера JK в конфигурации, показанной на третьем рисунке, делит исходную частоту на 4. При добавлении большего количества триггеров таким же последовательным образом частота делится на последующие степени 2: 8, 16, 32 и т. Д.
Проблема: как разделить частоту прямоугольной волны при сохранении ширины импульса?
Идея состоит в том, чтобы правильно добавить к миксу триггер JK, срабатывающий по отрицательному фронту. Назовем это «Neg FF»; см. четвертый рисунок. Здесь «правильно» означает, что контакты J и K нового триггера связаны с выходными контактами Q и Qbar, соответственно, делителя на 4 («Pos FF»), показанного на предыдущем рисунке. (Здесь «полоса» - это горизонтальная полоса над символом Q, указывающая на логическое отрицание.) Чтобы увидеть, что это достигается, взгляните на таблицу функций «Neg FF» на пятом рисунке: выходные контакты Neg, Q и Qbar, отражают состояние входных контактов J и K соответственно. Это означает, что они отражают состояние Pos 'Q и Qbar. Но действие триггера Neg должно ждать отрицательного фронта исходного сигнала, который приходит в момент P после положительного фронта. Ага!
Результирующие формы сигналов показаны на шестом рисунке. «Pos Q» выводит сигнал с частотой 1/4, «Pos Qbar» является инверсным, «Neg Q» следует за «Pos Q», смещенным на ширину импульса P, а «Neg Qbar» - обратным. Вы можете проверить, что логическое И между «Pos Qbar» и «Neg Q» дает последовательность импульсов, характеризующуюся исходной шириной импульса P и 1/4 частоты. Бинго!
Сначала я использовал именно этот выходной сигнал для питания микроконтроллера. Однако это оказалось проблематичным для очень коротких импульсов из-за ограничения MCU на 106 циклов, упомянутого во введении. Я решил эту небольшую проблему, выбрав другой вывод: «Pos Qbar» И «Neg Qbar». Один взгляд на формы сигналов должен убедить вас в том, что ширина импульса этой конкретной формы сигнала, P ', варьируется от T до 2T вместо диапазона (0, T) для P. P можно легко восстановить из P' следующим образом:
P = 2T - P '
Шаг 2: Рекомендуемое оборудование
Мне действительно нравится относительный новичок для любителей электроники: микроконтроллеры Atmel SAM D21 на базе 32-битного процессора ARM Cortex M0 +, работающие с тактовой частотой 48 МГц, что намного выше, чем у старых Atmels. Для этого проекта я купил:
- Плата ItsyBitsy M0 Express MCU от Adafruit
- У меня случайно оказался литий-полимерный аккумулятор от Adafruit.
- Монохромный 128x32 SPI OLED-дисплей (как вы уже догадались: Adafruit)
- Двойной триггер JK с положительным фронтом SN74HC109 от Texas Instruments
- Двойной триггер JK с отрицательным фронтом SN74HC112 от Texas Instruments
- Счетверенный И гейт CD74AC08E от Texas Instruments
- Счетверенный вентиль OR CD74AC32E от Texas Instruments
Шаг 3: Схема
На первом рисунке показана упрощенная схема измерителя частоты / скважности. Логика CMOS 3,3 В предполагается повсюду. Следовательно, амплитуда входной прямоугольной волны должна быть между соответствующим VIH уровень (т. е. 2 В) и 3,3 В. Если нет, вам необходимо соответственно увеличить или уменьшить его. В большинстве случаев достаточно простого делителя напряжения. Если вы хотите разработать свою версию измерителя на другом логическом уровне, вам необходимо использовать другой микроконтроллер (MCU), батарею и дисплей, которые работают на желаемом уровне. Логические вентили и триггеры, используемые в этом проекте, работают с логическими уровнями от 2 В до 6 В и должны работать в большинстве случаев.
Как показано, MCU ItsyBitsy использует контакты 9-13 для связи с дисплеем через программный протокол SPI. Вывод 3V обеспечивает питание всей цепи. Цифровой входной вывод 3 принимает анализируемый сигнал, а выводы 2 и 4 управляют источником сигнала: либо прямой сигнал, проходящий через вентиль AND3 (низкие входные частоты), либо сигнал, разделенный на 4, через вентиль AND4 (высокие входные частоты), как описано в шаге 2. Код, обсуждаемый на следующем шаге, автоматически определяет входящий частотный диапазон и соответствующим образом переключает источник сигнала.
Схема не показывает истинную сложность подключения цифровых микросхем. На втором изображении показано, как проект будет выглядеть на макете. Входной сигнал поступает через красный провод на контакт 2CLK двойного триггера с положительным фронтом. ВНИМАНИЕ: Обычно все контакты J и K этого триггера должны находиться на высоком уровне, но SN74HC109, в частности, имеет контакт Kbar - перевернутый контакт K. Следовательно, этот вывод должен быть заземлен! Первый триггер с отрицательным фронтом в SN74HC112 имеет контакты 1K и 1J, подключенные к контактам 1Q и 1Qbar SN74HC109. Второй триггер в SN74HC112 не используется, а его входные контакты (2K, 2J, 2CLRbar) заземлены. Все остальные дополнительные контакты PREbar (предустановка) и CLRbar (очистка) во всех триггерах должны быть подключены к логическому уровню. Неиспользуемые тактовые и выходные контакты остаются неподключенными. Точно так же неиспользуемые входные контакты во всех затворах заземляются, а неиспользуемые выходные контакты остаются неподключенными. Как я уже говорил в своей инструкции «Невидимый убийца телефонного кольца», заземление неиспользуемых входных контактов логических микросхем устраняет случайные колебания и экономит заряд батареи.
Шаг 4: Код и измерение низких частот
Естественно, все действия происходят в приведенном ниже коде. Когда вход, поступающий на контакт 3, переключается с цифрового низкого на высокий, микроконтроллер начинает подсчет импульсов своего внутреннего тактового сигнала 48 МГц. Он отмечает момент перехода от высокого к низкому уровню и продолжает счет до следующего переключения с низкого на высокий, когда он снова перезапускает весь процесс. Первый счетчик представляет собой ширину импульса, а полный счет представляет собой период сигнала. И в этом весь секрет.
ЦП отмечает эти переходы через аппаратные прерывания. SAMD21 имеет несколько часов; мой код использует TC3 one. Первоначально я начал с чтения таблицы данных M0, приложив много усилий для кодирования обработчика прерываний, но вскоре я обнаружил очень много похожий код в сообщениях на форуме Arduino пользователей electro_95, MartinL и Rucus, чей вклад признано должным образом. Я включил и изменил их объединенный код в свой; сэкономив мне много времени!
Как я уже упоминал, разрешение сигнала ограничено ~ 106 циклами ЦП для выполнения кода между прерываниями. Цифровое деление с сохранением ширины импульса заботится о высоких частотах. С другой стороны, низкие частоты создают еще одну проблему: поскольку тактовый счетчик TC3 имеет длину 16 бит, он переполняется после пересечения предела 65 536 отсчетов. Можно справиться с этой ситуацией, добавив прерывание переполнения, но выбрав другое решение: TC3 может использовать предварительно масштабированные (то есть программно разделенные) тактовые частоты процессора вместо аппаратных 48 МГц. Таким образом, если период сигнала приближается к пределу переполнения, код может проинструктировать TC3 использовать отсчеты 24 МГц для следующего периода, и, вуаля, счетчик упадет ниже 32 768 отсчетов. Для еще более низких частот TC3 может быть проинструктирован для подсчета импульсов 12 МГц и т. Д. Соответствующий предварительный делитель автоматически определяется на основе частоты сигнала с гистерезисом, чтобы удерживать счетчик TC3 в пределах предела переполнения. В результате нижняя граница диапазона устройства составляет около 43 Гц.
Вы можете форкнуть код и использовать его в своем проекте, но, пожалуйста, указывайте его источник при публикации результатов.
Ссылка на код.
Рекомендуемые:
Как измерить конденсатор или индуктор с помощью MP3-плеера: 9 шагов
Как измерить конденсатор или индуктивность с помощью MP3-плеера: Вот простой метод, который можно использовать для точного измерения емкости и индуктивности конденсатора и катушки индуктивности без дорогостоящего оборудования. Методика измерения основана на сбалансированном мосте и может быть легко сконструирована из необх
Как сделать дрон с помощью Arduino UNO - Сделать квадрокоптер с помощью микроконтроллера: 8 шагов (с картинками)
Как сделать дрон с помощью Arduino UNO | Сделать квадрокоптер с помощью микроконтроллера: ВведениеПосетите мой канал на Youtube Дрон - очень дорогой гаджет (продукт) для покупки. В этом посте я собираюсь обсудить, как я могу сделать это дешево ?? И как вы можете сделать это своими руками по дешевой цене … Ну, в Индии все материалы (моторы, регуляторы
Управление двигателями постоянного тока с помощью L298N с помощью микроконтроллера CloudX: 3 шага
Управление двигателями постоянного тока с помощью L298N с помощью микроконтроллера CloudX: В этом проекте мы объясним, как использовать наш H-мост L298N для увеличения и уменьшения скорости двигателя постоянного тока. H-мостовой модуль L298N можно использовать с двигателями, которые имеют напряжение от 5 до 35 В постоянного тока. Также имеется встроенный регулятор 5 В, поэтому, если ваш
Как измерить угол с помощью MPU-6050 (GY-521): 3 шага
Как измерить угол с помощью MPU-6050 (GY-521): в этом руководстве мы будем измерять угол с помощью Arduino. Нам нужны кабели, Arduino UNO и GY-521 (MPU-6050) для измерения угла
Как измерить коэффициент мощности переменного тока с помощью Arduino: 4 шага
Как измерить коэффициент мощности переменного тока с помощью Arduino: Всем привет! Это мое третье руководство, надеюсь, вы найдете его информативным :-) Это будет инструктаж о том, как выполнить базовое измерение коэффициента мощности с помощью Arduino. Прежде чем мы начнем, нужно помнить о нескольких вещах: это будет работать ТОЛЬКО с