Измерения | DDS-генератор на AVR - нужна помощь |
|
---|---|---|
GM: Вот тут зачатки теории (начиная с поста #23) и наглядное пособие (пост #43) Ветку эту я читал, даже немного участвовал (например, пост #215) Забавно, как там народу втолковывали суть метода "reciprocal counting", а затем изобретали метод, по типу "Continuous time stamping"от Pendulum. 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: Ну и где кусок кода с условными переходами? В предложенном коде.
На высокой входной частоте это даст несоответствие между 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 ничего не говорилось. Вот я и удивился. Не надо поддёргивать, здесь все хода записаны. Моя реплика была в ответ на ваше заявление, что "голая" мега с трудом справляется. Вот она Ответил я так |
|
|
GM Чёй-то сразу чушь? Да потому что в промышленных частотомерах это не используется, так как оно там ни к чему. Всё сказанное Вами дальше только подтверждает: "разве что в сугубо специальных измерителях". GM каждый мало-мальски соображающий пыонэр доработает её под себя Хоть из пионерского возроста уже давно вышел, но не уверен, что получится доработать. GM "Голая" мега легко и точно измеряет частоты до 10 МГц (fCLK/2) На данный момент я так не умею. И, похоже, никто не умеет, кроме Вас. |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |