Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 15 из 18
  1. #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 секунда.
    Всем спасибо!


  2. #2
    Мастер
    Регистрация
    30.04.2002
    Адрес
    Липецк, Россия
    Возраст
    51
    Сообщений
    935
    Записей в дневнике
    16
    Поблагодарили
    61
    Поблагодарил
    4
    Вообще-то, никаких команд во время подсчета импульсов никогда не применяют --- если они будут --- действительно пойдет неточность.
    Есть таймер , есть прескалер --- вот их и задействуют --- их суммарной разрядности хватает для данной задачи --- связаны они аппаратно --- никаких команд для переноса импульсов не требуется.
    Команды возникают , когда нужно прочесть значение, накопленное в прескалере , которое программно, к сожалению, недоступно (в отличие от значения таймера).
    Но это уже происходит вне "временных ворот" и, поэтому, это не должно влиять на точность --- это уже обработка полученных данных.

  3. #3
    Начинающий
    Регистрация
    05.12.2005
    Адрес
    Волжский, Волгоградская обл.
    Возраст
    65
    Сообщений
    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 такт на команду. Отчасти поэтому я на них давно переключился

  4. #4
    Мастер
    Регистрация
    30.04.2002
    Адрес
    Липецк, Россия
    Возраст
    51
    Сообщений
    935
    Записей в дневнике
    16
    Поблагодарили
    61
    Поблагодарил
    4
    Цитата Сообщение от rz4an
    Ну во первых простым подсчетом импульсов 40 мГц PICом
    измерить ИМХО не получится.
    Получится, поскольку у PIC есть высокоскоростной предделитель, коий работает до 60 Мгц (по паспорту , вроде бы до 40 Мгц, но на практике гораздо выше) и не зависит от тактовой частоты и программы --- а уже с него подается на счетчик.
    Которому тоже не требуется никаких команд от программы , кроме сброса и запуска.
    Читаем значения прескалера и счетчика, обрабатыванм математически и получаем частоту. Это , конечно , весьма схематично
    Очень подробно и доступно алгоритм частотомера изложен здесь:
    http://ikarab.narod.ru/Kea_20.html в разделе №17

    Удачи!
    RU3GA

  5. #5
    Начинающий
    Регистрация
    15.07.2004
    Адрес
    Харьков
    Сообщений
    89
    Поблагодарили
    0
    Поблагодарил
    0
    АЛЕ

    А может быть лучше на AVR?
    Например, приблизительно так, как показано в приложенном рисунке.
    CD74AC161 тянут до 100 МГц. При времени счета 0,1 сек. получается точность 1 Гц (используется 16-ти битный таймер). Готов поделиться исходником калиброванной задержки на 0,1 сек (выверена до такта ).
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	ChastotomerV4.GIF 
Просмотров:	1901 
Размер:	31.3 Кб 
ID:	2248  

  6. #6
    Коротковолновик
    Регистрация
    06.09.2002
    Адрес
    Екатеринбург
    Возраст
    56
    Сообщений
    246
    Поблагодарили
    7
    Поблагодарил
    49
    http://www.r3r.ru/
    Здесь есть частотомер на PIC.

  7. #7
    Начинающий
    Регистрация
    25.09.2003
    Адрес
    Москва
    Сообщений
    69
    Поблагодарили
    16
    Поблагодарил
    5
    Уважаемый RU3GA спасибо за Ваш ответ.

    Есть таймер , есть прескалер --- вот их и задействуют --- их суммарной разрядности хватает для данной задачи --- связаны они аппаратно --- никаких команд для переноса импульсов не требуется.
    Вот только понять не могу, каким образом в прескалер + таймер общей емкостью FFFF
    можно поместить число 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!

  8. #8
    Начинающий Аватар для RA3RBE
    Регистрация
    29.01.2006
    Адрес
    Тамбов, Россия
    Возраст
    65
    Сообщений
    87
    Поблагодарили
    13
    Поблагодарил
    1
    Цитата Сообщение от АЛЕ
    Вот только понять не могу, каким образом в прескалер + таймер общей емкостью FFFF
    можно поместить число 2625A00h,это 40000000 за 1 сек.( 40мГц ).Может я чего не
    понимаю ? Если не трудно поделитесь опытом.Желательно своим.
    Делюсь своим опытом.
    Там все просто как 3 рубля.
    На самом деле там не 2 байта, а 3. Хотя может быть и больше, просто мне для времени измерения 0.1 сек хватило и 3-х.
    Программа следит за переполнением таймера и эти переполнения суммирует в третьем байте. Количество команд строго подсчитано и время их выполнения входит в время измерения.
    Все это было сделано еще в 1999 году, и с тех пор лежит в интернете. Как правильно дал ссылочку UA9CCI , на сайте http://www.r3r.ru, а точнее на http://ra3rbe.r3r.ru

  9. #9
    Мастер
    Регистрация
    30.04.2002
    Адрес
    Липецк, Россия
    Возраст
    51
    Сообщений
    935
    Записей в дневнике
    16
    Поблагодарили
    61
    Поблагодарил
    4
    Цитата Сообщение от АЛЕ
    Если не трудно поделитесь опытом.Желательно своим.
    Александр , RA3RBE, чуть выше уже все рассказал по этому поводу --- добавить нечего...
    Просто вся беда в том , что мало кто выкладывает в инете "исходники", по которым можно полностью понять логику работы и тонкости реализации...
    "Базовый вариант" в этом плане --- это сайт OM3CPH (именно радиолюбительские разработки).
    А в русскоязычном инете на память приходит только публикации RW4LED (цифровая шкала на LCD) и EU1CC (синтезатор PIC16F877+DDS AD9851) --- вот там исходники в наличии --- при желании можно разобраться и поменять то , что не нравится (например, применить другой LCD ) или просто посмотреть как пишется "рабочий" код --- просто в качестве изучения.

    P.S. А на счет невозможности реализации Вашей задачи на PIC16F628 --- это Вы зря пришли к такому выводу

  10. #10
    Начинающий Аватар для RA3RBE
    Регистрация
    29.01.2006
    Адрес
    Тамбов, Россия
    Возраст
    65
    Сообщений
    87
    Поблагодарили
    13
    Поблагодарил
    1
    Цитата Сообщение от RU3GA
    Просто вся беда в том , что мало кто выкладывает в инете "исходники", по которым можно полностью понять логику работы и тонкости реализации...
    Выложить исходники не жалко, они у меня сначала и лежали на сайте вместе с оттранслированным НЕХ файлом. Думал интересно будет кому-то посмотреть, а вышло, что почти все норовили самостоятельно оттранслировать АСМ файл, никому невдомек было посмотреть, что пишет транслятор, что к АСМ файлу должен прилагаться файл с макросами, тоже выложенный на сайте. И задолбали меня письмами, что программа с ошибками, выдает 52 ошибки, вышлите рабочую. Объяснял я, объяснял, а потом убрал АСМ файл, оставил НЕХ, для тех, кто хочет собрать шкалу этого достаточно, а у кого есть вопросы - напишут мне.

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

  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 и вывод на ЖКИ).
    Зачем расшибать голову если кто то это уже сделал до вас?
    Сразу не кидаю потому что все это добро лежит дома.

    Честно вам скажу, программа не была дописана, а сам девайс лежит в полусобранном состоянии (острая надобность пока отпала).

  12. #12
    Начинающий Аватар для RA3RBE
    Регистрация
    29.01.2006
    Адрес
    Тамбов, Россия
    Возраст
    65
    Сообщений
    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 значений ПЧ и еще выходы для цифровой подстройки частоты ГПД.

  13. #13
    Начинающий
    Регистрация
    15.07.2004
    Адрес
    Харьков
    Сообщений
    89
    Поблагодарили
    0
    Поблагодарил
    0
    Уважаемый RA3RBE, наверное я чего то не понимаю. Пожалуйста, объясните мне, с какой радости точность будет 10 Гц? Какая разница, за какой период времени мы считаем импульсы?

    Теперь насчет ПИК-а: там переполнения счетчиков есть? Насколько я понимаю, есть. А в какой момент происходят прерываиня по переполнению? Во время выполения какой команды? А за сколько тактов выполняется эта команда? Простите за банальность, но пока текущая команда не завершится, прерывания не будет.
    Следовательно, мы имеем плавающую задержку от одного до до семи тактов генератора. И что же это за измеритель получается?

    Далее, насчет копеек: ATtiny2313 у нас на базаре стоит 6,5 грн (1,27 у.е.), а ATmega8 стоит 8,5 грн (1,66 у.е.). Разница - действительно копейки. Однако у меги все же 8 кб флеша, что позволяет без лишней головной боли использовать Си.

  14. #14
    Начинающий Аватар для RA3RBE
    Регистрация
    29.01.2006
    Адрес
    Тамбов, Россия
    Возраст
    65
    Сообщений
    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 сек.
    А когда требуется низкочастотный сигнал измерять с точностью до десятых и сотых долей герца, то чтобы не разгонять время измерения измеряют один период колебания и переводят потом его в частоту.

    Это же элементарно, Ватсон. Так работает любой железный частотомер и
    здесь нет никакой разницы.

    По поводу переполнений ПИКа. Они возникают довольно редко и совершенно не обязательно скорее срываться и прибавлять к старшему байту единичку. Главное не пропустить его и успеть инкрементировать старший счетчик до следующего переполнения. Для этого даже и прерывания-то не используются.

    Нужно просто поглядывать за битом переполнения и при его обнаружении инкрементировать программный байт счетчика. Это происходит редко, между делом я там успеваю еще и индикацию регенерировать.

    Узкое место там только в одном случае, если переполнение возникло в момент выполнения команды по закрытию входного гейта. Но и это легко решается. Нужно просто после окончания времени измерения еще раз проверить переполнение.

    Вобщем скучно мне на эту тему спорить. Это давно-давно пройденый этап.

  15. #15
    Начинающий
    Регистрация
    15.07.2004
    Адрес
    Харьков
    Сообщений
    89
    Поблагодарили
    0
    Поблагодарил
    0
    Спасибо RA3RBE, я Вас понял.
    За идею с проверкой переполнения без прерывания - отдельное спасибо. До этого я её нигде не встречал.

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

Похожие темы

  1. Частотомер
    от roma_ar в разделе Приборы и измерения
    Ответов: 0
    Последнее сообщение: 01.12.2005, 12:49
  2. Частотомер на AT90S1200
    от wwwbeehive в разделе Микропроцессорная техника
    Ответов: 0
    Последнее сообщение: 24.07.2005, 17:21
  3. RA3AO, частотомер
    от RV3ARL в разделе КВ: RA3AO
    Ответов: 8
    Последнее сообщение: 09.12.2002, 10:00
  4. Частотомер на PIC16F84
    от ew6ba в разделе Радиолюбительские технологии
    Ответов: 3
    Последнее сообщение: 08.12.2002, 12:10

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Похоже, что вы используете блокировщик рекламы :(
Форум QRZ.RU существует только за счет рекламы, поэтому мы были бы Вам благодарны если Вы внесете сайт в список исключений!
как отключить
×
Рейтинг@Mail.ru
eXTReMe Tracker
Яндекс.Метрика