-
30.05.2006, 22:22 #1
- Регистрация
- 25.09.2003
- Адрес
- Москва
- Сообщений
- 69
- Поблагодарили
- 16
- Поблагодарил
- 5
Частотомер на PIC'е.
Частотомер на PIC'е.
Вопрос к специалистам программерам крутым,не очень крутым и к тем кто занимался разработкой частотомеров
на микроконтроллерах, в частности на PIC628.
Возможно ли корректное измерение частоты в диапазоне, скажем 10Гц-40мГц, на пределе времени счета 1 сек.?!
Под корректностью подразумевается пускай неточное, по нулям, но постоянное расхождение,в процентном
отношении образцовых и измереной PICом, во всем диапазоне измеряемых частот. Эта неточность может быть
скорректирована более точной установкой времени счета.Это понятно.А как быть с коммандами выполняемыми во
время подсчета количества импульсов и связанными с организацией дополнительных регистров для хранения
переноса и обработки данных старших разрядов, отсутствующих в TMR0?
На низких частотах все проходит более менее гладко.А на высоких частотах? Может ли часть подсчитанной информации
теряться во время проверок на переполнение регистров и переноса данных из одного регистра в другой.
Кто нибудь сравнивал показания образцового частотомера и частотомера собраного на PICе.Ошибка растущая вместе с
частотой и достигающая 200-600 Гц на F=40 000,000 Гц относительно 5 000,000 Гц, это нормально?
Может ли эта ошибка быть вызвана тем, что поделеный предделителем сигнал постоянно синхронизируется с
внутреним тактовым сигналом?
У кого какие мысли, рекомендации есть по этому поводу.Желательно провереные практически.
Напоминаю время = 1 секунда.
Всем спасибо!
-
31.05.2006, 00:19 #2
- Регистрация
- 30.04.2002
- Адрес
- Липецк, Россия
- Возраст
- 55
- Сообщений
- 935
- Записей в дневнике
- 16
- Поблагодарили
- 64
- Поблагодарил
- 4
Вообще-то, никаких команд во время подсчета импульсов никогда не применяют --- если они будут --- действительно пойдет неточность.
Есть таймер , есть прескалер --- вот их и задействуют --- их суммарной разрядности хватает для данной задачи --- связаны они аппаратно --- никаких команд для переноса импульсов не требуется.
Команды возникают , когда нужно прочесть значение, накопленное в прескалере , которое программно, к сожалению, недоступно (в отличие от значения таймера).
Но это уже происходит вне "временных ворот" и, поэтому, это не должно влиять на точность --- это уже обработка полученных данных.Последний раз редактировалось RU3GA; 31.05.2006 в 00:33.
-
31.05.2006, 12:11 #3
- Регистрация
- 05.12.2005
- Адрес
- Волжский, Волгоградская обл.
- Возраст
- 69
- Сообщений
- 59
- Поблагодарили
- 1
- Поблагодарил
- 0
Ну во первых простым подсчетом импульсов 40 мГц PICом
измерить ИМХО не получится. Если мне не изменяет склероз
у РICа 4 такта на команду. Считаем:
- примерно 8 тактов на вход в прерывание по приходу очередного импульса;
- 4 такта инкремент регистра;
_ 8 тактов выход из прерывания.
Вот даже без сохранения контекста, на обработку прерывания нам требуется
20 тактов.
Для измерения 40 мГц (период 25nS) нам требуется МК успеющий обработать
прерывание за 25nS/20тактов = 1,25nS ну для верности за 1nS, а это уже
100мГц тактовой частоты. ИМХО для ПИКа это нереально.
Если у него тактовая 20мГц, то точно измерить он может не более чем 1мГц.
Можно применить предделитель, т.е. разбить весь диапазон на поддиапазоны
и делить в них входящую частоту на разные коэффициенты, чтобы на МК
при любом раскладе подавалось не более 1мГц. А уж вывод на шкалу
корректировать программно в зависимости от включенного диапазона.
Естественно чем больше коэффициент деления тем больше процент погрешности.
Она возникает на границах включения/выключения "временных ворот". Так
при делении на 40 мы можем потерятьдо 80 тактов, то биш герц.
у погрешность, надо умножить на погрешность частоты тактового кврца.
Т.е. если таймерное прерывание "временных ворот" будет будет отличатся
от заданной (Вы предложили 1сек), то погрешность будет увеличичиваться
пошагово кратно первой погрешности т.е. по 40Гц или 80Гц.
Плюс добавляется программная погрешность на обработку таймерного
прерывания для фиксации показания счетного регистра.
Все это можно скорректировать программно в процессе наладки каждого
устройства. Но для этого программист должен предусмотреть механизм
внесения поправки. Скажем установкой поправки перемычками на плате или
более гибко - диалогом по внешнему интерфейсу через СОМ порт или USB.
Есть и другие методы измерения частоты, но это наиболее часто
встречающийся в радиолюбительских разработках, поэтому я его Вам и
описАл. А теперь сами прикиньте, может быть такая погрешность
у вашего устройства или нет.
PS Кстати на AVR, ИМХО, должно точнее получится. У них 1 такт на команду. Отчасти поэтому я на них давно переключился
-
31.05.2006, 12:39 #4
- Регистрация
- 30.04.2002
- Адрес
- Липецк, Россия
- Возраст
- 55
- Сообщений
- 935
- Записей в дневнике
- 16
- Поблагодарили
- 64
- Поблагодарил
- 4
Сообщение от rz4an
Которому тоже не требуется никаких команд от программы , кроме сброса и запуска.
Читаем значения прескалера и счетчика, обрабатыванм математически и получаем частоту. Это , конечно , весьма схематично
Очень подробно и доступно алгоритм частотомера изложен здесь:
http://ikarab.narod.ru/Kea_20.html в разделе №17
Удачи!
RU3GA
-
31.05.2006, 12:58 #5
- Регистрация
- 15.07.2004
- Адрес
- Харьков
- Сообщений
- 89
- Поблагодарили
- 0
- Поблагодарил
- 0
АЛЕ
А может быть лучше на AVR?
Например, приблизительно так, как показано в приложенном рисунке.
CD74AC161 тянут до 100 МГц. При времени счета 0,1 сек. получается точность 1 Гц (используется 16-ти битный таймер). Готов поделиться исходником калиброванной задержки на 0,1 сек (выверена до такта ).У кошки четыре ноги: вход, выход, земля и питание.
73! UR3LTG.
-
31.05.2006, 17:22 #6
- Регистрация
- 06.09.2002
- Адрес
- Екатеринбург
- Возраст
- 61
- Сообщений
- 246
- Поблагодарили
- 7
- Поблагодарил
- 49
http://www.r3r.ru/
Здесь есть частотомер на PIC.73. Андрей (RZ9CV)
-
31.05.2006, 20:10 #7
- Регистрация
- 25.09.2003
- Адрес
- Москва
- Сообщений
- 69
- Поблагодарили
- 16
- Поблагодарил
- 5
Уважаемый RU3GA спасибо за Ваш ответ.
Есть таймер , есть прескалер --- вот их и задействуют --- их суммарной разрядности хватает для данной задачи --- связаны они аппаратно --- никаких команд для переноса импульсов не требуется.
можно поместить число 2625A00h,это 40000000 за 1 сек.( 40мГц ).Может я чего не
понимаю ? Если не трудно поделитесь опытом.Желательно своим.
Кстати в указаной Вами ссылке есть четкое указание на то, что в организованом т.о.
счетчике присутствует еще один регистр TimerH, не входящий в состав TMR0.И этот
регистр надо обрабатывать во время счета,равного,как там указано, 0,1 сек.!!!
У меня же был вопрос относительно времени счета равного 1 секунде !!!
Попытка в лоб решить вопрос простым добавлением еще одного регистра TimerVH не
увенчалась успехом т.к.приходилось во время счета обрабатывать сразу 3 регистра,TMR0,
TimerH и TimerVH,постоянно контролируя их состояние и по надобности вносить
необходимую коррекцию.
RZ4AN спасибо за выкладку.Это все понятно.Так оно и есть.И откуда она, эта ошибка,
набирается тоже ясно.
Ответ на 1-й вопрос получен.
Корректное измерение частоты в диапазоне, 10Гц-40мГц,на пределе времени счета 1 сек.
с помощью микроконтроллера PIC628 и ему подобных невозможно!
Мне кажется что применение AVR хотя и может улучшить точность измерения, но
кардинально решить проблемму, нет.
Homich спасибо за ответ и предложение.
Честно говоря Я уже окончательно пришел к варианту приблизительно такому же как у Вас.
Только входные счетчики другие. Например HC4520 или 1554ИЕ23.Можно обойтись одним
корпусом. Правда частота будет чуть поменьше.
А программу написать под это дело, не проблема.
Andrey UA9CCI Спасибо за ссылку. В сети достаточно много описаний подобного рода
устройств, но как оказалось,все это типичное не то, или чуть-чуть не то.
Тем не менее Всем спасибо! Александр. RU3ANH 73!
-
31.05.2006, 20:55 #8
- Регистрация
- 29.01.2006
- Адрес
- Тамбов, Россия
- Возраст
- 69
- Сообщений
- 87
- Поблагодарили
- 13
- Поблагодарил
- 1
Сообщение от АЛЕ
Там все просто как 3 рубля.
На самом деле там не 2 байта, а 3. Хотя может быть и больше, просто мне для времени измерения 0.1 сек хватило и 3-х.
Программа следит за переполнением таймера и эти переполнения суммирует в третьем байте. Количество команд строго подсчитано и время их выполнения входит в время измерения.
Все это было сделано еще в 1999 году, и с тех пор лежит в интернете. Как правильно дал ссылочку UA9CCI , на сайте http://www.r3r.ru, а точнее на http://ra3rbe.r3r.ruАлександр Денисов - http://www.r3r.ru
-
31.05.2006, 21:48 #9
- Регистрация
- 30.04.2002
- Адрес
- Липецк, Россия
- Возраст
- 55
- Сообщений
- 935
- Записей в дневнике
- 16
- Поблагодарили
- 64
- Поблагодарил
- 4
Сообщение от АЛЕ
Просто вся беда в том , что мало кто выкладывает в инете "исходники", по которым можно полностью понять логику работы и тонкости реализации...
"Базовый вариант" в этом плане --- это сайт OM3CPH (именно радиолюбительские разработки).
А в русскоязычном инете на память приходит только публикации RW4LED (цифровая шкала на LCD) и EU1CC (синтезатор PIC16F877+DDS AD9851) --- вот там исходники в наличии --- при желании можно разобраться и поменять то , что не нравится (например, применить другой LCD ) или просто посмотреть как пишется "рабочий" код --- просто в качестве изучения.
P.S. А на счет невозможности реализации Вашей задачи на PIC16F628 --- это Вы зря пришли к такому выводуПоследний раз редактировалось RU3GA; 31.05.2006 в 22:21.
-
01.06.2006, 09:30 #10
- Регистрация
- 29.01.2006
- Адрес
- Тамбов, Россия
- Возраст
- 69
- Сообщений
- 87
- Поблагодарили
- 13
- Поблагодарил
- 1
Сообщение от RU3GA
А утверждение, что корректное измерение частоты на пределе 1 сек невозможно, мягко говоря не соответствует действительности и вызывает улыбку.Александр Денисов - http://www.r3r.ru
-
01.06.2006, 14:11 #11
- Регистрация
- 15.07.2004
- Адрес
- Харьков
- Сообщений
- 89
- Поблагодарили
- 0
- Поблагодарил
- 0
АЛЕ
Корректное измерение частоты в диапазоне, 10Гц-40мГц,на пределе времени счета 1 сек. с помощью микроконтроллера PIC628 и ему подобных невозможно!
Мне кажется что применение AVR хотя и может улучшить точность измерения, но кардинально решить проблемму, нет.
При предлагаемом мной построении частотомера, ИМХО, точность измерений будет зависить только от точности опорного генератора (в пределах плюс-минус 1 Гц при частоте до 100 МГц).
Считаем:
100 МГц = 100 000 000 Гц.
100 000 000/256 = 390625 (это на выходе счетчиков).
390625/65536 (16 битовый счетчик AVR) = приблизительно 5,96 Гц.
Соответственно период - 0,16 сек.
Следовательно, если мы будем в течении 0,1 секунды тупо считать импульсы и ни на что не отвлекаться (прерываний нет), то можем получить достаточно точную частоту (счетчик контроллера не успеет переполниться).
А программу написать под это дело, не проблема.
У меня там не просто задержка. Предусмотрена возможность введения поправки плюс-минус 10 кГц с шагом 4 герца (что бы скомпенсировать уход частоты кварца от паспортных 16 МГц).
Есть как и чистый асм, так и процедурка для CodeVision.
В общем, если захотите - могу предоставить. Заодно с кое-какими процедурками под HT1613 (преобразование 4-х байт в BCD и вывод на ЖКИ).
Зачем расшибать голову если кто то это уже сделал до вас?
Сразу не кидаю потому что все это добро лежит дома.
Честно вам скажу, программа не была дописана, а сам девайс лежит в полусобранном состоянии (острая надобность пока отпала).У кошки четыре ноги: вход, выход, земля и питание.
73! UR3LTG.
-
01.06.2006, 14:45 #12
- Регистрация
- 29.01.2006
- Адрес
- Тамбов, Россия
- Возраст
- 69
- Сообщений
- 87
- Поблагодарили
- 13
- Поблагодарил
- 1
Я бы немного возразил против Ваших рассуждений.
Чувствуется, что программа недописана и не запущена, потому Вам не видна ошибка в рассуждениях.
Итак: У Вас в схеме внешний предделитель 4+4 бита и таймер на 16 бит. Итого 3 байта.
Какое максимальное число можно отобразть 3-я байтами - ffffffh = 16777215.
Т .е если мы будем измерять 1 секунду, то максимально возможная частота - 16777215 гц.
Если будем измерять 0.1 секунды, то для того, чтобы заполнить счетчик за всемя
в 10 раз меньше нужна будет частота в 10 раз больше.
Т.е максимальная частота будет 167 мгц. Но это уже будет с точностью до 10 гц.
Ваш пример:
100.000.000 герц - это 100000000 импульсов в секунду = 5F5E100h. Сами видите - это 4 байта и в Вашу структуру не полезет.
Но если будете мерять 0.1 гц, то это уже будет 989680h - три байта, вполне уместится. Но с точностью до 10 гц.
А по поводу деления этих герцев и сделанных выводов извините - не догнал зачем это, к тому же это привело к ошибочным выводам.
Теперь по поводу схемы.
Уж коль сделан был внешний предделитель, то лучше было бы оба ниббла предделителя вывести на один порт. Например PD. Это позволит считывать состояние предделителя за одно чтение из порта.
Ну и сделать все это можно было бы на дешевом ATtiny2313, он стоит копейки и это сделает конструкцию более доступной для сборки. А анализ предделителя сделать как и в PIC-e методом досчета.
Но это так сказать мои личные замечания, и без них схема должна работать нормально. Да собственно формально она ничем не отличается от PIC-a.
НО PIC-e все внутри одной микросхемы. Этим конструкция и подкупает - простотой. Это получается конструкция одного перекура.
При использовании ЖК индикатора У PIC-a остается еще куча свободных ног, на которые я вывел переключение 16 значений ПЧ и еще выходы для цифровой подстройки частоты ГПД.Александр Денисов - http://www.r3r.ru
-
01.06.2006, 15:50 #13
- Регистрация
- 15.07.2004
- Адрес
- Харьков
- Сообщений
- 89
- Поблагодарили
- 0
- Поблагодарил
- 0
Уважаемый RA3RBE, наверное я чего то не понимаю. Пожалуйста, объясните мне, с какой радости точность будет 10 Гц? Какая разница, за какой период времени мы считаем импульсы?
Теперь насчет ПИК-а: там переполнения счетчиков есть? Насколько я понимаю, есть. А в какой момент происходят прерываиня по переполнению? Во время выполения какой команды? А за сколько тактов выполняется эта команда? Простите за банальность, но пока текущая команда не завершится, прерывания не будет.
Следовательно, мы имеем плавающую задержку от одного до до семи тактов генератора. И что же это за измеритель получается?
Далее, насчет копеек: ATtiny2313 у нас на базаре стоит 6,5 грн (1,27 у.е.), а ATmega8 стоит 8,5 грн (1,66 у.е.). Разница - действительно копейки. Однако у меги все же 8 кб флеша, что позволяет без лишней головной боли использовать Си.У кошки четыре ноги: вход, выход, земля и питание.
73! UR3LTG.
-
01.06.2006, 16:54 #14
- Регистрация
- 29.01.2006
- Адрес
- Тамбов, Россия
- Возраст
- 69
- Сообщений
- 87
- Поблагодарили
- 13
- Поблагодарил
- 1
По поводу микросхем - в принципе согласен. У нас 57 и 68 руб соответсвенно.
Почти одно и то же. Но я пишу на ассемблере, мне памяти и в 2313 за глаза.
По поводу измерения:
При частоте 100 мгц длительность импульса = 0,00000001 сек
Время измерения = 0.1 сек
За это время вы успеете сосчитать своим счетчиком 0.1/0,00000001 = 10000000 импульсов.
Это и будет 100.000.00 = 100 мгц 000 кгц и 00 десятков герц +- 10 гц.
Для того, чтобы мерять с точностью до 1 гц период измерения должен быть 1 сек.
А когда требуется низкочастотный сигнал измерять с точностью до десятых и сотых долей герца, то чтобы не разгонять время измерения измеряют один период колебания и переводят потом его в частоту.
Это же элементарно, Ватсон. Так работает любой железный частотомер и
здесь нет никакой разницы.
По поводу переполнений ПИКа. Они возникают довольно редко и совершенно не обязательно скорее срываться и прибавлять к старшему байту единичку. Главное не пропустить его и успеть инкрементировать старший счетчик до следующего переполнения. Для этого даже и прерывания-то не используются.
Нужно просто поглядывать за битом переполнения и при его обнаружении инкрементировать программный байт счетчика. Это происходит редко, между делом я там успеваю еще и индикацию регенерировать.
Узкое место там только в одном случае, если переполнение возникло в момент выполнения команды по закрытию входного гейта. Но и это легко решается. Нужно просто после окончания времени измерения еще раз проверить переполнение.
Вобщем скучно мне на эту тему спорить. Это давно-давно пройденый этап.Александр Денисов - http://www.r3r.ru
-
01.06.2006, 17:29 #15
- Регистрация
- 15.07.2004
- Адрес
- Харьков
- Сообщений
- 89
- Поблагодарили
- 0
- Поблагодарил
- 0
Спасибо RA3RBE, я Вас понял.
За идею с проверкой переполнения без прерывания - отдельное спасибо. До этого я её нигде не встречал.
Насчет Си - до этого я тоже писал на ассемблере, но попробовал... и разбаловался. Лучше выложить лишние две гривны за кристалл и достаточно быстро написать легко модифицируемый код, чем вылизывать каждую процедуру. Да, это в чем то это "неправильный" подход. Но удобство...У кошки четыре ноги: вход, выход, земля и питание.
73! UR3LTG.
|
Социальные закладки