Перейти к содержанию
    

три частоты на АТмегу 128 с использованием таймеров

Ну, так во всех методах делается. Весь вопрос в том и состоит, подсчёт числа КАКИХ импульсов производится и КАК формируется интервал времени измерения. Спасибо за ответ, но хотелось бы услышать мнение Богдана(:-).

Метод "временных ворот" дает точность измерения +-1 период от измеряемой частоты.

Сейчас опять будут недопонимания(:-). Дайте определение временного разрешения и точности измерения.

Метод "обратного отсчета" (измерения периода) описан у Хоровца и Хилла в Искусстве схемотехники. У меня в трехтомнике это Том.3. раздел 15.10, стр.294-294.

Если у вас таймер тактируется частотой 16МГц, то временнОе разрешение с которым вы можете измерить один период составляет 1/16000000 с.

То что я привёл, это максимальная погрешность однократного измерения (с 1 с интервалом измерения и без учета погрешности опорной частоты 16 МГц). Реальная погрешность, вгрубе, будет ниже.

Вот именно! Без учета погрешности опорной частоты. Обычные кварцы имеют начальную погрешность порядка 20-50ppm и температурную нестабильность порядка 30-100ppm. Она и будет определяющей в данном случае, а не временнОе разрешение, которое вы математически сможете получить за период измерения 1 сек.

Ок, в таком случае программа для измерения частоты ОДНОГО входного сигнала 170khz с точностью не хуже 2Гц займет для вас около 20-ти минут (сопоставимо с временем написания одного комента в форуме). Если Вы умеете не только трепаться языком, то с любопытством жду от вас пример программы для измерения частоты ОДНОГО входного сигнала 170khz с точностью не хуже 2Гц с использованием Capture Unit. И когда будет готов пример программы, мы сможем обсудить его преимущества и недостатки. Thanks.

Извините, но вас я тоже могу отослать к разделу 15.10 из Х и Х.

Например, для увеличения разрешающей способности измеряемую частоту смешивают с близкой ей опорной и выделяют разностную частоту (Fразн.). Эту сравнительно низкую разностную частоту измеряют с тем же временнЫм разрешением, что позволяет таймер (1/Fтакт.). Но по отношению к исходной частоте разрешающая способность увеличивается до Fразн./Fтакт. Как этот способ применить на AVR я не знаю, т.к. слабо знаком с его таймерами. Для MSP430 представляю лучше, хотя честно признаюсь, что на практике необходимости применять его пока не было.

P.S. точнее не совсем этот способ с выделением и прямым измерением разностной частоты, а другой, также описанный у ХХ, определение периода разностной частоты за время выделенное для измерения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, но вас я тоже могу отослать к разделу 15.10 из Х и Х.

Он это заслужил, т.к. уже много небылиц нарассказывал, а полезного - "0 в сиянии".

И про измерения временных интервалов с точностью 0.5 такта, и про 20MSPS на AVRке тактируемой 20Mhz, теперь вот за два захвата получить точность измерения частоты +-0.02 Гц. Пусть хоть что-то подтвердит, тем паче время он там указал - 20 минут не так много (я на этот пост 20 минут потратил).

 

Например, для увеличения разрешающей способности измеряемую частоту смешивают с близкой ей опорной и выделяют разностную частоту (Fразн.). Эту сравнительно низкую разностную частоту измеряют с тем же временнЫм разрешением, что позволяет таймер (1/Fтакт.). Но по отношению к исходной частоте разрешающая способность увеличивается до Fразн./Fтакт.

GM за 6 прерываний в сукунду решил измерить с точностью +-0.02Гц частоты трех источников.

Неужели вы не понимаете всей абсурдности этого?

 

В AVR при возникновении события захвата в регистры ICRx переписывается текущее значение счетчика TCNT и возбуждается прерывание. GM заявляет, что достаточно всего 6-ти прерываний (событий) в секунду.

 

Если прерываний всего 6 (тобиш по 2 захвата на каждый входной сигнал), то у нас будет всего лишь одинократно отмерянный период сигнала, что и будет соответствовать точности приблизительно +-1% (+-1.7Khz), как уже отмечали выше. На мой взгляд, ни вы, ни GM до сих пор не понимаете, что для получения точности хотябы близкой к +-1Гц, потребуется несколько тысяч таких выборок (для точности +-0.02Гц - несколько миллионов), соответвенно и прерываний будет несколько тысяч/миллионов для каждого входного сигнала, и расчитывать "дельту" нужно будет успевать на лету, за время пока не произошел следующий захвать. А времени то нет, у нас всего ~100 тактов между захватами для одного сигнала. 100/ 3 - по 33 такта на обработку.

 

Как этот способ применить на AVR я не знаю, т.к. слабо знаком с его таймерами. Для MSP430 представляю лучше, хотя честно признаюсь, что на практике необходимости применять его пока не было. P.S. точнее не совсем этот способ с выделением и прямым измерением разностной частоты, а другой, также описанный у ХХ, определение периода разностной частоты за время выделенное для измерения.

В заданных условиях, на m168 - никак, я уже отметил это выше. И повторюсь еще раз, здесь нужно таймеры использовать в режиме счетчиков (External Clock source). В этом режиме таймеры просто считают входные импульсы - процессор отдыхает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

defunct, я же указал не один раз, что плохо знаю архитектуру AVR и его таймеров. Считайте тогда мой пост чистой теорией, раз при исходных условиях это не реализуется на AVR :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь я вставлю свои пять копеек.

 

Надеюсь будет более понятно.

 

Таймер,таймер\счетчик просто счетчик ,каккнывать не имеет значения так как все равно это одна и таже периферия ,разница лиш в том в каком режиме ее использовать.

 

Я (и defunct насколько я понял) предложили использование таймеров в режиме счета с тактированием не от ядра а от внешнего сигнала.Я думаю тут коменттарии не нужны как это все считается.

 

=GM= предложил в режиме захвата ,вот здесь и возник камень преткновения,так как одни считают что можно добиться высокой точности другие что нет.

Теперь немного разложим измерение в этом режиме.

допустим имеем частоту кварца 17мГц и входной сигнал частотой 170кГц,в этом режиме таймер стартанет со счетом не более 17мГц при переходе входного синала допустим с 0 на 1 и перенесет при переходе из 1 в 0 значение TCNT в регистр ICR и сгенерит прерывание если потребуется.

В результате при данном тактировании и частоте сигнала мы получим значение ICR<=100 ,а если скважность сигнала =50% то соответственно :),ну пускай будет 100.

Тут легко посчитать - имеем 170кГц

 

Теперь дальше ,а если сигнал не ровно 170кГц? Тоесть ICR выдал =101 ,мы считаем сигнал

17000000\101=168.316Гц ,тоесть если сигнал допустим 169кГц мы сможем посчитать или 170кГц или 168.316Гц точнее никак :) так как в ICR нет значений после точки :):):) соответствено мы будем иметь дело с достаточно большой погрешностью.И сколько раз не меряй в этом режиме - среднеарифметической точности ,тоже ну никак не получиться :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Теперь дальше ,а если сигнал не ровно 170кГц? Тоесть ICR выдал =101 ,мы считаем сигнал

17000000\101=168.316Гц ,тоесть если сигнал допустим 169кГц мы сможем посчитать или 170кГц или 168.316Гц точнее никак smile.gif так как в ICR нет значений после точки smile.gifsmile.gifsmile.gif соответствено мы будем иметь дело с достаточно большой погрешностью.И сколько раз не меряй в этом режиме - среднеарифметической точности ,тоже ну никак не получиться smile.gif

Ну да?! Ну пускай будет не ровно 170кГц, а скажем 169999Гц. За период 1 сек получаем 100 измерений: допустим пускай будет 91 значений 100, 9 значений 101. Итого (91*100+9*101)/100=100,09. Множим на период единичного отсчета, берем обратную величину и получаем 1/(100,09*1/17000000Гц)=169847,1 Гц. То бишь получили относительную погрешность 0,09%, против ваших 0,99% полученных при однократном измерении периода ;) За 100 измерений улучшаем временнОе разрешение счетчика на порядок.

Все это конечно справедливо при условии, что шумы схемы имеют гауссово распределение.

P.S. при этом улучшается именно временнОе разрешение, а не точность. Точность будет определятся в т.ч. самым худшим параметрами опорной частоты. 20ppm начального разброса частоты кварца дадут 17МГц+-340Гц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2resident

 

А с чего Вы взяли что при частоте 169999Гц ,у вас будет 91 значений 100 и 9 значений 101,а не все значения будут иметь значения 100 ? Клок ядра - есть аксиома через которую уже не перепрыгнеш.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Билин, ну да, в спешке я лажанулся :( Это статистически неверный пример. Правильно было бы указать частоту 169990Гц, а не 169999Гц. Тогда за 1 сек как раз 10 раз набегает фаза. И получается подсчитанная частота 169847,1Гц при истиной 169990Гц. Относительная погрешность измерения получается около указанных ранее 0,09%. На порядок выше, чем при измерении 1 периода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вот, стоило ненадолго ответвиться, столько всего понаписали, не знаю даже с чего начать.

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

 

ИЗМЕРЕНИЕ ЧАСТОТЫ С ПОМОЩЬЮ АВР МИКРОКОНТРОЛЛЕРА

 

1) Введём определения

Fо - сигнал опорной частоты,

То - период опорной частоты, То=1/Fо,

Fx - входной сигнал (меандр) неизвестной частоты, подлежащей измерению,

Тх - период входной частоты, Тх=1/Fx,

Тизм - период измерения входной частоты,

N - количество импульсов опорной частоты за время измерения,

M - количество импульсов входной частоты за время измерения.

 

2) Формула вычисления частоты Fx = Fо*М/N (поскольку очевидно, что То*N=Тх*М за Тизм).

 

3) Формула для Fx применима как к варианту с "воротами", так и к варианту со схемой захвата. При использовании схемы захвата М является точным числом, а N "гуляет" в пределах (-1,+1). При использовании "ворот" N является точным числом, а М "гуляет" в пределах (-1,+1).

 

Вот всё, что нам нужно знать из теории для измерения частоты.

 

4) Применим наши знания на практике. Выберем период измерения Тизм примерно равным одной секунде. (Примерно потому, что Тизм должен быть ТОЧНО кратен М*Тх). Пусть Fx=170 кГц, а Fо=16МГц. Тогда М=170000, а N=16000000.

 

Вычислим частоту по нашей формуле Fxвыч = Fо*М/N=16000000*170000/16000000=170000 Гц.

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

Ну и ещё упростим задачу, приняв ΔFo/Fo =0 (На самом деле, кратковременная нестабильность кварцевой опоры порядка 10^(-8) или лучше).

 

Итак, Fx = Fо*М/(N±1)=170000±0.010625 Гц. Что нам и требовалось показать. Относительная погрешность составит 6*10^(-8). Можно добавить 10^(-8) нестабильности опоры, если требуется уточнить погрешность. Кстати, для варианта с "воротами" Fx = Fо*(М±1)/N=170000±1 Гц, как и было сказано.

 

5) Перейдём теперь к реализации алгоритма на микроконтроллере. В принципе, всё и так уже ясно, просто поставим точки над ϊ и чёрточки на t(:-). Сколько нам нужно захватов таймера, чтобы вычислить частоту? Два - один для захвата начала секундного интервала, и второй для захвата конца того же интервала. Пусть захват работает по прерыванию. При захвате, т.е. при положительном фронте импульса входной частоты, содержимое таймера перепишется в регистр ICR. Прекрасно, в этом же прерывании запомним в регистрах или в памяти два числа – количество импульсов Мнач и Nнач, запрещаем прерывание и выходим из него (замечу в скобках, схема захвата "молотит" по-прежнему, но прерывания запрещены), оно нам понадобится только через секунду, займёмся другими делами, скажем, расчетом частоты предыдущего цикла. Через примерно секунду работы (или вынужденного безделья, можно по таймеру) ОПЯТЬ разрешаем прерывания от схемы захвата. Как только оно произойдёт, опять запоминаем два числа – количество импульсов Мкон и Nкон, запрещаем прерывание по захвату и выходим из него, вычисляем М=Мкон-Мнач, N=Nкон-Nнач.

 

Вот так это всё и работает. Я, конечно многого не упомянул. Все переменные для расчета должны быть соответствующей разрядности, как минимум 32, умножение надо делать до деления, чтобы не потерять точность, вычисление частоты можно вести непрерывно, достаточно просто после вычисления частоты переписать переменные Мнач=Мкон, Nнач=Nкон. Обязателен учёт переполнения таймеров.

 

6) По времени выполнения, самые длительные операции – умножение и деление, скажем, по 400 тактов, остальное умещается в 500 или меньше. 1500 тактов из 16 миллионов - процессор практически свободен 99.9% времени.

 

7) Измерение по похожему алгоритму реализовано мной на МК 8515 и прекрасно работает более 5-ти лет в нескольких тысячах экземпляров (в Германии).

 

8) Последнее. Надеюсь, что defunct возьмёт назад свои слова о "трепе". Надеюсь также, что сия заметка кому-то реально поможет в понимании, в реализации или ещё в чём-нибудь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8) Последнее. Надеюсь, что defunct возьмёт назад свои слова о "трепе". Надеюсь также, что сия заметка кому-то реально поможет в понимании, в реализации или ещё в чём-нибудь.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выберем период измерения Тизм примерно равным одной секунде. (Примерно потому, что Тизм должен быть ТОЧНО кратен М*Тх). Пусть Fx=170 кГц, а Fо=16МГц. Тогда М=170000, а N=16000000.

Непонятно откуда взялось и как реализовать это условие? Изначально мы не знаем ни M, ни Tx, нам их нужно измерить. А если мы их знаем, то зачем измерять? :blink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Как! Два прерывания на одну частоту уже достаточно? И с точностью ±0.010625 Гц согласны?

 

Да какая там загрузка, слёзы! - меньше ОДНОГО процента!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я понял, второй случай это тот же метод "временных ворот", но на счетный вход подается не измеряемая частота, а опорная? А временные ворота формируются измеряемой частотой, так? Как это реализуется на реальной периферии с использованием таймера?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Непонятно откуда взялось и как реализовать это условие? Изначально мы не знаем ни M, ни Tx, нам их нужно измерить. А если мы их знаем, то зачем измерять? :blink:

Ну что ж тут непонятного? Конечно вы ничего не знаете ни о М, ни о Тх. В произвольный (и удобный для вас) момент времени разрешаете прерывание от схемы захвата и ждёте наступления прерывания. Вот это прерывание наступило, записываете свои М и N, запрещаете прерывание. Тупо ждёте в программе (с помощью программной задержки) ОДНУ секунду или 1.2 с или сколько вам надо, затем ОПЯТЬ разрешаете прерывание от схемы захвата и ждёте наступления прерывания. Ну и так далее, как описано мною выше. По М, N и Fo определяете вашу Fx, ну и Тх, если надо. А интервал измерения связан с заданной точностью измерения и наоборот. зависит от решаемой задачи.

 

Вся прелесть метода в том, что вам НЕ ОБЯЗАТЕЛЬНО ждать точно одну секунду, ждите сколько можно или сколько вам хочется. В результате разного времени ожидания в итоге вы получите совершенно другие М и N, но вычисление по формуле даст тот же самый результат.

Возьмите, да посчитайте для 1с и для 1.3с, практически ничего не изменится.

 

ЭТОТ АБЗАЦ ПОПРАВЛЕН

Вот, кстати говоря, ещё один метод измерения придумался, и не одной, не трёх, а десятков частот. После получения стартовых Мнач и Nнач и завершающих пар Мкон и Nкон для одной частоты подключаете к МК мультиплексором другую частоту и получаете новую пару стартовых М и N. И так для десятка-другого частот, насколько мультиплексора хватит и в зависимости от требуемой точности. В течение одной секунды можно измерить СТО частот, поскольку для достижения точности ±1 Гц предлагаемым методом потребное время измерения составляет 10 мс (для максимальной частоты 170 кГц).

 

Забыл добавить, что можно делать оценку значения входной частоты с помощью метода "временных ворот" что-нибудь порядка 10-20-100 мс, чтобы обеспечить подходящие условия для точного измерения, скажем инфранизких частот, или для определения наличия входной частоты и т.д. Ну это уже примочки для коммерческих продуктов, мы же с вами обсуждаем идею получения максимальной точности на АВР при прочих равных условиях. Согласитесь, что точность в ±0.01 Гц звучит гораздо лучше, чем точность ±1 Гц, как тут предлагают некоторые уважаемые, не в обиду им будь сказано.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если честно, то я нихрена не понял :) Если можно, то дайте до кучи еще и описание схемы захвата. А то, видимо я ее функционирование представляю себе тоже не так, как вы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насколько я понял, второй случай это тот же метод "временных ворот", но на счетный вход подается не измеряемая частота, а опорная? А временные ворота формируются измеряемой частотой, так? Как это реализуется на реальной периферии с использованием таймера?

Это как бы обобщённый метод "временных ворот", если хотите, М периодов входных и N периодов опорных. Частный случай при М=1 - измерение одного периода входной частоты.

 

Входная частота подается на ножку ICPn, которая является частью схемы захвата (input capture unit). Схема захвата работает следующим образом. По фронту импульса входной частоты содержимое таймераn переписывается в специальный регистр (ICRn). Можно и по спаду, это настраивается. То есть, если у вас в таймереn тикает время, то вы получите точное значение времени пришедшего фронта, скажем, это было начало измерения (значит, число Nнач). Запомнили его. И т.д. Количество импульсов входной частоты можно считать программно, но можно и другим таймером0 (счетчик М), я так и делаю. n - номер схемы захвата.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...