|
Измерение частоты 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 бита. Размахнулся...
--------------------
Закономерность: Чем больше узнаю, тем меньше знаю... Любые мнения, даже ошибочные, имеют право на существование. Чем лучше узнаю людей, тем больше нравятся собаки...
|
|
|
|
Guest_=AVR=_*
|
Apr 24 2007, 16:13
|
Guests

|
Какие "4 мгц на пределе"?? При наличии аппаратного СЧЕТЧИКА считать программно циклом опроса порта? Зачем?? Смотри пост #3, там все предельные факторы однозначно разжеваны
|
|
|
|
|
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, 10:14
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата Если бы у нас был в наличии таймер длиной 32 бита - никаких возражений не последовало бы.Но максимум, что мы имеем в AVR - 16 разрядов, т.е. каждые 3,27... мс мы будем вынуждены вываливаться в прерывание по переполнению, тратя на это (фактически - прекращая счет) как минимум 5-6 машинных циклов. Свего за время 100 секунд таких пауз будет более 30 тысяч.Развейте это мое сомнение, и я сниму шляпу перед Вами. Таймер то зачем останавливать.. он продолжает считать пока Вы обрабатываете прерывание .. причем тут 16битные или 32-ух битные таймера..?
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Apr 25 2007, 10:27
|
Профессионал
   
Группа: Свой
Сообщений: 553
Регистрация: 17-02-05
Из: Свердловская обл.
Пользователь №: 2 712

|
Цитата(add @ Apr 25 2007, 13:14)  Таймер то зачем останавливать.. он продолжает считать пока Вы обрабатываете прерывание .. причем тут 16битные или 32-ух битные таймера..? Пардон, что он продолжает считать?
--------------------
Закономерность: Чем больше узнаю, тем меньше знаю... Любые мнения, даже ошибочные, имеют право на существование. Чем лучше узнаю людей, тем больше нравятся собаки...
|
|
|
|
|
Apr 25 2007, 10:35
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

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

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

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

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

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

|
Цитата(Валентиныч @ Apr 25 2007, 09:59)  Однако, в попытке "сохранить лицо" выскажу еще одно сомнение: Если не изменяет память, минимальное время, необходимое для обработки "захвата" - 50 нс. А это как раз период клока. И 10 Мгц гарантированно будут обрабатываться только в том случае, если входная и тактовая частоты синхронны (и синфазны?). Или я опять чего-то не учитываю? Ну, выше я вам привёл пример измерения 10 МГц с помощью метода ворот, а не захвата. Про метод захвата я где-то говорил, что он работает до Fо/5, в нашем случае до 4 МГц. Недавно, правда нашёл способ, как на некоторых МК, атмега128, мерять частоту до Fо/2, т.е. до 10 МГц, как и в методе ворот. Точность к сожалению всего в два раза выше, чем при методе ворот, но иногда и это существенно. Насколько я понимаю, как работает атмега, длительность нуля и единицы входного сигнала ВСЕГДА не должна быть меньше, чем один такт процессора, поскольку в МК практически на каждом пине стоит синхронизатор, но входная частота не обязана быть синхронной по отношению к тактовой частоте процессора. Итак, сигнал частотой 10 МГц будет гарантированно обрабатываться, если он будут меандром со скважностью два, несинхронным к тактовой частоте.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|