[Home] | [Donate!] [Контакты] |
Существуют два основных метода цифрового измерения частоты: метод прямого счёта и метод обратного счёта. В первом случае производится подсчёт количества импульсов входного сигнала за фиксированный промежуток времени (интервал счёта или интервал измерения). Во втором случае выполняется подсчёт количества импульсов эталонного генератора за один или несколько периодов исследуемого входного сигнала.
При использовании метода прямого счёта, значение, получаемое в счётчике в конце интервала измерения, оказывается пропорциональным частоте сигнала. А если выбран интервал, равный 1 секунде, результат счёта оказывается численно равен измеряемой частоте в герцах, что позволяет легко построить частотомер на простой "логике" (простой цифровой элементной базе). Ведь в этом случае не требуется выполнять преобразование результата счёта, достаточно его отобразить на индикаторе. Благодаря простоте, метод прямого счёта в своё время пользовался значительной популярностью.
Значение в счётчике, получаемое при использовании метода обратного счёта, пропорционально периоду исследуемого сигнала. То есть, для определения частоты, требуется выполнять преобразование результата - вычислять обратную величину. Уже только поэтому данный метод оказывается сложнее в реализации. Однако, он обеспечивает лучшую точность и более высокую скорость измерения и в настоящее время имеет смысл делать выбор именно в пользу этого метода. Прямой счёт сейчас скорее представляет исторический интерес. Тем не менее, далее рассмотрим подробно оба метода.
Возможно, также будет интересно:
Частота сигнала. Измерение частоты. Мгновенная и средняя частота
(рассматриваются вопросы о том, что такое частота сигнала, мгновенная частота, средняя частота; какую частоту измеряет частотомер и др.).
Оглавление
Наиболее простой способ измерения частоты состоит в подсчёте количества импульсов входного сигнала за определённый промежуток времени (за интервал измерения).
Функционирует частотомер, использующий данный способ измерения, следующим образом (рис. %img:bd0). Специализированный генератор интервалов измерения формирует на своём выходе импульс, длительность которого с высокой точностью равна заданному интервалу измерения \( \tau \). Импульс от генератора интервалов с помощью ключевой схемы управляет прохождением исследуемого входного сигнала на счётчик. В простейшем случае ключом может быть логический элемент "И". Счёт происходит только во время действия импульса от генератора интервалов, т.е. на протяжении интервала измерения. На основании подсчитанного счётчиком количества импульсов N за интервал измерения \( \tau \), вычисляется частота сигнала. Полученное значение отображается на индикаторе. После этого выполняется сброс счётчика, формируется новый интервал измерения и процесс измерения повторяется, обеспечивая регулярное обновление отображаемого на индикаторе результата.
В качестве генератора интервалов используют точный генератор (например, стабилизированный кварцевым резонатором) с делителем частоты. Коэффициент деления выбирают таким, чтобы получить требуемую длительность импульса, разрешающего счёт.
В общем случае, частота входного сигнала (точнее говоря, средняя за интервал измерения частота) может быть найдена как $$ f \approx N / \tau. $$
В самом деле, количество импульсов N входного сигнала, подсчитанных счётчиком за интервал измерения, с точностью до 1, равно количеству периодов входного сигнала, приходящихся на интервал измерения. То есть, если период входного сигнала равен T, то $$ \tau \approx N T, $$ а так как T = 1 / f, то $$ \tau \approx N / f, \\ f \approx N / \tau. $$
В частности, если выбрать интервал измерения равным одной секунде, то результат счёта за интервал измерения оказывается (приблизительно) численно равным частоте сигнала. Что неудивительно, так как частота - количество колебаний сигнала за 1 с. При таком выборе интервала измерения, всё, что требуется после завершения счёта импульсов - отобразить на индикаторе значение из счётчика (рис. %img:bd1). Особенно просто эта задача решается при использовании для подсчёта импульсов двоично-десятичного счётчика.
Не намного сложнее организовать отображение результата и при других интервалах измерения из ряда 10k (10 в целой степени). Например, при выборе интервала измерения 0.1 с, частота сигнала будет в 10 раз больше значения в счётчике, т.е. при отображении результата нужно просто дописать 0 справа к выводимому на индикатор числу. А, например, при интервале 10 с, частота сигнала в 10 раз меньше результата счёта и при выводе значения на индикатор следует отобразить десятичную точку перед крайней правой цифрой. Уменьшают интервал измерения для увеличения скорости измерений, увеличивают - для повышения точности.
Оценим погрешность измерения. Здесь будем учитывать только погрешность самого метода, считая генератор интервала измерения идеальным. Тем самым, сможем оценить предельную точность данного метода измерения частоты.
Заметим, что количество импульсов N входного сигнала, подсчитанных счётчиком за интервал измерения, является целочисленными приближением количества периодов сигнала \( \tau / T \) за этот интервал, которое, в общем случае, является дробной величиной. Можно показать, что N равно количеству периодов сигнала за интервал измерения с точностью \( \pm 1 \).
Предположим, счётчик подсчитывает импульсы входного сигнала по его фронтам. Если входной сигнал и генератор интервалов не синхронизированы, то в зависимости от частоты сигнала и его начальной фазы, промежуток времени \( \Delta {\tau}_1 \) от начала интервала измерения до первого фронта может изменяться в пределах 0..T, смотрите рис. %img:err. Аналогично, промежуток времени \( \Delta {\tau}_2 \) от последнего учтённого фронта до конца интервала измерения может быть 0..T. При этом промежуток времени между первым учтённым фронтом и последним составляет $$ \tau - \Delta {\tau}_1 - \Delta {\tau}_2, $$ причём в этот промежуток точно укладывается целое количество периодов сигнала (это следует из определений \( \Delta {\tau}_1, \, \Delta {\tau}_2 \)), и это количество на 1 меньше результата счёта N (количество отрезков разбиения всегда на 1 меньше количества точек разбиения). Можем записать $$ (N - 1) T = \tau - (\Delta {\tau}_1 + \Delta {\tau}_2), \\ (N - 1) T = \tau - (0 \ldots 2 T), \\ N - 1 = \frac {\tau} T - (0 \ldots 2). $$ Здесь \( \tau / T \) - истинное количество периодов сигнала, приходящихся на интервал измерения, обозначим его через n. Тогда $$ N - 1 = n - (0 \ldots 2) $$ или, окончательно, результат счёта равен истинному количеству периодов сигнала за интервал счёта с точностью до 1: $$ N = n \pm 1. $$
То есть, рассматривать результат счёта N как целочисленное приближение количества периодов n за интервал измерения вполне правомерно. Максимальная допускаемая при этом относительная погрешность определения n и равная ей относительная погрешность в определении частоты составляет $$ \varepsilon = \frac 1 n \approx \frac 1 N. $$
А с учётом того, что величина N связана с частотой сигнала и интервалом измерения соотношением $$ N \approx f \tau, $$ можем записать $$ \varepsilon \approx \frac 1 {f \tau} $$
Как видим, относительная погрешность метода очень сильно зависит от измеряемой частоты, что уже само по себе плохо. Ещё хуже то, что при измерении низких частот, погрешность становится огромной. Допустим, выбран интервал измерения 1 с. При частоте сигнала, скажем 1 МГц, точность метода оказывается довольно высокой, погрешность составляет 10-6 (0.0001%). Но при частоте сигнала 1000 Гц погрешность возрастёт до 0.1%, а на частоте 10 Гц достигнет 10%, что уже совершенно неприемлемо.
Точность может быть увеличена путём увеличения интервала измерения, но на низких частотах при разумных размерах интервала не удастся добиться удовлетворительных результатов.
Указанных недостатков лишён метод обратного счёта, позволяющий выполнять измерения очень быстро и точно.
Основные недостатки метода прямого счёта - зависимость точности метода от измеряемой частоты и очень сильное падение точности на низких частотах. Увеличить точность на низких частотах можно, если от прямого измерения частоты перейти к измерению периода сигнала. Период измеряется путём подсчёта количества импульсов N от эталонного генератора с достаточно высокой частотой за 1 период входного сигнала. Понятно, что этот вариант не подходит для случая высоких измеряемых частот, когда период очень мал, а значит, будет малым подсчитанное значение N, следовательно, относительная погрешность становится очень большой.
Но никто не мешает нам измерять длительность не одного, а нескольких периодов (M периодов) входного сигнала, увеличивая тем самым интервал измерения до нужной величины, необходимой для получения достаточно больших значений N, а значит малых значений относительной погрешности.
Подбирая M, можно добиться, чтобы интервал измерения был приблизительно равен заранее заданному желаемому значению. Тем не менее, как видим, характерной особенностью рассматриваемого метода является то, что реальный интервал измерения не является жёстко фиксированным, он зависит от входного сигнала. Интервал может отклоняться от заданного значения и может несколько изменяться от одного измерения к другому. Зато теперь интервал измерения точно выражается целым числом периодов входного сигнала (в отличие от метода прямого счёта).
Итак, в процессе измерения получаем два числа: M - количество периодов входного сигнала, образующих интервал измерения, примерно равный заданному интервалу измерения; N - количество импульсов опорного генератора, подсчитанных за интервал измерения (имеется в виду реальный интервал, образованный M периодами). По этим данным можем вычислить среднюю частоту сигнала за интервал измерения.
Пусть частота опорного генератора равна F0 (период опорного сигнала T0 = 1 / F0). Если за M периодов исследуемого сигнала с периодом T было подсчитано N импульсов опорного генератора, то $$ M T \approx N T_0, \\ T \approx T_0 N / M, \\ f \approx F_0 M / N. $$ Оценим относительную погрешность метода. Значение M известно точно; N определяется с точностью до 1 (можно показать аналогично тому, как это было сделано для метода прямого счёта). Тогда относительная погрешность определения частоты составит $$ \varepsilon \approx 1 / N \approx T_0 / \tau $$ или $$ \varepsilon \approx \frac 1 {F_0 \tau}, $$ \( \tau \) - интервал измерения.
Последнее выражение хорошо выявляет преимущества метода обратного счёта перед методом прямого счёта. Во-первых, здесь относительная погрешность не зависит от частоты входного сигнала. Во-вторых, теперь можно увеличивать точность не только за счёт увеличения интервала измерения, но за счёт повышения частоты опорного генератора. А значит, используя высокочастотный генератор, можем добиться высокой точности измерений при достаточно малых интервалах измерения.
Таким образом, метод обратного счёта для измерения частоты сигнала обеспечивает высокую точность и высокую скорость измерения, а также независимость точности измерения от частоты входного сигнала.
Прибор на основе метода обратного счёта может быть собран даже на простой логике при выполнении ряда ограничений. А именно, если он будет отображать не частоту сигнала, а период; если M будет фиксированным значением (или набором из нескольких фиксированных значений для переключения пределов измерения); если частота опорного сигнала F0 и значение M подобраны так, что M F0 является целой степенью 10 (может быть выражено в виде 10k, где k - целое). Например, если выберем F0 = 10 МГц, M = 100, то результат счёта N оказывается численно равным периоду сигнала в наносекундах. То же самое получим, если, например, F0 = 25 МГц, M = 40 (только теперь интервал измерения уменьшается до 40 периодов). И так далее...
Однако, такой прибор не только не лишён недостатков, присущих простейшим частотомерам на основе прямого счёта, но имеет свои дополнительные. Во-первых, опять приходим к тому, что погрешность зависит от измеряемой частоты (только здесь, наоборот, чем ниже частота, т.е. чем больше период, тем точность выше). Во-вторых, при фиксированном M, интервал измерения оказывается зависящим от частоты сигнала, а значит, заранее неизвестно, сколько времени потребуется на измерение. Максимальный интервал измерения будет ограничен временем до переполнения счётчика, подсчитывающего N; после переполнения счётчика, текущий цикл измерения должен быть прерван, а на индикатор выведено сообщение о превышении верхнего предела измерения.
В полной мере все достоинства метода обратного счёта проявляются, если M подбирается прямо во время цикла измерения. При этом каждый раз значение выбирается таким образом, чтобы реальный интервал измерения был как можно ближе к заданному желаемому интервалу измерения. Тем самым достигаем независимости как времени измерения, так и точности измерения от частоты сигнала.
Может показаться, что метод обратного счёта довольно сложен в реализации из-за необходимости автоматического подбора M в каждом цикле измерения, а также необходимости дополнительных вычислений (для определения частоты по периоду требуется выполнять операцию деления).
Но на самом деле, указанные проблемы легко решаемы. Вычисления не вызывают никаких затруднений при использовании микроконтроллера для обработки результатов. А что касается определения M, соответствующего интервалу измерения, близкого к заданному, то можно предложить следующий простой метод (смотрите схему на рис. %img:rbd).
В действительности, схема частотомера должна также содержать схему ресинхронизации на входе, она необходима для предотвращения возможности перехода счётчика IC1 в метастабильное состояние. А также должен быть асинхронный делитель частоты (на входе, перед схемой ресинхронизации), который необходим для увеличения верхнего предела измерения прибора и устранения ограничений на входной сигнал, обусловленных наличием схемы ресинхронизации. Указанные блоки не изображены на данной схеме, так как, во-первых, они не изменяют принцип действия предлагаемой схемы; во-вторых, даже при их отсутствии, частотомер способен функционировать (пусть и менее надёжно, с определённой вероятностью сбоя). В таймерах микроконтроллеров STM32 схемы ресинхронизации на входах есть, а на некоторых входах (ETR) имеются также и асинхронные делители частоты.
Входной сигнал поступает на вход счётчика IC1. Каждый фронт входного сигнала увеличивает значение в счётчике на 1. Независимо от первого счётчика, второй счётчик (IC3) выполняет непрерывный счёт импульсов опорного генератора. Результат счёта этого счётчика сохраняется в регистре IC4 по каждому фронту входного сигнала.
В какой бы момент времени мы не прочитали значения из регистра и счётчика, регистр IC4 будет содержать количество импульсов, подсчитанное к моменту прихода последнего фронта входного сигнала, а счётчик IC1 - количество фронтов входного сигнала к моменту чтения (которое, разумеется, равно количеству фронтов в момент подсчёта последнего из них). Таким образом, данные в регистре IC4 и счётчике IC1 всегда согласованы - они относятся к одному и тому же моменту времени, моменту, соответствующему последнему фронту входного сигнала.
Прочитав данные в определённый момент, получим некоторые значения M1 (значение из счётчика IC1) и N1 (значение из регистра IC4). Теперь выполним повторное чтение через промежуток времени, равный заданному интервалу измерения \( {\tau}_0 \); получим новые значения M2, N2. При каждом чтении получаем наиболее актуальные в данный момент данные, относящиеся к последнему перед чтением фронту входного сигнала. Количество периодов входного сигнала между двумя рассматриваемыми фронтами (для которых были считаны данные) составит M = M2 - M1, а количество импульсов опорного сигнала за это время N = N2 - N1. Среднюю частоту сигнала по полученным данным вычисляется элементарно: f = f0 M / N. При этом промежуток времени \( \tau \) между рассматриваемыми фронтами оказывается близок к заданному интервалу измерения \( {\tau}_0 \) (который в данном случае определяется моментами отсчёта, т.е. моментами считывания результатов): $$ \tau = {\tau}_0 + \Delta {\tau}_1 - \Delta {\tau}_2, $$ где \( \Delta {\tau}_1, \Delta {\tau}_2 \) - промежутки времени между ближайшим предшествующим фронтом сигнала и моментом отсчёта (первым и вторым соответственно), они могут изменяться в переделах от 0 до T (до периода входного сигнала). Тогда отклонение реального интервала измерения от заданного интервала не превышает \( \pm T \): $$ \tau = {\tau}_0 \pm T. $$ Но это вовсе не означает, что отклонение реального интервала от заданного может достигать 100%, если задан очень малый, сравнимый с периодом сигнала, интервал. Дело в том, что отклонение тем меньше, чем заданный интервал ближе к целому количеству периодов сигнала, в частности при $$ {\tau}_0 \rightarrow T+, \\ \tau - {\tau}_0 \rightarrow 0. $$ Максимальное относительное отклонение может составлять +50%, когда оказывается \( {\tau}_0 = 1.5 T \). Но обычно, при измерении не слишком низких частот, интервал измерения включает в себя множество периодов и отклонение интервала от заданного значения оказывается незначительным. В любом случае, отклонения реального интервала от заданного - особенность метода, это не приводит к снижению точности измерения частоты.
Остаётся только заметить, что при последовательном считывании данных из счётчика и регистра, очередной фронт входного сигнала может попасть в промежуток времени между этими считываниями. В результате чего, считанные значения оказываются несогласованными - они относятся к разным фронтам сигнала. Вычисление частоты по несогласованным данным даст неверный результат. Чтобы избежать этого, в схему введены два дополнительных регистра, IC2 и IC5, которые фиксируют значения из счётчика IC1 и регистра IC4. Причём делают это строго одновременно, по общему управляющему импульсу ("сигнал на выполнение отсчёта"). Данные считываем именно из этих регистров, естественно, после подачи импульса на выполнение отсчёта. Дополнительные регистры гарантируют согласованность считываемых значений M, N и неизменность значений до следующего импульса на выполнение отсчёта, т.е. можно без каких-либо опасений и не торопясь последовательно считывать данные.
Следует иметь в виду, что в процессе работы предложенной схемы измерения, будут возникать следующие особые ситуации. Во-первых, время от времени счётчики будут неизбежно переполняться (при переполнении счётчик переходит в начальное состояние и счёт продолжается). Во-вторых, если частота входного сигнала окажется слишком низкой (период сигнала больше заданного интервала измерения), можем получить одинаковые значения M в двух (и более) последовательных отсчётах: M1 = M2, M = M2 - M1 = 0, а значит, по результатам отсчётов невозможно будет вычислить частоту. Указанные проблемы легко выявляются и решаются программно в процессе обработки результатов счёта.
Практически все микроконтроллеры имеют достаточно сложные таймеры, содержащие и счётчики, и регистры для фиксации результатов счёта по внешнему сигналу. Поэтому возможно построить частотомер по предложенной схеме на основе единственного микроконтроллера, без каких-либо дополнительных элементов (не считая, разумеется, минимальной обвязки микроконтроллера и средств индикации или передачи результатов измерения). Пример такого частотомера на одном микроконтроллере рассматривается в статье:
Частотомер на основе микроконтроллера STM32 с конвейерным измерением частоты - 2
Оказывается, несмотря на сложность и многофункциональность таймеров в STM32, построить частотомер на одном лишь микроконтроллере - не совсем тривиальная задача. Не исключено, что в определённых случаях будет проще собрать частотомер по схеме на рис. %img:rbd, а микроконтроллер использовать для обработки получаемых данных.
Для увеличения точности измерения частоты сигнала (при одной и той же опорной частоте), следует увеличивать интервал измерения. Но для того, чтобы точно отслеживать быстрые изменения частоты сигнала, требуется малый интервал измерения. Отчасти разрешить данное противоречие можно, организовав процесс непрерывного, а ещё лучше - конвейерного измерения частоты.
Причём, для этого даже не нужно изменять уже рассмотренную схему, надо просто иначе обрабатывать получаемые данные (изменяется лишь программное обеспечение).
Наиболее примитивный вариант измерений - "измерения по запросу". Выглядит измерение по запросу следующим образом. Когда нам требуется получить очередной результат измерения частоты, мы выполняем первый отсчёт (подаём сигнал отсчёта и считываем данные из регистров), получаем значения M1, N1. После этого ждём, пока пройдёт время, равное заданному интервалу измерения. Выполняем второй отсчёт и получаем значения M2, N2. По значениям, полученным при выполнении этих двух отсчётов, вычисляем среднюю частоту сигнала на интервале измерения. После этого ожидаем следующего запроса на измерение частоты; во время ожидания измерения не выполняются и мы теряем массу информации об изменениях частоты сигнала за этот промежуток времени.
Самый очевидный путь усовершенствования измерений - сделать процесс измерений непрерывным. Для этого следует выполнять отсчёты регулярно с заданным интервалом (сигналом на выполнение отсчёта будет периодический сигнал с периодом, равным заданному интервалу отсчёта). Каждый отсчёт будет давать некоторые значения Mi, Ni. По этим значениям и значениям, полученным в предыдущем отсчёте, вычисляем количество периодов входного сигнала и опорного сигнала за последний интервал измерения и определяем среднюю частоту сигнала: $$ M = M_i - M_{i-1}, \\ N = N_i - N_{i-1}, \\ f = f_0 \frac M N. $$ Благодаря такой организации процесса, удаётся исключить бесполезные простои схемы измерения и получать результаты с периодичностью, равной интервалу измерения.
Но оказывается, не изменяя схему частотомера, можно добиться намного большего. На самом деле, нам никто не мешает выполнять множество отсчётов за интервал измерения. Пусть \( {\tau}_0 \) - заданный интервал измерения, но мы хотим получать результаты измерения частоты в k раз чаще (k - целое). Тогда будем выполнять отсчёты с интервалом \( \delta = {\tau}_0 / k \). Получаемые при каждом отсчёте значения M, N будем помещать в таблицу из k + 1 строк $$ M_0, N_0; \\ M_1, N_1; \\ M_2, N_2; \\ \ldots \\ M_k, N_k. $$ После запуска схемы измерения, таблица очень быстро заполнится (за время, равное одному интервалу измерения). В дальнейшем, для размещения результатов очередного отсчёта, будем сдвигать все строки таблицы на одну позицию вверх (при этом строка с индексом 0 теряется), а данные отсчёта будем помещать в конец таблицы (строка с индексом k).
Нетрудно заметить, что первая и последняя строки таблицы соответствуют отсчётам, отстоящим по времени на интервал измерения: $$ \Delta t = k \delta = k {\tau}_0 / k = {\tau}_0. $$ А значит, по этим данным можем вычислить среднюю частоту за интервал измерения (за тот интервал измерения, который завершился в момент последнего отсчёта, данные по которому находятся в конце таблицы): $$ M = M_k - M_0, \\ N = N_k - N_0, \\ f = f_0 \frac M N. $$ С интервалом, равным интервалу отсчёта \( \delta \), содержимое таблицы обновляется, и после каждого обновления мы можем рассчитать очередное среднее значение частоты для только что завершившегося интервала измерения. Каждый очередной отсчёт сдвигает "окно усреднения" на время, равное интервалу отсчёта. Поэтому даже при большом заданном интервале измерения, можно получать результаты с большой частотой ("окно усреднения" широкое, но оно передвигается маленькими шагами, равными интервалу отсчёта, при этом каждый раз получаем новое значение частоты для нового положения "окна"). При такой организации измерений, результаты будем получать в k раз чаще, чем при просто непрерывном процессе измерений.
Конечно, данный подход к измерениям имеет свои определённые ограничения. Во-первых, требуется дополнительная память для хранения таблицы с промежуточными результатами отсчётов (впрочем, требуемый объём памяти не будет слишком большим при разумном выборе количества отсчётов k на интервал измерения).
Во-вторых, конвейерный принцип измерения становится бесполезным в случае очень низких частот входного сигнала, когда период сигнала становится соизмерим с интервалом измерения. Тогда увеличение количества отсчётов на интервале не будет сопровождаться увеличением количества получаемой информации (всё большее количество отсчётов будет попадать в один и тот же период сигнала, и эти отсчёты будут давать одни и те же результаты). И это вполне естественно, исходя из самого принципа цифрового измерения частоты понятно, что новый результат измерения не может быть получен за время, меньшее периода входного сигнала. Оставаясь в рамках цифровых средств измерения, нельзя выяснить, что происходит с частотой на интервале, меньшем одного периода.
В-третьих, не стоит забывать, что цифровой частотомер измеряет среднюю частоту за интервал измерения. А операция усреднения обладает свойствами фильтрации, подавляя быстрые изменения усредняемой величины. В результате, увеличивая интервал измерения, мы хотя и увеличиваем точность измерения средней частоты, но одновременно теряем информацию о быстрых изменениях мгновенной частоты сигнала. Подробнее об этом смотрите в статье "Частота сигнала. Измерение частоты. Мгновенная и средняя частота ".
Так что не стоит рассчитывать на то, что неограниченно увеличивая количество отсчётов k на интервале измерения, удастся отследить сколь угодно быстрые изменения частоты сигнала. Не нужно без особой необходимости выбирать большие значения k. Хорошо, если заранее известно, с какого рода сигналами предстоит работать и есть возможность теоретически оценить изменение средней частоты (верхнюю границу возможного изменения) при сдвиге "окна усреднения" на величину, равную интервалу отсчёта. Тогда, если такое наибольшее изменение средней частоты не превышает абсолютной погрешности метода, то дальнейшее увеличение k (соответственно, уменьшение интервала отсчёта) лишено смысла. Как раз наоборот, стоит подумать о существенном уменьшении k, чтобы фиксируемые изменения результатов измерения уверенно превышали погрешность метода (по крайней мере, при достаточно быстром и значительном изменении мгновенной частоты сигнала).