|
MegaAVR, Timer |
|
|
|
Feb 28 2007, 11:49
|
Группа: Новичок
Сообщений: 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.
|
|
|
|
|
 |
Ответов
|
Mar 2 2007, 03:32
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Mar 2 2007, 16:44
|

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, тогда и делить не надо будет, просто отбросите младший байт. Вот как-то так...
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Mar 2 2007, 17:57
|
Группа: Новичок
Сообщений: 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 пришел сигнал запутить счетчики.Чтобы не оказаться на середине импульса...или в конце...только, кажись просчет...этот цикл проблемы не решает...
Есть вариант и по внешнему прерыванию запускать, по нарастающему фронту...погрешность таже и характер изменения этой погрешности тоже случайный...
|
|
|
|
Сообщений в этой теме
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     =GM= Цитата(Duduka @ Mar 2 2007, 14:57) Знаете... Mar 2 2007, 18:48 SasaVitebsk Да... Лоханулся... Измерять N-периодов мне почему-... Mar 3 2007, 01:08
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|