Полная версия этой страницы:
Измерение частоты
Kotjara
Mar 1 2006, 18:48
Подскажите пожалуйста алгоритм измерения частоты микроконтроллером(AT90S2313).
А именно как принять частоту до нескольких МГц, с точностью до 1Гц ??
beer_warrior
Mar 1 2006, 19:11
Дык просто - посчитать количество импульсов за определенный период
времени. Чем выше точность, длиннее преобразование.
Для счета и интервала преобразования использовать таймеры -
один ведомый от внешнего источника, другой от кварца.
defunct
Mar 1 2006, 21:05
Хм требования сильно высокие.. попробуйте подсчет импульсов делать средствами таймера T1, в режиме Input Capture.. Возможно 1-2Mhz и вытянет с заданной точностью (если кварц будет 10Mhz и выше)...
Зы, а может на входе схемы поставить пределитель на 10 или 16, погрешность компенсировать более длительной выборкой.
Kotjara
Mar 2 2006, 00:29
T1-двухбайтный, т.е. max счёт будет 65535Гц за 1с.
Цитата(Kotjara @ Mar 2 2006, 06:29)

T1-двухбайтный, т.е. max счёт будет 65535Гц за 1с.
считайте еще количество прерываний по переполнению.
только вчера тахометр писал

--
запускаю прерывание по переполнению дабы получить управление каждые 100 Гц.
--
запускаю pragma на внешнее прерывание int0, в котором просто тупо i++
--
когда приходит прерывание от таймера, просто вывожу i на дисплей
после этого i=0
--
всё по кругу

главное! прескалер и коефициент (слово-то какое) для кварца посчитать и настроить таймер
--
см аттач (протеус, иар)
muravei
Mar 2 2006, 07:40
Этому господину уже предлогалось использовать предделитель как еще дополнительные мл. разряды, и досчитывать его программно.
Думаю, 24 р-р хватит.
Прошу прощения.
Хочу задать этот же вопрос в несколько другом ракурсе.
Задача таже - измерение частоты.
Контроллер тот же - ат90s2313.
Пожелания те же:
1. Точность измерений.
2.F верх. еденицы МГц.
А теперь вопросы:
1.Зависит ли от F кварца F верх (для прямого метода отсчета).?
2.Возможно ли для решения данной задачи использовать прямой метод отсчета частоты и какие при этом могут быть ограничения?
3.С точки зрения точности что предпочтительней прямой или косвенный отсчет?
Kotjara
Mar 2 2006, 15:21
[/quote]
считайте еще количество прерываний по переполнению.
[/quote]
Наверное так и сделаю
beer_warrior
Mar 2 2006, 17:17
2 Genri
все возможно - просто надо найти компромисс между точностью
и скоростью преобразования на заданном железе.
а почему at90?их вроде и не выпускают.Делай на tiny2313,она до 20мгц.
Kotjara
Mar 2 2006, 20:01
Цитата(WHALE @ Mar 2 2006, 23:54)

а почему at90?их вроде и не выпускают.Делай на tiny2313,она до 20мгц.
До 20Мгц меряет?
Разберусь с at90, и думаю перейти на ATMega.
defunct
Mar 3 2006, 03:12
Цитата(Kotjara @ Mar 2 2006, 22:01)

До 20Мгц меряет?
Разберусь с at90, и думаю перейти на ATMega.
Поставьте внешний делитель "на много", захватывайте импульсы аналоговым компаратором по Timer Capture и меряйте их длительность, будет вам 1Ghz с точностью до 0.01 Гц

если найдете такие быстродействующие элементы.. К примеру у серии К1533 кажется быстродействие до 100Mhz, можно сделать делитель на ней будет у вас частотомер до ~70Mhz.
ivainc1789
Mar 3 2006, 03:42
Цитата(defunct @ Mar 3 2006, 06:12)

Поставьте внешний делитель "на много", захватывайте импульсы аналоговым компаратором по Timer Capture и меряйте их длительность, будет вам 1Ghz с точностью до 0.01 Гц

если найдете такие быстродействующие элементы.. К примеру у серии К1533 кажется быстродействие до 100Mhz, можно сделать делитель на ней будет у вас частотомер до ~70Mhz.
AVR имеют синхронные счетчики, измерять можно максимально Fmax = Fbq/2.5. Ставить внешний делитель "на много" - решение корявое, т. к. на выходе такого делителя будет уже сигнал с утраченной точностью. Например, для делителя на 250, погрешность будет такая же. Не для всех применений это приемлемо. Лучше использовать метод досчета. Суть метода в неоходимости уметь точно прочитать содержимое счетчика-предделителя в данный момент, чтобы корректно вычислить измеряемую частоту.
defunct
Mar 3 2006, 09:20
Цитата(ivainc1789 @ Mar 3 2006, 05:42)

Ставить внешний делитель "на много" - решение корявое, т. к. на выходе такого делителя будет уже сигнал с утраченной точностью.
Ой! а куда точность-то денется?
цифровой делитель на паре счетчиков потеряет?

отмерять длительность нескольких N = 10..20 импульсов, усреднить - 1/T будет частота.
ivainc1789
Mar 4 2006, 13:23
Цитата(defunct @ Mar 3 2006, 12:20)

отмерять длительность нескольких N = 10..20 импульсов, усреднить - 1/T будет частота.
Получишь Fin = 1/T [+-] P, где P - коэфф. деления твоего предделителя "на много".
maximka
Mar 4 2006, 20:53
пусть F1=1МГц F2=1,000001МГц Сделаем делитель на 1024.
Т1=0,001024 с. Т2=0,001023999c. Т3=Т1-Т2=0,000000001c.
Значит Fзаполнения должна быть 1000 МГц.Много.
Сделаем делитель на 65536.
Т1=0,065536 с. Т2=0,06553593c. Т3=Т1-Т2= 0,00000007c.
Значит Fзаполнения должна быть 14285714 Гц. 14,3 МГц. Вполне реально.
А дальше выбираем исходя из условия что проще реализовать
GrayCat
Mar 6 2006, 10:48
Хмм. Вот на PIC-ах частотомер до 20...50 МГц был очень давно и успешно реализован:
http://ra3rbe.qrz.ru/digiscal.htm или
http://www.cqham.ru/digi.htmПрактически, классика.
Kotjara
Mar 7 2006, 15:51
Не совсем разобрался с приоритетом рываний, от сюда вопросы:
-если во время обработки прерывания от Т0, произойдет прерывание от Т1,
как поведёт себя программа, и куда вернётся после подпрограммы обработки прерывания Т1 ??
-и тот же вопрос, но если во время обработки прерывания от Т1, произойдет прерывание от Т0 ??
beer_warrior
Mar 7 2006, 16:04
По команде call, адрес возврата заносится в стек, флажок прерывания
сбрасывается и если случается новое прерывание все повторяеться по той же схеме.
В асме приоритетами достаточно легко манипулировать, в С флажки
локальных прерываний и sei могут обрабатываться неявно.
Поэтому рекомендуеться смотреть доку на конкретный компилятор, а еще лучше листинг.
В журнале "Схемотехника"' №5 за 2004 год есть статься в которой описывается устройство измерения частоты (автор вроде Николай Заец, ой в имени могу ошибиться). Построено по принципу уже изложенному в данном топике - аналоговый компаратор и таймер. Однако в данном способе есть несколько НО. Главное из них задержка срабатывания компаратора которая для mega составляет 500-750нс. То бишь определять с точостью до 1Гц на частотах в единицы МГц ИМХО не получится. Сам использую данную схему, но рассчитываю частоты до 1-10кГц - мне точнее просто не надо.
Pretorianec
Mar 22 2006, 13:48
Вообще-то из официальной документации ATMELа ясно видно, что при входе в подпрограмму прерывания запрещается обработка любых других прерываний, если не указано обратно.
НО контроллер запоминает какие были прерывания в момент запрещения.
Расскажите попопулярно о методе досчета предварительного делителя (алгоритм досчета).
Чтобы измерить несколько МГц с точностю до Гц нужно иметь очень стабильныю опору с точностью порядка +/- 0,1ppm обычный кварц это врядли обеспечит. Высокостабильные генераторы имеют точноть +/-1..2ppm.
Почти наверняка человеку нужна не абсолютная точность измерения, а разрешение. Если нужна именно абсолютная точнось в доли ppm, то проще всего для задания интервала измерения использовать секундные импульсы от GPS.
Ну зачем же сразу GPS, антенны эти ставить, погоду хорошую ловить. Можно обойтись обычным рубидиевым генератором.
Цитата(Magnum @ May 6 2006, 11:51)

Ну зачем же сразу GPS, антенны эти ставить, погоду хорошую ловить. Можно обойтись обычным рубидиевым генератором.
А еще проще принимать сигнал эталонных частот, например 50 и 66 кГц - когда-то в журнале "Радио" была схемка простенького приемника... На худой конец для калибровки можно использовать сигналы точного времени по радиотрансляции - это тоже с эталона частоты
Цитата(Magnum @ May 6 2006, 18:21)

Ну зачем же сразу GPS, антенны эти ставить, погоду хорошую ловить. Можно обойтись обычным рубидиевым генератором.
Причем здесь погода? И зачем нужен невесть-какой-дорогой рубидиевый генератор, если можно обойтись дешевым GPS-ом?
__nik__
May 6 2006, 19:01
я конечно не супер спец как некоторые может так реализовать:
-таймер 0 запустить на отсчет времени скажем 1 секунда
-- прерывания от таймера0 защелкивают данные в регистре = значение таймера1+переполнение
-прерывания таймер1 переполнения добовляют к long регистру 0х1000
частота равна long регистр + значение таймера1
при таком измерении(если все реализовано максимально быстро(код маленький) получится погрешность около 320гц, толи при 50МГц толи при 20МГц, покрайне мере такой способ позволял измерить до 2 МГц с погрешностью около 16герц, кому интересно может посчитать сам. Максимальная частота измерения = максимальной частоте работы таймера1. Для измерения частоты скажем 100(150)МГц нужен тригер вроде 1554ТВ1 (если интересно уточню) другая не катит.
Суммарная погрешность будет равна погрешности кварца+ длинна проги до считывания данных, а если использовать внешнии опорный импульс нужно по его фронту блокировать счетный вход перед контроллером(реакция на прерывание 2+2такта минимум да на код погрешность выростет) и чтоб контроллер после окончания защелкивания данных сам разрешил повторный отсчет...
prottoss
May 7 2006, 17:20
Привет всем!
А еще есть метод сравнения частот
http://roknroll.narod.ru/ALTERA/Chastotomer.htmhttp://cepera.h1.ru/isa/2_1_12.htmОчень интересный метод. Правда, необходима ПЛИС. Никто не пробовал реализовывать?
__nik__
May 7 2006, 19:52
Цитата(prottoss @ May 7 2006, 21:20)

Привет всем!
А еще есть метод сравнения частот
http://roknroll.narod.ru/ALTERA/Chastotomer.htmhttp://cepera.h1.ru/isa/2_1_12.htmОчень интересный метод. Правда, необходима ПЛИС. Никто не пробовал реализовывать?
как я понял способ не очень сложный и все зависит от максимальной частоты и точности. При частотах в районе кГц можно и досчетным методом (считать кол-во опорных импульсов за 1 или несколько входных импульсов) выше точность будет заметно падать, для МГц проще кол-во импульсов за периуд также можно для вычисления не целых периудов совместить оба способа только 1ый способ прировнять по периуду ко 2у, но как я понимаю нет необходимости знать у вас 100МГц или 100 000 000,5Гц разница не большая. Таким образом можно в разумных пределах обойтись и MCU (давным давно была схемка с програмкой для частотамера до 50МГц на контроллере ВЕ1) если есть желание выше то либо брать проц мощнее либо плис с параметрами подходящими.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.