|
Измерение частоты ATmega168 |
|
|
|
 |
Ответов
|
Apr 24 2007, 16:06
|
Профессионал
   
Группа: Свой
Сообщений: 553
Регистрация: 17-02-05
Из: Свердловская обл.
Пользователь №: 2 712

|
Уважаемые, вспомним первоначальную постановку вопроса: Цитата(олесь @ Apr 22 2007, 17:17)  подскажите как правильно определить максимальную входную частоту, которую необходимо померять(очень точно,посчитав кажый импульс) за интервал времени сто секунд, частота опорного генератора 20мгц Если я правильно понимаю, человек интересуется способом (как?), позволяющим с максимальной точностью измерить частоту (какую?) за определенный интервал времени. Зачем ему это нужно, и что он с этими результатами будет делать - вопрос третий. ИМХО: для измерения макимально возможной частоты нужно минимизировать длительность промежуточных процедур. Например - по возможности исключить потери на вход/выход из прерываний. Это время, как известно, составляет в среднем 4 машинных такта. Плюс 2-3 такта на прочие действия. Какие уж тут 10 МГц на входе, при клоке 20 МГц? Очевидно, что простой опрос порта (2 такта ) с последующим инкрементом (2 такта для регистра длиннее 1-го байта) + неизбежные прочие "мелочи" (1-2 такта) - это тот минимум, ниже которого не опуститься. Т.е. реально на регистрацию одного события по входу будет тратиться не менее 4-6 машинных тактов. Отсюда вытекает максимальная частота входного сигнала - 4 МГц. На пределе! Второй вопрос - точность измерения. Здесь она определяется точностью задания "ворот". Относительную точность "клокирования" (в тактах) реализовать не сложно, а вот обеспечить долговременную стабильность частоты расхожего "контроллерного" кристалла весьма и весьма не просто. И далеко не факт, что в течение 100 секунд эта "опора" будет стабильной... Так что какие уж тут 0,02 Гц? Точнее - о какой достоверности подобных измерений идет речь? Или я чего-то сильно не понимаю.  P.S. В моем первом посте ошибка - потребная длина регистра, конечно, не 64, а 32 бита. Размахнулся...
--------------------
Закономерность: Чем больше узнаю, тем меньше знаю... Любые мнения, даже ошибочные, имеют право на существование. Чем лучше узнаю людей, тем больше нравятся собаки...
|
|
|
|
|
Apr 24 2007, 19:06
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Валентиныч @ 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 Гц? Точнее - о какой достоверности подобных измерений идет речь? Или я чего-то сильно не понимаю.  Вы говорите всё правильно, скажу только, что если уж вы решились мерять 10 МГц с такой точностью, то надо бы поставить опору, соответствующей точности, ну или по крайней мере раскошелиться на термокомпенсированный кварцевый генератор. Есть относительно дешёвое решение - поочередно проводить измерения и калиброваться от хорошей опоры, это может быть радиосигнал, или GPS. То есть, используя секундные импульсы с GPS, сначала измерили частоту опорного генератора, используя ту же формулу и считая, что входная частота известна, затем измерили входную частоту, подставляя в формулу вычисления измеренную опорную частоту. Единственное существенное ограничение данного решения - кратковременная стабильность опорного генератора (на интервале 100 с) должна быть порядка 1Е-9 или лучше.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Apr 25 2007, 09:31
|
Профессионал
   
Группа: Свой
Сообщений: 553
Регистрация: 17-02-05
Из: Свердловская обл.
Пользователь №: 2 712

|
Цитата(=GM= @ Apr 24 2007, 22:06)  Попробуем разобраться с червём сомнения, который точит Валентиныча. Да нет у меня, по большому счету, никаких сомнений.  Просто я в подобных вопросах реалист-скептик, привыкший все считать для наихудшего варианта. Ваши рассуждения (и не только Ваши, уважаемый GM) в общем верны. Точнее - верны в частном случае. Здесь же речь идет о измерении частоты сигнала одного порядка с частотой клока, и весьма ограниченными аппаратными ресурсами. Если бы у нас был в наличии таймер длиной 32 бита - никаких возражений не последовало бы. Но максимум, что мы имеем в AVR - 16 разрядов, т.е. каждые 3,27... мс мы будем вынуждены вываливаться в прерывание по переполнению, тратя на это (фактически - прекращая счет) как минимум 5-6 машинных циклов. Свего за время 100 секунд таких пауз будет более 30 тысяч. Развейте это мое сомнение, и я сниму шляпу перед Вами. Цитата(=GM= @ Apr 24 2007, 22:06)  ... если уж вы решились мерять 10 МГц с такой точностью, то надо бы поставить опору, соответствующей точности, ну или по крайней мере раскошелиться на термокомпенсированный кварцевый генератор. Это не я решил. Более того, я как раз уверен, что этого не получится. Не сбрасываете со счетов, что вопрос задан в разделе для начинающих, поэтому давайте не будем ориентироваться на прецизионные термокомпенсированные клокеры, которые сами по себе - большая сложность, и уж тем более - на всякие внешние источники синхронизации, типа GPS, и т.д. Исходим из возможностей "среднеститистической" Меги в руках не очень опытного юзера. P.S. Сразу скажу - я не считаю себя даже средненьким программером. Скорее - так, ламер-любитель.
--------------------
Закономерность: Чем больше узнаю, тем меньше знаю... Любые мнения, даже ошибочные, имеют право на существование. Чем лучше узнаю людей, тем больше нравятся собаки...
|
|
|
|
|
Apr 25 2007, 13:09
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Валентиныч @ 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) на порядок выше. Так что результат вполне приемлен для радиолюбителя средней руки, я уж не говорю о начинающих. Даже если не применять неких специальных мер к улучшению. В программу можно встроить программную подстройку окна и делать проверку пару раз в год на эталоне, если уж сильно нужна абсолютная точность. Итак, главным результатом является то, что измерение входной частоты, доходящей до половины тактовой частоты процессора вполне возможно на голом микроконтроллере, с хорошей точностью и недорого.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
Сообщений в этой теме
олесь Измерение частоты ATmega168 Apr 22 2007, 14:17 Валентиныч Вопрос поставлен не корректно.
За 100 секунд можно... Apr 22 2007, 14:31 =AVR= В лоб (используя таймер в режиме счетчика) - теоре... Apr 22 2007, 15:41 zorromen А если логику приделать ... счетчик например ... т... Apr 22 2007, 15:42 CD_Eater Если подсчитывать количество периодов измеряемого ... Apr 22 2007, 15:51 WHALE Цитата(CD_Eater @ Apr 22 2007, 16:51) Есл... Apr 22 2007, 17:47 CD_Eater ЦитатаА меандром-то зачемВ ДШ озвучено требование ... Apr 22 2007, 21:29 Dopler http://electronix.ru/forum/lofiversion/index.php/t... Apr 22 2007, 23:00 =AVR= Не совсем так. Здесь автору вопроса нужно мерять м... Apr 22 2007, 23:14 =GM= Цитата(Dopler @ Apr 22 2007, 20:00) http:... Apr 23 2007, 00:51  demaven Точность измерения на 100-секундном интервале сост... Apr 23 2007, 07:53   =GM= Цитата(demaven @ Apr 23 2007, 03:53) Уваж... Apr 23 2007, 12:50   defunct Цитата(demaven @ Apr 23 2007, 06:53) Точн... Apr 23 2007, 13:25    =GM= Цитата(defunct @ Apr 23 2007, 09:25) Точн... Apr 23 2007, 13:56     defunct Цитата(=GM= @ Apr 23 2007, 12:56) Добавлю... Apr 23 2007, 14:04      mse Цитата(defunct @ Apr 23 2007, 15:04) Тут ... Apr 23 2007, 14:30      =GM= Цитата(defunct @ Apr 23 2007, 10:04) Тут ... Apr 23 2007, 14:33       defunct Цитата(=GM= @ Apr 23 2007, 13:33) Это что... Apr 23 2007, 18:11        =GM= Цитата(defunct @ Apr 23 2007, 14:11) погр... Apr 23 2007, 19:32         defunct Цитата(=GM= @ Apr 23 2007, 18:32) Да с че... Apr 23 2007, 22:22          =GM= Цитата(defunct @ Apr 23 2007, 19:22) Для ... Apr 23 2007, 22:54           defunct Цитата(=GM= @ Apr 23 2007, 21:54) Я утвер... Apr 24 2007, 00:23            =GM= Цитата(defunct @ Apr 23 2007, 21:23) 1 ил... Apr 24 2007, 01:29             defunct ЦитатаКак это не важно? Это очень важно, ошибка ум... Apr 24 2007, 14:18              mse Цитата(defunct @ Apr 24 2007, 15:18) Умен... Apr 24 2007, 14:49               defunct Ок, приношу всем кого задел свои извинения.
Я здес... Apr 24 2007, 15:40              =GM= Да, интересное кино. Я смотрю, вы отвечаете только... Apr 24 2007, 15:23  =AVR= Цитата(=GM= @ Apr 23 2007, 01:51) Метод з... Apr 23 2007, 15:41   =GM= Цитата(=AVR= @ Apr 23 2007, 11:41) Captur... Apr 23 2007, 16:19 =AVR= ЦитатаНадо-то всего два прерывания на одно измерен... Apr 23 2007, 16:56    Валентиныч Цитата(=GM= @ Apr 25 2007, 16:09) Не знаю... Apr 25 2007, 13:59     =GM= Цитата(Валентиныч @ Apr 25 2007, 09:59) О... Apr 25 2007, 14:30 =AVR= Какие "4 мгц на пределе"?? При наличии а... Apr 24 2007, 16:13 add ЦитатаЕсли бы у нас был в наличии таймер длиной 32... Apr 25 2007, 10:14 Валентиныч Цитата(add @ Apr 25 2007, 13:14) Таймер т... Apr 25 2007, 10:27 add ЦитатаПардон, что он продолжает считать?
Цитатамс ... Apr 25 2007, 10:35 Валентиныч Повторю вопрос - что считаем?
Если внутренний клок... Apr 25 2007, 10:59 add ЦитатаЕсли внутренний клок, то без проблем. А как ... Apr 25 2007, 11:11 олесь спасибо всем участникам информация очень помогла May 5 2007, 13:52
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|