Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: три частоты на АТмегу 128 с использованием таймеров
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3, 4, 5
sKWO
суть дела такова
можно ли с хорошей точностью определить частоты поданные на таймера
АТмеги 128??
изменнения -+ 40 ГЦ (в этих пределах)
частоты 50 КГц, 90 КГц, 170 КГц.
У АТмеги 128 три таймера - один 16-ти разрядный(1). и два 8-ми разрядных.
Как правильно написать прогу на Си???
Нужно ли мне работать по флагам или подсчитывать количества переполнений таймеров
и если да то какое количество переполнений удовлетворит точности определе ления для каждой из частот
+- 2герца?
Нужно ли ставить предделители для восьмиразрядных таймеров на два или на :n?
Тактовая частота контроллера 22.1184 МГц!
Значения думаю передавать по УАРТУ!!

Цитата(sKWO @ Apr 5 2007, 22:44) *
bodja74 у Вас возникли какае нибудь идеи?
а у Резидента?
rezident
Во-первых, вы не указали за какой период времени хотите получить значение с заданной точностью? Во-вторых, для получения точных отсчетов нужно использовать режим захвата (Capture) таймера. Я слабо знаком с AVR, у вашей атмеги имеются три входа захвата?
sKWO
Цитата(rezident @ Apr 5 2007, 23:36) *
НЕТ. Capture присутствует только у таймера 1 (16 разрядный)
а продолжительность счёта будет зависеть от точности результата
допустим за 1с
резидент извините за тупо вопрос на телесистемах по поводу клавиш с гистерезисом
Микроконтроллер Атмега 168 а не 128
Kuzmi4
2 частоты мерять в принципе реально - а вот 3 - ??? , я бы советовал для 2-х входящих сигналов работать с INT0,INT1(как пишут в книгах и ДШ - обнаружение фронтов на входах интов происходит синхронно - тобто за 1 такт , но для ваших частот и 16 тактов что мож уйти на вход интерупт - роли не сыграет),вот, ну а если взять ИНТ2 - то там мин время для принятия решения- 50нс - в принципе я так дцмаю реально склепать такую схему...
Но итн2 я всегда обходил дальней дорогой, поэтому не могу точно сказать как будет работать - но в принципе будет smile.gif . ну а время мерять таймерами(можно так же юзать каую нить переменную типа лонга если в таймер не вкладываемся) - вот я б так реализовал, ну а если пойти по правильному пути - то тут надо действительно на вход ИСП подавать таймера , а он вроде только у Т1 присутствует...
=GM=
Цитата(sKWO @ Apr 5 2007, 20:21) *
изменения -+ 40 ГЦ (в этих пределах) частоты 50 КГц, 90 КГц, 170 КГц.
У АТмеги 128 три таймера - один 16-ти разрядный(1). и два 8-ми разрядных.

Начнём с того, что у атмеги128 четыре таймера. Два - 16-разрядных и два - 8-разрядных. Первые к тому же имеют input capture unit
Цитата(sKWO @ Apr 5 2007, 20:21) *
Нужно ли мне работать по флагам или подсчитывать количества переполнений таймеров
и если да то какое количество переполнений удовлетворит точности определения для каждой из частот +- 2герца?

Ставьте две частоты на два input capture unit, третью (50 кГц) - на прерывание. За одну секунду без всяких ухищрений получите ±1 Гц для всех частот.
Цитата(sKWO @ Apr 5 2007, 20:21) *
Значения думаю передавать по УАРТУ!!

Да хоть по FireWire(:-)!!!
defunct
Цитата(=GM= @ Apr 7 2007, 00:40) *
Начнём с того, что у атмеги128 четыре таймера. Два - 16-разрядных и два - 8-разрядных. Первые к тому же имеют input capture unit

m168, см comment #2

Во первых. Господа, Capture Unit для таких частот не пригодится. Capture Unit решает обратную задачу - измерение временных интервалов и чем меньше частота тем лучше. На частоте же 170Khz это будет всего ~100 тактов на период, точность будет мягко сказать хреновая при значительных затратах процессорного времени.

А теперь к самой задаче:
таймер T0 использовать в режиме External Clock source с прескейлером 1.
таймер T2 - в asyncronous режиме (тоже External clock) с прескейлером 1.
T1 16-ти разрядный оставить для отмерки секундных интервалов (и возможно каких-то других нужд)
к входу T0 подрубить сигнал 90khz
к входу T2 - 170khz
По прерыванию OVF увеличивать (на 256) значения 32-х разрядных счетчиков.
50khz мерять с помощью Int0 - в обработчике прерывания инкрементировать счетчик.

По прерыванию OC T1 (каждую секунду), прибавлять к счетчикам текущее значение таймеров T0, T2, сбрасывать таймеры T0, T2 и выводить рез-тат.

Точность будет +-1 Hz за секунду для всех 3х частот, плюс останется куча процессорного времени. Тобиш и частоту тактирования можно брать раза в два меньше.

PS: Кварц 22.1184 - фтопку, оверклок - неправильная затея.
=GM=
Цитата(defunct @ Apr 7 2007, 02:35) *
Цитата
(=GM= @ Apr 7 2007, 00:40)
Начнём с того, что у атмеги128 четыре таймера. Два - 16-разрядных и два - 8-разрядных. Первые к тому же имеют input capture unit

m168, см comment #2

Что за comment #2? На заголовок темы посмотрите.
Цитата(defunct @ Apr 7 2007, 02:35) *
Во первых. Господа, Capture Unit для таких частот не пригодится. Capture Unit решает обратную задачу - измерение временных интервалов и чем меньше частота тем лучше. На частоте же 170Khz это будет всего ~100 тактов на период, точность будет мягко сказать хреновая при значительных затратах процессорного времени.

Ну тут я полностью с вами не согласен. Именно Capture Unit поможет добиться непревзойдённой точности. Кто нам мешает измерить 170000 периодов в секунду с помощью Capture Unit? Вгрубе так, запустили прерывание Capture Unit, оно сработало, в прерывании записали захваченное время т1 и выключили прерывания Capture Unit. Выждали примерно (!) секунду, включили прерывания Capture Unit опять, сработало, в прерывании записали время т2 и выключили прерывания Capture Unit. Зная количество периодов входной частоты, (т2-т1) и тактовую частоту, вычисляем частоту входного сигнала, точность измерения примерно ±0,02 Гц. Сравните с вашими ±1 Гц. Другим способом на данном железе вы такой точности не добьётесь.
rezident
Цитата(defunct @ Apr 7 2007, 08:35) *
Во первых. Господа, Capture Unit для таких частот не пригодится. Capture Unit решает обратную задачу - измерение временных интервалов и чем меньше частота тем лучше. На частоте же 170Khz это будет всего ~100 тактов на период, точность будет мягко сказать хреновая при значительных затратах процессорного времени.

Я ведь потому и спросил о периоде готовности результата. Чем больше период времени выделенный для подсчета частоты, тем точнее можно получить результат за счет матем.обработки. Да, при частоте тактирования таймера 22МГц использование Capture позволяет получить дискретность определения периода частоты порядка 45нс. Для частоты 170кГц эта точность хуже 1%. Но если усреднить результаты измерения за временной интервал значительно превышающий период частоты сигнала, то мы получим гораздо бОльшее временнОе разрешение, чем искомые 45нс. За 1 сек можно посчитать частоту 170кГц с точностью почти на порядок выше, чем дает единичный отсчет с дискретностью определения периода в 45мс. Впрочем на форуме это уже неоднократно обсуждалось, имеет ли смысл повторяться?
defunct
Цитата(=GM= @ Apr 7 2007, 20:54) *
m168, см comment #2
Что за comment #2? На заголовок темы посмотрите.

Понятно, тобиш вам до лампочки поправка условия задачи автором темы в comment'e #2.
И 22.1184 для m128 совсем не смущает?
Как всегда решаете какую-то свою мега задачу? ;> 20MSPS на AVR c Fosc 20Mhz.


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

Вы упускаете тот факт, что прерывания будут идти с шагом в 100 тактов лишь только от одного источника, источников 3, ваша система на трех источниках просто захлебнется, а еще ведь надо и UART как-то обслуживать, и вероятно выполнять еще какие-то задачи. Зачем гонка за точностью 0.02Гц, там где по условию задачи достаточно +-2Гц.
Или вы предлагаете все на ассемблере отточить в 300 байт кода. Дык зачем тогда m128 и даже m168 ставить?

resident
Вы говорили где-то, что с AVR'ами работали мало, поэтому я допускаю что, вы не в курсе того, что AVR будет просто пропускать прерывания, которые не будет успевать обработать. И даже мат обработка не поможет устранить эту ошибку, точность будет весьма скверная.
=GM=
Цитата(defunct @ Apr 8 2007, 04:18) *
Понятно, то бишь вам до лампочки поправка условия задачи автором темы в comment'e #2. И 22.1184 для m128 совсем не смущает?
Положим, пост #2 - это пост не автора, а rezident'a. Кто частоту применяет, тот пусть и смущается, сам я стараюсь не выходить за пределы технических спецификаций на прибор.
Цитата(defunct @ Apr 8 2007, 04:18) *
Как всегда решаете какую-то свою мега задачу? ;> 20MSPS на AVR c Fosc 20Mhz.
Подумываю(:-). Мне интересно выжать из прибора максимум возможного.
Цитата(defunct @ Apr 8 2007, 04:18) *
Вы упускаете тот факт, что прерывания будут идти с шагом в 100 тактов лишь только от одного источника, источников 3, ваша система на трех источниках просто захлебнется, а еще ведь надо и UART как-то обслуживать, и вероятно выполнять еще какие-то задачи.
А вы упускаете тот весьма значительный факт, что прерываний всего ШЕСТЬ, три в начале измерения, и три в конце измерения, и между ними промежуток в ОДНУ секунду. Ну и кто там захлебнётся, и чем? Да к тому же измерения частот независимы и их можно обрабатывать последовательно, т.е. ОДНО прерывание одномоментно. Что касается количества прерываний, там еще должны быть прерывания от таймеров - обработка переполнения, тоже не вижу никаких проблем.
Цитата(defunct @ Apr 8 2007, 04:18) *
Зачем гонка за точностью 0.02Гц, там где по условию задачи достаточно +-2Гц.
Никакой гонки, просто использование Capture Unit, который вы отметаете за ненадобностью, автоматически даст эту самую точность.
Цитата(defunct @ Apr 8 2007, 04:18) *
Или вы предлагаете все на ассемблере отточить в 300 байт кода. Дык зачем тогда m128 и даже m168 ставить?
Ну почему, данную задачу можно легко реализовать на си, и даже под какой-нибудь осью, всё зависит от постановки задачи. А на ассемблере всё уместится в 150 байт кода, особо не напрягаясь. Один час работы.
bodja74
2=GM=

Думаю что вариант с внешним тактом таймеров будет получше чем захват,
с внешним тактом вообще никаких вычислений не нужно - просто выбрать из регистра значение допустим через секунду,примерно также и с ИНТ ,просто инкрементировать в прерываниии и больше ничего.
в варианте с захватом чем меньше импульс (выше частота) тем больше погрешность при расчете частоты, и здесь 0.02Гц весьма сомнительно,так при частоте 170кГц мы будем иметь погрешность 1% - соответственно для этой частоты +\- 1.7кГц smile.gif
=GM=
Цитата(bodja74 @ Apr 8 2007, 17:15) *
2=GM=

Думаю что вариант с внешним тактом таймеров будет получше чем захват,
с внешним тактом вообще никаких вычислений не нужно - просто выбрать из регистра значение допустим через секунду,примерно также и с ИНТ ,просто инкрементировать в прерываниии и больше ничего.
в варианте с захватом чем меньше импульс (выше частота) тем больше погрешность при расчете частоты, и здесь 0.02Гц весьма сомнительно, так при частоте 170 кГц мы будем иметь погрешность 1% - соответственно для этой частоты +\- 1.7кГц smile.gif

Тут какая-то путаница в понимании и терминологии. Давайте с самого начала. Поясните ваш вариант с внешним тактом таймеров, как он выглядит(:-). К слову сказать, если такт внешний, то таймер называется счётчиком.

А потом я вам расскажу про свой вариант с захватом. И покажу, что на секундном интервале частота 170 кГц измеряется МК с тактовой частотой 16 МГц с точностью ±0,010625 Гц (вгрубе ±0,01 Гц)
rezident
bodja74, видимо имеет в виду метод "временнЫх ворот", т.е. подсчет числа импульсов за определенный интервал времени.

Цитата
А потом я вам расскажу про свой вариант с захватом. И покажу, что на секундном интервале частота 170 кГц измеряется МК с тактовой частотой 16 МГц с точностью ±0,010625 Гц (вгрубе ±0,01 Гц)

Это временнОе разрешение такое получается, а точность измерения несколько похуже.
=GM=
Цитата(rezident @ Apr 8 2007, 21:16) *
bodja74, видимо имеет в виду метод "временнЫх ворот", т.е. подсчет числа импульсов за определенный интервал времени.

Ну, так во всех методах делается. Весь вопрос в том и состоит, подсчёт числа КАКИХ импульсов производится и КАК формируется интервал времени измерения. Спасибо за ответ, но хотелось бы услышать мнение Богдана(:-).
Цитата(rezident @ Apr 8 2007, 21:16) *
Это временнОе разрешение такое получается, а точность измерения несколько похуже.

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

То что я привёл, это максимальная погрешность однократного измерения (с 1 с интервалом измерения и без учета погрешности опорной частоты 16 МГц). Реальная погрешность, вгрубе, будет ниже.
defunct
Цитата
Положим, пост #2 - это пост не автора, а rezident'a. Кто частоту применяет, тот пусть и смущается, сам я стараюсь не выходить за пределы технических спецификаций на прибор.

Нет, это не пост резидента. Это пост автора ветки, где автор вероятно случайно не там поставил закрывающий таг цитаты.
Резидент такое не писал. Для того чтобы в этом убедиться, достаточно прочитать (предшествующие коменту #2) коменты 0 и 1. Ну да ладно, не мне вас учить внимательности.

Цитата(=GM= @ Apr 8 2007, 17:15) *
А вы упускаете тот весьма значительный факт, что прерываний всего ШЕСТЬ, три в начале измерения, и три в конце измерения, и между ними промежуток в ОДНУ секунду. Ну и кто там захлебнётся, и чем?

?!
Что это вы собрались так мерять? smile.gif
Однако, хорош метод для генерации случайных чисел! biggrin.gif

Цитата
Ну почему, данную задачу можно легко реализовать на си, и даже под какой-нибудь осью, всё зависит от постановки задачи. А на ассемблере всё уместится в 150 байт кода, особо не напрягаясь. Один час работы.

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

Цитата(=GM= @ Apr 9 2007, 00:19) *
То что я привёл, это максимальная погрешность однократного измерения (с 1 с интервалом измерения и без учета погрешности опорной частоты 16 МГц). Реальная погрешность, вгрубе, будет ниже.

То что вы привели в простонародье называтся "трепом".
rezident
Цитата(=GM= @ Apr 9 2007, 04:19) *
Ну, так во всех методах делается. Весь вопрос в том и состоит, подсчёт числа КАКИХ импульсов производится и КАК формируется интервал времени измерения. Спасибо за ответ, но хотелось бы услышать мнение Богдана(:-).

Метод "временных ворот" дает точность измерения +-1 период от измеряемой частоты.
Цитата(=GM= @ Apr 9 2007, 04:19) *
Сейчас опять будут недопонимания(:-). Дайте определение временного разрешения и точности измерения.

Метод "обратного отсчета" (измерения периода) описан у Хоровца и Хилла в Искусстве схемотехники. У меня в трехтомнике это Том.3. раздел 15.10, стр.294-294.
Если у вас таймер тактируется частотой 16МГц, то временнОе разрешение с которым вы можете измерить один период составляет 1/16000000 с.
Цитата(=GM= @ Apr 9 2007, 04:19) *
То что я привёл, это максимальная погрешность однократного измерения (с 1 с интервалом измерения и без учета погрешности опорной частоты 16 МГц). Реальная погрешность, вгрубе, будет ниже.

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

Извините, но вас я тоже могу отослать к разделу 15.10 из Х и Х.
Например, для увеличения разрешающей способности измеряемую частоту смешивают с близкой ей опорной и выделяют разностную частоту (Fразн.). Эту сравнительно низкую разностную частоту измеряют с тем же временнЫм разрешением, что позволяет таймер (1/Fтакт.). Но по отношению к исходной частоте разрешающая способность увеличивается до Fразн./Fтакт. Как этот способ применить на AVR я не знаю, т.к. слабо знаком с его таймерами. Для MSP430 представляю лучше, хотя честно признаюсь, что на практике необходимости применять его пока не было.
P.S. точнее не совсем этот способ с выделением и прямым измерением разностной частоты, а другой, также описанный у ХХ, определение периода разностной частоты за время выделенное для измерения.
defunct
Цитата(rezident @ Apr 9 2007, 01:23) *
Извините, но вас я тоже могу отослать к разделу 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). В этом режиме таймеры просто считают входные импульсы - процессор отдыхает.
rezident
defunct, я же указал не один раз, что плохо знаю архитектуру AVR и его таймеров. Считайте тогда мой пост чистой теорией, раз при исходных условиях это не реализуется на AVR smile.gif
bodja74
Теперь я вставлю свои пять копеек.

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

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

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

=GM= предложил в режиме захвата ,вот здесь и возник камень преткновения,так как одни считают что можно добиться высокой точности другие что нет.
Теперь немного разложим измерение в этом режиме.
допустим имеем частоту кварца 17мГц и входной сигнал частотой 170кГц,в этом режиме таймер стартанет со счетом не более 17мГц при переходе входного синала допустим с 0 на 1 и перенесет при переходе из 1 в 0 значение TCNT в регистр ICR и сгенерит прерывание если потребуется.
В результате при данном тактировании и частоте сигнала мы получим значение ICR<=100 ,а если скважность сигнала =50% то соответственно smile.gif,ну пускай будет 100.
Тут легко посчитать - имеем 170кГц

Теперь дальше ,а если сигнал не ровно 170кГц? Тоесть ICR выдал =101 ,мы считаем сигнал
17000000\101=168.316Гц ,тоесть если сигнал допустим 169кГц мы сможем посчитать или 170кГц или 168.316Гц точнее никак smile.gif так как в ICR нет значений после точки smile.gifsmile.gifsmile.gif соответствено мы будем иметь дело с достаточно большой погрешностью.И сколько раз не меряй в этом режиме - среднеарифметической точности ,тоже ну никак не получиться smile.gif
rezident
Цитата(bodja74)
Теперь дальше ,а если сигнал не ровно 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% полученных при однократном измерении периода wink.gif За 100 измерений улучшаем временнОе разрешение счетчика на порядок.
Все это конечно справедливо при условии, что шумы схемы имеют гауссово распределение.
P.S. при этом улучшается именно временнОе разрешение, а не точность. Точность будет определятся в т.ч. самым худшим параметрами опорной частоты. 20ppm начального разброса частоты кварца дадут 17МГц+-340Гц.
bodja74
2resident

А с чего Вы взяли что при частоте 169999Гц ,у вас будет 91 значений 100 и 9 значений 101,а не все значения будут иметь значения 100 ? Клок ядра - есть аксиома через которую уже не перепрыгнеш.
rezident
Билин, ну да, в спешке я лажанулся sad.gif Это статистически неверный пример. Правильно было бы указать частоту 169990Гц, а не 169999Гц. Тогда за 1 сек как раз 10 раз набегает фаза. И получается подсчитанная частота 169847,1Гц при истиной 169990Гц. Относительная погрешность измерения получается около указанных ранее 0,09%. На порядок выше, чем при измерении 1 периода.
=GM=
Ну вот, стоило ненадолго ответвиться, столько всего понаписали, не знаю даже с чего начать.
Начну, пожалуй, с ликбеза, только без обидок, не нравится, просто пропустите. И это не трёп, как некоторые полагают(:-).

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

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 возьмёт назад свои слова о "трепе". Надеюсь также, что сия заметка кому-то реально поможет в понимании, в реализации или ещё в чём-нибудь.
defunct
Цитата(=GM= @ Apr 9 2007, 19:37) *
8) Последнее. Надеюсь, что defunct возьмёт назад свои слова о "трепе". Надеюсь также, что сия заметка кому-то реально поможет в понимании, в реализации или ещё в чём-нибудь.

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

Непонятно откуда взялось и как реализовать это условие? Изначально мы не знаем ни M, ни Tx, нам их нужно измерить. А если мы их знаем, то зачем измерять? blink.gif
=GM=
Цитата(defunct @ Apr 9 2007, 18:00) *
Обязательно возьму свои слова назад, но только тогда когда увижу от вас рабочий пример программы. Вы видите только одну сторону медали - точность, и не видите другой ее стороны - загрузки CPU, поэтому вам бесполезно что-то доказывать пока.

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

Да какая там загрузка, слёзы! - меньше ОДНОГО процента!
rezident
Насколько я понял, второй случай это тот же метод "временных ворот", но на счетный вход подается не измеряемая частота, а опорная? А временные ворота формируются измеряемой частотой, так? Как это реализуется на реальной периферии с использованием таймера?
=GM=
Цитата(rezident @ Apr 9 2007, 18:50) *
Непонятно откуда взялось и как реализовать это условие? Изначально мы не знаем ни M, ни Tx, нам их нужно измерить. А если мы их знаем, то зачем измерять? blink.gif

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

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

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

Забыл добавить, что можно делать оценку значения входной частоты с помощью метода "временных ворот" что-нибудь порядка 10-20-100 мс, чтобы обеспечить подходящие условия для точного измерения, скажем инфранизких частот, или для определения наличия входной частоты и т.д. Ну это уже примочки для коммерческих продуктов, мы же с вами обсуждаем идею получения максимальной точности на АВР при прочих равных условиях. Согласитесь, что точность в ±0.01 Гц звучит гораздо лучше, чем точность ±1 Гц, как тут предлагают некоторые уважаемые, не в обиду им будь сказано.
rezident
Если честно, то я нихрена не понял smile.gif Если можно, то дайте до кучи еще и описание схемы захвата. А то, видимо я ее функционирование представляю себе тоже не так, как вы.
=GM=
Цитата(rezident @ Apr 9 2007, 19:27) *
Насколько я понял, второй случай это тот же метод "временных ворот", но на счетный вход подается не измеряемая частота, а опорная? А временные ворота формируются измеряемой частотой, так? Как это реализуется на реальной периферии с использованием таймера?

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

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

Т.е. получается, что как обычно таймер тактируется опорной частотой, которая является асинхроной по отношению к входной измеряемой. Поэтому захват фронта измеряемой частоты произойдет с точностью до 1 такта опорной.
Цитата(=GM=)
Количество импульсов входной частоты можно считать программно, но можно и другим таймером0 (счетчик М)

ОК, посчитали мы импульсы и зафиксировали схемой захвата фронт последнего импульса с точностью опять же +- 1 период от опорной частоты.
Кстати, а переполнения таймера вы учитываете? При тактовой 16МГц за 1 сек измерения у 16-битного таймера произойдет 244 переполнения.
Ладно. Дальше. Пускай измеряемая частота была 169999Гц. Тогда за время счета 170000 импульсов мы получаем схемой захвата число 16000094. Вычисляем по вашей формуле Fx=16000000*170000/16000094(+-2)=169999,001Гц(+-0,02Гц).
Хм. cranky.gif И вправду получается неплохое разрешение! a14.gif
add
хелп! запутался в конец!
Ув.=GM=, поясните пожалуйста.
Цитата
По фронту импульса входной частоты содержимое таймераn переписывается в специальный регистр (ICRn).

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

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

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

Тут как быть с 2.5...3.5?
=GM=
Цитата(rezident @ Apr 10 2007, 00:41) *
ОК, посчитали мы импульсы и зафиксировали схемой захвата фронт последнего импульса с точностью опять же +- 1 период от опорной частоты.

Немного подправлю. Любой фронт вы фиксируете с точностью в диапазоне (0,1) такт, значит оба фронта фиксируются с точностью ±1 такт. Это важно осознать, а то вы там ниже уже пишете ±2, а это неправильно.
Цитата(rezident @ Apr 10 2007, 00:41) *
Кстати, а переполнения таймера вы учитываете? При тактовой 16МГц за 1 сек измерения у 16-битного таймера произойдет 244 переполнения.

А як-жеж(:-)! Специально написал, что все переменные 32-битные.
Цитата(rezident @ Apr 10 2007, 00:41) *
Ладно. Дальше. Пускай измеряемая частота была 169999Гц. Тогда за время счета 170000 импульсов мы получаем схемой захвата число 16000094. Вычисляем по вашей формуле Fx=16000000*170000/16000094(+-2)=169999,001Гц(+-0,02Гц).
Хм. cranky.gif И вправду получается неплохое разрешение! a14.gif

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

Цитата(add @ Apr 10 2007, 06:41) *
хелп! запутался в конец!
Ув.=GM=, поясните пожалуйста.
а что за содержимое в таймере?(что собственно мы там насчитали?) Неивестное время до начала вх. импульса?

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

Цитата(add @ Apr 10 2007, 06:41) *
Здесь я так понял время прошедшее до первого фронта после интервала "примерно одна секунда".
И собственно непонятно причем здесь это?: "Зная количество периодов входной частоты, (т2-т1)"

Ну так это и есть значение периода измерения.
Цитата(add @ Apr 10 2007, 06:41) *
Да вот еще до кучи цитата:
Евстифеев(Atmel_AVRTiny_Mega) ..стр 284. "следует понимать, что между изменением состояния вххода блока захвата копированием счетного регистра в регистр захвата проходит некоторое время. Эту задержку вносит синхронизатор и детектор. Величина задержки состовляет 2.5 ..3.5 машинных цикла...
Тут как быть с 2.5...3.5?

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


Как я понял измерения проходят так:
Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла

Как тут можно определить частоту?
=GM=
Цитата(add @ Apr 10 2007, 07:48) *
Как я понял измерения проходят так:
Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла
Как тут можно определить частоту?

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

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

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

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

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

Этого не хватало для понимания :-) т.е. всеж таки мы не совсем "отдыхаем", а переодически Fвх. /255 обрабатываем переполнение таймера timer0/counter0 считая кол-во импульсов. (для 170кГц это 666 прерываний на обработку которого пусть тактов20, соответственно это 13333 тактов, - меньше 0,1% загрузки контр.при 17МГц за сек. )
Спасибо за разъяснения.
=GM=
Цитата(add @ Apr 10 2007, 08:58) *
Этого не хватало для понимания :-) т.е. всеж таки мы не совсем "отдыхаем", а периодически Fвх. /256 обрабатываем переполнение таймера timer0/counter0 считая кол-во импульсов. (для 170кГц это 664 прерываний на обработку которого пусть тактов20, соответственно это 13280 тактов, - меньше 0,1% загрузки контр. при 17 МГц за сек.)
Спасибо за разъяснения.

На здоровье.

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

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

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

Что ж некоторые уважаемые, не буду показывать пальцем, никак не разберутся и не заберут свои слова назад о том, что это "пустой трёп"? А потом опять из-за угла будут говорить о "0 в сиянии". Как-то несправедливо получается, человека оговорить можно и легко, а признать свою неправоту нельзя ни под каким видом. Конечно, надо иметь определенное мужество, чтобы признать перед сообществом свою неправоту.
rezident
Цитата(=GM=)
Как-то не так вы вычисляете. Для частоты 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.gif
P.S. только для удобства лучше все же иметь в периферии 32-х разрядный таймер, а не 8-ми разрядный smile.gif
=GM=
Цитата(rezident @ Apr 10 2007, 09:55) *
Еще раз. Откуда взялась цифра 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 такт.
Цитата(rezident @ Apr 10 2007, 09:55) *
Я не знаю синхронный или асинхронный захват в AVR, поэтому насчет +-2 утверждать не буду. В общем (худшем) случае будет +-2 такта.

Захват синхронный, поскольку все входные сигналы тактируются внутренним клоком, т.е. все входные фронты приводятся к единой временной сетке, что есть, не скажу всегда необходимо, но грамотно с точки зрения построения архитектуры МК. Как бы то ни было, фронт нашего сигнала лежит между двумя фронтами тактовой частоты, следовательно максимальная ошибка +1 такт, или, если хотите, ±0.5 такта. Как кому нравится. Или вот так ещё можно сказать: фронт нашего сигнала лежит в диапазоне от N до N+1 такта, соответственно ошибка лежит в диапазоне от 0 до 1 такта.
Цитата(rezident @ Apr 10 2007, 09:55) *
P.S. только для удобства лучше все же иметь в периферии 32-х разрядный таймер, а не 8-ми разрядный smile.gif

Так ведь нет его! С другой стороны, представьте себе некий 8-10-12-ногий чип, который меряет частоту с относительной точностью 10^(-10), что могут дать только какие-нибудь монстры с цезиевым или там водородным стандартом, да и то не все. Ну а опору надо брать от ДжиПиэС(:-).
defunct
Цитата(=GM= @ Apr 9 2007, 22:02) *
Входная частота подается на ножку 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 не поменяется.
add
Цитата
2. Откуда здесь возьмется точность в +-0.02 Гц?

Разве не так?: XTAL/Fвх - к примеру 16Мгц/170кГц=94такта на 1Гц Fвх. соответственно 1/94= 0,01% ..что тут не так?
rezident
Цитата(=GM=)
То есть ничего не делаем, таймер1 подсчитывает время окна, таймер 0 подсчитывает количество входных импульсов.

Нет, не так! Время окна (количество импульсов) должен считать таймер0, который от измеряемой частоты тактируется. Таймер1 от опорной частоты тактируется. Причем по окончании счета (совпадении количества импульсов таймер0 с заданным) должен сработать "стоп"-захват у таймер1.
=GM=
Цитата(rezident @ Apr 10 2007, 14:10) *
Нет, не так! Время окна (количество импульсов) должен считать таймер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(:-).
bodja74
Цитата(add @ Apr 10 2007, 16:31) *
Разве не так?: XTAL/Fвх - к примеру 16Мгц/170кГц=94такта на 1Гц Fвх. соответственно 1/94= 0,01% ..что тут не так?


не 1/94= 0,01%

а 100\94=1.06%

Не нужно так лихо коэфициенты переводить в проценты smile.gifsmile.gifsmile.gif

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

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

2resident

наконец то вы поняли о чем я ,(Таймер1 можно заменить и обычной задержкой в цикле если прерывания не планируются ) но к режиму таймера "Input Capture" (режим захвата) это никакого отношения не имеет.
=GM=
Цитата(defunct @ Apr 10 2007, 12:11) *
1. Чем ваше решение в таком случае отличается от предложенного мной в comment'e #6?
2. Откуда здесь возьмется точность в +-0.02 Гц?
Читайте мой пост #23, там всё написано. Постарайтесь понять, это без подковырок, просто постарайтесь понять. Наглядная агитация в посте #43.

Отличие небольшое, но приводящее к радикальным последствиям. У вас неточность определения ±1 периода входной частоты, а у меня ±1 такт опорной частоты. Отсюда различие в точности примерно в 100 раз. А в остальном ничем, ваш метод вполне работоспособен.
Цитата(defunct @ Apr 10 2007, 12:11) *
теперь ваша формула:
проверим ее на частном случае, окно захвата - 1 секунда. В этом случае N = Fo, формула примет вид:
Fx = M.
Где же точность +- 0.02Гц? Ведь M - это целое число следовательно, с окном в 1 сек точность составит +- 1Гц.

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

Цитата(defunct @ Apr 10 2007, 12:11) *
Пример программы вы не приводите вероятно потому, что вы осознаете, что у вас там лажа.
Не поэтому, просто по контракту не имею права, а писать что-то заново мне лениво. Вот если б кто-нибудь написал, я б подправил(:-).
Цитата(defunct @ Apr 10 2007, 12:11) *
Какие-то бестолковые у вас посты. Ей-богу.

Ну напишите вы что-нибудь толковое по данной теме, покамест я ничего толкового от вас не увидел. А ваши так называемые идеи знали в древней иудее(:-). Разница между моей и вашей идеей - в 100 раз по точности ИЛИ по времени измерения! Я вот додумался как мерять частоту до Fo/2 с той же точностью на голом проце, у вас есть идеи? Давайте обсудим(:-).
Цитата(defunct @ Apr 10 2007, 12:11) *
AVR - 8-ми битный процессор. И таймеров у него 32х битных нет. От того что вы "специально" что-то написали, архитектура AVR не поменяется.
Вы за собой получше смотрите. В посте #6 вы пишете "...значения 32-х разрядных счётчиков...", ну так, какие 32-х разрядные счетчики в 8-битовом процессоре? А я писал о 32-битных переменных, между прочим, а не о таймерах. Ну и в чём тут криминал? Это и называется трёп ни о чём.

Или вот, говорите, что пост #2 не rezident писал, а кто? Несколько мессагов упирались. Ну и кто кого должен учить внимательности? Обратите внимание, в каждом посту вверху-справа стоит значок "решетка" # и номер поста.
defunct
Цитата(=GM= @ Apr 10 2007, 18:54) *
Читайте мой пост #23, там всё написано. Постарайтесь понять, это без подковырок, просто постарайтесь понять. Наглядная агитация в посте #43.

К методу вопросов нет. Идея понятна.

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

Ой не надо про контракты рассказывать. Проходили мы такое.
Лень, так лень.

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

Идей я тут не высказывал. Я привел конкретный способ решения поставленной задачи - определения частот трех сигналов на m168, который точно будет работать. Разница между моим способом и вашим в том, что ваш нельзя впихнуть в m168 при всем желании т.к. в ней только один таймер с Capture Unit.

Цитата
Я вот додумался как мерять частоту до Fo/2 с той же точностью на голом проце, у вас есть идеи? Давайте обсудим(:-).

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

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

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

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

Ок, признаю, ошибся с номером поста. Имел в виду comment #3.
sKWO:
Цитата
...
Микроконтроллер Атмега 168 а не 128
=GM=
Цитата(defunct @ Apr 10 2007, 18:02) *
К методу вопросов нет. Идея понятна.
То есть достаточно два прерывания захвата на частоту? А с точностью согласны?
Цитата(defunct @ Apr 10 2007, 18:02) *
Ой не надо про контракты рассказывать. Проходили мы такое. Лень, так лень.
А что тут такого? Подписал контракт и держу слово. Даже если бы не подписал, а просто дал слово я бы его всё равно держал, потому что есть такое понятие - порядочность.
Цитата(defunct @ Apr 10 2007, 18:02) *
Идей я тут не высказывал. Я привел конкретный способ решения поставленной задачи - определения частот трех сигналов на m168, который точно будет работать. Разница между моим способом и вашим в том, что ваш нельзя впихнуть в m168 при всем желании т.к. в ней только один таймер с Capture Unit.
Чуток пораньше вас в посте #5 я привёл аналогичное решение для точности ±1 Гц. Дальнейшее обсуждение пошло по пути получения максимальной точности, отсюда весь сыр-бор разгорелся.
Цитата(defunct @ Apr 10 2007, 18:02) *
Не вижу никакой сложности в решении этой задачи. Более того допускаю, что с наличием асинхронного таймера можно мерять и частоты превышающие частоту ядра.
Интересно бы послушать ваш подход, так-таки нет никаких сложностей? Берём голую мегу128, 16 МГц такт, входная частота 8 МГц. Предлагаю мерить с точностью ±0.05 Гц. Ваши предложения?
Цитата(defunct @ Apr 10 2007, 18:02) *
Криминал в том - к чему относился тот ваш ответ. Вам было указано, что прерываний будет уже далеко не 6, а вы начали говорить про какие-то 32-х разрядные переменные. Как это вяжется друг с другом. Просто признайте, что ранее налапшали.
Где это я ранее налапшал? Прерываний надо всего два на одну частоту, по-моему вы с этим согласились. Никакого потока прерываний, от которого программа захлебнётся, нет и в помине. И что вам не понравилось про "какие-то 32-х разрядные переменные" и где? Опять огульно говорите.
defunct
Цитата(=GM= @ Apr 10 2007, 23:56) *
То есть достаточно два прерывания захвата на частоту? А с точностью согласны?

Если быть точнее то в самом частном для короткого интервала измерения случае прерываний будет - три (2 IC и 1 - отмер эталонного интервала).
Для секндного интервала - не согласен. будет еще +170k/256 прерываний от которых никуда не деться как в моем способе, так и в вашем - прерывания по переполнению таймера, считающего импульсы.

Цитата
А что тут такого? Подписал контракт и держу слово. Даже если бы не подписал, а просто дал слово я бы его всё равно держал, потому что есть такое понятие - порядочность.

Я не об этом. С контрактом все понятно, только когда речь идет о пятиминутном примере зачем упоминать о контракте, достаточно только о лени.

Цитата
Чуток пораньше вас в посте #5 я привёл аналогичное решение для точности ±1 Гц.

Перечитал комент #5 несколько раз, и там IMHO речь шла о методе (A) - измерении периодов ti импульсов входного сигнала с помошью IC, с последующим усреднением T и расчетом частоты как 1/T

Цитата
Где это я ранее налапшал? Прерываний надо всего два на одну частоту, по-моему вы с этим согласились. Никакого потока прерываний, от которого программа захлебнётся, нет и в помине. И что вам не понравилось про "какие-то 32-х разрядные переменные" и где? Опять огульно говорите.

Да, для такого метода большого потока прерываний не будет. Поток будет для метода (A). Но прерываний и здесь все равно не 2.
=GM=
Цитата(defunct @ Apr 10 2007, 22:22) *
Если быть точнее то в самом частном для короткого интервала измерения случае прерываний будет - три (2 IC и 1 - отмер эталонного интервала).
Для секундного интервала - не согласен. будет еще +170k/256 прерываний от которых никуда не деться как в моем способе, так и в вашем - прерывания по переполнению таймера, считающего импульсы.
Ну, определяющих прерывании всё-таки два, остальное можно делать и без прерываний, в основной программе, будет чем занять программу на одну секунду(:-). Потом, даже если и по прерываниям, захлебнуться невозможно, период полторы миллисекунды...

Ну а что с точностью?
Цитата(defunct @ Apr 10 2007, 22:22) *
Когда речь идет о пятиминутном примере зачем упоминать о контракте, достаточно только о лени.
У меня программа есть готовая, вылизанная, на ассемблере. Я на 8515 с клоком 8 Мгц измерял частоту 1,5 мгц за 1,2 мс с приличной точностью 50 Гц. А новую программу, радикально отличную от старой, придумывать лениво, да и стимула нет(:-). По-моему, кому надо, тот и так всё понял.

Ну так как насчёт измерения 8 МГц? Берём голую мегу128, 16 МГц такт, входная частота 8 МГц. Предлагаю мерить с точностью ±0.05 Гц. Есть продуктивная идея?
add
Цитата(bodja74 @ Apr 10 2007, 20:27) *
не 1/94= 0,01%

а 100\94=1.06%

Не нужно так лихо коэфициенты переводить в проценты smile.gifsmile.gifsmile.gif

Ну лихости нам не занимать :-) .. ну очепятка.. идея то понятна что 170кГц можно измерить с точностью +-0.01Гц при заданных условиях.. Определяющим это 16МГц +-1..2 такта(без учета стабильности и расбросов кварца).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.