|
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.
|
|
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 19)
|
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, 16:46
|
Группа: Новичок
Сообщений: 12
Регистрация: 28-02-07
Пользователь №: 25 758

|
Цитата(SasaVitebsk @ Feb 28 2007, 23:48)  Цитата(Duduka @ Feb 28 2007, 12:49)  А вопрос в следующем...пытаюсь измерить период с точностью до 0,1 мкс. Для этого задействована пара счетчиков (вариантов уже накопилось множество, поэтому прикладываю самый простой на, мой взгляд). Измеряемый диапазон частот 600 Гц-2,5 кГц
Давайте переведём 600 Гц - период 1666.7мкс (411Ah единиц с шагом 0.1мкс) 2.5кГц - 400.0 (FA0h единиц с шагом 0.1мкс) Таким образом вам необходимо посчитать импульсы частотой 1/0.1мкс = 10МГц и для этого достаточно 16-ти битного таймера. Из приведенного видно что на частоте 7372800 вы не получите данную точность без внешних элементов. Необходимо применить кварц с частотой не менее 10МГц. Если мы применим кварц 10 МГц, то необходимо следующее. 1) Настроить выход меги в режиме генерации CLK. 2) Применить 1533ли1 к примеру (Если мерим длит. положительного импульса). Если надо определять что мерить полож или отриц, то незначительно сложнее не всё поместится на одной ЛА3 или 74hc00. 3) Измеряемый сигнал подать на 1 ногу а заполнение на вторую. С выхода (третья нога) на вход захвата шеснадцатибитного таймера (например IC1A). 4) Также измеряемый сигнал подаём на вход INT0 к примеру. 5) Настраиваем прерывание от INT0 на прерывание по перепаду в 0. 6) Настраиваем таймер один канал а на захват. Алгоритм измерения следующий. По прерыванию от Int0 (конец полож импульса измеряемого сигнала - измерение закончилось) мы читаем значение ICR1A, что и является значением периода измеренного сигнала (можно выводить). И сбрасываем значение ICR1A таймера (начинаем новый отсчёт) Программу вашу не читал. Пока без надобности. Необходимо что бы вы сами поняли что хотите сделать и внятно смогли другим объяснить. Да... упустил одну деталь которую сам же и писал... На частоте 10MHz ваша однокристалка не сосчитает импульсы 10MHz. По этому изменения следующие (тоже писал в предыдущем посте). Между выходом мелкосхемы и счётным входом однокристалки необходимо поставить доп счётчик. К примеру ИЕ7 а его выходы (4 штуки) на свободные входы однокристалки. При чтении необходимо читать ICR1A (старшие 16 разрядов) и входы счётчика (младшие 4). В остальном нет отличий. Очень интересное предложение!Но на мой взгляд имея в своем распоряжении мегу 128, с 4-мя встроенными таймерами обвешиваться таким к-ом микросхем ....абсурдно... Что касается частоты тактовой 10...16 Мгц и оганизации временных ворот используя один период измеряемого сигнала (извиняюсь, не описала при постановке вопроса), то к сожалению в данном случае в моем распоряжении микросхема ATmega128L, с пониженным энергопотреблением (один из критериев выбора оной микросхемы), которая может тактироваться 8 МГц (мах); так же является необходимым измерять именно по 100 периодам, одного мало, т.к. данный сигнал в реальности будет идти не с генератора, а с датчика. Необходимо усреднение для точности измерений. Если говорить об аппаратной реализации, используя входы захвата счетчиков (идея описана в седьмом сообщении)это проблемы не решает...имеем ту же самую погрешность в 0,2 мкс...которая меняется в зависимости от к-ва выполняемых инструкций между запуском и остановкой счетчиков!
|
|
|
|
|
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 пришел сигнал запутить счетчики.Чтобы не оказаться на середине импульса...или в конце...только, кажись просчет...этот цикл проблемы не решает...
Есть вариант и по внешнему прерыванию запускать, по нарастающему фронту...погрешность таже и характер изменения этой погрешности тоже случайный...
|
|
|
|
|
Mar 2 2007, 18:48
|

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> было чётным, также важен их порядок, ну и за их вложенностью тоже следите. Угловые скобки, естественно, надо заменить на квадратные.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|