Свежие обсуждения
Измерения

DDS-генератор на AVR - нужна помощь

1 143 189

GM: Вот тут зачатки теории (начиная с поста #23) и наглядное пособие (пост #43)

Ветку эту я читал, даже немного участвовал (например, пост #215) Забавно, как там народу втолковывали суть метода "reciprocal counting", а затем изобретали метод, по типу "Continuous time stamping"от Pendulum.
А в этой теме нужно не забыть предупредить народ, что зарезервированного вывода ICP не хватит для измерения частоты, нужно еще на T0 перемычку кидать.

GM: Готовый код на си (пост #32)

Что-то стремно такой метод использовать. Аппаратно нет возможности защелкнуть одновременно содержимое счетчиков TCNT0 и TCNT1. При работе на высокой входной частоте между захватом TCNT1 и чтением TCNT0 может просочиться входной импульс. Как-то можно, наверное, такую ситуацию отследить, но ценой программного поллинга флагов, что существенно будет мешать процессору работать над другими задачами. Я ограничиваюсь одним входом ICP и подсчетом импульсов входной частоты в прерывании. На ассемблере при этом можно вытянуть порядка 1 МГц на тактовой 20 МГц. Если не хватает скорости, ставлю на вход делитель, благо, относительная погрешность измерения частоты методом "reciprocal counting" не зависит от значения частоты. Но кардинальное решение проблемы - добавление на вход процессора хотя бы небольшой ПЛИС.

 

1) Вообще-то, я на авторство там не претендовал и сейчас не претендую. Просто оптимально реализовал "метод захвата" на архитектуре АВР, было это году так 2001. Судя по постам, народ про это явно не знал, зато потом у них глаза широко раскрылись.

2) Суть метода "reciprocal counting" вгрубе - подсчёт периода вместо подсчёта частоты. "Метод захвата" вгрубе это подсчёт ЦЕЛОГО числа периодов измеряемой частоты за известное время (примерно 1 с). Метод захвата более общий, он вырождается в метод "reciprocal counting", если измерять один период входной частоты. Метод захвата я довёл до совершенства, теперь можно сделать 1000 измерений за ту же секунду и усреднить результат.

3) И вам на будущее. Я разработал метод измерения частоты только заполнение порядка 300 МГц. Никаких частот выше 20 мег в системе нет. Pendulum знает?

4) ЛИ: Аппаратно нет возможности защелкнуть одновременно содержимое счетчиков TCNT0 и TCNT1. При работе на высокой входной частоте между захватом TCNT1 и чтением TCNT0 может просочиться входной импульс. Но кардинальное решение проблемы - добавление на вход процессора хотя бы небольшой ПЛИС

Вот как раз сишная программа этим занимается, отслеживает просачивание. Отслеживание занимает малое время при начальном захвате и при конечном, всё остальное время машина практически свободна. Программно я тоже делал, давно, спокойно получается до 4 МГц. В принципе достаточно одного ICP, но если не в силах, берите МК с двумя ICP, такие есть.

5) Да что ж такое, поветрие какое-то, чуть-что: плис, плис, плис. Не нужна в частотомере плиска, без неё можно спокойно обойтись.

 

1) Да, народ не знал, и до сих пор многие не знают, о чем говорит появление многочисленных клонов любительских частотомеров, основанных на методе прямого счета. Это позор!

2) Понятие "reciprocal counting" хоть и означает проcто "обратный счет", но уже прочно закрепилось за методом измерения частоты, когда измеряют длительность не одного периода, а N целых периодов. Как и в обсуждаемом здесь методе захвата. А метод накопления данных во время измерительного интервала с последующей статистической обработкой сейчас используется в частотмерах, в частности, для снижения шумов аналоговых интерполяторов.

3) Скорее всего, Pendulum не знает. Но и у них самих неплохо получается. Например, их CNT-90 на интервале 1 S имеет разрешение 8E-12.

4) Не понимаю, почему процессор занимается на малое время в начале и в конце измерения. Ведь там поллингом ожидается событие захвата, которое неизвестно когда может произойти, так как входная частота неизвестна. Ну и я не понимаю, как значение TCNT0 связано с захваченным значением, ведь чтение TCNT0 делается позже чтения ICR1, причем между этими событиями стоит кусок кода с условными переходами, т.е. с непостоянным временем выполнения.

Upd: хотя, возможно, все эти проблемы можно решить.

5) В нормальном частотомере, пусть даже любительском, ПЛИС нужна. Она позволяет решить сразу несколько проблем, поэтому целесообразность ее применения у меня не вызывает сомнений.

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

 

Леонид Иванович: Не понимаю, почему процессор занимается на малое время в начале и в конце измерения. Ведь там поллингом ожидается событие захвата, которое неизвестно когда может произойти, так как входная частота неизвестна. Ну и я не понимаю, как значение TCNT0 связано с захваченным значением, ведь чтение TCNT0 делается позже чтения ICR1, причем между этими событиями стоит кусок кода с условными переходами, т.е. с непостоянным временем выполнения

Так в моих постах по ссылке все написано, гражданин начальник . Или вы только слова знаете типа "обратный счет", "метод накопления данных", "снижение шумов аналоговых интерполяторов"? Не обижайтесь, это сарказм у меня такой. Иногда я людей тестирую по-своему, предпоследним был Vlad_Petr.

Обьясняю на примере. Вы измеряете частоту 1 МГц, которая подаётся на вход таймера0 и на ICP, таймер1 считает клоки 20 МГц. Начинаем измерения. Приходит фронт импульса, таймер0++ и содержимое таймер1 записывается в ICR1. В следующие 20 тактов содержимое таймер0 и таймер1 не изменится. Ваша задача их сохранить за 20 тактов в N1 и M1, затем вы свободны целую секунду, 20 миллионов команд, можете делать, что хотите. Через одну секунду ждёте нового фронта входного импульса, всё то же самое, сохраняете в N2 и M2. Из 20 миллионов команд выделяете 2000 команд, считаете по известной формуле частоту, переписываете N2, M2 в N1, M1, далее цикл повторяется. Единственное трудное в реализации место - это учёт переносов. Ну и где кусок кода с условными переходами?

Л.И., измерение частоты - это серьёзная задача и подходить к ней надо серьёзно. Профи не кидаются измерять частоту абы как, сначала проводится оценка значения частоты, потом точное измерение. Ну, а поллинг или прерывание - дело десятое.

(Кстати, я уже вышел на рубеж 1Е-10, могу измерить 10 ГГц с точностью 1 Гц.)

 

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

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

GM: Приходит фронт импульса, таймер0++ и содержимое таймер1 записывается в ICR1

Если на входе 1 МГц - это тепличные условия. А на практике, чтобы дождаться прихода фронта импульса, можно потерять неизвестно сколько времени. Ваша программа на этом этапе просто сидит в поллинге.

GM: В следующие 20 тактов содержимое таймер0 и таймер1 не изменится

Так нечестно. Я просил научить измерять 1/2Fclk И Ваша реплика, что можно измерить до 1/2Fclk, прозвучала именно тогда, когда здесь было объявлено о зарезервированном выводе ICP. Про вывод T0 ничего не говорилось. Вот я и удивился.

GM: Ну и где кусок кода с условными переходами?

В предложенном коде.


while((TIFR&_BV(TOV1))==0); //ждём начала измерения
ntick1=ICR1; //запомним ICR1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ntick2=nover; //и старшую часть

if(TIFR &_BV(TOV1)) //!!!!!!!!!!!!!!!!!!!!!!!!!!! кусок с условными переходами
{
nover++;
TIFR =_BV(TOV1); //сбросим TOV1
if(ntick1 < 0x8000) ntick2=nover;
} //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! конец куска

TIFR=(1 < < ICF1); //сбросим флаг захвата
TIMSK |=_BV(TOIE1); //разрешим прерывания TOV1
mtick1=TCNT0; //запомним TCNT0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

На высокой входной частоте это даст несоответствие между ICR1 и TCNT0, так как за время выполнения кода между их чтением пройдет куча импульсов, причем каждый раз разная.

GM: Профи не кидаются измерять частоту абы как, сначала проводится оценка значения частоты, потом точное измерение

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

GM: Кстати, я уже вышел на рубеж 1Е-10, могу измерить 10 ГГц с точностью 1 Гц

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

P.S. Пожалуй, соглашусь, что измерение частоты с помощью ICR1 и TCNT0 до 1/2Fclk возможно, но ни один из представленных фрагментов кода это не сделает. А нужно всего лишь написать функцию Get_N_and_M, которая в произвольный момент времени "на лету" способна выдавать адекватные пары количества импульсов заполнения и входных импульсов. Выбрать адекватную пару, наверное, можно на основе серии считываний регистров ICR1 и TCNT0 с последующим анализом, но мозг это может нагрузить неслабо, учитывая 16-разрядность ICR1 и учет переносов Для измерения частоты, как минимум, надо дважды вызвать эту функцию с каким-то промежутком времени, примерно равным желаемому измерительному интервалу. Без какого-либо ожидания захвата. Хоть из прерывания системного таймера, хоть из основной программы через задержку. Дальше - просто расчет.

 

А ведь про частотомер была специальная ветка, где GM подробно излагал суть этого метода.
Может с измерением частоты туда ?
Ну а точность и разрешающую способность путать конечно не надо.
Это и к генераторам с цифровым вводом относится.

 

ЛИ: GM: Профи не кидаются измерять частоту абы как, сначала проводится оценка значения частоты, потом точное измерение
Чушь. Пожалуйста, дайте ссылку на алгоритм работы какого-нибудь промышленного частотомера, где это используется. Такое может быть разве что в сугубо специальных измерителях для каких-то экзотических случаев.

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

А если я расскажу, что у меня делается, так у вас волосы зашевелятся..от ужаса. Измерение частоты затухающих импульсов 450МГц длит.15 мкс, аппаратная погрешность 1 Гц с когерентным накоплением, датчики момента вращения, температуры и давления для автомобилей и не только. Частота выборок 4166 кГц, полосы видеочастот датчиков 50-960 и 2100-2700 кГц, измеряются одновременно,

 

ЛИ: Если на входе 1 МГц - это тепличные условия. А на практике, чтобы дождаться прихода фронта импульса, можно потерять неизвестно сколько времени. Ваша программа на этом этапе просто сидит в поллинге

Один мег это для примера, если вы не поняли. Программа тоже для примера, каждый мало-мальски соображающий пыонэр доработает её под себя.

 

ЛИ: И Ваша реплика, что можно измерить до 1/2Fclk, прозвучала именно тогда, когда здесь было объявлено о зарезервированном выводе ICP. Про вывод T0 ничего не говорилось. Вот я и удивился.

Не надо поддёргивать, здесь все хода записаны. Моя реплика была в ответ на ваше заявление, что "голая" мега с трудом справляется. Вот она
ЛИ: Хотя "голая" мега с трудом справится измерять 1 МГц методом обратного счета. Я ставил еще делитель на 4

Ответил я так
GM: Значит, плохо используете схемотехнику АВР. "Голая" мега легко и точно измеряет частоты до 10 МГц (fCLK/2)

 

GM Чёй-то сразу чушь?

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

GM каждый мало-мальски соображающий пыонэр доработает её под себя

Хоть из пионерского возроста уже давно вышел, но не уверен, что получится доработать.

GM "Голая" мега легко и точно измеряет частоты до 10 МГц (fCLK/2)

На данный момент я так не умею. И, похоже, никто не умеет, кроме Вас.