Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Измерение частоты ATmega168
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
oles_k76
подскажите как правильно определить максимальную входную частоту,
которую необходимо померять(очень точно,посчитав кажый импульс)
за интервал времени сто секунд,
частота опорного генератора 20мгц
Валентиныч
Вопрос поставлен не корректно.
За 100 секунд можно посчитать среднюю частоту сигнала за этот отрезок времени. Ес-сно, если сигнал достаточно высокочастотный.
Такие интервалы (100 секунд) обычно применяются для измерения инфранизких частот.
Если же сигнал действительно высокочастотный (единицы МГц), нужно организовать 64-разрядный накопительный регистр, и инкрементировать его по каждому импульсу входного сигнала. Максимальная частота, которую удастся измерить таким способом - порядка 4 МГц.
5 тактов клока пожалуй хватит для обработки каждого входного импульса и контроля измерительного интервала. Но на пределе.
=AVR=
В лоб (используя таймер в режиме счетчика) - теоретически до 10 МГЦ (Fclk/2), практически (с гарантией отсутствия пропусков) - мегагерц до 8..9 (Fclk/2.5). Частоту считать 16-битным таймером с 16-битным программным расширителем, инкрементируемым по прерыванию таймера, либо 8-битным таймером с 24-битным расширителем. Чисто программный счет невыгоден - займет 100% вычислительных ресурсов МК, будет минимум вдвое медленнее таймерного и т.д.
zorromen
А если логику приделать ... счетчик например ... то можно ...
CD_Eater
Если подсчитывать количество периодов измеряемого сигнала с помощью внешнего тактирования таймера 0 или 1 (pins T0, T1), то внешняя частота может быть до 8 МГц (= F/2.5, где F=20 MHz)
При этом требуется, чтобы измеряемый сигнал был меандром.
WHALE
Цитата(CD_Eater @ Apr 22 2007, 16:51) *
Если подсчитывать количество периодов измеряемого сигнала с помощью внешнего тактирования таймера 0 или 1 (pins T0, T1), то внешняя частота может быть до 8 МГц (= F/2.5, где F=20 MHz)
При этом требуется, чтобы измеряемый сигнал был меандром.

А меандром-то зачем.Оно-же вроде по фронту считает?
CD_Eater
Цитата
А меандром-то зачем
В ДШ озвучено требование на длительность уровня: и высокий, и низкий уровни должны быть длиннее, чем один такт, чтобы МК успел их "зафиксировать". Если скважность другая, то максимальная частота будет ниже.
Dopler
http://electronix.ru/forum/lofiversion/index.php/t29796.html
В этой теме данный вопрос до таких косточек обмыли, что уже и обсуждать особо нечего.
=AVR=
Не совсем так. Здесь автору вопроса нужно мерять максимально возможную частоту, а не 1/100 от Fclk, и метод Capture тут не годится. Зато рулит обычный Gated Counter, благо времени счета хоть отбавляй - 100 секунд
=GM=
Цитата(Dopler @ Apr 22 2007, 20:00) *
http://electronix.ru/forum/lofiversion/index.php/t29796.html
В этой теме данный вопрос до таких косточек обмыли, что уже и обсуждать особо нечего.
Цитата(=AVR= @ Apr 22 2007, 20:14) *
Не совсем так. Здесь автору вопроса нужно мерять максимально возможную частоту, а не 1/100 от Fclk, и метод Capture тут не годится. Зато рулит обычный Gated Counter, благо времени счета хоть отбавляй - 100 секунд
На самом деле в теме, указанной Dopler'ом обсуждался не только вопрос измерения трёх частот 50, 90 и 170 кГц, но и вопрос точности и была приведена более-менее универсальная формула, Fx = Fо*М/N, пригодная как для метода захвата, так и для метода ворот (смотрите пост #23). Также там было отмечено, что для обоих методов имеется ФУНДАМЕНТАЛЬНОЕ ограничение - частота входного сигнала не может быть больше половины тактовой частоты процессора (пост #61).

Что касается вопроса автора данной темы, то максимальная частота измерения составляет 10 Мгц. Точность измерения на 100-секундном интервале составит ±0.02 Гц. Метод захвата на атмеге168 применим до Fclk/5. На атмеге128 - до Fclk/2, так же как и для метода ворот. Для максимальной частоты Fclk/2 точность метода захвата в 2 раза лучше точности метода ворот.
demaven
Точность измерения на 100-секундном интервале составит ±0.02 Гц.

Уважаемый, откуда взялась столь умопомрачительная цифра? За 100 секунд будет насчитано где-то около 20 000 000 *100 импульсов и только,. так что ни о каких ±0.02 Гц и речи быть не может. Мы 100 секунд измеряем с точностью опоры и почему считаем их абсолютно достоверными? А они брехливы.
=GM=
Цитата(demaven @ Apr 23 2007, 03:53) *
Уважаемый, откуда взялась столь умопомрачительная цифра (±0.02 Гц)? За 100 секунд будет насчитано где-то около 20 000 000 *100 импульсов и только. Так что ни о каких ±0.02 Гц и речи быть не может. Мы 100 секунд измеряем с точностью опоры и почему считаем их абсолютно достоверными? А они брехливы.

Читайте вышецитированный пост, уважаемый, особенно ответы #23 и #43, там всё написано. И приведите ваши цифры, о которых может идти речь, без них это только ваши слова. А эту "умопомрачительную цифру", как вы говорите, я могу улучшить еще раз в 20 за то же время.

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

Чтобы получить суммарную погрешность надо сложить данную относительную погрешность 0.02/1Е-7 и относительную погрешность опоры 1Е-9 (возможно 1Е-10 и выше, это кратковременная нестабильность опорного генератора на интервале 100 с). Как видите вклад погрешности опоры на порядок ниже вклада погрешности измерения.

Отвлекусь. Году так в 1998, у меня был частотомер, который мерял частоту опорного генератора пейджингового передатчика, там было три диапазона: 1с, 10с и 100с. На последнем диапазоне частотомер выдавал 10 значащих цифр! Секундные метки брались с GPS, входящего в состав прибора. Принцип работы был простой - открывались ворота и считалось количество пришедших импульсов. Вот такая была опора.
defunct
Цитата(demaven @ Apr 23 2007, 06:53) *
Точность измерения на 100-секундном интервале составит ±0.02 Гц.

откуда взялась столь умопомрачительная цифра?

±0.02 Гц для 170Khz сигнала и Fosc 20Mhz там получается за счет того, что сигнал захватывается с точностью до такта процессора. Точность за секунду будет грубо говоря ±1Гц * (2 Fизм/Fosc).

GM предлагает сделать захват первого импульса, затем - Gate'ом посчитать кол-во имупульсов за известный интервал времени и сделать захват последнего импульса. Это потребует 2-3 таймера для измерения одной частоты, сложно реализовать на практике, но вполне реально.. И до меня долго не могло дойти по его объяснениям в той ветке.
=GM=
Цитата(defunct @ Apr 23 2007, 09:25) *
Точность за секунду будет грубо говоря ±1Гц * (2 Fизм/Fosc).

Добавлю, с помощью метода ворот. А с помощью метода захвата ту же точность можно достичь за 10 мс, в 100 раз быстрее.
Цитата(defunct @ Apr 23 2007, 09:25) *
GM предлагает сделать захват первого импульса, затем - Gate'ом посчитать кол-во имупульсов за известный интервал времени и сделать захват последнего импульса. Это потребует 2-3 таймера для измерения одной частоты, сложно реализовать на практике, но вполне реально.. И до меня долго не могло дойти по его объяснениям в той ветке.

Ну теперь-то наконец дошло(:-)! Не путайте людей, в принципе, таймер нужен только ОДИН, чтобы отсчитывать время, и чтобы было, что захватывать(:-). Ну а второй таймер нужен, чтобы просто освободить процессор под другие задачи на период секундного интервала. Никакой сложности в реализации метода захвата на практике нет.

Там же был предложен метод измерения до 100 частот (скажем, до 200 кГц каждая) с точностью ±1Гц за 1 сек. Сигналы подключаются последовательно к МК с помощью мультиплексера и за 10 мс определяется частота каждого сигнала методом захвата.
defunct
Цитата(=GM= @ Apr 23 2007, 12:56) *
Добавлю, с помощью метода ворот. А с помощью метода захвата ту же точность можно достичь за 10 мс, в 100 раз быстрее.

Тут я с вами не соглашусь.
Т.к. точность там определяется точностью ворот умноженной на точность захвата, тобиш для 10ms будет:
±100 * (2Fизм/Fosc)

Цитата
Ну теперь-то наконец дошло(:-)! Не путайте людей, в принципе, таймер нужен только ОДИН, чтобы отсчитывать время, и чтобы было, что захватывать(:-). Ну а второй таймер нужен, чтобы просто освободить процессор под другие задачи на период секундного интервала. Никакой сложности в реализации метода захвата на практике нет.

Я не путаю, а просто чуть-чуть поигрался с этим методом. Не все так гладко на практике как в теории.
mse
Цитата(defunct @ Apr 23 2007, 15:04) *
Тут я с вами не соглашусь.
Т.к. точность там определяется точностью ворот умноженной на точность захвата, тобиш для 10ms будет:
±100 * (2Fизм/Fosc)
...
Я не путаю, а просто чуть-чуть поигрался с этим методом. Не все так гладко на практике как в теории.

Не знаю, с чем вы игрались, но метОде этой сто лет в обед уже. А негладкость там одна - нужна проццедура деления. И помножения тоже, в общем случае. Накладные расходы на счОччики, практицки те-же самые. Одним делаем ворота, другим считаем. Классический режим Ф1/Ф2 у классицких частотомеров. А уж в нём-то меряно-перемеряно немеряно скока и чего...
=GM=
Цитата(defunct @ Apr 23 2007, 10:04) *
Тут я с вами не соглашусь.
Т.к. точность там определяется точностью ворот умноженной на точность захвата, тобиш для 10ms будет:
±100 * (2Fизм/Fosc)
Я не путаю, а просто чуть-чуть поигрался с этим методом. Не все так гладко на практике как в теории.

Это что за точность, относительная? Покажите, откуда она взялась.
=AVR=
Цитата(=GM= @ Apr 23 2007, 01:51) *
Метод захвата на атмеге168 применим до Fclk/5. На атмеге128 - до Fclk/2, так же как и для метода ворот. Для максимальной частоты Fclk/2 точность метода захвата в 2 раза лучше точности метода ворот.

Capture годится до тех пор, пока время примитивной обработки события Capture (как минимум вход в ISR, сохранение отсчета в буфере, и возврат из ISR) не превысит периода измеряемой частоты
=GM=
Цитата(=AVR= @ Apr 23 2007, 11:41) *
Capture годится до тех пор, пока время примитивной обработки события Capture (как минимум вход в ISR, сохранение отсчета в буфере, и возврат из ISR) не превысит периода измеряемой частоты

Ну уж вы скажете! Надо-то всего два прерывания на одно измерение, причем между ними зазор по времени ОДНА секунда.

Да и вообще, без прерываний можно обойтись.
=AVR=
Цитата
Надо-то всего два прерывания на одно измерение
Вот про любое из них я и говорю. Для Мег с однотактовым доступом к ICR1 (М128) минимальный период (в тактах XTAL) должен быть больше, чем InterruptLatency+1, с двухтактовым (М168) - чем InterruptLatency+2. А для поллинга без прерываний это будет для обеих Мег по 4 такта - в М128 адрес TIFRа, в котором живет флаг Capture, не попадает в разрешенный диапазон адресов команды sbic, поэтому придется делать in+sbrs, что уравняет выигрыш в такт от in вместо lds. Так как максимальная измеряемая частота будет определяться, увы, именно этим временем, то лимит Fin будет одинаков и в случае единственного прерывания за цикл измерения
defunct
Цитата(=GM= @ Apr 23 2007, 13:33) *
Это что за точность, относительная? Покажите, откуда она взялась.

погрешность одного захвата в секундах у нас = +-1/Fosc
Захватов по вашей методе 2 - вначала и в конце, отсюда погрешность захватов - +-2/Fosc.

P1 = 2/Fosc секунд

для интервала измерения T погрешность составит:

P2 = P / T

теперь считаем погрешность в герцах для частоты Fизм

P3 = Fизм * P2

Теперь разворачиваем P2:

P3 = Fизм * (2/Fosc) / T = 1/T * 2Fизм/Fosc

для T = 10ms:
100 * 2 Fизм/Fosc
=GM=
Цитата(defunct @ Apr 23 2007, 14:11) *
погрешность одного захвата в секундах у нас = +-1/Fosc
Захватов по вашей методе 2 - в начале и в конце, отсюда погрешность захватов - +-2/Fosc.

Насчет захватов правильно, а насчёт погрешности неправильно. Объясню, почему так. Предположим вам необходимо измерить некий интервал. Погрешность в начале может только уменьшить ваш результат, поскольку вы можете начать отсчёт только после того, как событие началось, не раньше. Т.о. погрешность лежит на полуоткрытом отрезке (-1,0]. Погрешность в конце может только увеличить ваш результат, поскольку вы можете завершить отсчёт только после того, как событие закончилось, не раньше, т.о. погрешность лежит на полуоткрытом отрезке [0,+1). Поскольку отрезки не перекрываются, общая погрешность определения длины интервала будет просто суммой двух отрезков и будет лежать в диапазоне (-1,+1) или, говоря простым языком, будет ±1 такт. А не ±2, как вы считаете.
Цитата(defunct @ Apr 23 2007, 14:11) *
P1 = 2/Fosc секунд
для интервала измерения T погрешность составит: P2 = P / T

Да с чего вы взяли? Я же не определяю каждый период отдельно и потом суммой получаю полный интервал, стало быть должен и погрешности каждого интервала суммировать. У меня всего две погрешности - начала и конца, никаких промежуточных погрешностей нет. Поэтому общая погрешность будет ±1 такт.
Цитата(defunct @ Apr 23 2007, 14:11) *
теперь считаем погрешность в герцах для частоты Fизм
P3 = Fизм * P2
Теперь разворачиваем P2: P3 = Fизм * (2/Fosc) / T = 1/T * 2Fизм/Fosc
для T = 10ms: 100 * 2 Fизм/Fosc

Тоже неверно, поскольку неверны исходные посылки.

Кстати, у вас в формулах с размерностями не всё в порядке.
defunct
Цитата(=GM= @ Apr 23 2007, 18:32) *
Да с чего вы взяли? Я же не определяю каждый период отдельно и потом суммой получаю полный интервал,

Мы уже в курсе что захватывается начало импульса, затем считаются импульсы, затем захватывается опять начало импульса, т.о. за время T мы получаем два числа М и N
1. M число периодов искомой частоты
2. N = T * Fosc - количество тактов опорной частоты.

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

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

Цитата
Да с чего вы взяли? Я же не определяю каждый период отдельно и потом суммой получаю полный интервал,

T - это полный интервал.
Вы его назвали - 10ms.

Цитата
Кстати, у вас в формулах с размерностями не всё в порядке.

Там все ок. Hz/Hz / s = Hz
=GM=
Цитата(defunct @ Apr 23 2007, 19:22) *
Для этого способа погрешность будет такой как я описал постом выше.

Слона надо есть по частям, а танцевать надо от печки, поэтому давайте по порядку. Вы опустили моё описание как считать погрешность определения интервала. Значит ли это, что вы согласны или вы по-прежнему считаете, что, цитирую, "погрешность одного захвата в секундах = +-1/Fosc. Захватов по вашей методе 2 - вначала и в конце, отсюда погрешность захватов - +-2/Fosc". Я утверждаю, что погрешность равна ±1 такт, вы же упираетесь на ±2 такта.
Цитата(defunct @ Apr 23 2007, 19:22) *
Если вы опять говорите о каком-то другом способе, то сперва изложите его так чтобы было понятно всем, а не только вам. T - это полный интервал. Вы его назвали - 10ms.

Способ тот же самый и интервал я назвал, ну и что из этого? Мы же говорим о расчёте погрешности, а вы виляете, как маркитанская лодка. Сначала говорите, вот покажете как, я свои слова назад возьму, а потом говорите, к методу претензий нет, но очень большие сложности в реализации, ну о-очень большие...Ладно, отвлёкся.
Цитата(defunct @ Apr 23 2007, 19:22) *
Там все ок. Hz/Hz / s = Hz

Ну если ОК, то подскажите, в каких единицах выражается Р2, если Р1 в герцах, а Т в секундах? Заодно просветите, что там у вас за переменная Р, чтобы было понятно всем, а не только вам.
defunct
Цитата(=GM= @ Apr 23 2007, 21:54) *
Я утверждаю, что погрешность равна ±1 такт, вы же упираетесь на ±2 такта.

1 или 2 такта это не важно, важно что не будет там +-0.02Гц за 10ms.

Цитата
Ну если ОК, то подскажите, в каких единицах выражается Р2, если Р1 в герцах, а Т в секундах? Заодно просветите, что там у вас за переменная Р, чтобы было понятно всем, а не только вам.

P1 - погрешность захватов (в секундах)
P2 - весовой коэфициент погрешности для интервала T (если домножить на 100% получите в процентах)
P3 - погрешность измерения частоты Fизм на интервале T - в герцах.

P - опечатка, там должно было быть P1 (P2 = P1 / T).
=GM=
Цитата(defunct @ Apr 23 2007, 21:23) *
1 или 2 такта это не важно

Как это не важно? Это очень важно, ошибка уменьшается в два раза. Что бы вы сказали, если б вам бухгалтер начислил зарплату в два раза меньше, мотивируя тем, что это, мол, ошибка округления такая набежала(:-)?
Цитата(defunct @ Apr 23 2007, 21:23) *
важно что не будет там +-0.02Гц за 10ms.

Конечно, не будет, я этого и не говорил. Почитайте мой пост #14 в этой ветке. Я там говорил, что методом захвата можно получить ту же самую точность ±1 Гц, что и методом ворот, но в 100 раз быстрее, а именно за 10 мс. Повнимательнее надо быть самому, щательнее так сказать, а не других корить.

Когда слова-то свои забирать обратно будете? Вроде с методом согласились, с тем что прерываниями программа не захлебнётся тоже...Гордость не позволяет или высокое звание профессионала на этом форуме или ещё что(:-)?
defunct
Цитата
Как это не важно? Это очень важно, ошибка уменьшается в два раза.

Уменьшайте в два раза. Во скока хотите во стока и уменьшайте. оно у вас и работает ровно на пол-зарплаты.

Цитата(=GM= @ Apr 24 2007, 00:29) *
Когда слова-то свои забирать обратно будете? Вроде с методом согласились, с тем что прерываниями программа не захлебнётся тоже...

Когда приведете программу.
В той ветке, был треп, и мне нечего забирать, т.к задачу той ветки вы своим методом не решили, метод объясняли целую неделю.
mse
Цитата(defunct @ Apr 24 2007, 15:18) *
Уменьшайте в два раза. Во скока хотите во стока и уменьшайте. оно у вас и работает ровно на пол-зарплаты.
Когда приведете программу.
В той ветке, был треп, и мне нечего забирать, т.к задачу той ветки вы своим методом не решили, метод объясняли целую неделю.

Остапа понесло... ;О) Он-то при чём, если вы целую неделю не могли понять? Откройте ТО на любой толковый частотомер и изучите матчасть...
=GM=
Да, интересное кино. Я смотрю, вы отвечаете только на выборочные моменты, а когда вам нечего ответить, вопросы просто пропускаете. Вот, например, вы написали: "важно что не будет там +-0.02Гц за 10ms"

Вот я вам ответил: "Конечно, не будет, я этого и не говорил. Почитайте мой пост #14 в этой ветке. Я там говорил, что методом захвата можно получить ту же самую точность ±1 Гц, что и методом ворот, но в 100 раз быстрее, а именно за 10 мс. Повнимательнее надо быть самому, щательнее так сказать, а не других корить"

Ну откуда вы взяли этот перл, что у меня точность будет ±0.02Гц за 10ms? Из пальца высосали? Когда вам на это указали, вы просто не стали отвечать, поскольку ответить по существу нечего.

Цитата(defunct @ Apr 24 2007, 10:18) *
Уменьшайте в два раза. Во скока хотите во стока и уменьшайте. оно у вас и работает ровно на пол-зарплаты.

А вот это уже трёп. Вам указали на вашу ошибку в определении погрешности, ну так признайте и поехали дальше, а вы вместо того, чтобы признать, начинаете упираться, вилять и уходить в сторону. Что значит, "во сколько хотите, во столько и уменьшайте", вы что, на базаре? Это математика, тут всё считается на раз. Советую вам почитать статью Гегеля, Георга Вильгельма Фридриха, "Кто мыслит абстрактно", вам будет полезно.

Цитата(defunct @ Apr 24 2007, 10:18) *
Когда приведете программу. В той ветке, был треп, и мне нечего забирать, т.к задачу той ветки вы своим методом не решили, метод объясняли целую неделю.

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

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

Ну и как следствие, что может доказать моя программа, пусть самая распрекрасная, если вы не понимаете до конца алгоритма измерения частоты методом захвата и путаетесь в определении погрешности?

Не надо мне здесь отвечать. И так всё ясно.

Прошу у всех прощения за флейм.
defunct
Ок, приношу всем кого задел свои извинения.
Я здесь чертовски не прав.
Валентиныч
Уважаемые, вспомним первоначальную постановку вопроса:
Цитата(олесь @ Apr 22 2007, 17:17) *
подскажите как правильно определить максимальную входную частоту, которую необходимо померять(очень точно,посчитав кажый импульс)
за интервал времени сто секунд, частота опорного генератора 20мгц

Если я правильно понимаю, человек интересуется способом (как?), позволяющим с максимальной точностью измерить частоту (какую?) за определенный интервал времени.
Зачем ему это нужно, и что он с этими результатами будет делать - вопрос третий.

ИМХО: для измерения макимально возможной частоты нужно минимизировать длительность промежуточных процедур. Например - по возможности исключить потери на вход/выход из прерываний. Это время, как известно, составляет в среднем 4 машинных такта. Плюс 2-3 такта на прочие действия. Какие уж тут 10 МГц на входе, при клоке 20 МГц?
Очевидно, что простой опрос порта (2 такта ) с последующим инкрементом (2 такта для регистра длиннее 1-го байта) + неизбежные прочие "мелочи" (1-2 такта) - это тот минимум, ниже которого не опуститься. Т.е. реально на регистрацию одного события по входу будет тратиться не менее 4-6 машинных тактов. Отсюда вытекает максимальная частота входного сигнала - 4 МГц. На пределе!
Второй вопрос - точность измерения. Здесь она определяется точностью задания "ворот". Относительную точность "клокирования" (в тактах) реализовать не сложно, а вот обеспечить долговременную стабильность частоты расхожего "контроллерного" кристалла весьма и весьма не просто. И далеко не факт, что в течение 100 секунд эта "опора" будет стабильной...
Так что какие уж тут 0,02 Гц? Точнее - о какой достоверности подобных измерений идет речь?
Или я чего-то сильно не понимаю. smile.gif

P.S. В моем первом посте ошибка - потребная длина регистра, конечно, не 64, а 32 бита. Размахнулся... blink.gif
=AVR=
Какие "4 мгц на пределе"?? При наличии аппаратного СЧЕТЧИКА считать программно циклом опроса порта? Зачем?? Смотри пост #3, там все предельные факторы однозначно разжеваны
=GM=
Цитата(Валентиныч @ Apr 24 2007, 12:06) *
Уважаемые, вспомним первоначальную постановку вопроса.
Если я правильно понимаю, человек интересуется способом (как?), позволяющим с максимальной точностью измерить частоту (какую?) за определенный интервал времени.
Зачем ему это нужно, и что он с этими результатами будет делать - вопрос третий.
ИМХО: для измерения макимально возможной частоты нужно минимизировать длительность промежуточных процедур. Например - по возможности исключить потери на вход/выход из прерываний. Это время, как известно, составляет в среднем 4 машинных такта. Плюс 2-3 такта на прочие действия. Какие уж тут 10 МГц на входе, при клоке 20 МГц?

Действительно, в погоне за исчезающе малой ошибкой потеряли исходный вопрос(:-)...
Прежде всего замечу, что если хочется мерить максимально точно, то на время измерения лучше забыть о прерываниях, или по крайней мере на моменты обработки начала и окончания окна.
Цитата(Валентиныч @ Apr 24 2007, 12:06) *
Очевидно, что простой опрос порта (2 такта ) с последующим инкрементом (2 такта для регистра длиннее 1-го байта) + неизбежные прочие "мелочи" (1-2 такта) - это тот минимум, ниже которого не опуститься. Т.е. реально на регистрацию одного события по входу будет тратиться не менее 4-6 машинных тактов. Отсюда вытекает максимальная частота входного сигнала - 4 МГц. На пределе!
Второй вопрос - точность измерения. Здесь она определяется точностью задания "ворот"

Попробуем разобраться с червём сомнения, который точит Валентиныча(:-). Для автора топика опишу вгрубе алгоритм измерения методом ворот максимальной частоты 10 МГц, поданной на ножку Т0. Таймер 1 работает в режиме измерения системного клока.

1) Исходное состояние счётчика0 и таймера1 - остановлены и обнулены.

2) Запустим таймер1 и таймер0 двумя командами
Код
    sts    0x81,r12
    sts    0x25,r13
После выполнения инструкций T1=Nнач=2, T0=Mнач=0, в регистрах r12, r13 соответствующие настройки CSij для останова. Все переменные - 32-разрядные.

3) Ждём СТО секунд (делая попутно какие-то вещи и учитывая переносы таймеров в Mкон, Nкон).

4) Остановим таймер1 и таймер0 двумя командами
Код
    sts    0x81,r14
    sts    0x25,r15
После выполнения инструкций T1=Nкон=2'000'000'002, T0=Mкон=1'000'000'000, в регистрах r14, r15 соответствующие настройки CSij для останова.

5) По формуле Fx=Fo*(Mкон-Mнач±1)/(Nкон-Nнач) вычисляем измеренную частоту

Fx=20000000*(1000000000-0±1)/(2000000002-2)=10000000±0.01 Гц.

Никаких чудес, никаких прерываний, частота на входе 10 МГц, точность результата не хуже ±0.01 Гц. Программы умножения 32х32 и деления 64/32 в Сети можно найти на каждом углу(:-). Фактически, мною приведена готовая программа измерения, если вы меня понимаете.
Цитата(Валентиныч @ Apr 24 2007, 12:06) *
Относительную точность "клокирования" (в тактах) реализовать не сложно, а вот обеспечить долговременную стабильность частоты расхожего "контроллерного" кристалла весьма и весьма не просто. И далеко не факт, что в течение 100 секунд эта "опора" будет стабильной...
Так что какие уж тут 0,02 Гц? Точнее - о какой достоверности подобных измерений идет речь?
Или я чего-то сильно не понимаю. smile.gif

Вы говорите всё правильно, скажу только, что если уж вы решились мерять 10 МГц с такой точностью, то надо бы поставить опору, соответствующей точности, ну или по крайней мере раскошелиться на термокомпенсированный кварцевый генератор.

Есть относительно дешёвое решение - поочередно проводить измерения и калиброваться от хорошей опоры, это может быть радиосигнал, или GPS. То есть, используя секундные импульсы с GPS, сначала измерили частоту опорного генератора, используя ту же формулу и считая, что входная частота известна, затем измерили входную частоту, подставляя в формулу вычисления измеренную опорную частоту. Единственное существенное ограничение данного решения - кратковременная стабильность опорного генератора (на интервале 100 с) должна быть порядка 1Е-9 или лучше.
Валентиныч
Цитата(=GM= @ Apr 24 2007, 22:06) *
Попробуем разобраться с червём сомнения, который точит Валентиныча.

Да нет у меня, по большому счету, никаких сомнений. smile.gif Просто я в подобных вопросах реалист-скептик, привыкший все считать для наихудшего варианта.
Ваши рассуждения (и не только Ваши, уважаемый GM) в общем верны. Точнее - верны в частном случае. Здесь же речь идет о измерении частоты сигнала одного порядка с частотой клока, и весьма ограниченными аппаратными ресурсами.
Если бы у нас был в наличии таймер длиной 32 бита - никаких возражений не последовало бы.
Но максимум, что мы имеем в AVR - 16 разрядов, т.е. каждые 3,27... мс мы будем вынуждены вываливаться в прерывание по переполнению, тратя на это (фактически - прекращая счет) как минимум 5-6 машинных циклов. Свего за время 100 секунд таких пауз будет более 30 тысяч.
Развейте это мое сомнение, и я сниму шляпу перед Вами.

Цитата(=GM= @ Apr 24 2007, 22:06) *
... если уж вы решились мерять 10 МГц с такой точностью, то надо бы поставить опору, соответствующей точности, ну или по крайней мере раскошелиться на термокомпенсированный кварцевый генератор.

Это не я решил. Более того, я как раз уверен, что этого не получится.
Не сбрасываете со счетов, что вопрос задан в разделе для начинающих, поэтому давайте не будем ориентироваться на прецизионные термокомпенсированные клокеры, которые сами по себе - большая сложность, и уж тем более - на всякие внешние источники синхронизации, типа GPS, и т.д.
Исходим из возможностей "среднеститистической" Меги в руках не очень опытного юзера.
P.S. Сразу скажу - я не считаю себя даже средненьким программером. Скорее - так, ламер-любитель.
add
Цитата
Если бы у нас был в наличии таймер длиной 32 бита - никаких возражений не последовало бы.Но максимум, что мы имеем в AVR - 16 разрядов, т.е. каждые 3,27... мс мы будем вынуждены вываливаться в прерывание по переполнению, тратя на это (фактически - прекращая счет) как минимум 5-6 машинных циклов. Свего за время 100 секунд таких пауз будет более 30 тысяч.Развейте это мое сомнение, и я сниму шляпу перед Вами.

Таймер то зачем останавливать.. он продолжает считать пока Вы обрабатываете прерывание .. причем тут 16битные или 32-ух битные таймера..?
Валентиныч
Цитата(add @ Apr 25 2007, 13:14) *
Таймер то зачем останавливать.. он продолжает считать пока Вы обрабатываете прерывание .. причем тут 16битные или 32-ух битные таймера..?

Пардон, что он продолжает считать?
add
Цитата
Пардон, что он продолжает считать?

Цитата
мс мы будем вынуждены вываливаться в прерывание по переполнению, тратя на это (фактически - прекращая счет)

Фактически прекращать счет не надо! вообще не надо. В обсужденнии про измерения частоты (другая ветка), все это обсуждалось. Вываливаемся в прерывание не останавливая (аппаратного ) счетчика (хоть 8битного).. , счетчик продалжает считать интервал времени, А мы в это время (если 8битный таймер то за 256клоков, если 16 то за 65536 ) должны обработать прерывание..(увеличить к примеру 32-ух битную переменную)..можно хоть год так чтитать.. неговоря о 100секундах.. и точность будет привязанна только к погрешностям опоры..(кварца)
Валентиныч
Повторю вопрос - что считаем?
Если внутренний клок, то без проблем. А как считать внешние события в те моменты (4-5 циклов), когда обрабатывается прерывание по переполнению? Возникают пропуски? Или "захват" - автономная аппаратная функция?
add
Цитата
Если внутренний клок, то без проблем. А как считать внешние события в те моменты (4-5 циклов), когда обрабатывается прерывание по переполнению? Возникают пропуски? Или "захват" - автономная аппаратная функци

Внешние считаются так же на аппаратном уровне. т.е. обработка прерываний переполнения таймера от внешней частоты идет параллельно аппаратному увеличению таймера(внешняя частота заведена на вход счета таймера).
=GM=
Цитата(Валентиныч @ Apr 25 2007, 05:31) *
Здесь же речь идет об измерении частоты сигнала одного порядка с частотой клока, и весьма ограниченными аппаратными ресурсами.
Если бы у нас был в наличии таймер длиной 32 бита - никаких возражений не последовало бы.
Но максимум, что мы имеем в AVR - 16 разрядов, т.е. каждые 3,27... мс мы будем вынуждены вываливаться в прерывание по переполнению, тратя на это (фактически - прекращая счет) как минимум 5-6 машинных циклов. Всего за время 100 секунд таких пауз будет более 30 тысяч.
Развейте это мое сомнение, и я сниму шляпу перед Вами

Ну, шляпу снимать не надо, это лишнее(:-). Пока я добрался до работы, вам уже ответили, но вижу всё же у вас остались кое-какие сомнения, так что дополню.

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

И уж если говорить о количестве прерываний по переполнению и о времени обработки, то надо бы говорить о прерываниях от 8-битного таймера0, которые будут следовать каждые 25,6 мкс для входной частоты 10 МГц. Но даже этого времени (примерно 250 команд) с лихвой хватит, чтобы обработать два наложившихся прерывания от обоих таймеров. Даже если любитель будет писать на си(:-).

Конечно, 32-битного таймера нет, да он и не нужен, вместо него прекрасно справляется программная эмуляция двух старших байт. А для таймера0 - даже трёх байт.
Цитата(Валентиныч @ Apr 25 2007, 05:31) *
Более того, я как раз уверен, что этого не получится.
Не сбрасывайте со счетов, что вопрос задан в разделе для начинающих, поэтому давайте не будем ориентироваться на прецизионные термокомпенсированные клокеры, которые сами по себе - большая сложность, и уж тем более - на всякие внешние источники синхронизации, типа GPS, и т.д.
Исходим из возможностей "среднеститистической" Меги в руках не очень опытного юзера.

Не знаю почему вы говорите. что вопрос задан в разделе для начинающих, разве его передвинули? Оценка точности, приводимая выше, не учитывает погрешности опорного генератора, т.е. я считал, что ΔFo/Fo=0, хотя это не так. Для учёта надо относительную погрешность генератора добавить к относительной погрешности применяемого метода. Где-то я читал (не помню, а искать лень), что кратковременная нестабильность современных кварцевых генераторов на интервале одна секунда достигает 1Е-12, ну пусть будет 1Е-10 на интервале 100 секунд, всё равно наша погрешность (1Е-9) на порядок выше. Так что результат вполне приемлен для радиолюбителя средней руки, я уж не говорю о начинающих. Даже если не применять неких специальных мер к улучшению. В программу можно встроить программную подстройку окна и делать проверку пару раз в год на эталоне, если уж сильно нужна абсолютная точность.

Итак, главным результатом является то, что измерение входной частоты, доходящей до половины тактовой частоты процессора вполне возможно на голом микроконтроллере, с хорошей точностью и недорого.
Валентиныч
Цитата(=GM= @ Apr 25 2007, 16:09) *
Не знаю почему вы говорите. что вопрос задан в разделе для начинающих, разве его передвинули?

Виноват - перед этим что-то смотрел в разделе для чайников, видно - "наложилось".
Что касается непрерывности работы таймера, это мне известно. Но был уверен, что внешние события обрабатываются только по прерываниям. Если это не так, то должен согласиться с Вашими доводами, и... снять шляпу! a14.gif
Однако, в попытке "сохранить лицо" выскажу еще одно сомнение:
Если не изменяет память, минимальное время, необходимое для обработки "захвата" - 50 нс. А это как раз период клока. И 10 Мгц гарантированно будут обрабатываться только в том случае, если входная и тактовая частоты синхронны (и синфазны?).
Или я опять чего-то не учитываю?

Цитата
Даже если любитель будет писать на си.

Пишу исключительно на асме. Си - не знаю.
=GM=
Цитата(Валентиныч @ Apr 25 2007, 09:59) *
Однако, в попытке "сохранить лицо" выскажу еще одно сомнение: Если не изменяет память, минимальное время, необходимое для обработки "захвата" - 50 нс. А это как раз период клока. И 10 Мгц гарантированно будут обрабатываться только в том случае, если входная и тактовая частоты синхронны (и синфазны?).
Или я опять чего-то не учитываю?

Ну, выше я вам привёл пример измерения 10 МГц с помощью метода ворот, а не захвата. Про метод захвата я где-то говорил, что он работает до Fо/5, в нашем случае до 4 МГц. Недавно, правда нашёл способ, как на некоторых МК, атмега128, мерять частоту до Fо/2, т.е. до 10 МГц, как и в методе ворот. Точность к сожалению всего в два раза выше, чем при методе ворот, но иногда и это существенно.

Насколько я понимаю, как работает атмега, длительность нуля и единицы входного сигнала ВСЕГДА не должна быть меньше, чем один такт процессора, поскольку в МК практически на каждом пине стоит синхронизатор, но входная частота не обязана быть синхронной по отношению к тактовой частоте процессора.

Итак, сигнал частотой 10 МГц будет гарантированно обрабатываться, если он будут меандром со скважностью два, несинхронным к тактовой частоте.
oles_k76
спасибо всем участникам информация очень помогла cheers.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.