За ранее благодарен за дельные ответы!!!!!
Вопрос по точности измерения частоты
Сконструировал частотомер на микроконтроллере tiny2313, программу написал самостоятельно на ассемблере. Результат об измеренной частоте выводится на шесть семисегментных индикаторов. Но есть "бег" младшего разряда. Тоесть, если я на вход подаю сигнал от генераторного кварца с частотой 12 МГц, то на индикаторе я наблюдаю значения в диапазоне 11.999.5 - 12. 0005. Сам процес измерения длится 800 мс, за это время временные ворота открываются 160 раз на протяжении 5 мс. Так вот сам вопрос - как можно уменьщить (убрать) величину "бега" младшего разряда. Быть может программы для измерения частоты строятся по другому принципу, тогда буду благодарен за описание другого принципа построения программы.
За ранее благодарен за дельные ответы!!!!!
За ранее благодарен за дельные ответы!!!!!
- Реклама
А входной делитель есть? сама тини2313 от какого генератора работает? с какой частотой?
Информация по RLC mini находится >тут<
Внешний делитель - LB3500 (коэфициент деления 8 ) + 74LS90 (коэфициент деления 10). Контроллер затактирован кварцевым резонатором 10 МГц.
- Сообщения: 85
- Зарегистрирован: Сб мар 13, 2010 13:52:10
Стабильность обычного кварцевого резонатора порядка 1е-9, Поэтому избежать бега последнего разряда простыми способами не удастся. У Вас и так получилась достаточно высокая точность. В промышленных частотомерах узел задающего генератора - один из самых сложных в разработке, изготовлении и наладке.
misterdi<@>i.ua
Как раз о частотомере речь зашла вот здесь: http://radiokot.ru/forum/viewtopic.php? ... 5&start=40
Что касается метода счета, то входной сигнал нужно подавать на вход захвата, по началу измерительного интервала запоминать значение таймера. Таймер для получения длительных измерительных интервалов придется расширить программно (в прерывании по переполнению считать эти самые переполнения). Затем по следущим захватам считать входные импульсы, и так до конца интервала. После окончания интервала осуществить второй захват. Затем взять посчитанное количество периодов входной частоты и разделить на их суммарную длительность, которую нужно найти по захваченным значениям. Получится входная частота, причем относительная точность измерения не будет зависеть от измеряемой частоты. Это и есть метод обратного счета. Грабли всего одни, заключаются в программном разруливании ситуации одновременного возникновения прерываний по захвату и переполнению. Голый ATtiny2313 способен измерять примерно 120 кГц с программой на Си и почти 500 кГц с программой на ASM. Если не прибегать к изврату со счетом периодов вторым таймером.
Что касается метода счета, то входной сигнал нужно подавать на вход захвата, по началу измерительного интервала запоминать значение таймера. Таймер для получения длительных измерительных интервалов придется расширить программно (в прерывании по переполнению считать эти самые переполнения). Затем по следущим захватам считать входные импульсы, и так до конца интервала. После окончания интервала осуществить второй захват. Затем взять посчитанное количество периодов входной частоты и разделить на их суммарную длительность, которую нужно найти по захваченным значениям. Получится входная частота, причем относительная точность измерения не будет зависеть от измеряемой частоты. Это и есть метод обратного счета. Грабли всего одни, заключаются в программном разруливании ситуации одновременного возникновения прерываний по захвату и переполнению. Голый ATtiny2313 способен измерять примерно 120 кГц с программой на Си и почти 500 кГц с программой на ASM. Если не прибегать к изврату со счетом периодов вторым таймером.
- Реклама
Спасибо всем за ответы! Разобрался в чем была причина слишком большого "бега" разрядов. Как уже было написано я Т/С0 назначил таймером, а Т/С1 счетчиком, но поскольку для таймера Т/С0 при включенном делении на 1024 и частоте кварца 10 МГц, состовляет чуть более 26 мс. Поэтому я написал программу так что таймер в процессе работы многократно включается и выключается. При этом тоже самое творится и со счетчиком - проходит 160 измерительных циклов. Известно что за один период временных ворот может быть ошибка в один входной импульс. А если таких ворот 160, вот и набегает хорошенькая ошибка.
Вчера изменил программу, теперь у меня только одни временные ворота с длительностью порядка 26 мс. Ошибка при таком составляет только единицу!!!!! Теперь подправлю чуть плату чтобы Т/С0 был счетчиком, а Т/С1 - таймером, потому что на нем просто реализовать ворота длительностью 800 мс.
А вот с "Голый ATtiny2313 способен измерять примерно 120 кГц с программой на Си и почти 500 кГц с программой на ASM." несогласен. Все зависит от частоты кварца, ну и от максимальной частоты самого микроконтроллера. Максимальная входная частота которую контроллер способен воспринять приблизительно можно определить разделив значение частоты кварца на 2,2. Тоесть если у Вас стоит кварц 16 МГц, то максимальная измеряемая частота будет 7,2 МГц.
Удачи!!!!!
Вчера изменил программу, теперь у меня только одни временные ворота с длительностью порядка 26 мс. Ошибка при таком составляет только единицу!!!!! Теперь подправлю чуть плату чтобы Т/С0 был счетчиком, а Т/С1 - таймером, потому что на нем просто реализовать ворота длительностью 800 мс.
А вот с "Голый ATtiny2313 способен измерять примерно 120 кГц с программой на Си и почти 500 кГц с программой на ASM." несогласен. Все зависит от частоты кварца, ну и от максимальной частоты самого микроконтроллера. Максимальная входная частота которую контроллер способен воспринять приблизительно можно определить разделив значение частоты кварца на 2,2. Тоесть если у Вас стоит кварц 16 МГц, то максимальная измеряемая частота будет 7,2 МГц.
Удачи!!!!!
Я имел в виду метод обратного счета с программным счетом входных периодов в прерывании по захвату. Просто счет импульсов действительно работает почти до 1/2 тактовой. Но что толку? Чтобы точно измерить период N импульсов входной частоты, нужно делать захват по первому и последнему фронту. Можно, конечно, подать входной сигнал одновременно на ICP1 (для захвата) и T0 (для счета), но это уже изврат.Tiratron писал(а):А вот с "Голый ATtiny2313 способен измерять примерно 120 кГц с программой на Си и почти 500 кГц с программой на ASM." несогласен.
Вы, как я понял, используете просто счет входных импульсов во временных воротах. Попробуйте таким способом измерить низкую частоту (например, 100 Гц) и скажите, какая получилась точность
- Сообщения: 315
- Зарегистрирован: Пт янв 29, 2010 19:42:27
Tiratron
может мерять до fclk/2.01
если на входе меандр со скважностью 2 (т е если есть любой предделитель на степень 2 если коэф деления не степень 2 то скважность сторого не равна 2)
проверялось так 16 битный таймер на счёт
8 битный в режим деления CLK пополам
так вот эту частоту считает точно
но это не все при равных затратах метод товарища =GM= http://electronix.ru/forum/index.php?sh ... 9796&st=15
дает точность в 10-100 раз выше
может мерять до fclk/2.01
если на входе меандр со скважностью 2 (т е если есть любой предделитель на степень 2 если коэф деления не степень 2 то скважность сторого не равна 2)
проверялось так 16 битный таймер на счёт
8 битный в режим деления CLK пополам
так вот эту частоту считает точно
но это не все при равных затратах метод товарища =GM= http://electronix.ru/forum/index.php?sh ... 9796&st=15
дает точность в 10-100 раз выше
ух ты.... показывает
Ответ для Liv:
Если мне нужно будет измерять низкие частоты - единицы, десятки герц - единицы килогерц я пойду по другому пути. С помощью встроенного аналогового компаратора будет включатся таймер (первое опрокидывание компаратора), а при втором опрокидывании таймер отключится. Таким образом я получу время одного периода измеряемого сигнала. А потом последует реализация деления единицы на полученную длительность периода.
Ответ-вопрос для Liv и 12val12:
Вы упоминаете про метод захвата и в статье что посоветовали тоже про это говорится. Но как его можно реализовать на tiny2313. У неё есть вывод для подачи сигнала захвата, также захват может происходить по сигналу аналогового компаратора. Если Вы знаете как реализовать этот захват то расскажите, буду благодарен.
Если мне нужно будет измерять низкие частоты - единицы, десятки герц - единицы килогерц я пойду по другому пути. С помощью встроенного аналогового компаратора будет включатся таймер (первое опрокидывание компаратора), а при втором опрокидывании таймер отключится. Таким образом я получу время одного периода измеряемого сигнала. А потом последует реализация деления единицы на полученную длительность периода.
Ответ-вопрос для Liv и 12val12:
Вы упоминаете про метод захвата и в статье что посоветовали тоже про это говорится. Но как его можно реализовать на tiny2313. У неё есть вывод для подачи сигнала захвата, также захват может происходить по сигналу аналогового компаратора. Если Вы знаете как реализовать этот захват то расскажите, буду благодарен.
чтото я не понимаю вообще какие у Вас проблемы с макс частотой? если таймер 8-мибитный то даже на частоте 32 мегагерца переполнение таймера будет происходить всего навсего 16000000/256=125000 раз в секунду а с этим любой МК на 16-ти мегагерцах справится запросто....а если таймер 16-ти разрядный как на мегах?
считать вообще нужно чисто аппаратно....написать два обработчика прерываний - первый - переполнение счетного таймера, второй - окончание счета времязадающего таймера и остановку счетного таймера....а ещё лучше - его переполнение чтоб период был побольшев тактах системного генератора...
в теле основного циклоа по кнопке или в вечном цикле работаем двумя путями - если измерение не начато то сбрасываем все переменные переполнений и таймеров в ноль, запускаем оба таймера и ждем в вечном цикле(можно с допустимым таймаутом на случай глюков ) остановки первого таймера вторым...как только это произошло расчитываем частоту зная сколько натюкало в счетном таймере за время переполнения временнОго таймера
, потом выводим результат на экран и потом снова в начало алгоритма 
вот и все дела....
считать вообще нужно чисто аппаратно....написать два обработчика прерываний - первый - переполнение счетного таймера, второй - окончание счета времязадающего таймера и остановку счетного таймера....а ещё лучше - его переполнение чтоб период был побольшев тактах системного генератора...
в теле основного циклоа по кнопке или в вечном цикле работаем двумя путями - если измерение не начато то сбрасываем все переменные переполнений и таймеров в ноль, запускаем оба таймера и ждем в вечном цикле(можно с допустимым таймаутом на случай глюков ) остановки первого таймера вторым...как только это произошло расчитываем частоту зная сколько натюкало в счетном таймере за время переполнения временнОго таймера
вот и все дела....
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
а если нужна уж очень высокая точность измерения низких частот то можно предусмотреть запись значений временнОго таймера по первым трем-четырем импульсам счетного таймера и если там всего один импульс был - временнОй таймер замедлить в 8 раз и снова повторить
а дальше действовать из расчета один такт за 10 секунд а не 1200 тактов за секунду(как при высокочастотном измерении) 
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
Ну что ж, не хотите измерять любые частоты одинаково точно, как хотите.Tiratron писал(а):Если мне нужно будет измерять низкие частоты - единицы, десятки герц - единицы килогерц я пойду по другому пути.
Liv, я же ведь спрашивал - как реализовать захват на микроконтроллере tiny2313??? Судя по её архитектуре реализовать захват можно двумя путями - подачей фронта сигнала на вывод ICP или по сигналу аналогового компаратора. Можно, конечно, при старте и финише временных ворот формировать сигнал на каком-то выводе и соединить его с выводом ICP. Но, по-моему, подавать сигнал с одного внутреннего блока микроконтроллера на другой по средствам внешней связи (за пределами самого микроконтроллера) не рационально.
Всё верно, или через вход ICP, и через компаратор.Tiratron писал(а):Liv, я же ведь спрашивал - как реализовать захват на микроконтроллере tiny2313??? Судя по её архитектуре реализовать захват можно двумя путями - подачей фронта сигнала на вывод ICP или по сигналу аналогового компаратора.
А зачем захват делать при старте и финише ворот? Захват нужно делать по фронту входного сигнала. Поэтому на вход ICP нужно подавать входной сигнал. При этом появляется проблема со счетом периодов входной частоты (сделать это можно только программно, наращивая в прерывании переменную), зато реализуется метод обратного счета, когда независимо от частоты входного сигнала получаем точность Тинтервала/Fclk.Tiratron писал(а):Можно, конечно, при старте и финише временных ворот формировать сигнал на каком-то выводе и соединить его с выводом ICP.
Полностью с Вами согласен. Это не очень красиво. А так можно было бы подать входной сигнал не только на ICP, но и на T0 для счета периодов. Вместо этого я в своем частотомере (ссылку давал выше) входную логику реализовал в маленькой CPLD. В результате получил возможность измерять методом обратного счета частоты до 100 МГц без предделителя (при условии соответствующего входного формирователя).Tiratron писал(а):Но, по-моему, подавать сигнал с одного внутреннего блока микроконтроллера на другой по средствам внешней связи (за пределами самого микроконтроллера) не рационально.
Liv, читал о методе обратного счета в книге "Искусство схемотехники", получается что в этом методе подсчитывается период, а потом, как написано, производится деление единицы на число подсчитанных импульсов. Хорошо, но как мне написать функцию деления на ассемблере для микроконтроллера, или я неправ??? Если неправ то, пожалуйста, поправте.
Примерно так. Обычно измеряется длительность не одного периода входной частоты, а нескольких, сколько примерно вписывается в желаемый измерительный интервал. Затем количество периодов входного сигнала делят на полученную их длительность.Tiratron писал(а):Liv, читал о методе обратного счета в книге "Искусство схемотехники", получается что в этом методе подсчитывается период, а потом, как написано, производится деление единицы на число подсчитанных импульсов.
Ну Вы даёте! А что, написать деление на ассемблере - проблема? Помотрите, хотя бы, Application Note от Atmel AVR200. Ну и в сети полно примеров.Tiratron писал(а):Хорошо, но как мне написать функцию деления на ассемблере для микроконтроллера
Здравствуйте. Посмотрите эту веточку
http://radiokot.ru/forum/viewtopic.php?f=20&t=24703
Там есть скан из книги, очень хорошо описывающий этот метод. Есть в исходниках программы умножения, деления больших чисел вплоть до 2^79.
http://radiokot.ru/forum/viewtopic.php?f=20&t=24703
Там есть скан из книги, очень хорошо описывающий этот метод. Есть в исходниках программы умножения, деления больших чисел вплоть до 2^79.


