Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Измерение периода AVR микронтроллером
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
lex_84
help.gif
Вопрос заключается в следующем. Необходимо измерить малый период с достаточно высокой точностью, используя микроконтроллер.
Просмотрев литературу на эту тему пришел к выводу, что лучше всего это было бы реализовать с помощью усреднения на некотором интервале времени.
Но к сожалению не нашел алгоритмов расчета среднего значения для микроконтроллеров. Все что удалось мне найти - это алгоритмы для микропроцессоров с ПЗ и ФЗ.
Кто-нибудь мог бы мне посоветовать какие-нибудь интернет-ссылки или литературу на эту тему???
domowoj
Цитата(lex_84 @ May 24 2008, 22:09) *
help.gif
Вопрос заключается в следующем. Необходимо измерить малый период с достаточно высокой точностью, используя микроконтроллер.

Малый период???
с достаточно высокой точностью???
Alhen
что такое ПЗ и ФЗ?
lex_84
Цитата(domowoj @ May 24 2008, 19:38) *
Малый период???
с достаточно высокой точностью???

Измеряемый период примерно составляет 400 нс и его желательно оцифровать 16 разрядным кодом. Время измерения должно составлять где-то 1-1.5 минуты 05.gif

ПЗ и ФЗ - вычисления с плавающей запятой и с фиксированной smile.gif
zltigo
Цитата(lex_84 @ May 24 2008, 17:55) *
Измеряемый период примерно составляет 400 нс и его желательно оцифровать 16 разрядным кодом.

О это волшебное заклинание "AVR!!!!". Не поможет - ну не действует оно всегда и везде. Не действует.
Moderator:
Тему перенес.
_Pasha
ПАДАЖДЫТЭ!
167 ГГц тактовой - это есть до фига.
И почему не частоту?
У Вас что, непериодический процесс?
Amper25
Вообще то поможет, только криво.

Можно померять интервал времени для 0x2000 измеряемых импульсов. 400нс - это всего лишь 2,5MHz.
Вообщем надо один из 16-битных счетчиков тактировать от внешнего измеряемого сигнала, а саму AVR запустить от 16MHz кварца.
Второй 16-бит таймер тактируем от 16MHz.

Теперь на счетчик 2,5MHz ставим прерывание по переполнению, и записываем в него (0xFFFF - 0x2000). сразу же обнуляем второй таймер.

В момент возникновения прерывания, значение в TIMER2 будет соответствовать количеству периодов 16MHZ, уместившихся в 0x2000 периодов 2,5MHZ измеряемого сигнала.


Только результат может быть неправидльным, тоестьокругленным, если 2,5MHz сигнал имеет джиттер.
zltigo
Цитата(Amper25 @ May 24 2008, 19:06) *
400нс - это всего лишь 2,5MHz.

А с 16бит разрешением это "всего лишь" в шестьдесят пять тысяч пятьсот трицать пять раз больше...
Сколько это будет в Гигагерцах?
lex_84
Цитата(zltigo @ May 24 2008, 21:36) *
А с 16бит разрешением это "всего лишь" в шестьдесят пять тысяч пятьсот трицать пять раз больше...
Сколько это будет в Гигагерцах?

Если я не ошибся в расчетах - 40

Цитата(zltigo @ May 24 2008, 20:07) *
О это волшебное заклинание "AVR!!!!". Не поможет - ну не действует оно всегда и везде. Не действует.
Moderator:
Тему перенес.

Я на форуме не давно. Но правила читал smile.gif Поэтому тему разместил в этом разделе, т.к. реализацию этого устройства желательно провести на AVR. У которых фиксированная архитектура и команды.

Цитата(Amper25 @ May 24 2008, 21:06) *
Вообще то поможет, только криво.

Можно померять интервал времени для 0x2000 измеряемых импульсов. 400нс - это всего лишь 2,5MHz.
Вообщем надо один из 16-битных счетчиков тактировать от внешнего измеряемого сигнала, а саму AVR запустить от 16MHz кварца.
Второй 16-бит таймер тактируем от 16MHz.

Теперь на счетчик 2,5MHz ставим прерывание по переполнению, и записываем в него (0xFFFF - 0x2000). сразу же обнуляем второй таймер.

В момент возникновения прерывания, значение в TIMER2 будет соответствовать количеству периодов 16MHZ, уместившихся в 0x2000 периодов 2,5MHZ измеряемого сигнала.
Только результат может быть неправидльным, тоестьокругленным, если 2,5MHz сигнал имеет джиттер.


Спасибо! Идея мне понравилась. Но это было бы слишком просто.
Просто я не правильно сформулировал задачу. Длительность импульса 400 нс, но частота следования 1 Гц. Вот в чем проблема.
Поэтому и нужно осреднение и статистическая обработка.

Цитата(zltigo @ May 24 2008, 20:07) *
О это волшебное заклинание "AVR!!!!". Не поможет - ну не действует оно всегда и везде. Не действует.
Moderator:
Тему перенес.

Хотя чувствую как бы не пришлось бы применять Пентиум-шментиум или 486 для измерения... 07.gif
defunct
Цитата(lex_84 @ May 24 2008, 21:03) *
Если я не ошибся в расчетах - 40
Ошиблись - 2.5mHz * 65535 = 163.8 ГГц нереальная частота.

Цитата
Просто я не правильно сформулировал задачу. Длительность импульса 400 нс, но частота следования 1 Гц. Вот в чем проблема.
Поэтому и нужно осреднение и статистическая обработка.
А можно поинтересоваться зачем измерять его длительность если Вы и так знаете что длительность == 400нс?

Цитата
Хотя чувствую как бы не пришлось бы применять Пентиум-шментиум или 486 для измерения...
не поможет.
вот простенькая, но резвая CPLD, была бы кстати.
svs39
Цитата(lex_84 @ May 24 2008, 21:08) *
Если я не ошибся в расчетах - 40
Я на форуме не давно. Но правила читал smile.gif Поэтому тему разместил в этом разделе, т.к. реализацию этого устройства желательно провести на AVR. У которых фиксированная архитектура и команды.
Спасибо! Идея мне понравилась. Но это было бы слишком просто.
Просто я не правильно сформулировал задачу. Длительность импульса 400 нс, но частота следования 1 Гц. Вот в чем проблема.
Поэтому и нужно осреднение и статистическая обработка.
Хотя чувствую как бы не пришлось бы применять Пентиум-шментиум или 486 для измерения... 07.gif


но в начале ж написано "малый период"!!! Представляю что написали бы в "телесистемах!
lex_84
Цитата(defunct @ May 24 2008, 22:09) *
Ошиблись - 2.5mHz * 65535 = 163.8 ГГц нереальная частота.
А можно поинтересоваться зачем измеряться его длительность если Вы и так знаете что длительность == 400нс?

не поможет.
вот простенькая, но резвая CPLD, была бы кстати.


Я не то число написал - это для 14 разрядов smile.gif

"оцифровать период"- я под этим подразумевал, что период сигнала меняется от 0 до 400 нс.

Насчет CPLD - хороший вариант, но я не знаю таких CPLD которые бы бегали под 163 ГГц smile.gif

Повторюсь, я ознакомился с теорией этой проблемы и мне представляется, что нужно либо реализовать на CPLD такое извращение, как нониусный метод, либо использовать стат. обработку.
Но примеров практической реализации подобных устройств я не нашел... 05.gif
И я думаю что стат обработку на МК реализовать проще, чем нониусный метод на ПЛИС.
_Ivan_33
использовать прерывания по фронту и спаду сигнала - нада форму импульса... и счетчик тама....
singlskv
Цитата(zltigo @ May 24 2008, 20:07) *
О это волшебное заклинание "AVR!!!!". Не поможет - ну не действует оно всегда и везде. Не действует.
Автору нужно было указать не AVR а ARM в качестве базовой платформы,
причем желательно LPC(NXP), тогда бы и отношение было более серьезным biggrin.gif biggrin.gif biggrin.gif

Ну а если по серьезному, ну вполне такая задачка, только 16бит для 1-1.5 минуты
выглядит не реалистично,
Цитата
Я не то число написал - это для 14 разрядов
но и после этой корекции все равно не реалистично
а вот это:
Цитата
Просто я не правильно сформулировал задачу. Длительность импульса 400 нс, но частота следования 1 Гц. Вот в чем проблема.

убивает всякие идеи на корню, за 1.5 минуты при частоте 1Гц будет всего 90 измерений,
получить из них 14бит не представляется возможным...
lex_84
Цитата(_Ivan_33 @ May 24 2008, 22:27) *
использовать прерывания по фронту и спаду сигнала - нада форму импульса... и счетчик тама....

А какая частота тактирования для микроконтроллера при этом будет не подскажете??? 07.gif

Вах! Для ПК найти алгоритм численных методов не составляет ни какого труда. Тот же самый Рунге Кут. А для микроконтроллеров полный завал sad.gif
Нашел книжку "Прикладные задачи микропроцессорных систем" Байкова, так она расчитана на МП и арифметику с ПЗ и ФЗ.
defunct
Цитата(lex_84 @ May 24 2008, 21:18) *
"оцифровать период"- я под этим подразумевал, что период сигнала меняется от 0 до 400 нс.

Тогда вам надо мерять мощность импульса.
Пропустить импульс через интегратор - затем мерять напряжение каким-нибудь не очень шустрым, но точным АЦП. Из мощности (при условии что импульс прямоугольный) легко расчитать длительность. При таком подходе AVRка с 1Mhz тактовой вполне справится.
lex_84
Цитата(singlskv @ May 24 2008, 22:35) *
Автору нужно было указать не AVR а ARM в качестве базовой платформы,
причем желательно LPC(NXP), тогда бы и отношение было более серьезным biggrin.gif biggrin.gif biggrin.gif

Ну а если по серьезному, ну вполне такая задачка, только 16бит для 1-1.5 минуты
выглядит не реалистично,
но и после этой корекции все равно не реалистично
а вот это:

убивает всякие идеи на корню, за 1.5 минуты при частоте 1Гц будет всего 90 измерений,
получить из них 14бит не представляется возможным...


Очень может быть что придется использовать ядро ARM smile.gif Изначально я и хотел использовать smile.gif Только хотелось бы подешевле smile.gif
Насчет 90 измерений. Это же приближенные значения.
Т.к. я еще не нашел подходящего алгоритма, то макс. время измерения точно не известно. Но хотелось бы по быстрее. smile.gif
На ПЛИС получалось 5 минут при 14 битах разрешения. Но там была очень сложная схема и пришлось от нее отказаться.

Цитата(defunct @ May 24 2008, 22:39) *
Может тогда лучше мощность импульса мерять?
пропустить импульс через LowPass фильтр (LC) - и мерять напряжение каким-нибудь не очень шустрым, но точным АЦП. Из мощности (при условии что импульс прямоугольный) легко расчитать длительность.

Идея довольно интересная. Мне такой принцип измерения нигде не встречалался раньше.
Я думаю, что при такой длитетельности и частоте АЦП будет измерять шумы, да и фильтр будет какой-то монстр наверно.
defunct
Цитата(lex_84 @ May 24 2008, 21:50) *
Я думаю, что при такой длитетельности и частоте АЦП будет измерять шумы, да и фильтр будет какой-то монстр наверно.

Да нет, все не так скверно как вы думаете.
импульс заряжает конденсатор - и одновременно дергает MK (за какой-нить INT). МК меряет напряжение на конденсаторе до тех пор пока оно не упадет практически до нуля. Считает мощность. Выводит рез-тат и спит до прихода сл. импульса.

Другим способом длительность в пределах 0..400нс будет гораздо проблемотичней измерить. Например как вы собирались определить импульсы длительностью в единицы нс?
lex_84
Цитата(defunct @ May 24 2008, 22:53) *
Да нет, на самом деле все довольно просто.
импульс заряжает конденсатор - и одновременно дергает MK (за какой-нить INT). МК меряет напряжение на конденсаторе до тех пор пока оно не упадет практически до нуля. Считает мощность. Выводит рез-тат и спит до прихода сл. импульса.


Любопытная идея.
Но пожалуста какой-нить пример примения, потому что измерения времени все-таки точнее, чем измерение мощности. Не понятно насколько реализуемо.
Какую погрешность будут вносить конденсатор (который далеко не идеальный) и АЦП???
singlskv
Цитата(lex_84 @ May 24 2008, 22:50) *
Очень может быть что придется использовать ядро ARM smile.gif Изначально я и хотел использовать smile.gif Только хотелось бы подешевле smile.gif
насчет АРМ это была шутка smile.gif
при том избытке времени(1сек) на каждое измерение вам подойдет любой мк,
а считать при этом можно хоть в ФЗ хоть в ПЗ
Цитата
Насчет 90 измерений. Это же приближенные значения.
А вот с этого момента по-подробнее, Вам что нужно, разрешающая способность в 16(14)бит
или точность в 16(14)бит ?
Цитата
На ПЛИС получалось 5 минут при 14 битах разрешения. Но там была очень сложная схема и пришлось от нее отказаться.

Ну на мк Вы быстрее и не получите, хотя если Вы уточните задачку то может чего-нить и
можно придумать...
defunct
Цитата(lex_84 @ May 24 2008, 21:57) *
Но пожалуста какой-нить пример примения, потому что измерения времени все-таки точнее, чем измерение мощности. Не понятно насколько реализуемо.

Не на таких времянках. единицы нс будет гораздо проблемней измерить, чем мощность, следовательно и точность измерения интервала будет хуже.
Пример применения можете посмотреть в appnote Analog-to-Digital Conversion Utilizing the
AT89CX051 Microcontrollers.

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

По идее мощность можно измерить и без АЦП - достаточно только компаратора.

Цитата
Какую погрешность будут вносить конденсатор (который далеко не идеальный) и АЦП???

Уж точно меньше чем МК который будет пытаться синхронными узлами измерить сигнал, превосходящий его частоту тактирования.
lex_84
Цитата(singlskv @ May 24 2008, 22:58) *
насчет АРМ это была шутка smile.gif
при том избытке времени(1сек) на каждое измерение вам подойдет любой мк,
а считать при этом можно хоть в ФЗ хоть в ПЗ
А вот с этого момента по-подробнее, Вам что нужно, разрешающая способность в 16(14)бит
или точность в 16(14)бит ?

Ну на мк Вы быстрее и не получите, хотя если Вы уточните задачку то может чего-нить и
можно придумать...


Не совсем шутка smile.gif Все-таки я пытаюсь сейчас реализовать схему ПЛИС+МК. Была надежда что с помощью ARM удастся обойтись без ПЛИС, но не получилось.

ФЗ и ПЗ?! Что это за МК которые считают десятичные числа и имеют в составе команд команду DIV??? Это уж какой то слишком хитрый алгоритм получается 07.gif

Если уточнить требования к системе. 14-16 бит разрешающей способности. Хотелось бы чтобы младшие биты были адекватны измеряемому периоду.
Макс. значение периода 400 нс, а мининимальное, если снова не наврал smile.gif 24 пс (для 14 бит)



Цитата(defunct @ May 24 2008, 23:07) *
Не на таких времянках. единицы нс будет гораздо проблемней измерить, чем мощность, следовательно и точность измерения интервала будет хуже.
Пример применения можете посмотреть в appnote Analog-to-Digital Conversion Utilizing the
AT89CX051 Microcontrollers.

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

По идее мощность можно измерить и без АЦП - достаточно только компаратора.
Уж точно меньше чем МК который будет пытаться синхронными узлами измерить сигнал, превосходящий его частоту тактирования.

Да в этом что то есть. Но требует всестороннего исследования.
Это получается аналоговая интерполяции вместо цифровой.
Спасибо за идею.
singlskv
Цитата(lex_84 @ May 24 2008, 23:13) *
ФЗ и ПЗ?! Что это за МК которые считают десятичные числа и имеют в составе команд команду DIV??? Это уж какой то слишком хитрый алгоритм получается 07.gif
А для вас что принципиально что команда деления будет выполняться не
1 такт а 1000 ? учитывая что у Вас между делениями как минимум 1сек ?
Цитата
Если уточнить требования к системе. 14-16 бит разрешающей способности. Хотелось бы чтобы младшие биты были адекватны измеряемому периоду.
Макс. значение периода 400 нс, а мининимальное, если снова не наврал smile.gif 24 пс (для 14 бит)
ну тогда для 14бит это просто фикция и никакие
Цитата
Все-таки я пытаюсь сейчас реализовать схему ПЛИС+МК. Была надежда что с помощью ARM удастся обойтись без ПЛИС, но не получилось.
ПЛИС Вам здесь не помогут, на нескольких сотнях измерений такое не получить.
lex_84
Цитата(singlskv @ May 24 2008, 23:29) *
А для вас что принципиально что команда деления будет выполняться не
1 такт а 1000 ? учитывая что у Вас между делениями как минимум 1сек ?
ну тогда для 14бит это просто фикция и никакие
ПЛИС Вам здесь не помогут, на нескольких сотнях измерений такое не получить.

Кстати подобные устройства существуют и без ПЛИС smile.gif на одних МК, но к сожалению открытых программ для них я не встречал.
singlskv
Цитата(lex_84 @ May 24 2008, 23:34) *
Кстати подобные устройства существуют и без ПЛИС smile.gif на одних МК, но к сожалению открытых программ для них я не встречал.
Ага, и при удлиннении импульса на 24 пс они точно показывают ровно на 1 отсчет больше smile.gif
И все это на нескольких сотнях измерений ... smile.gif
Ню-ню... удачи...
Леонид Иванович
Задача очень непростая. Делал на AVR + ПЛИС измерение интервалов с точностью 100 пс. Не могу сказать, что всё хорошо получилось. Довольно много проблем. Использовал принцип аналоговой растяжки импульса и преобразования растянутого интервала в код с помощью счетчика на ПЛИС. Перед каждым измерением аналоговый интерполятор калибровался с помощью сигнала образцовой длительности.
singlskv
Цитата(Леонид Иванович @ May 25 2008, 00:38) *
Задача очень непростая. Делал на AVR + ПЛИС измерение интервалов с точностью 100 пс. Не могу сказать, что всё хорошо получилось. Довольно много проблем. Использовал принцип аналоговой растяжки импульса и преобразования растянутого интервала в код с помощью счетчика на ПЛИС. Перед каждым измерением аналоговый интерполятор калибровался с помощью сигнала образцовой длительности.
Интересно, раcтяжка импульса была чисто аналоговой или цифровые(читай статистические)
методы тоже применялись ?
lex_84
Цитата(Леонид Иванович @ May 25 2008, 00:38) *
Задача очень непростая. Делал на AVR + ПЛИС измерение интервалов с точностью 100 пс. Не могу сказать, что всё хорошо получилось. Довольно много проблем. Использовал принцип аналоговой растяжки импульса и преобразования растянутого интервала в код с помощью счетчика на ПЛИС. Перед каждым измерением аналоговый интерполятор калибровался с помощью сигнала образцовой длительности.


Согласен с вами, что задача сложная.
В принципе, если не использовать конверторы "время-код" в интегральном исполнении, то остается только вариант с предварительным аналоговым преобразованием.
Либо производить растяжку импульса, либо преобразовать длительность импульса в амплитуду напряжения, в ток или заряд конденсатора. Но любое решение получается схематически довольно сложным.
Интересно было бы посмотреть на подобные схемы smile.gif
Любопытно у кого-нибудь получалось реализовать на ПЛИС какие нибудь экзотические методы, типа нониусного и т.п???
=GM=
Цитата(lex_84 @ May 24 2008, 20:58) *
Интересно было бы посмотреть на подобные схемы

Посмотрите в сторону ТС500А, может помочь.
domowoj
lex_84

А интересно зачем это нужно ? И зачем такая точность?(если не секрет)

А любое преобразование в аналог и обратно влечет за собой увелич. погрешности.
lex_84
Цитата(domowoj @ May 25 2008, 06:11) *
lex_84

А интересно зачем это нужно ? И зачем такая точность?(если не секрет)

А любое преобразование в аналог и обратно влечет за собой увелич. погрешности.


http://electronix.ru/forum/index.php?showtopic=48005

Типа того
XVR
Цитата(lex_84 @ May 25 2008, 01:58) *
Согласен с вами, что задача сложная.
В принципе, если не использовать конверторы "время-код" в интегральном исполнении, то остается только вариант с предварительным аналоговым преобразованием.
Либо производить растяжку импульса, либо преобразовать длительность импульса в амплитуду напряжения, в ток или заряд конденсатора. Но любое решение получается схематически довольно сложным.
Интересно было бы посмотреть на подобные схемы smile.gif
Читал (очень давно) в журнале 'Приборы и техника эксперимента' очень интересный способ решения данной задачи (без CPLD и даже без MCU). Длинна импулься считалась обычным образом (на счетчиках), хвост импульса, не уместившийся в период тактовой частоты, скармливался отдельной схеме досчета. Схема состояла из 2х линий задержек (на кусках коаксиального кабеля). Задержки были больше периода тактовой частоты (из 1й части), и слегка отличались (на единицу измерения). Импульс подавался на вход обеих линий задержки, выходы их объединялись по логическому и, и снова заводились на вход обоих линий задержки. На выходе, после лог. и, получался задержанный и укороченный на разницу времен задержек импульс, который снова отправлялся по кольцу. Схема считала количество оборотов импульса по кользу из ЛЗ.

В некоторых FPGA есть встроенные настраиваемые цифровые ЛЗ (в Spartan III например)
Леонид Иванович
Аналоговая. Интегратор, на время импульса включаем большой зарядный ток, затем включаем маленький разрядный. Измеряем длительность процесса разряда.


Если Вы про синхронизируемый с GPS генератор, то в такой задаче точность измерения интервала ни к чему. Сигнал 1PPS имеет большой джиттер, точность может достигаться только путем длительного накопления (до 24 часов).
lex_84
Цитата(Леонид Иванович @ May 26 2008, 11:52) *
Аналоговая. Интегратор, на время импульса включаем большой зарядный ток, затем включаем маленький разрядный. Измеряем длительность процесса разряда.
Если Вы про синхронизируемый с GPS генератор, то в такой задаче точность измерения интервала ни к чему. Сигнал 1PPS имеет большой джиттер, точность может достигаться только путем длительного накопления (до 24 часов).



Но ведь задачи бывают разные smile.gif
Вообще я не совсем правильно понял ТЗ. Точность такая требуются (для подстройки частоты VCXO), но время измерения может варьироваться в широком диапазоне (с длительным накоплением).
И вся сложность заключается в разработке алгоритма управления для VCXO. А измеритель получается довольно простым.
Спасибо всем кто откликнулся! beer.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.