реклама на сайте
подробности

 
 
16 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> три частоты на АТмегу 128 с использованием таймеров, оределить изменения каждой частоты
sKWO
сообщение Apr 5 2007, 23:21
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



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

Цитата(sKWO @ Apr 5 2007, 22:44) *
bodja74 у Вас возникли какае нибудь идеи?
а у Резидента?


Сообщение отредактировал sKWO - Apr 5 2007, 23:02


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 5 2007, 23:36
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Во-первых, вы не указали за какой период времени хотите получить значение с заданной точностью? Во-вторых, для получения точных отсчетов нужно использовать режим захвата (Capture) таймера. Я слабо знаком с AVR, у вашей атмеги имеются три входа захвата?
Go to the top of the page
 
+Quote Post
sKWO
сообщение Apr 6 2007, 00:01
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(rezident @ Apr 5 2007, 23:36) *
НЕТ. Capture присутствует только у таймера 1 (16 разрядный)
а продолжительность счёта будет зависеть от точности результата
допустим за 1с
резидент извините за тупо вопрос на телесистемах по поводу клавиш с гистерезисом
Микроконтроллер Атмега 168 а не 128


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Apr 6 2007, 09:52
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 частоты мерять в принципе реально - а вот 3 - ??? , я бы советовал для 2-х входящих сигналов работать с INT0,INT1(как пишут в книгах и ДШ - обнаружение фронтов на входах интов происходит синхронно - тобто за 1 такт , но для ваших частот и 16 тактов что мож уйти на вход интерупт - роли не сыграет),вот, ну а если взять ИНТ2 - то там мин время для принятия решения- 50нс - в принципе я так дцмаю реально склепать такую схему...
Но итн2 я всегда обходил дальней дорогой, поэтому не могу точно сказать как будет работать - но в принципе будет smile.gif . ну а время мерять таймерами(можно так же юзать каую нить переменную типа лонга если в таймер не вкладываемся) - вот я б так реализовал, ну а если пойти по правильному пути - то тут надо действительно на вход ИСП подавать таймера , а он вроде только у Т1 присутствует...
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 7 2007, 01:40
Сообщение #5


Ambidexter
*****

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



Цитата(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(:-)!!!


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 7 2007, 05:35
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=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 - фтопку, оверклок - неправильная затея.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 7 2007, 21:54
Сообщение #7


Ambidexter
*****

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



Цитата(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 Гц. Другим способом на данном железе вы такой точности не добьётесь.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 8 2007, 03:00
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Я ведь потому и спросил о периоде готовности результата. Чем больше период времени выделенный для подсчета частоты, тем точнее можно получить результат за счет матем.обработки. Да, при частоте тактирования таймера 22МГц использование Capture позволяет получить дискретность определения периода частоты порядка 45нс. Для частоты 170кГц эта точность хуже 1%. Но если усреднить результаты измерения за временной интервал значительно превышающий период частоты сигнала, то мы получим гораздо бОльшее временнОе разрешение, чем искомые 45нс. За 1 сек можно посчитать частоту 170кГц с точностью почти на порядок выше, чем дает единичный отсчет с дискретностью определения периода в 45мс. Впрочем на форуме это уже неоднократно обсуждалось, имеет ли смысл повторяться?
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 8 2007, 07:18
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=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 будет просто пропускать прерывания, которые не будет успевать обработать. И даже мат обработка не поможет устранить эту ошибку, точность будет весьма скверная.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 8 2007, 18:15
Сообщение #10


Ambidexter
*****

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



Цитата(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 байт кода, особо не напрягаясь. Один час работы.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
bodja74
сообщение Apr 8 2007, 20:15
Сообщение #11


Знающий
****

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



2=GM=

Думаю что вариант с внешним тактом таймеров будет получше чем захват,
с внешним тактом вообще никаких вычислений не нужно - просто выбрать из регистра значение допустим через секунду,примерно также и с ИНТ ,просто инкрементировать в прерываниии и больше ничего.
в варианте с захватом чем меньше импульс (выше частота) тем больше погрешность при расчете частоты, и здесь 0.02Гц весьма сомнительно,так при частоте 170кГц мы будем иметь погрешность 1% - соответственно для этой частоты +\- 1.7кГц smile.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 8 2007, 23:35
Сообщение #12


Ambidexter
*****

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



Цитата(bodja74 @ Apr 8 2007, 17:15) *
2=GM=

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

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

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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 9 2007, 00:16
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



bodja74, видимо имеет в виду метод "временнЫх ворот", т.е. подсчет числа импульсов за определенный интервал времени.

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

Это временнОе разрешение такое получается, а точность измерения несколько похуже.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 9 2007, 01:19
Сообщение #14


Ambidexter
*****

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



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

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

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

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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 9 2007, 01:49
Сообщение #15


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата
Положим, пост #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 МГц). Реальная погрешность, вгрубе, будет ниже.

То что вы привели в простонародье называтся "трепом".
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 9 2007, 02:23
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(=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. точнее не совсем этот способ с выделением и прямым измерением разностной частоты, а другой, также описанный у ХХ, определение периода разностной частоты за время выделенное для измерения.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 9 2007, 07:28
Сообщение #17


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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). В этом режиме таймеры просто считают входные импульсы - процессор отдыхает.
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 9 2007, 12:12
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



defunct, я же указал не один раз, что плохо знаю архитектуру AVR и его таймеров. Считайте тогда мой пост чистой теорией, раз при исходных условиях это не реализуется на AVR smile.gif
Go to the top of the page
 
+Quote Post
bodja74
сообщение Apr 9 2007, 13:12
Сообщение #19


Знающий
****

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



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

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

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

Я (и 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
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 9 2007, 14:17
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(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Гц.
Go to the top of the page
 
+Quote Post
bodja74
сообщение Apr 9 2007, 15:50
Сообщение #21


Знающий
****

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



2resident

А с чего Вы взяли что при частоте 169999Гц ,у вас будет 91 значений 100 и 9 значений 101,а не все значения будут иметь значения 100 ? Клок ядра - есть аксиома через которую уже не перепрыгнеш.
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 9 2007, 17:01
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Билин, ну да, в спешке я лажанулся sad.gif Это статистически неверный пример. Правильно было бы указать частоту 169990Гц, а не 169999Гц. Тогда за 1 сек как раз 10 раз набегает фаза. И получается подсчитанная частота 169847,1Гц при истиной 169990Гц. Относительная погрешность измерения получается около указанных ранее 0,09%. На порядок выше, чем при измерении 1 периода.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 9 2007, 20:37
Сообщение #23


Ambidexter
*****

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



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

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

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 возьмёт назад свои слова о "трепе". Надеюсь также, что сия заметка кому-то реально поможет в понимании, в реализации или ещё в чём-нибудь.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 9 2007, 21:00
Сообщение #24


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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

Обязательно возьму свои слова назад, но только тогда когда увижу от вас рабочий пример программы. Вы видите только одну сторону медали - точность, и не видите другой ее стороны - загрузки CPU, поэтому вам бесполезно что-то доказывать пока.
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 9 2007, 21:50
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Непонятно откуда взялось и как реализовать это условие? Изначально мы не знаем ни M, ни Tx, нам их нужно измерить. А если мы их знаем, то зачем измерять? blink.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 9 2007, 22:02
Сообщение #26


Ambidexter
*****

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



Цитата(defunct @ Apr 9 2007, 18:00) *
Обязательно возьму свои слова назад, но только тогда когда увижу от вас рабочий пример программы. Вы видите только одну сторону медали - точность, и не видите другой ее стороны - загрузки CPU, поэтому вам бесполезно что-то доказывать пока.

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

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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 9 2007, 22:27
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Насколько я понял, второй случай это тот же метод "временных ворот", но на счетный вход подается не измеряемая частота, а опорная? А временные ворота формируются измеряемой частотой, так? Как это реализуется на реальной периферии с использованием таймера?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 9 2007, 22:36
Сообщение #28


Ambidexter
*****

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



Цитата(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 Гц, как тут предлагают некоторые уважаемые, не в обиду им будь сказано.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 9 2007, 22:53
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Если честно, то я нихрена не понял smile.gif Если можно, то дайте до кучи еще и описание схемы захвата. А то, видимо я ее функционирование представляю себе тоже не так, как вы.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 9 2007, 23:02
Сообщение #30


Ambidexter
*****

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



Цитата(rezident @ Apr 9 2007, 19:27) *
Насколько я понял, второй случай это тот же метод "временных ворот", но на счетный вход подается не измеряемая частота, а опорная? А временные ворота формируются измеряемой частотой, так? Как это реализуется на реальной периферии с использованием таймера?

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

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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 10 2007, 03:41
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Так, хорошо хоть работу схемы захвата я понимаю верно. 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
Go to the top of the page
 
+Quote Post
add
сообщение Apr 10 2007, 09:41
Сообщение #32


Местный
***

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



хелп! запутался в конец!
Ув.=GM=, поясните пожалуйста.
Цитата
По фронту импульса входной частоты содержимое таймераn переписывается в специальный регистр (ICRn).

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

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

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

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


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 10 2007, 10:37
Сообщение #33


Ambidexter
*****

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



Цитата(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?

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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
add
сообщение Apr 10 2007, 11:48
Сообщение #34


Местный
***

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



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


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

Прикрепленное изображение

Прикрепленное изображение


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


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 10 2007, 12:42
Сообщение #35


Ambidexter
*****

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



Цитата(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 работает как таймер, считает импульсы опорной частоты.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
add
сообщение Apr 10 2007, 12:58
Сообщение #36


Местный
***

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



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

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


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 10 2007, 13:33
Сообщение #37


Ambidexter
*****

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



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

На здоровье.

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

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

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

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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 10 2007, 13:55
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(=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
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 10 2007, 14:51
Сообщение #39


Ambidexter
*****

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



Цитата(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), что могут дать только какие-нибудь монстры с цезиевым или там водородным стандартом, да и то не все. Ну а опору надо брать от ДжиПиэС(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 10 2007, 16:11
Сообщение #40


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=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 не поменяется.
Go to the top of the page
 
+Quote Post
add
сообщение Apr 10 2007, 16:31
Сообщение #41


Местный
***

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



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

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


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 10 2007, 18:10
Сообщение #42


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Нет, не так! Время окна (количество импульсов) должен считать таймер0, который от измеряемой частоты тактируется. Таймер1 от опорной частоты тактируется. Причем по окончании счета (совпадении количества импульсов таймер0 с заданным) должен сработать "стоп"-захват у таймер1.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 10 2007, 19:08
Сообщение #43


Ambidexter
*****

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



Цитата(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(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
bodja74
сообщение Apr 10 2007, 19:27
Сообщение #44


Знающий
****

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



Цитата(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" (режим захвата) это никакого отношения не имеет.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 10 2007, 19:54
Сообщение #45


Ambidexter
*****

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



Цитата(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 писал, а кто? Несколько мессагов упирались. Ну и кто кого должен учить внимательности? Обратите внимание, в каждом посту вверху-справа стоит значок "решетка" # и номер поста.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 10 2007, 22:02
Сообщение #46


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=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
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 11 2007, 00:56
Сообщение #47


Ambidexter
*****

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



Цитата(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-х разрядные переменные" и где? Опять огульно говорите.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 11 2007, 01:22
Сообщение #48


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Apr 10 2007, 23:56) *
То есть достаточно два прерывания захвата на частоту? А с точностью согласны?

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

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

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

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

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

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

Да, для такого метода большого потока прерываний не будет. Поток будет для метода (A). Но прерываний и здесь все равно не 2.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 11 2007, 02:03
Сообщение #49


Ambidexter
*****

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



Цитата(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 Гц. Есть продуктивная идея?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
add
сообщение Apr 11 2007, 09:00
Сообщение #50


Местный
***

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



Цитата(bodja74 @ Apr 10 2007, 20:27) *
не 1/94= 0,01%

а 100\94=1.06%

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

Ну лихости нам не занимать :-) .. ну очепятка.. идея то понятна что 170кГц можно измерить с точностью +-0.01Гц при заданных условиях.. Определяющим это 16МГц +-1..2 такта(без учета стабильности и расбросов кварца).


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
Guest_=AVR=_*
сообщение Apr 15 2007, 02:45
Сообщение #51





Guests






Для усугубления - тем же методом, что расписал уважаемый GM, только еще с кучей наворотов - накопление/фильтрация/масштабирование на ходу, дитеринг для сглаживания ступенек и т.д. я многоканально измеряю частоты в своей аппаратуре, которая по миру разошлась сотнями экземпляров. Точность(!) и дискретность измерений - порядка 10Е-9 (0.0001 ГЦ для сигнала 100 КГЦ) при 10-миллисекундном цикле измерений и частоте таймера МК в 100 МГЦ (Silabs C8051F121) или в 5 раз хуже при Ftimer = 20 МГЦ (ATMega88, 644). Опора - TCXO, в последних разработках - GPS. И резервы еще есть smile.gif)
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 16 2007, 01:42
Сообщение #52


Ambidexter
*****

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



Цитата(=AVR= @ Apr 14 2007, 23:45) *
Для усугубления - тем же методом, что расписал уважаемый GM, только еще с кучей наворотов - накопление/фильтрация/масштабирование на ходу, дитеринг для сглаживания ступенек и т.д. я многоканально измеряю частоты в своей аппаратуре, которая по миру разошлась сотнями экземпляров. Точность(!) и дискретность измерений - порядка 10Е-9 (0.0001 ГЦ для сигнала 100 КГЦ) при 10-миллисекундном цикле измерений и частоте таймера МК в 100 МГЦ (Silabs C8051F121) или в 5 раз хуже при Ftimer = 20 МГЦ (ATMega88, 644). Опора - TCXO, в последних разработках - GPS. И резервы еще есть smile.gif)

Что такое в мире творится, наверное медведь в лесу сдох(:-) - АВР на электрониксе зарегился!
Расскажите про дитеринг уважаемому автору темы, а то он (или она) куда-то закатился, кочерёжкой не достанешь(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 16 2007, 03:30
Сообщение #53


Ambidexter
*****

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



Цитата(=AVR= @ Apr 16 2007, 00:10) *
Зарегился, кстати, исключительно благодаря позавчерашней ссылке rezident'а в Телесисах на этот thread - прочитал и счел своим долгом укрепить Вашу линию упоминанием успешности своего аналогичного решения, а то Вас уже едва ли не еретиком-одиночкой без мотора готовы были назначить smile.gif А про дитеринг аффтару с удовольствием расскажу, коли подберется к необходимости использования такового, но чую, не скоро это будет smile.gif

Ну, наверное, и снежный человек - йети, тоже сдох, и мать его ...(:-). Люди! АВР укрепляет мою линию и меня от предания еретичеству! Чудны дела твои, господи! А мне что теперь, st256-го поддерживать с его мухобойной статьёй(:-)?

Вообще-то, я и сам могу отбиться, не маленький ужо. Да и главный оппонент, defunct, слил, не выдержал что называется напряжёнки(:-), и Bodja74 куда-то пропал.

Тем не менее, за поддержку спасибо.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Snaky
сообщение Apr 16 2007, 07:41
Сообщение #54


Mute Beholder
***

Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754



Натолкнулся сегодня на эту ветку и вспомнилось, что в свое время, когда тоже задавался задачей измерения частоты сигнала (также, кстати на AVR) попалась мне книжка
Касаткин А.С. Обработка сигналов частотных датчиков. – М.: Энергия, 1966. – 120 с.
В книге как раз расписываются различные способы и алгоритмы измерения частоты/периода цифровых сигналов (рассматривается 14 или 15 способов (!), насколько помню, в том числе и те два которые сравнивали здесь). Там приводятся графики достижимых точностей и погрешностей измерения рассмотренных способов.
Единственный недостаток - книга старая и схемы приведены на дискретной логике, но при желании можно перевести на уровень программ для МК или ПЛИС - может даже получится что-то новое из хорошо забытого старого wink.gif


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 16 2007, 08:20
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Справедливости ради стоит отметить, что диапазон измеряемых частот получается ограниченным сверху при сравнении с методом временных ворот, если только не использовать для подсчета количества импульсов измеряемой частоты отдельный таймер, а при увеличении количества измеряемых сигналов таймеров может и не хватить для каждого сигнала smile.gif
Уточню, а то запинаете wink.gif - но при увеличении входной частоты погрешность метода временных ворот улучшается, так что проблема точности становится не особенно актуальной.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Apr 16 2007, 08:36
Сообщение #56


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
mse
сообщение Apr 16 2007, 10:24
Сообщение #57


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(Rst7 @ Apr 16 2007, 09:36) *
Я, господа, честно говоря не понимаю смысла ломания копий. В какой нормальной разработке можно применять такие измерения? Я о том, что измерение производится один(!) раз, совершенно нет подавления возможных помех и т.д. В рамках радиолюбительской поделки - еще ничего, но скорее всего такие точности не нужны, а при проффесиональном подходе - это все не годится.

Господи! ;О) Ну произведите это измерение 10-20...100 раз, статистицки обработайте да выведите куды надоть. Но измерение-то надо провести! Хотяб один раз. ;О) Нам, радиолюбителям - подельщикам, больше и не надо.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 16 2007, 13:20
Сообщение #58


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Apr 16 2007, 02:30) *
defunct, слил, не выдержал что называется напряжёнки(:-), и Bodja74 куда-то пропал.

Когда вы наконец-то удосужились объяснить метод, то смысла оппонировать больше не стало. ;>
Теперь каждый сможет разобраться на каком чипе его можно применить.
Автор ветки куда-то пропал, видать сам уже все померял.

А "слил", потому что рассуждать об измерении запредельных частот сейчас некогда.. Будет время сделаю, проверю, и напишу о результате. А пока это все треп.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 16 2007, 13:35
Сообщение #59


Ambidexter
*****

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



Цитата(Dog Pawlowa @ Apr 16 2007, 04:20) *
Справедливости ради стоит отметить, что диапазон измеряемых частот получается ограниченным сверху при сравнении с методом временных ворот, если только не использовать для подсчета количества импульсов измеряемой частоты отдельный таймер, а при увеличении количества измеряемых сигналов таймеров может и не хватить для каждого сигнала smile.gif
Уточню, а то запинаете wink.gif - но при увеличении входной частоты погрешность метода временных ворот улучшается, так что проблема точности становится не особенно актуальной.

Ну, если говорить об измерении частоты на голой атмеге128, то как для "метода захвата", так и для "метода ворот" имеется одно ФУНДАМЕНТАЛЬНОЕ ограничение - частота входного сигнала не может быть больше половины тактовой частоты процессора.

Но даже для пограничной входной частоты 8 МГц погрешность первого метода (±0.5 Гц) в ДВА раза выше погрешности второго метода (±1 Гц) и может быть легко увеличена в десятки раз, чего не скажешь о втором методе.

На практике это означает, например, что с помощью делителя на 10 вы можете мерять первым методом частоту 80 МГц с той же точностью, что и частоту 8 МГц вторым методом. Так что овчинка стоит выделки и проблема точности всё ещё актуальна.

Что касается отдельного таймера, то вы невнимательно читали мои посты, там как раз предлагается использовать отдельный таймер (timer/counter0) для подсчёта количества импульсов измеряемой частоты.

Цитата(defunct @ Apr 16 2007, 09:20) *
Когда вы наконец-то удосужились объяснить метод, то смысла оппонировать больше не стало. ;>
Теперь каждый сможет разобраться на каком чипе его можно применить.

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

Цитата(defunct @ Apr 16 2007, 09:20) *
А "слил", потому что рассуждать об измерении запредельных частот сейчас некогда.. Будет время сделаю, проверю, и напишу о результате. А пока это все треп.

Ну вот, опять трёп! Вы уверены, что вы правильно применяете это слово(:-)?
Какие такие запредельные частоты? То есть 8 МГц для вас запредельно? А что ж вы раньше говорили, что измерить просто и никаких сложностей вы там не видите?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 16 2007, 14:45
Сообщение #60


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Apr 16 2007, 12:35) *
Какие такие запредельные частоты? То есть 8 МГц для вас запредельно? А что ж вы раньше говорили, что измерить просто и никаких сложностей вы там не видите?

Я хочу попробовать померять частоты до ~50Mhz на AVR'кe без внешних компонентов.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Apr 16 2007, 17:15
Сообщение #61


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(=GM= @ Apr 16 2007, 13:35) *
Что касается отдельного таймера, то вы невнимательно читали мои посты, там как раз предлагается использовать отдельный таймер (timer/counter0) для подсчёта количества импульсов измеряемой частоты.

GM, дорогой, дискуссия была напряженной, но пора уже расслабиться. Я прочитал Ваши реплики не более невнимательно, чем Вы smile.gif И я еще прочел автора темы - он хотел три частоты измерять. Рано или поздно таймеры могут закончиться. Успехов wink.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 16 2007, 19:14
Сообщение #62


Ambidexter
*****

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



Цитата(Dog Pawlowa @ Apr 16 2007, 13:15) *
GM, дорогой, дискуссия была напряженной, но пора уже расслабиться. Я прочитал Ваши реплики не более невнимательно, чем Вы smile.gif И я еще прочел автора темы - он хотел три частоты измерять. Рано или поздно таймеры могут закончиться. Успехов wink.gif

Уверен, они кончатся раньше(:-). А я, в основном, совершенно спокоен и расслаблен...до пятницы. На работе вынашиваю коварные планы, которые повергнут в шок братьев наших бледнолицых(:-).

Вообще притомился, собираюсь в отпуск...


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
sKWO
сообщение Apr 16 2007, 20:33
Сообщение #63


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(defunct @ Apr 7 2007, 05:35) *
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 - фтопку, оверклок - неправильная затея.




От автора темы defunct
На 22-х мегагерцах атмеги 88 работают уже более полтора года
без срывов и подвисаний и сбоев tongue.gif
АТмега168 ето оно же 88 талько чуть пузатее по памяти и всё



Цитата(defunct @ Apr 16 2007, 14:45) *
Я хочу попробовать померять частоты до ~50Mhz на AVR'кe без внешних компонентов.


Как для "метода захвата", так и для "метода ворот" имеется одно ФУНДАМЕНТАЛЬНОЕ ограничение - частота входного сигнала не может быть больше половины тактовой частоты процессора.
Так заметил GM и я с ним согласен.
Кстати, defunct, если видели АВРки с тактовой 100МГц то подскажите!!!
А в общем спасибо за ваши ответы.
Вы прочитали вопрос и ответили точно по самой сути.

А "слил", потому что рассуждать об измерении запредельных частот сейчас некогда

Почитать ваши ответы очень интересно и полезно начинающим.
А Ваш спор с GM весьма некоректный как с его стороны так и с Вашей.
Он (спор) больше напоминал базар в тюряге двух радиолюбителей подрывников. (Не сочтите за грубость). (Слово за слово, строка за строку и понесло....). Пжлста a14.gif друг-друга.
Я Вас уважаю уже прочитав лиш ответы как знатока АВР, но всё же, моё мнение, GM и резидент прав
именно Capture Unit поможет добиться непревзойдённой точности.
"метод ворот" чудесен для высоких частот (неоспоримо).
И ёщё раз, я ВАМ ВСЕМ благодарен за сокращение времени поиска теории.


Цитата(Dog Pawlowa @ Apr 16 2007, 08:20) *
Справедливости ради стоит отметить, что диапазон измеряемых частот получается ограниченным сверху при сравнении с методом временных ворот, если только не использовать для подсчета количества импульсов измеряемой частоты отдельный таймер, а при увеличении количества измеряемых сигналов таймеров может и не хватить для каждого сигнала smile.gif
Уточню, а то запинаете wink.gif - но при увеличении входной частоты погрешность метода временных ворот улучшается, так что проблема точности становится не особенно актуальной.

С Вами я согласен полностью.
Тут всё понятно. Спасиб! a14.gif


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 16 2007, 20:39
Сообщение #64


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(sKWO @ Apr 16 2007, 19:28) *
Как для "метода захвата", так и для "метода ворот" имеется одно ФУНДАМЕНТАЛЬНОЕ ограничение - частота входного сигнала не может быть больше половины тактовой частоты процессора.
Так заметил GM и я с ним согласен.

это ограничение действует на всю синхронную периферию. Но для асинхронного таймера поидее не важна частота процессора, собсно я и хочу испытать его возможности.
Go to the top of the page
 
+Quote Post
sKWO
сообщение Apr 16 2007, 21:32
Сообщение #65


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Цитата(=GM= @ Apr 10 2007, 12:42) *
Картинки хорошие, но неполные. Внизу под меандром надо нарисовать много-много импульсов опорной частоты, это будет наше время, заполнение, как угодно назовите.

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

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

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

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

Спасиб за классное обяснение, учитывая частоты Ваш метод меня устроил
и для моего случая он отимален.
И ещё, мне кажется что Вы немножко спешите Всех критиковать за невнимательность
а сами тоже невнимательны.
Я извинился за неправильную постановку вопроса в названии контроллера,
defunct , правильно это заметил! это мой ответ резиденту в самом начале!!

m168, см comment #2
Что за comment #2? На заголовок темы посмотрите.

Да и приятно провести время в отпуске!!!




Цитата(defunct @ Apr 16 2007, 20:39) *
это ограничение действует на всю синхронную периферию. Но для асинхронного таймера поидее не важна частота процессора, собсно я и хочу испытать его возможности.

Вприцыпе, идея интересна потому только что я не знаю как работать с асинхронным таймером
и его возможностями. С внешним счётчиком видел где-то схему частотомера на 2313том до 40МГц.
Желаю удачи!


Цитата(defunct @ Apr 16 2007, 20:39) *
это ограничение действует на всю синхронную периферию. Но для асинхронного таймера поидее не важна частота процессора, собсно я и хочу испытать его возможности.

Взял описсание злостной АТмеги 168 таймер 2 и выделил два момента:
  • The CPU main clock frequency must be more than four times the Oscillator

During asynchronous operation, the synchronization of the Interrupt Flags for the asynchronous
timer takes 3 processor cycles plus one timer cycle. The timer is therefore
advanced by at least one before the processor can read the timer value causing the setting
of the Interrupt Flag. The Output Compare pin is changed on the timer clock and is
not synchronized to the processor clock.
Вашу идею не совсем понимаю.


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 17 2007, 00:57
Сообщение #66


Ambidexter
*****

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



То sKWO

Не знаю, есть ли АВРки с тактом 100 Мгц, а вот с тактом 48 МГц пожалуйста - АТ76С712 и 713.

Успехов в трудном деле измерения частоты. И напоследок: не давайте далеко заплывать плавающей запятой(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Яrik
сообщение Aug 19 2007, 18:04
Сообщение #67


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



То =GM=

Очень заинтересовал ваш метод измерения частоты.
Интересует следующие. Вы писали, что таймер1 считает такты МК, собственно вопрос: как лучше опрабатывать переполнение по пррыванию или следить программно.
Go to the top of the page
 
+Quote Post
singlskv
сообщение Aug 19 2007, 18:58
Сообщение #68


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Яrik @ Aug 19 2007, 22:04) *
То =GM=

Очень заинтересовал ваш метод измерения частоты.
Интересует следующие. Вы писали, что таймер1 считает такты МК, собственно вопрос: как лучше опрабатывать переполнение по пррыванию или следить программно.

Помнитца где-то около года назад мы уже обсуждали эту тему,
кажись тогда она называлась типа: ловля импульсов с 1мкс точностью на кварце МГц. smile.gif
Название конечно переврал, но поиском должно искаться.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 19 2007, 20:05
Сообщение #69


Ambidexter
*****

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



Цитата(Яrik @ Aug 19 2007, 18:04) *
То =GM=
Очень заинтересовал ваш метод измерения частоты.
Интересует следующее. Вы писали, что таймер1 считает такты МК, собственно вопрос: как лучше обрабатывать переполнение по прерыванию или следить программно.

Зависит от задачи, но особой разницы нет, без прерываний проц будет тупо ждать наступления переполнения, следовательно, ничего другого сделать не сможет. Хотя, по своему опыту скажу, что и здесь можно вывернуться, у меня было несколько реализаций метода захвата без прерываний ( т.к. были жесткие требования по джиттеру), частота мерялась от 0.5 МГц до 1.5 МГц, так я и датчик температуры по одному проводу опрашивал и много ещё чего там делалось.

По прерываниям, ваш проц в фоне может вычислить частоту, по данным, полученным в предыдущем цикле.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Яrik
сообщение Aug 19 2007, 20:24
Сообщение #70


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Спасибо. Всь сыр бор вот в чем, как Вы могли уже заметить я создал тему связаную с переполнением таймера0, поэтому и спрашивал как лучше.
Go to the top of the page
 
+Quote Post
Яrik
сообщение Aug 21 2007, 17:56
Сообщение #71


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



ТО GM
Для работы частотомера по Вашому методу контроллер обязательно должен иметь два таймера с Capture Unit? Я вот хотел сделать на ATmega8L, но что то не то, точность оставляет желать лучшего.
Вот код, подскажите что не так. Спасибо.
Код
#include <mega8.h>

static float Fx;
unsigned long int N1, N;
unsigned int M1, M;
unsigned int Perepol_Timer0=0, Perepol_Timer1=0;
unsigned int count_T1, count_T0;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
Perepol_Timer0++;
}

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void){
Perepol_Timer1++;
}

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void){
TIMSK&=0xDF;
count_T0=TCNT0;
count_T1=ICR1;
}


void main(void)
{
// Input/Output Ports initialization

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: T0 pin Rising Edge
TCCR0=0x07;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Rising Edge
// Timer 1 Overflow Interrupt: On
// Input Capture Interrupt: On
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x41;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x05;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")
while (1) {
Perepol_Timer1=0;
N1=Perepol_Timer1*65535+count_T1;
M1=Perepol_Timer0*255+count_T0;
while (Perepol_Timer1<12){
};
TIMSK|=0x20;
N=((unsigned long int)(Perepol_Timer1)*65535+(unsigned int)(count_T1))-N1;
M=(Perepol_Timer0*255+count_T0)-M1;
Fx=(float)8000000.0*(float)M/(float)N;
};
TIMSK|=0x20;
}
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 21 2007, 23:40
Сообщение #72


Ambidexter
*****

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



Цитата(Яrik @ Aug 21 2007, 17:56) *
То GM Для работы частотомера по Вашему методу контроллер обязательно должен иметь два таймера с Capture Unit? Я вот хотел сделать на ATmega8L, но что-то не то, точность оставляет желать лучшего

Достаточно одного.
Цитата(Яrik @ Aug 21 2007, 17:56) *
Вот код, подскажите что не так. Спасибо

Во-первых, счётчики переполнений надо умножать на 65536 и 256 соответственно, а не так как у вас.
Во-вторых, у вас прерывание по захвату сработает на второй перепад, скажем частота 1 МГц, значит через 1 мкс, а вам надо ждать примерно 1 секунду. Кстати, частота вычислится, но точность будет никакая, поскольку определение частоты будет происходить по одному периоду(:-(.

Примерный алгоритм бесконечного цикла может быть следующим.
1) ждём 1с,
2) разрешили захват,
3) дождались захвата,
4) считали N2 и M2,
5) вычислили Fx и выдали на индикатор,
6) передвинули метку времени: N1=N2, M1=M2,
7) вернулись к пункту 1.

Код примерно такой.
Код
Perepol_Timer1=0;  //внимание, первое значение частоты может быть неточным
N1=0;M1=0;
while (1)
{
while ((currenTime-oldTime)<OneSec)    //п.1-условно, можно сделать по-другому
{
}
TIMSK|=0x20;                           //п.2-разрешили захват
while ((TIMSK&0x20)==0x20)             //п.3-условно, можно сделать по-другому
N2=((unsigned long int)(Perepol_Timer1))*65536+count_T1; //п.4-текущее время
M2=Perepol_Timer0*256+count_T0;
N=N2-N1;                               //п.5-вычисление частоты
M=M2-M1;
Fx=(float)8000000.0*(float)M/(float)N; //можно выдать во внешний мир
N1=N2;                                 //п.6-новое значение времени стало старым
M1=M2;
}                                     // <---while цикл---

В-третьих, я удивлён, как оказывается легко "метод захвата" реализовать на си(:-). Well done!


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 21 2007, 23:55
Сообщение #73


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Умножение на 256 и 65536 имеет смысл заменить сдвигами. И перед делением стоит проверить значение N на нуль, чтобы избежать исключения (ошибка деления на нуль).
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 22 2007, 00:18
Сообщение #74


Ambidexter
*****

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



Цитата(rezident @ Aug 21 2007, 23:55) *
Умножение на 256 и 65536 имеет смысл заменить сдвигами. И перед делением стоит проверить значение N на нуль, чтобы избежать исключения (ошибка деления на нуль).
Насчёт деления всё верно, проверять надо. А на асме и сдвигать не надо, просто положить значение в соответствующую ячейку или регистр. Вот интересно, какую максимальную частоту сможет измерить сишная программа?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Яrik
сообщение Aug 22 2007, 15:23
Сообщение #75


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



ТО GM
БОООООльшое спасибо. smile.gif, за ответ. Буду пробывать. a14.gif
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 22 2007, 15:43
Сообщение #76


Ambidexter
*****

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



Цитата(Яrik @ Aug 22 2007, 14:23) *
ТО GM
БОООООльшое спасибо. smile.gif, за ответ. Буду пробовать. a14.gif

На здоровье.

ДолОжите нам(:-), какую максимальную частоту удалось измерить.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Яrik
сообщение Aug 22 2007, 16:52
Сообщение #77


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Цитата
currenTime-oldTime)<OneSec

Это переменные?

Цитата(=GM= @ Aug 22 2007, 18:43) *
На здоровье.

ДолОжите нам(:-), какую максимальную частоту удалось измерить.

Завтра, сегодня нет времени.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 23 2007, 08:48
Сообщение #78


Ambidexter
*****

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



Цитата(Яrik @ Aug 22 2007, 15:52) *
Это переменные?

Я ж написал там в комментарии: "пункт 1-условно, можно сделать по-другому".
Ну поставьте для начала тупой цикл на ОДНУ секунду, ИЛИ делайте другую задачу в течение одной секунды (примерно, точность здесь не важна) ИЛИ опрашивайте флаг таймера, взведённого на 1 сек ИЛИ сравнивайте число в N1 с текущим содержимым таймера 1, всё зависит от разработчика программы, т.е. от вас. Главное, вы должны выдержать период измерения.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Яrik
сообщение Aug 23 2007, 15:18
Сообщение #79


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Цитата(=GM= @ Aug 22 2007, 18:43) *
На здоровье.

ДолОжите нам(:-), какую максимальную частоту удалось измерить.


По данному коду в симуляторе VMlab удалось померять частоту 6,25МГц (выше не пробывал). Но меня терзают самнения может я что то не так делаю, я где то на форуме читал, что максимальная частота измерения для АВР пол тактовой, а то и меньше.

Код
#include <mega8.h>
#include <delay.h>

static float Fx;
unsigned long int N1, N2, N;
unsigned long int M1, M2, M;
unsigned int Perepol_Timer0=0, Perepol_Timer1=0;
unsigned int count_T1, count_T0;

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void){
Perepol_Timer0++;

}

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void){
Perepol_Timer1++;
}

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void){
TIMSK&=0xDF;
count_T0=TCNT0;
count_T1=ICR1;

}


void main(void)
{
PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;


PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
TCCR0=0x07;
TCNT0=0x00;

// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x41;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x05;

// Analog Comparator initialization
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

Perepol_Timer1=0;
N1=0;M1=0;
while (1){
delay_ms(1000);
TIMSK|=0x20;                        
while ((TIMSK&0x20)==0x20){}            
N2=(unsigned long int)(Perepol_Timer1)*65536+count_T1;
M2=(unsigned long int)Perepol_Timer0*256+count_T0;
N=N2-N1;                              
M=M2-M1;
Fx=(float)8000000.0*(float)M/(float)N;
N1=N2;                                
M1=M2;
} }
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 23 2007, 16:27
Сообщение #80


Ambidexter
*****

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



Цитата(Яrik @ Aug 23 2007, 14:18) *
По данному коду в симуляторе VMlab удалось померять частоту 6,25МГц (выше не пробывал). Но меня терзают самнения может я что то не так делаю, я где то на форуме читал, что максимальная частота измерения для АВР полтактовой, а то и меньше.

Сомнения вас терзают правильно, для тактовой частоты 8 МГц, вы выше 4 МГц не введёте. Вернее, ввести-то можно всё, не будет адекватности, вот в чём беда.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Яrik
сообщение Aug 23 2007, 16:43
Сообщение #81


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Тоесть программа работает правильно, это симулятор идиализирует возможности МК и реальные измерения частоты 6 МГц возможны но не будут постоянны.
Я правильно понял?

То GM.
Вы не могли бы обяснить все что необходимо для реализации цикла приведенного Вами (с его помощью можно менять время измерения):
Код
while ((currenTime-oldTime)<OneSec)    //п.1-условно, можно сделать по-другому
{
}

Что считает время currenTime, oldTime?

Спасибо.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Aug 23 2007, 21:56
Сообщение #82


Ambidexter
*****

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



Цитата(Яrik @ Aug 23 2007, 16:43) *
То есть программа работает правильно, это симулятор идиализирует возможности МК и реальные измерения частоты 6 МГц возможны но не будут постоянны. Я правильно понял?

Неправильно. Для 8-МГц аврки выше 4 МГц вы принципиально ничего не померяете.
Цитата(Яrik @ Aug 23 2007, 16:43) *
То GM.
Вы не могли бы обяснить все что необходимо для реализации цикла приведенного Вами (с его помощью можно менять время измерения):
Код
while ((currenTime-oldTime)<OneSec)    //п.1-условно, можно сделать по-другому
{
}

Что считает время currenTime, oldTime?

Ну ещё раз, вот вам варианты, на выбор:

1) Поставьте тупой цикл на Тизм (например, Тизм={0.1, 1.0, 10.0}) в виде программной задержки - в цикле вызываете подпрограмму задержки на 1 мс. Меняя счётчик цикла, будете менять время счёта.

2) Вызовите некую подпрограмму с подходящим временем работы Тизм. После её окончания можно приступать к измерению частоты.

3) Таймер1 у вас фактически является счетчиком некоего времени, поэтому вычисляйте
Т=(unsigned long int)(Perepol_Timer1)*65536+count_T1 - N1, до тех пор пока оно не станет равным заданному Тизм.

4) Заведите отдельный таймер, если он есть, запустите его, пусть он взводит флаг через Тизм, в фоне опрашивайте флаг таймера, как только он взведён - наступило время измерения.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Tomade
сообщение Jul 21 2008, 07:04
Сообщение #83


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 26-05-08
Пользователь №: 37 817



Знатоки, подскажите, пожалуйста, как реализовать частотомер по методу GM на ATMega64L. По описанию, у этого микроконтроллера нет входа для внешнего сигнала T0. Может, можно вместо таймера Т0 использовать таймер Т2?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 21 2008, 11:24
Сообщение #84


Ambidexter
*****

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



Не только можно, но и нужно. Как сделать - почитайте весь топик повнимательнее, этого достаточно.

На этом проце вообще можно сделать частотомер до 4 МГц (то есть до Fclk/2) с программой на си (мечта Яrik'а) с непревзойдённой точностью, скажем, до ±0,005 Гц на одном измерении, а с обработкой и того меньше.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 21 2008, 12:59
Сообщение #85


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Jul 21 2008, 14:24) *
На этом проце вообще можно сделать частотомер до 4 МГц (то есть до Fclk/2) с программой на си (мечта Яrik'а) с непревзойдённой точностью, скажем, до ±0,005 Гц на одном измерении, а с обработкой и того меньше.

Только не надо про ±0,005 Гц говорить.
Не будет на частотах 4Mhz такой точности. Подставьте числа в ваши же формулы. Fo = 8Mhz, Fx=4Mhz.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 21 2008, 13:31
Сообщение #86


Ambidexter
*****

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



Цитата(defunct @ Jul 21 2008, 11:59) *
Только не надо про ±0,005 Гц говорить.
Не будет на частотах 4Mhz такой точности. Подставьте числа в ваши же формулы. Fo = 8Mhz, Fx=4Mhz.

Ну подставьте сами. А в качестве интервала измерения возьмите 100 секунд. И заметьте, это оценка предельно допустимой ошибки, реальная ошибка будет всегда меньше.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 21 2008, 14:36
Сообщение #87


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Jul 21 2008, 16:31) *
А в качестве интервала измерения возьмите 100 секунд.

Прибор с абсолютной точностью при бесконечном интервале измерения? smile.gif

Цитата
скажем, до ±0,005 Гц на одном измерении

и что ради ±0,005 Гц на 4Mhz, будем тормозить 100сек и на более низких частотах?
Тогда нет смысла извращаться с захватом. Метод "ворот" проще и даст те же ±0,005 Гц на 100 секундном интервале (разбив его на 100 интервалов с последующим усреднением).

Цитата(=GM= @ Jul 21 2008, 16:31) *
И заметьте, это оценка предельно допустимой ошибки, реальная ошибка будет всегда меньше.

Заметил. Само-собой.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 21 2008, 14:56
Сообщение #88


Ambidexter
*****

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



defunct:Прибор с абсолютной точностью при бесконечном интервале измерения?

Ну, 100с явно не бесконечный интервал. Отвлекусь. Когда-то работал в пейджинговой компании, у меня было 12 стоваттных передатчиков, работающих синхронно. Пользовался похожим портативным прибором, сделанным на пике кстати, который давал ДЕСЯТЬ значащих цифр. Период измерения составлял 1с, 10с и 100с. Да, неудобно было ждать результата почти 2 минуты, но это же разовая операция. Не знаю другого доступного способа померить частоту в полевых условиях с такой точностью, находясь на радиорелейной башне на высоте 120 м от земли. (Потом, когда всё было настроено, можно было мерять частоту и корректировать дистанционно из единого центра)

defunct: и что ради ±0,005 Гц на 4MГц, будем тормозить 100сек и на более низких частотах?

Проще написать программу, которая автоматом решает, что делать в конкретном случае. Относительная погрешность составляет ±1,25Е-9, вам что, всегда нужна предельная погрешность? Кстати, покажите, какую точность вы получите методом ворот, измеряя 1 кГц?

defunct:Тогда нет смысла извращаться с захватом. Метод "ворот" проще и даст те же ±0,005 Гц на 100 секундном интервале (разбив его на 100 интервалов с последующим усреднением).

С усреднением метод захвата даст тот же результат, что и метод ворот, но на секундном интервале, а не на 100с.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 21 2008, 15:42
Сообщение #89


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Jul 21 2008, 17:56) *
Проще написать программу, которая автоматом решает, что делать в конкретном случае

Ок принимается.

Цитата
Кстати, покажите, какую точность вы получите методом ворот, измеряя 1 кГц?

Все те же ±0.5Гц на секундном интервале.
Здесь бесспорно "захвать" выиграет.

Цитата
С усреднением метод захвата даст тот же результат, что и метод ворот, но на секундном интервале, а не на 100с.

Обоснуйте. Fo = 8Mhz, Fx = 4Mhz.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 21 2008, 16:31
Сообщение #90


Ambidexter
*****

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



defunct: Все те же ±0.5Гц на секундном интервале. Здесь бесспорно "захвать" выиграет.

Выиграет естественно, но как! С непревзойдённой точностью: ±0.0000625 Гц. Может она и не нужна на таких частотах, но сама получается и на "голой" аврке. А в методе ворот, вообще-то будет ±1 Гц, а не ±0.5Гц, как вы считаете, не пойму?

defunct: Обоснуйте. Fo = 8Mhz, Fx = 4Mhz.

Моим методом (ну не совсем моим, он известен давно, просто я его приспособил к периферии аврки, в этом смысле он мой) за 1 с интервал вполне реально сделать 1000 НЕЗАВИСИМЫХ измерений, потом обработать результат, вот и всё обоснование.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 21 2008, 18:40
Сообщение #91


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Jul 21 2008, 19:31) *
defunct: Обоснуйте. Fo = 8Mhz, Fx = 4Mhz.
Моим методом (ну не совсем моим, он известен давно, просто я его приспособил к периферии аврки, в этом смысле он мой) за 1 с интервал вполне реально сделать 1000 НЕЗАВИСИМЫХ измерений, потом обработать результат, вот и всё обоснование.

допустим Fx не 4Mhz, а 3.98Mhz хотя это не суть важно, ну и как эти 1000 независимых измерений в сумме выйдут на точность ±0.005?

Ведь чтобы выйти на такую точность нужно чтобы каждое отдельно взятое измерение обладало точностью не ниже |0.005| * 1000,

а у вас точность одного измерения на интервале 1с = |0.25| если я не ошибаюсь (Fx/Fo = 0.5). меньше интервал ниже точность. i.e. если интервал равен двум периодам Fo - то точности нет вообще, можно лишь грубо оценить есть сигнал или нет.
Go to the top of the page
 
+Quote Post
Peeoner
сообщение Jul 21 2008, 19:43
Сообщение #92





Группа: Новичок
Сообщений: 10
Регистрация: 2-07-08
Пользователь №: 38 711



Вот я наваял тут вобщем прогу по вашему методу,осталось только все слепить в кучю.
Я как бы уже тему открывал,но раз уж тут есть тема по конкретному методу то спрошу тут.
Если у меня период измерения будет 0.1с ,какую получю погрешность? И если период измерения будет не целым числом ,ну скажем 0.14-0.095 сильно это повлияет на точность?Тактовая частота АВРки 10Мгц,есть ли смысл подымать до 16?
Есть ли смысл использовать 10 разрядов? Или 6 в самый раз?

Сообщение отредактировал Peeoner - Jul 21 2008, 19:45
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 21 2008, 20:16
Сообщение #93


Ambidexter
*****

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



Цитата(defunct @ Jul 21 2008, 17:40) *
допустим Fx не 4Mhz, а 3.98Mhz хотя это не суть важно

Допустим, теоретически 4 МГц РОВНО (Fclk/2), хотя это и не суть важно.

Цитата(defunct @ Jul 21 2008, 17:40) *
ну и как эти 1000 независимых измерений в сумме выйдут на точность ±0.005? Ведь чтобы выйти на такую точность нужно чтобы каждое отдельно взятое измерение обладало точностью не ниже |0.005| * 1000, а у вас точность одного измерения на интервале 1с = |0.25| если я не ошибаюсь (Fx/Fo = 0.5)


Ошибаетесь, defunct, как всегда, впрочем(:-). Точность одного измерения на секундном интервале ±0.5 Гц, что вы всё время перевираете?

Давайте, я вас совсем добью, и скажу, что за секунду сделаю 10000 НЕЗАВИСИМЫХ измерений, да что там 10 тыщ, давайте сделаем 50 тысяч измерений в секунду. Какая будет суммарная погрешность такого количества измерений по сравнению с погрешностью отдельного измерения, не подскажете?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 21 2008, 20:56
Сообщение #94


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Jul 21 2008, 23:16) *
Ошибаетесь, defunct, как всегда, впрочем(:-). Точность одного измерения на секундном интервале ±0.5 Гц, что вы всё время перевираете?

скорее делаю комплимент вашему методу. ибо раньше в ветке вы заявляли о ±0.5 Гц в методе ворот.
В захвате же где Fo = 2Fx, вы обещали дать точность выше как раз за счет измерения периодов Fo.
Читайте внимательней ;>


Цитата
Давайте, я вас совсем добью, и скажу, что за секунду сделаю 10000 НЕЗАВИСИМЫХ измерений, да что там 10 тыщ, давайте сделаем 50 тысяч измерений в секунду. Какая будет суммарная погрешность такого количества измерений по сравнению с погрешностью отдельного измерения, не подскажете?

Добивать меня бесполезно и так defunct ;>
Просто расскажите, что вы подразумеваете под НЕЗАВИСИМЫМ измерением, и какова точность отдельно взятого независимого измерения.

И еще небольшой вопросик cool.gif
Подтверждаете ли вы что в методе захвата точность зависит соотношения измеряемой частоты к опорной Fx/Fo?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 21 2008, 21:25
Сообщение #95


Ambidexter
*****

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



Цитата(defunct @ Jul 21 2008, 19:56) *
скорее делаю комплимент вашему методу. ибо раньше в ветке вы заявляли о ±0.5 Гц в методе ворот. В захвате же где Fo = 2Fx, вы обещали дать точность выше как раз за счет измерения периодов Fo. Читайте внимательней

Это гдей-то я такое говорил? В пределе максимальная погрешность для метода захвата в два раза лучше, чем для метода ворот, это я говорил, помню. А именно, ±0.5 Гц в методе захвата супротив ±1.0 Гц в методе ворот для нашего конкретного случая Fo=8 MГц, Fx=4 MГц.

Цитата(defunct @ Jul 21 2008, 19:56) *
Просто расскажите, что вы подразумеваете под НЕЗАВИСИМЫМ измерением, и какова точность отдельно взятого независимого измерения

Давайте, для разнообразия вы мне расскажете, что такое независимое измерение, а я, так и быть, побуду "нулём в сиянии", это ведь ваши слова? Вот, кстати, нашёл отличную книжку Дворяшина Б.В. по методам радиотехнических измерений, даже две, всем рекомендую. Молодость вспомнил, ведь Дворяшин читал нам курс лекций по измерениям и лабы вёл...

А погрешность отдельно взятого независимого измерения так и будет ±0.5 Гц, ничего не могу поделать. Ну и какая будет погрешность 1000 независимых измерений в таком случае?

Цитата(defunct @ Jul 21 2008, 19:56) *
И еще небольшой вопросик. Подтверждаете ли вы что в методе захвата точность зависит соотношения измеряемой частоты к опорной Fx/Fo?

Абсолютная погрешность, естественно, зависит от соотношения частот, а вот относительная - не зависит. Сказанное справедливо как для метода захвата, так и для метода ворот. Почитайте книжки Дворяшина, там такая теория наведена, ой-ё-ёй, мало не покажется...


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 22 2008, 00:03
Сообщение #96


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Jul 22 2008, 00:25) *
Это гдей-то я такое говорил? В пределе максимальная погрешность для метода захвата в два раза лучше, чем для метода ворот, это я говорил, помню. А именно, ±0.5 Гц в методе захвата супротив ±1.0 Гц в методе ворот для нашего конкретного случая Fo=8 MГц, Fx=4 MГц.

Сорри запамятовал, давно эту тему не перечитывал.
Хорошо пусть |0.5|, и |1|.

Цитата
Давайте, для разнообразия вы мне расскажете, что такое независимое измерение, а я, так и быть, побуду "нулём в сиянии", это ведь ваши слова? Вот, кстати, нашёл отличную книжку Дворяшина Б.В. по методам радиотехнических измерений, даже две, всем рекомендую. Молодость вспомнил, ведь Дворяшин читал нам курс лекций по измерениям и лабы вёл...

Проглочу, поскольку виноват, см "PS".
По делу.
Такой замечательной книжки у меня под рукой нет (у всех свои кумиры), поэтому могу только предположить, что речь идет об измерении, с независимой погрешностью, т.е. не вызывающей погрешности других измерений.
Теперь объясните мне как вы сделаете 1000 независимых измерений на интервале 1с, так чтобы погрешность каждого измерения была как вы пишете ±0.5 Гц.
Fx все же давайте сделаем 3.98Mhz (хотя бы для наглядности, чтоб не тупо 1/2).

Цитата
А погрешность отдельно взятого независимого измерения так и будет ±0.5 Гц, ничего не могу поделать. Ну и какая будет погрешность 1000 независимых измерений в таком случае?

Опять ведь не договариваете.
На каком интервале будет заявленная погрешность?

Цитата
Почитайте книжки Дворяшина, там такая теория наведена, ой-ё-ёй, мало не покажется...
Спасибо за рекомендацию, при возможности воспользуюсь.


PS: Свои слова насчет 0 в сиянии забираю обратно.
Go to the top of the page
 
+Quote Post
Tomade
сообщение Jul 22 2008, 04:04
Сообщение #97


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 26-05-08
Пользователь №: 37 817



Цитата(Peeoner @ Jul 21 2008, 23:43) *
Вот я наваял тут вобщем прогу по вашему методу,осталось только все слепить в кучю.

Поделитесь, пожалуйста, наработками. Думаю, начинающим, вроде меня, будет полезно посмотреть.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 22 2008, 09:22
Сообщение #98


Ambidexter
*****

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



Цитата(defunct @ Jul 21 2008, 23:03) *
Опять ведь не договариваете. На каком интервале будет заявленная погрешность?

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

Цитата(defunct @ Jul 21 2008, 23:03) *
Теперь объясните мне как вы сделаете 1000 независимых измерений на интервале 1с, так чтобы погрешность каждого измерения была как вы пишете ±0.5 Гц

Я уже готов сделать 50000 независимых измерений на секундном интервале с погрешностью каждого в ±0.5 Гц, естественно для нашего конкретного случая Fo=8 MГц, Fx=4 MГц. Щас мне надо отъехать, где-то после обеда попытаюсь пояснить, как это можно сделать. А всё-ж-таки, defunct, не прочувствовали вы всю прелесть моего метода (:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Tomade
сообщение Jul 22 2008, 09:49
Сообщение #99


Участник
*

Группа: Новичок
Сообщений: 23
Регистрация: 26-05-08
Пользователь №: 37 817



Попробовал написать программу по методу GM, за основу взял программу Яrik_а. Микроконтроллер - ATMega 64L, тактовую частоту взял 1 мГц (просто для тренировки). Вместо нулевого таймера, который задействован у Яrik_а, взял таймер_2.
Работу программы проверял в VMLABе, смоделировав там пульсовый генератор меандра частотой 10 кГц.
Но ничего хорошего не получилось. Вместо ожидаемой индицируемой частоты 10 кГц на ЖК-индикаторе VMLABа в каждом цикле высвечиваются разные значения - от 2 до 30 кГц, причём бывают и отрицательные числа. Подскажите, пожалуйста, где ошибка в программе.

static float Fx;
unsigned long int N1, N2, N;
unsigned long int M1, M2, M;
unsigned int Perepol_Timer2=0, Perepol_Timer1=0;
unsigned int count_T1, count_T2;

// Timer 1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
Perepol_Timer1++;
}

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
TIMSK&=0xDF;
count_T2=TCNT2;
count_T1=ICR1;
}

// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{Perepol_Timer2++;}

void main(void){
// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0xC1;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2 initialization
TCCR2=0x07;
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x64;
ETIMSK=0x00;
#asm("sei")

Perepol_Timer1=0;
Perepol_Timer2=0;
N1=0;M1=0;

while (1) {
delay_ms(1000);
TIMSK|=0x20;
while ((TIMSK&0x20)==0x20){}
N2=(unsigned long int)(Perepol_Timer1)*65536+count_T1;
M2=(unsigned long int)Perepol_Timer2*65536+count_T2;
N=N2-N1;
M=M2-M1;
Fx=(float)1000000.0*(float)M/(float)N;
//Здесь идёт вывод измеряемой частоты Fx на ЖК-индикатор
N1=N2;
M1=M2; }}
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 22 2008, 10:47
Сообщение #100


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(=GM= @ Jul 22 2008, 12:22) *
Ну, блин, вы даёте! Конечно, на односекундном интервале. Мне что, каждый раз это писать, когда я говорю о погрешности? Я уж язык весь отболтал (:-).

Ок, просто это важный момент который надо было услышать от вас именно сейчас ;>
Цитата
Я уже готов сделать 50000 независимых измерений на секундном интервале с погрешностью каждого в ±0.5 Гц, естественно для нашего конкретного случая Fo=8 MГц, Fx=4 MГц. Щас мне надо отъехать, где-то после обеда попытаюсь пояснить, как это можно сделать. А всё-ж-таки, defunct, не прочувствовали вы всю прелесть моего метода (:-).

Как можно на одном секундном интервале сделать 50k независимых измерений секундного интервала (пусть они даже будут пересекаться)?! На секундном интервале есть возможность сделать только одно независимое измерение с точностью ±0.5 Гц (первая часть поста). Все остальные будут обладать либо меньшей точностью, либо не будут независимыми!
Go to the top of the page
 
+Quote Post

16 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th August 2025 - 16:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.03234 секунд с 7
ELECTRONIX ©2004-2016