реклама на сайте
подробности

 
 
> MegaAVR, Timer
Duduka
сообщение Feb 28 2007, 11:49
Сообщение #1





Группа: Новичок
Сообщений: 12
Регистрация: 28-02-07
Пользователь №: 25 758



[font=Times New Roman][size=4]
Привет, всем посетителям форума!
Возникла проблема с мегой 128...Может кто-нибудь из специалистов обратит внимание и разъяснит неопытному пользователю в чем проблема?

А вопрос в следующем...пытаюсь измерить период с точностью до 0,1 мкс. Для этого задействована пара счетчиков (вариантов уже накопилось множество, поэтому прикладываю самый простой на, мой взгляд). Измеряемый диапазон частот 600 Гц-2,5 кГц

Используется два таймера:
-Т/С0-генерирует 102, 4 кГц, при каждом совпадении счетного регистра осуществляется инкремент регистров-результата;
-Т/С2-считает импульсы с датчика-для обеспечения заданной точности 100*Т .
Как только досчитали до 100 останавливаем , обнуляем таймеры и передаем по ком порту на комп.
Мегу тактирую 7,3728 МГц (реально 7,3724 МГц)

Проблема в том, что откудо-то берется погрешность: при такой конфигурации программы 0, 2 мкс на всех измеряемых частотах...Но если расширить возможности программы и передавать на комп после различных преобразований, то результирующее число заметно искажается причем чем меньше измеряемая частота, тем больше прогрешность. Т.е. фактически, если между остановкой и новым запуском счетчиков вставить цикл (инкремент регистров), то в зависимости от к-ва выполняемых операций, меняется результат в результирующих регистрах счетчиков. Не ясно почему?

Работаю с STK500/501, AVR Studio 4.12 и самодельным Jtag ICE.
В качестве сигнала с датчика использую кварц STK500.
Прикрепленные файлы
Прикрепленный файл  mega128.rar ( 1.74 килобайт ) Кол-во скачиваний: 100
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Mar 2 2007, 00:02
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Согласен с обоими. Конечно любой разработчик при заказе 0.1 уменьшит для надёжности. Писал на скорую руку перед рыбалкой. Хотя быть может это уже с запасом.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 2 2007, 02:30
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Поскольку входной сигнал асинхронен по отношению к системной частоте, погрешность измеряемого периода может достигать плюс-минус одного клока. При клоке=10 Мгц это будет плюс-минус 0.1 мкс.

Так что измерения с точностью 0.1 мкс (фактически +-0.05 мкс) можно достичь только с частотой заполнения 20 МГц.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 2 2007, 03:32
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(=GM= @ Mar 2 2007, 03:30) *
Поскольку входной сигнал асинхронен по отношению к системной частоте, погрешность измеряемого периода может достигать плюс-минус одного клока. При клоке=10 Мгц это будет плюс-минус 0.1 мкс.

Так что измерения с точностью 0.1 мкс (фактически +-0.05 мкс) можно достичь только с частотой заполнения 20 МГц.


Я понимаю о чём вы пишете.

Да действительно. Можно конечно пробовать уменьшить данную ошибку программно. Хотя это будет громоздко.

Тем не менее в неинтелектуальных частотомерах обычно используется заполнение удобное для счёта. Наверное они вводят инструментальную погрешность в 2 единицы заполнения.

Как выход здесь можно использовать внешний генератор меток на 20Мгц. С одним счётчиком достаточно использовать мегу на 7372800
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 2 2007, 16:44
Сообщение #5


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(SasaVitebsk @ Mar 2 2007, 00:32) *
Цитата(=GM= @ Mar 2 2007, 03:30) *

Поскольку входной сигнал асинхронен по отношению к системной частоте, погрешность измеряемого периода может достигать плюс-минус одного клока. При клоке=10 Мгц это будет плюс-минус 0.1 мкс.

Так что измерения с точностью 0.1 мкс (фактически +-0.05 мкс) можно достичь только с частотой заполнения 20 МГц.

Я понимаю о чём вы пишете.
Да действительно. Можно конечно пробовать уменьшить данную ошибку программно. Хотя это будет громоздко.
Тем не менее в неинтелектуальных частотомерах обычно используется заполнение удобное для счёта. Наверное они вводят инструментальную погрешность в 2 единицы заполнения.
Как выход здесь можно использовать внешний генератор меток на 20Мгц. С одним счётчиком достаточно использовать мегу на 7372800

Выше я говорил об измерении ОДНОГО периода измеряемой частоты. А вот если мерять целое количество периодов, скажем за период порядка секунды, будет совсем другая картина.

Оценим погрешность. Измерение целого числа М периодов входного сигнала Тх с точностью +- один клок будет равно N периодам клока To=1/Fclk, т.е.

Tx*M+-То = N*To,

отсюда Tx=To*(N+-1)/M==To*N/M+-To/M. Последнее слагаемое определяет ошибку.

Для входной частоты 600 Гц и периода наблюдения в 1 с ошибка определения периода входной частоты будет +-(1е-6/7.3724)/600=+-0.226 нс.

Как видим погрешность существенно ниже требуемой, так что можно уменьшить время наблюдения.
Оценка даёт минимальное время наблюдения порядка 5 мс.

To Duduka Для измерения частот нужен только микроконтроллер, никаких дополнительных элементов. Меряете длительность целого числа периодов входной частоты, потом делите её на число периодов, получаете искомый период входной частоты с известной точностью.

Вполне возможно, что в вашей программе достаточно изменить сравнение переменной count3 не с 2, а с числом 100..200, проверьте, я особо не вникал. Ну и деление придётся добавить, а лучше сравнивать с числом 128 или даже 256, тогда и делить не надо будет, просто отбросите младший байт. Вот как-то так...


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Duduka
сообщение Mar 2 2007, 17:57
Сообщение #6





Группа: Новичок
Сообщений: 12
Регистрация: 28-02-07
Пользователь №: 25 758



[quote name='=GM=' date='Mar 2 2007, 16:44' post='218520']
[quote name='SasaVitebsk' post='218217' date='Mar 2 2007, 00:32']
[quote name='=GM=' post='218210' date='Mar 2 2007, 03:30']

Вполне возможно, что в вашей программе достаточно изменить сравнение переменной count3 не с 2, а с числом 100..200, проверьте, я особо не вникал. Ну и деление придётся добавить, а лучше сравнивать с числом 128 или даже 256, тогда и делить не надо будет, просто отбросите младший байт. Вот как-то так...
[/quote]

wait_signal:



sbis pind,T2 ;ждем сигнал с датчика
rjmp wait_signal

inc count3
cpi count3,0x02
brne wait_signal

out SFIOR,zero ; для запуска счетчиков

Знаете GM, содержимое регистра count3, сравниваю с 2 для того, что бы лучше синхронизировать работу счетчиков, т.е. на самом деле мне хотелось, чтобы в тот момент, когда на ножку Т2 пришел сигнал запутить счетчики.Чтобы не оказаться на середине импульса...или в конце...только, кажись просчет...этот цикл проблемы не решает...

Есть вариант и по внешнему прерыванию запускать, по нарастающему фронту...погрешность таже и характер изменения этой погрешности тоже случайный...
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 2 2007, 18:48
Сообщение #7


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(Duduka @ Mar 2 2007, 14:57) *
Знаете GM, содержимое регистра count3, сравниваю с 2 для того, что бы лучше синхронизировать работу счетчиков, т.е. на самом деле мне хотелось, чтобы в тот момент, когда на ножку Т2 пришел сигнал запутить счетчики.Чтобы не оказаться на середине импульса...или в конце...только, кажись просчет...этот цикл проблемы не решает...

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

Сделайте простую программу без прерываний по следующему алгоритму.

1) Проверить, что уровень входного сигнала нулевой. Если нет, то подождать.

2) Дождаться перехода входного сигнала из 0 в 1. Запустить таймер. Обнулить счётчик периодов M.

3) Дождаться перехода входного сигнала из 1 в 0.

4) Дождаться перехода входного сигнала из 0 в 1. Инкрементировать счётчик периодов M.

5) Если количество периодов равно заданному, остановить таймер. Если нет, перейти к п. 3.

6) Взять значение таймера N и вычислить период по формуле Tx=To*N/M.

Пусть количество периодов М=100. Даже, если у вас будет ошибка в 40 клоков в определении периода входной частоты, что само по себе маловероятно, это надо хорошо постараться, на си скажем писать, или под какой-нибудь микроосью программу запускать, так вот, даже тогда погрешность будет в диапазоне +-0.05 мкс, что вам и требуется. Кстати, таймер можно пустить по прерываниям, ну и добавить пару старших байт к таймеру, а то не хватит ему ёмкости...

Ну вот вам программа минимум(:-).

Потом, когда освоите процесс, переходите на аппаратные средства, которые есть в аврках, icr, например. Потом поймёте, что и таймер не надо включать и выключать, а просто вычитать из нового значения старое значение и запоминать новое на месте старого.

По оформлению постов, чтобы было более читабельно. Старайтесь, чтобы количество тегов <quote> и </quote> было чётным, также важен их порядок, ну и за их вложенностью тоже следите. Угловые скобки, естественно, надо заменить на квадратные.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Duduka   MegaAVR   Feb 28 2007, 11:49
- - IgorKossak   Цитата(Duduka @ Feb 28 2007, 10:49) Испол...   Feb 28 2007, 11:55
|- - Duduka   [font=Times New Roman][size=4] А прикрепленный фа...   Feb 28 2007, 13:11
- - IgorKossak   1. Прерывание OC2addr_int: не содержит инструкции ...   Feb 28 2007, 13:42
|- - Duduka   Цитата(IgorKossak @ Feb 28 2007, 13:42) 1...   Feb 28 2007, 17:15
|- - IgorKossak   Цитата(Duduka @ Feb 28 2007, 16:15) По по...   Feb 28 2007, 18:17
|- - Duduka   Да, вы правы, ненчего лишний раз дергать вывод... ...   Feb 28 2007, 19:21
- - SasaVitebsk   Прерывания ни когда не дадут точный временной инте...   Feb 28 2007, 14:17
|- - Duduka   Цитата(SasaVitebsk @ Feb 28 2007, 14:17) ...   Feb 28 2007, 18:03
- - SasaVitebsk   Цитата(Duduka @ Feb 28 2007, 12:49) А воп...   Feb 28 2007, 23:48
|- - Duduka   Цитата(SasaVitebsk @ Feb 28 2007, 23:48) ...   Mar 2 2007, 16:46
- - bodja74   Саша ,у таймера есть прерывание по захвату,так что...   Mar 1 2007, 00:59
- - IgorKossak   Действительно, варианта с Input Capture было бы вп...   Mar 1 2007, 10:55
- - SasaVitebsk   Да... Лоханулся... Измерять N-периодов мне почему-...   Mar 3 2007, 01:08


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 22:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01428 секунд с 7
ELECTRONIX ©2004-2016