Вопрос по точности измерения частоты

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Встал на лапы
Сообщения: 89
Зарегистрирован: Ср июн 24, 2009 08:20:30
Откуда: Украина, Киев, Троещина

Сообщение Tiratron »

Сконструировал частотомер на микроконтроллере tiny2313, программу написал самостоятельно на ассемблере. Результат об измеренной частоте выводится на шесть семисегментных индикаторов. Но есть "бег" младшего разряда. Тоесть, если я на вход подаю сигнал от генераторного кварца с частотой 12 МГц, то на индикаторе я наблюдаю значения в диапазоне 11.999.5 - 12. 0005. Сам процес измерения длится 800 мс, за это время временные ворота открываются 160 раз на протяжении 5 мс. Так вот сам вопрос - как можно уменьщить (убрать) величину "бега" младшего разряда. Быть может программы для измерения частоты строятся по другому принципу, тогда буду благодарен за описание другого принципа построения программы.
За ранее благодарен за дельные ответы!!!!!
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

А входной делитель есть? сама тини2313 от какого генератора работает? с какой частотой?
Информация по RLC mini находится >тут<
Контактная информация:
Реклама
Встал на лапы
Сообщения: 89
Зарегистрирован: Ср июн 24, 2009 08:20:30
Откуда: Украина, Киев, Троещина

Сообщение Tiratron »

Внешний делитель - LB3500 (коэфициент деления 8 ) + 74LS90 (коэфициент деления 10). Контроллер затактирован кварцевым резонатором 10 МГц.
Встал на лапы
Сообщения: 85
Зарегистрирован: Сб мар 13, 2010 13:52:10

Сообщение MisterDi »

Стабильность обычного кварцевого резонатора порядка 1е-9, Поэтому избежать бега последнего разряда простыми способами не удастся. У Вас и так получилась достаточно высокая точность. В промышленных частотомерах узел задающего генератора - один из самых сложных в разработке, изготовлении и наладке.
misterdi<@>i.ua
Реклама
Эиком - электронные компоненты и радиодетали
Liv
Вымогатель припоя
Аватара пользователя
Сообщения: 525
Зарегистрирован: Сб сен 20, 2008 12:12:30
Откуда: Minsk

Сообщение Liv »

Как раз о частотомере речь зашла вот здесь: http://radiokot.ru/forum/viewtopic.php? ... 5&start=40

Что касается метода счета, то входной сигнал нужно подавать на вход захвата, по началу измерительного интервала запоминать значение таймера. Таймер для получения длительных измерительных интервалов придется расширить программно (в прерывании по переполнению считать эти самые переполнения). Затем по следущим захватам считать входные импульсы, и так до конца интервала. После окончания интервала осуществить второй захват. Затем взять посчитанное количество периодов входной частоты и разделить на их суммарную длительность, которую нужно найти по захваченным значениям. Получится входная частота, причем относительная точность измерения не будет зависеть от измеряемой частоты. Это и есть метод обратного счета. Грабли всего одни, заключаются в программном разруливании ситуации одновременного возникновения прерываний по захвату и переполнению. Голый ATtiny2313 способен измерять примерно 120 кГц с программой на Си и почти 500 кГц с программой на ASM. Если не прибегать к изврату со счетом периодов вторым таймером.
Контактная информация:
Реклама
Встал на лапы
Сообщения: 89
Зарегистрирован: Ср июн 24, 2009 08:20:30
Откуда: Украина, Киев, Троещина

Сообщение Tiratron »

Спасибо всем за ответы! Разобрался в чем была причина слишком большого "бега" разрядов. Как уже было написано я Т/С0 назначил таймером, а Т/С1 счетчиком, но поскольку для таймера Т/С0 при включенном делении на 1024 и частоте кварца 10 МГц, состовляет чуть более 26 мс. Поэтому я написал программу так что таймер в процессе работы многократно включается и выключается. При этом тоже самое творится и со счетчиком - проходит 160 измерительных циклов. Известно что за один период временных ворот может быть ошибка в один входной импульс. А если таких ворот 160, вот и набегает хорошенькая ошибка.
Вчера изменил программу, теперь у меня только одни временные ворота с длительностью порядка 26 мс. Ошибка при таком составляет только единицу!!!!! Теперь подправлю чуть плату чтобы Т/С0 был счетчиком, а Т/С1 - таймером, потому что на нем просто реализовать ворота длительностью 800 мс.

А вот с "Голый ATtiny2313 способен измерять примерно 120 кГц с программой на Си и почти 500 кГц с программой на ASM." несогласен. Все зависит от частоты кварца, ну и от максимальной частоты самого микроконтроллера. Максимальная входная частота которую контроллер способен воспринять приблизительно можно определить разделив значение частоты кварца на 2,2. Тоесть если у Вас стоит кварц 16 МГц, то максимальная измеряемая частота будет 7,2 МГц.
Удачи!!!!!
Реклама
Liv
Вымогатель припоя
Аватара пользователя
Сообщения: 525
Зарегистрирован: Сб сен 20, 2008 12:12:30
Откуда: Minsk

Сообщение Liv »

Tiratron писал(а):А вот с "Голый ATtiny2313 способен измерять примерно 120 кГц с программой на Си и почти 500 кГц с программой на ASM." несогласен.
Я имел в виду метод обратного счета с программным счетом входных периодов в прерывании по захвату. Просто счет импульсов действительно работает почти до 1/2 тактовой. Но что толку? Чтобы точно измерить период N импульсов входной частоты, нужно делать захват по первому и последнему фронту. Можно, конечно, подать входной сигнал одновременно на ICP1 (для захвата) и T0 (для счета), но это уже изврат.

Вы, как я понял, используете просто счет входных импульсов во временных воротах. Попробуйте таким способом измерить низкую частоту (например, 100 Гц) и скажите, какая получилась точность :)
Контактная информация:
Потрогал лапой паяльник
Сообщения: 315
Зарегистрирован: Пт янв 29, 2010 19:42:27

Сообщение 12val12 »

Tiratron
может мерять до fclk/2.01
если на входе меандр со скважностью 2 (т е если есть любой предделитель на степень 2 если коэф деления не степень 2 то скважность сторого не равна 2)
проверялось так 16 битный таймер на счёт
8 битный в режим деления CLK пополам
так вот эту частоту считает точно
но это не все при равных затратах метод товарища =GM= http://electronix.ru/forum/index.php?sh ... 9796&st=15
дает точность в 10-100 раз выше
ух ты.... показывает
Встал на лапы
Сообщения: 89
Зарегистрирован: Ср июн 24, 2009 08:20:30
Откуда: Украина, Киев, Троещина

Сообщение Tiratron »

Ответ для Liv:
Если мне нужно будет измерять низкие частоты - единицы, десятки герц - единицы килогерц я пойду по другому пути. С помощью встроенного аналогового компаратора будет включатся таймер (первое опрокидывание компаратора), а при втором опрокидывании таймер отключится. Таким образом я получу время одного периода измеряемого сигнала. А потом последует реализация деления единицы на полученную длительность периода.

Ответ-вопрос для Liv и 12val12:
Вы упоминаете про метод захвата и в статье что посоветовали тоже про это говорится. Но как его можно реализовать на tiny2313. У неё есть вывод для подачи сигнала захвата, также захват может происходить по сигналу аналогового компаратора. Если Вы знаете как реализовать этот захват то расскажите, буду благодарен.
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

чтото я не понимаю вообще какие у Вас проблемы с макс частотой? если таймер 8-мибитный то даже на частоте 32 мегагерца переполнение таймера будет происходить всего навсего 16000000/256=125000 раз в секунду а с этим любой МК на 16-ти мегагерцах справится запросто....а если таймер 16-ти разрядный как на мегах?
считать вообще нужно чисто аппаратно....написать два обработчика прерываний - первый - переполнение счетного таймера, второй - окончание счета времязадающего таймера и остановку счетного таймера....а ещё лучше - его переполнение чтоб период был побольшев тактах системного генератора...
в теле основного циклоа по кнопке или в вечном цикле работаем двумя путями - если измерение не начато то сбрасываем все переменные переполнений и таймеров в ноль, запускаем оба таймера и ждем в вечном цикле(можно с допустимым таймаутом на случай глюков ) остановки первого таймера вторым...как только это произошло расчитываем частоту зная сколько натюкало в счетном таймере за время переполнения временнОго таймера :), потом выводим результат на экран и потом снова в начало алгоритма :)))
вот и все дела....
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

а если нужна уж очень высокая точность измерения низких частот то можно предусмотреть запись значений временнОго таймера по первым трем-четырем импульсам счетного таймера и если там всего один импульс был - временнОй таймер замедлить в 8 раз и снова повторить :) а дальше действовать из расчета один такт за 10 секунд а не 1200 тактов за секунду(как при высокочастотном измерении) :)
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Liv
Вымогатель припоя
Аватара пользователя
Сообщения: 525
Зарегистрирован: Сб сен 20, 2008 12:12:30
Откуда: Minsk

Сообщение Liv »

Tiratron писал(а):Если мне нужно будет измерять низкие частоты - единицы, десятки герц - единицы килогерц я пойду по другому пути.
Ну что ж, не хотите измерять любые частоты одинаково точно, как хотите.
Контактная информация:
Встал на лапы
Сообщения: 89
Зарегистрирован: Ср июн 24, 2009 08:20:30
Откуда: Украина, Киев, Троещина

Сообщение Tiratron »

Liv, я же ведь спрашивал - как реализовать захват на микроконтроллере tiny2313??? Судя по её архитектуре реализовать захват можно двумя путями - подачей фронта сигнала на вывод ICP или по сигналу аналогового компаратора. Можно, конечно, при старте и финише временных ворот формировать сигнал на каком-то выводе и соединить его с выводом ICP. Но, по-моему, подавать сигнал с одного внутреннего блока микроконтроллера на другой по средствам внешней связи (за пределами самого микроконтроллера) не рационально.
Liv
Вымогатель припоя
Аватара пользователя
Сообщения: 525
Зарегистрирован: Сб сен 20, 2008 12:12:30
Откуда: Minsk

Сообщение Liv »

Tiratron писал(а):Liv, я же ведь спрашивал - как реализовать захват на микроконтроллере tiny2313??? Судя по её архитектуре реализовать захват можно двумя путями - подачей фронта сигнала на вывод ICP или по сигналу аналогового компаратора.
Всё верно, или через вход ICP, и через компаратор.
Tiratron писал(а):Можно, конечно, при старте и финише временных ворот формировать сигнал на каком-то выводе и соединить его с выводом ICP.
А зачем захват делать при старте и финише ворот? Захват нужно делать по фронту входного сигнала. Поэтому на вход ICP нужно подавать входной сигнал. При этом появляется проблема со счетом периодов входной частоты (сделать это можно только программно, наращивая в прерывании переменную), зато реализуется метод обратного счета, когда независимо от частоты входного сигнала получаем точность Тинтервала/Fclk.
Tiratron писал(а):Но, по-моему, подавать сигнал с одного внутреннего блока микроконтроллера на другой по средствам внешней связи (за пределами самого микроконтроллера) не рационально.
Полностью с Вами согласен. Это не очень красиво. А так можно было бы подать входной сигнал не только на ICP, но и на T0 для счета периодов. Вместо этого я в своем частотомере (ссылку давал выше) входную логику реализовал в маленькой CPLD. В результате получил возможность измерять методом обратного счета частоты до 100 МГц без предделителя (при условии соответствующего входного формирователя).
Контактная информация:
Встал на лапы
Сообщения: 89
Зарегистрирован: Ср июн 24, 2009 08:20:30
Откуда: Украина, Киев, Троещина

Сообщение Tiratron »

Liv, читал о методе обратного счета в книге "Искусство схемотехники", получается что в этом методе подсчитывается период, а потом, как написано, производится деление единицы на число подсчитанных импульсов. Хорошо, но как мне написать функцию деления на ассемблере для микроконтроллера, или я неправ??? Если неправ то, пожалуйста, поправте.
Liv
Вымогатель припоя
Аватара пользователя
Сообщения: 525
Зарегистрирован: Сб сен 20, 2008 12:12:30
Откуда: Minsk

Сообщение Liv »

Tiratron писал(а):Liv, читал о методе обратного счета в книге "Искусство схемотехники", получается что в этом методе подсчитывается период, а потом, как написано, производится деление единицы на число подсчитанных импульсов.
Примерно так. Обычно измеряется длительность не одного периода входной частоты, а нескольких, сколько примерно вписывается в желаемый измерительный интервал. Затем количество периодов входного сигнала делят на полученную их длительность.
Tiratron писал(а):Хорошо, но как мне написать функцию деления на ассемблере для микроконтроллера
Ну Вы даёте! А что, написать деление на ассемблере - проблема? Помотрите, хотя бы, Application Note от Atmel AVR200. Ну и в сети полно примеров.
Контактная информация:
Встал на лапы
Сообщения: 89
Зарегистрирован: Ср июн 24, 2009 08:20:30
Откуда: Украина, Киев, Троещина

Сообщение Tiratron »

Спасибо, поищю примеры!!!!!
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Здравствуйте. Посмотрите эту веточку
http://radiokot.ru/forum/viewtopic.php?f=20&t=24703
Там есть скан из книги, очень хорошо описывающий этот метод. Есть в исходниках программы умножения, деления больших чисел вплоть до 2^79.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»