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

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

Так, хорошо хоть работу схемы захвата я понимаю верно. :)

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

Т.е. получается, что как обычно таймер тактируется опорной частотой, которая является асинхроной по отношению к входной измеряемой. Поэтому захват фронта измеряемой частоты произойдет с точностью до 1 такта опорной.

Количество импульсов входной частоты можно считать программно, но можно и другим таймером0 (счетчик М)

ОК, посчитали мы импульсы и зафиксировали схемой захвата фронт последнего импульса с точностью опять же +- 1 период от опорной частоты.

Кстати, а переполнения таймера вы учитываете? При тактовой 16МГц за 1 сек измерения у 16-битного таймера произойдет 244 переполнения.

Ладно. Дальше. Пускай измеряемая частота была 169999Гц. Тогда за время счета 170000 импульсов мы получаем схемой захвата число 16000094. Вычисляем по вашей формуле Fx=16000000*170000/16000094(+-2)=169999,001Гц(+-0,02Гц).

Хм. :cranky: И вправду получается неплохое разрешение! :a14:

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


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

хелп! запутался в конец!

Ув.=GM=, поясните пожалуйста.

По фронту импульса входной частоты содержимое таймераn переписывается в специальный регистр (ICRn).

а что за содержимое в таймере?(что собственно мы там насчитали?) Неивестное время до начала вх. импульса?

Выждали примерно (!) секунду, включили прерывания Capture Unit опять, сработало, в прерывании записали время т2 и выключили прерывания Capture Unit

Здесь я так понял время прошедшее до первого фронта после интервала "примерно одна секунда".

И собственно непонятно причем здесь это?:

Зная количество периодов входной частоты, (т2-т1)

Да вот еще до кучи цитата:

Евстифеев(Atmel_AVRTiny_Mega) ..стр 284. "следует понимать, что между изменением состояния вххода блока захвата копированием счетного регистра в регистр захвата проходит некоторое время. Эту задержку вносит синхронизатор и детектор. Величина задержки состовляет 2.5 ..3.5 машинных цикла...

Тут как быть с 2.5...3.5?

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


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

ОК, посчитали мы импульсы и зафиксировали схемой захвата фронт последнего импульса с точностью опять же +- 1 период от опорной частоты.

Немного подправлю. Любой фронт вы фиксируете с точностью в диапазоне (0,1) такт, значит оба фронта фиксируются с точностью ±1 такт. Это важно осознать, а то вы там ниже уже пишете ±2, а это неправильно.

Кстати, а переполнения таймера вы учитываете? При тактовой 16МГц за 1 сек измерения у 16-битного таймера произойдет 244 переполнения.

А як-жеж(:-)! Специально написал, что все переменные 32-битные.

Ладно. Дальше. Пускай измеряемая частота была 169999Гц. Тогда за время счета 170000 импульсов мы получаем схемой захвата число 16000094. Вычисляем по вашей формуле Fx=16000000*170000/16000094(+-2)=169999,001Гц(+-0,02Гц).

Хм. :cranky: И вправду получается неплохое разрешение! :a14:

Как-то не так вы вычисляете. Для частоты 169999 Гц вы и получите за 1 секунду М=169999 импульсов, а импульсов опорной за секунду будет N=16000000. Измеренная частота Fx=169999*16000000/(16000000±1)=169999±0.01. Ну и вот здесь ошибочка, надо писать ±1, а не ±2, почему, я объяснил выше.

 

хелп! запутался в конец!

Ув.=GM=, поясните пожалуйста.

а что за содержимое в таймере?(что собственно мы там насчитали?) Неивестное время до начала вх. импульса?

В таймере идёт текущее время, которое задается опорным генератором, таймер считает импульсы этого генератора. Нам неважно абсолютное значение начала, нам важна разница между концом и началом. N=Ткон-Тнач ("временные ворота", если хотите).

 

Здесь я так понял время прошедшее до первого фронта после интервала "примерно одна секунда".

И собственно непонятно причем здесь это?: "Зная количество периодов входной частоты, (т2-т1)"

Ну так это и есть значение периода измерения.

Да вот еще до кучи цитата:

Евстифеев(Atmel_AVRTiny_Mega) ..стр 284. "следует понимать, что между изменением состояния вххода блока захвата копированием счетного регистра в регистр захвата проходит некоторое время. Эту задержку вносит синхронизатор и детектор. Величина задержки состовляет 2.5 ..3.5 машинных цикла...

Тут как быть с 2.5...3.5?

Ну, задержка одна и та же как для начала, так и для конца. Не надо её учитывать. Тем более, как я сказал, нам без разницы каково абсолютное время, важна разница между последним фронтом и первым.

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


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

Вгрубе так, запустили прерывание Capture Unit, оно сработало, в прерывании записали захваченное время т1 и выключили прерывания Capture Unit. Выждали примерно (!) секунду, включили прерывания Capture Unit опять, сработало, в прерывании записали время т2 и выключили прерывания Capture Unit. Зная количество периодов входной частоты, (т2-т1) и тактовую частоту, вычисляем частоту входного сигнала, точность измерения примерно ±0,02 Гц. Сравните с вашими ±1 Гц. Другим способом на данном железе вы такой точности не добьётесь.

 

Как я понял измерения проходят так:

post-9459-1176205767_thumb.jpgpost-9459-1176205777_thumb.jpg

 

Как тут можно определить частоту?

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


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

Как я понял измерения проходят так:

post-9459-1176205767_thumb.jpgpost-9459-1176205777_thumb.jpg

Как тут можно определить частоту?

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

 

Вот вы написали "Оно сработало" в конце периода Т1 (ваши обозначения на рис.1). Что это означает? Это означает, что содержимое таймера1 от "мелкого" опорного меандра (который вы не нарисовали) переписалось в регистр ICR1, его надо запомнить, а прерывание запретить (в принципе, можно не запрещать, просто не обращать внимания, если время и вычислительная обстановка позволяет, важно, что нужно только первое, которое даёт время начала вашего окна).

 

Отмечу, что таймер1 продолжает работать, отсчитывает длительность окна. В начале времени Т2 на вашем рисунке надо разрешить прерывание опять, всё так, дождаться когда оно сработает (конец периода Т2 на вашем рисунке), и запомнить время, сохранённое в ICR1.

 

Затем нужно вычислить разность этих времен. Что нам даст эта разность? Эта разность N нам даст время (в тиках таймера1) между первым фронтом входной частоты и последним фронтом. Причём это время будет не приблизительным, а ТОЧНЫМ, с точностью ±1 такт. В то же самое время, таймер0 подсчитает количество импульсов входной частоты М. Теперь вы имеете на руках М, N и Fo и по формуле можете посчитать Fx.

 

Скажу ещё раз, для ясности. Сигнал измеряемой частоты надо подать на вход ICP1 и вход timer0/counter0, который работает как счётчик, в то же время timer1 работает как таймер, считает импульсы опорной частоты.

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


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

Скажу ещё раз, для ясности. Сигнал измеряемой частоты надо подать на вход ICP1 и вход timer0/counter0, который работает как счётчик, в то же время timer1 работает как таймер, считает импульсы опорной частоты

таймер0 подсчитает количество импульсов входной частоты М.

Этого не хватало для понимания :-) т.е. всеж таки мы не совсем "отдыхаем", а переодически Fвх. /255 обрабатываем переполнение таймера timer0/counter0 считая кол-во импульсов. (для 170кГц это 666 прерываний на обработку которого пусть тактов20, соответственно это 13333 тактов, - меньше 0,1% загрузки контр.при 17МГц за сек. )

Спасибо за разъяснения.

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


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

Этого не хватало для понимания :-) т.е. всеж таки мы не совсем "отдыхаем", а периодически Fвх. /256 обрабатываем переполнение таймера timer0/counter0 считая кол-во импульсов. (для 170кГц это 664 прерываний на обработку которого пусть тактов20, соответственно это 13280 тактов, - меньше 0,1% загрузки контр. при 17 МГц за сек.)

Спасибо за разъяснения.

На здоровье.

 

Да, конечно, не совсем "отдыхаем"(:-). Но это малая плата за результат. Кстати, в методе "ворот" тоже надо учитывать переполнения, куда от них денешься. А откуда у вас взялось 17 МГц? Лучше не выходить за допустимые рамки по тактовой частоте.

 

Добавлю, что ещё будут прерывания по переполнению таймера1, который считает опору. Ну здесь загрузка вообще слёзы - 16МГц/65536=244 Гц или один раз за 4 мс. На загрузку проца практически не влияет.

 

Отвлекусь малёк. Я вот вижу, что вы заинтересовались, позадавали вопросы и разобрались, как оно всё работает.

 

Что ж некоторые уважаемые, не буду показывать пальцем, никак не разберутся и не заберут свои слова назад о том, что это "пустой трёп"? А потом опять из-за угла будут говорить о "0 в сиянии". Как-то несправедливо получается, человека оговорить можно и легко, а признать свою неправоту нельзя ни под каким видом. Конечно, надо иметь определенное мужество, чтобы признать перед сообществом свою неправоту.

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


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

Как-то не так вы вычисляете. Для частоты 169999 Гц вы и получите за 1 секунду М=169999 импульсов, а импульсов опорной за секунду будет N=16000000. Измеренная частота Fx=169999*16000000/(16000000±1)=169999±0.01. Ну и вот здесь ошибочка, надо писать ±1, а не ±2, почему, я объяснил выше.

Еще раз. Откуда взялась цифра 169999? Изначально мы не знаем входную частоту. Допустим по 1 периоду определили ее период с дискретностью +-1 такт опорной частоты (число 94 или 95 в ее отсчетах). Т.е. 16000000Гц/94=170212,766Гц или 16000000Гц/95=168421,051Гц. Время измерения у нас 1 сек, следовательно мы должны подсчитать 170213 или 168421 импульсов входной частоты, чтобы примерно получить 1 сек "временнЫх ворот".

Далее, взяв меньшую величину (чтобы гарантированно уложиться в 1 секунду), посчитаем 168421 импульс частоты 169999Гц. Мы получим длительность "временнЫх ворот" 0,99072 сек. За это время первый таймер отсчитает 15851481 такт опорной частоты (разница между двумя захватами старта и стопа).

Итого расчетная частота получится: Fx=16000000*168421/15851481(+-2)=169999,005Гц+-0,02Гц

Я не знаю синхронный или асинхронный захват в AVR, поэтому насчет +-2 утверждать не буду. В общем (худшем) случае будет +-2 такта.

Насчет описанного вами метода я в общем-то все понял. Нет принципиальной разницы в том, чтобы формировать "временнЫе ворота" опорной частотой, подсчитывая импульсы измеряемой частоты или наоборот, формировать "временнЫе ворота" из импульсов измеряемой частоты, подсчитывая количество импульсов опорной частоты, "влезающие" в эти "временнЫе ворота". Точнее разница в том, что "временнЫе ворота" лучше формировать из более низкой частоты. Спасибо за разъяснения! :a14:

P.S. только для удобства лучше все же иметь в периферии 32-х разрядный таймер, а не 8-ми разрядный :)

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


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

Еще раз. Откуда взялась цифра 169999? Изначально мы не знаем входную частоту. Допустим по 1 периоду определили ее период с дискретностью +-1 такт опорной частоты (число 94 или 95 в ее отсчетах). Т.е. 16000000Гц/94=170212,766Гц или 16000000Гц/95=168421,051Гц. Время измерения у нас 1 сек, следовательно мы должны подсчитать 170213 или 168421 импульсов входной частоты, чтобы примерно получить 1 сек "временнЫх ворот".

Не, что-то не срастается. Давайте ляжем по-другому(:-). Запустили таймер1 и прерывание по захвату. Пусть так получилось, что прерывание сработало как раз в то время, когда в таймере оказался 0 (вообще без разницы, что там будет, просто для удобства). Запомнили этот 0 в памяти или регистре, не важно. Сидим ждём, курим, "кирпич ёк"(:-). То есть ничего не делаем, таймер1 подсчитывает время окна, таймер 0 подсчитывает количество входных импульсов. "Ничего не делаем" означает скручиваем 32-битный счетчик, предположим он рассчитан на 800 мс. Затем разрешили прерывание по захвату, оно сработало, у нас в руках число - время последнего фронта входного импульса. Какое оно будет? Зависит от того, сколько импульсов входного сигнала насчиталось. Давайте прикинем.

 

Если задержка была на 800 мс, то число М=170000*0.8=136000, а число N=16000000*0.8=12800000. Хорошо, значит Fx=16000000*136000/12800000=170000±0.013 Гц

 

Если задержка была на 801 мс, то число М=170000*0.801=136170, а число N=16000000*0.801=12816000. Fx=16000000*136170/12816000=170000±0.013 Гц

 

Если задержка была на 802 мс, то число М=170000*0.802=136340, а число N=16000000*0.802=12832000. Fx=16000000*136340/12832000=170000±0.013 Гц

 

Ну и так далее. Как вы видите размер окна никак не влияет на результат. Но относительная ошибка, естественно, зависит от времени наблюдения. Для упрощения понимания я брал задержку примерно на 1 с.

 

Подчеркну, окно всё время будет кратным периоду входной частоты, поскольку схема захвата срабатывает от передних фронтов именно входной частоты. Ну а поскольку частота опоры асинхронна по отношению к входной частоте, она будет "гулять" на ±1 такт.

Я не знаю синхронный или асинхронный захват в AVR, поэтому насчет +-2 утверждать не буду. В общем (худшем) случае будет +-2 такта.

Захват синхронный, поскольку все входные сигналы тактируются внутренним клоком, т.е. все входные фронты приводятся к единой временной сетке, что есть, не скажу всегда необходимо, но грамотно с точки зрения построения архитектуры МК. Как бы то ни было, фронт нашего сигнала лежит между двумя фронтами тактовой частоты, следовательно максимальная ошибка +1 такт, или, если хотите, ±0.5 такта. Как кому нравится. Или вот так ещё можно сказать: фронт нашего сигнала лежит в диапазоне от N до N+1 такта, соответственно ошибка лежит в диапазоне от 0 до 1 такта.

P.S. только для удобства лучше все же иметь в периферии 32-х разрядный таймер, а не 8-ми разрядный :)

Так ведь нет его! С другой стороны, представьте себе некий 8-10-12-ногий чип, который меряет частоту с относительной точностью 10^(-10), что могут дать только какие-нибудь монстры с цезиевым или там водородным стандартом, да и то не все. Ну а опору надо брать от ДжиПиэС(:-).

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


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

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

Чудак человек...

 

1. Чем ваше решение в таком случае отличается от предложенного мной в comment'e #6?

2. Откуда здесь возьмется точность в +-0.02 Гц?

3. Зачем здесь Capture Unit если отмерять окно измерения можно гораздно проще, а опорная частота Fosc у нас и так есть.

 

теперь ваша формула:

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

 

проверим ее на частном случае, окно захвата - 1 секунда. В этом случае N = Fo, формула примет вид:

Fx = M.

Где же точность +- 0.02Гц? Ведь M - это целое число следовательно, с окном в 1 сек точность составит +- 1Гц.

 

Пример программы вы не приводите вероятно потому, что вы осознаете, что у вас там лажа.

 

Кстати, а переполнения таймера вы учитываете? При тактовой 16МГц за 1 сек измерения у 16-битного таймера произойдет 244 переполнения.

А як-жеж(:-)! Специально написал, что все переменные 32-битные.

Какие-то бестолковые у вас посты. Ей богу.

AVR - 8-ми битный процессор. И таймеров у него 32х битных нет. От того что вы "специально" что-то написали, архитектура AVR не поменяется.

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


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

2. Откуда здесь возьмется точность в +-0.02 Гц?

Разве не так?: XTAL/Fвх - к примеру 16Мгц/170кГц=94такта на 1Гц Fвх. соответственно 1/94= 0,01% ..что тут не так?

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


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

То есть ничего не делаем, таймер1 подсчитывает время окна, таймер 0 подсчитывает количество входных импульсов.

Нет, не так! Время окна (количество импульсов) должен считать таймер0, который от измеряемой частоты тактируется. Таймер1 от опорной частоты тактируется. Причем по окончании счета (совпадении количества импульсов таймер0 с заданным) должен сработать "стоп"-захват у таймер1.

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


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

Нет, не так! Время окна (количество импульсов) должен считать таймер0, который от измеряемой частоты тактируется. Таймер1 от опорной частоты тактируется. Причем по окончании счета (совпадении количества импульсов таймер0 с заданным) должен сработать "стоп"-захват у таймер1.

Так вы ж сами говорили, что входная частота неизвестна, докуда тогда считать(:-)?

 

Должно быть так. Входной сигнал подключен к таймеру0 И к схеме захвата таймера1. Таймер0 считает входные импульсы, таймер1 - системный клок 16 МГц.

Попробую изобразить

МЕТОД ЗАХВАТА (предложил GM)
      ___     ___     ___     ___     ___  
  ___|   |___|   |___|   |___|   |___|    входная частота
             ^                   ^
             |                   |
|||||||||||||||||||||||||||||||||||||||| опорная частота
             Nнач=100            Nкон=16000100±1
             Мнач=0              Мкон=170000 точно
             |<---примерно 1с--->| интервал измерения
     Fx=Fo*М/(N±1)=16000000*170000/(16000000±1)=170000±0.01
         (числа приведены для односекундного интервала)

МЕТОД ВОРОТ (предложил defunct)
        ___     ___     ___     ___     ___  
    ___|   |___|   |___|   |___|   |___|    входная частота
             ^                   ^
             |                   |
   |||||||||||||||||||||||||||||||||||||||| опорная частота
             Nнач=100            Nкон=16000100 точно
             Мнач=0              Мкон=170000±1 
             |<----точно 1с----->| интервал измерения

     Fx=Fo*(М±1)/N=16000000*(170000±1)/16000000=170000±1
        (числа приведены для односекундного интервала)

Обратите внимание, что время захвата в первом варианте ВСЕГДА точно совпадает с фронтами входной частоты (вернее с точностью ±1 такт, дань синхронизму), а во втором варианте оно не совпадает (вернее совпадает но с точностью до ±1-го периода входной частоты). Различие маленькое, но ОЧ-ЧЕНЬ существенное.

 

Различие приводит к тому, что точность различается почти в 100 раз ИЛИ, другими словами, можно почти в 100 раз уменьшить интервал наблюдения для достижения тоё же точности ±1 Гц. Так что автор темы спокойно может за 30-40 мс измерить последовательно все три частоты, а оставшееся время - 960 мс - делать козу методу defunct'a(:-).

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


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

Разве не так?: XTAL/Fвх - к примеру 16Мгц/170кГц=94такта на 1Гц Fвх. соответственно 1/94= 0,01% ..что тут не так?

 

не 1/94= 0,01%

 

а 100\94=1.06%

 

Не нужно так лихо коэфициенты переводить в проценты :):):)

 

соответсвенно все формулы с применением этого аргумента будут иметь как миниум туже погрешность.

 

поэтому все приведенные выше формулы эффекта на меня не произвели.

 

2resident

 

наконец то вы поняли о чем я ,(Таймер1 можно заменить и обычной задержкой в цикле если прерывания не планируются ) но к режиму таймера "Input Capture" (режим захвата) это никакого отношения не имеет.

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


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

1. Чем ваше решение в таком случае отличается от предложенного мной в comment'e #6?

2. Откуда здесь возьмется точность в +-0.02 Гц?

Читайте мой пост #23, там всё написано. Постарайтесь понять, это без подковырок, просто постарайтесь понять. Наглядная агитация в посте #43.

 

Отличие небольшое, но приводящее к радикальным последствиям. У вас неточность определения ±1 периода входной частоты, а у меня ±1 такт опорной частоты. Отсюда различие в точности примерно в 100 раз. А в остальном ничем, ваш метод вполне работоспособен.

теперь ваша формула:

проверим ее на частном случае, окно захвата - 1 секунда. В этом случае N = Fo, формула примет вид:

Fx = M.

Где же точность +- 0.02Гц? Ведь M - это целое число следовательно, с окном в 1 сек точность составит +- 1Гц.

Вот тут вы не правы. В этом случае N=Fo±1, а М - "точное" целое (я имею в виду без всяких ±1). Да вы посчитайте по формуле два раза: один раз с N=Fo-1, другой раз с N=Fo+1. Сразу почувствуете разницу, в смысле максимальную ошибку). В посте #43 попытался это показать. В одном случае гуляет N, в другом - М, вся разница в этом. И потом, откуда вы берете ±2? Вроде бы я везде писал ±1.

 

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

Какие-то бестолковые у вас посты. Ей-богу.

Ну напишите вы что-нибудь толковое по данной теме, покамест я ничего толкового от вас не увидел. А ваши так называемые идеи знали в древней иудее(:-). Разница между моей и вашей идеей - в 100 раз по точности ИЛИ по времени измерения! Я вот додумался как мерять частоту до Fo/2 с той же точностью на голом проце, у вас есть идеи? Давайте обсудим(:-).

AVR - 8-ми битный процессор. И таймеров у него 32х битных нет. От того что вы "специально" что-то написали, архитектура AVR не поменяется.
Вы за собой получше смотрите. В посте #6 вы пишете "...значения 32-х разрядных счётчиков...", ну так, какие 32-х разрядные счетчики в 8-битовом процессоре? А я писал о 32-битных переменных, между прочим, а не о таймерах. Ну и в чём тут криминал? Это и называется трёп ни о чём.

 

Или вот, говорите, что пост #2 не rezident писал, а кто? Несколько мессагов упирались. Ну и кто кого должен учить внимательности? Обратите внимание, в каждом посту вверху-справа стоит значок "решетка" # и номер поста.

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


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

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

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

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

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

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

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

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

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

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