|
|
  |
Измерение временных интервалов, с высокой точностью |
|
|
|
Oct 24 2006, 11:03
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(=GM=) Ну голубчик defunct, ну подумайте сами. Да, захват происходит (и должен происходить!) в один и тот же момент времени для обоих таймеров, но СОДЕРЖИМОЕ таймеров различается, поскольку на оба таймера подается один и тот же сигнал, но первый таймер инкрементируется на переходах 0-1, а второй будет инкрементироваться на переходах 1-0. Ну а раз содержимое различается, захват это должен показать! А вот я не догоняю. Наверно мы с defunct оба не догоняем. Если сигнал меняется один раз, то будет только один переход 1-0 (либо 0-1) и сработает только один таймер. второй не изменится. Если второй не изменится, значит точности он не добавит к обычной 1-микросекундной. Что дальше? Где собака зарыта?
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 24 2006, 12:34
|

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

|
Цитата(GetSmart @ Oct 24 2006, 10:03)  А вот я не догоняю. Наверно мы с defunct оба не догоняем. Если сигнал меняется один раз, то будет только один переход 1-0 (либо 0-1) и сработает только один таймер. второй не изменится. Если второй не изменится, значит точности он не добавит к обычной 1-микросекундной. Что дальше? Где собака зарыта? Ну давайте догонять вместе(:-). Забудьте на время об атмеге. Обсудим идею. У вас есть два 16-битных таймера, на которые подан меандр заполнения частотой 1 МГц. Если оба таймера настроены на перепад 0-1, то таймеры будут инкрементироваться фронтами данного меандра синхронно, согласны? Пойдем дальше, настроим второй таймер на перепад 1-0, что мы увидим? Мы увидим, что содержимое первого таймера будет обновляться, скажем, в периоды 100.0, 101.0, 102.0 и т.д., а содержимое второго таймера будет обновляться в периоды 100.5, 101.5, 102.5 и т.д., поскольку они реагируют на фронты и спады одного и того же меандра, согласны? Теперь представьте себе, что у вас есть спецустройство, позволяющее считывать одновременно показания обоих счетчиков. Скажем, устройство сработало в момент времени 101.1. Время таймера1 будет 101, а таймера2 - 100. Если устройство сработало в момент времени 101.7, то время таймера1 будет 101, и таймера2 - 101, согласны? Т.е. два числа 101/100 говорят о том, что захват произошел в первой половине меандра, 101/101 - во второй. Ну или еще проще, младший бит содержимого второго таймера показывает первую (1) или вторую (0) половину меандра. Обратите внимание, таймеры/счетчики срабатывают от разных перепадов сигнала заполнения, а схемы захвата - от одного типа перепада исследуемого сигнала. Теперь перенесите все рассуждения на МК, с учетом его дискретного времени. Спецустройство легко сделать на МК, у которого есть два устройства захвата. Надо только подать на них один и тот же исследуемый сигнал.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 24 2006, 16:10
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(=GM= @ Oct 24 2006, 14:13)  Да, захват происходит (и должен происходить!) в один и тот же момент времени для обоих таймеров, но СОДЕРЖИМОЕ таймеров различается, поскольку на оба таймера подается один и тот же сигнал, но первый таймер инкрементируется на переходах 0-1, а второй будет инкрементироваться на переходах 1-0. Ну а раз содержимое различается, захват это должен показать! =GM=Вы просто не понимаете как происходит инкремент таймера и захват. 1. захват на таймерах происходит в один и тот же момент времени такта 2. инкремент таймеров происходит тоже в один и тот же момент вне зависимости от того что мы ловим фронт или спад. Когда ловим фронт мк просто сравнивает текущее значение со значением полученным в прошлом такте и если было 0 а стало 1 то происходит захват, со спадом аналогично.
|
|
|
|
|
Oct 24 2006, 16:32
|

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

|
singlskv Вы просто не понимаете как происходит инкремент таймера и захват. 1. захват на таймерах происходит в один и тот же момент времени такта 2. инкремент таймеров происходит тоже в один и тот же момент вне зависимости от того что мы ловим фронт или спад. Когда ловим фронт мк просто сравнивает текущее значение со значением полученным в прошлом такте и если было 0 а стало 1 то происходит захват, со спадом аналогично.
Да понимаю я все прекрасно. Вы описываете все для таймеров, а я собирался их использовать как счетчики, с внешним входом.
Похоже по технике все сказано, по-моему пора прикрывать ветку. С вашего позволения,
ТЕМА ИСЧЕРПАНА, ЗАКРЫТА, ПОД СУКНО ПОЛОЖЕНА(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 24 2006, 17:11
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(=GM= @ Oct 24 2006, 20:32)  singlskv Вы просто не понимаете как происходит инкремент таймера и захват. 1. захват на таймерах происходит в один и тот же момент времени такта 2. инкремент таймеров происходит тоже в один и тот же момент вне зависимости от того что мы ловим фронт или спад. Когда ловим фронт мк просто сравнивает текущее значение со значением полученным в прошлом такте и если было 0 а стало 1 то происходит захват, со спадом аналогично.
Да понимаю я все прекрасно. Вы описываете все для таймеров, а я собирался их использовать как счетчики, с внешним входом. Ну тогда прочитайте вот это из datasheet: If external pin modes are used for the Timer/Countern, transitions on the Tn pin will clock the counter even if the pin is configured as an output. This feature allows software control of the counting.и попробуйте понять, что это означает что инкремент счетчика таймера происходит не в момент когда произошел переход из 0->1 или 1->0 а в какой-то четко определенный момент такта во второй его половине. Почему во второй ? А потому что задержка вывода на пин 1,5 такта. Так что желаю Вам удачной ловли по пол такта, как поймаете, телеграфируйте нам, отметим
|
|
|
|
|
May 24 2010, 04:36
|
Частый гость
 
Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558

|
Приветствую, друзья. Кто может рассказать тупо на пальцах как мне посчитать периоды импульсов на авр 2313 с кварцем 8 мгц? А то сил уже нет никаких. Надо считать 100 периодов частоты в диапазоне от 1 до 4 кгц. Я раньше делал через INT0. В этом прерывании запускал таймер 1, отсчитывал 100 прерываний,останавливал таймер, помещал и сдвигал влево на 16 дополнительный виртуальный регистр таймера1 OverfLow, прибавлял текущий таймер1, вычитал ошибку и выводил на ЖКИ. Т.е. с первого прерывания Т1 запускался и крутился до конца измерений, до сотого прерывания, не забывая при переполнении в другом прерывании инкриминировать дополнительный виртуальный регистр OverfLow. Всё в принципе нормально работало, но показания немного плавали. Потом на телесистемах какой то аквариум сказал что интервалы надо мерить через захват, а через INT никто не мерит, потому что точности не будет. ВОт тут то я и уселся. ВОбщем делаю так: после нажатия кнопки измерения, очищаю все переменные, запускаю таймер1, разрешаю прерывания по захвату и ухожу на паузу 0,2мс (на всякий случай). В обработчике прерываний по захвату очищаю таймер1, отсчитываю 101 прерывание. Первое пропускаю, со второго прибавляю каждый раз в переменную. В 101-м очищаю счетчик прерываний, прибавляю захват в переменную, запрещаю прерывание по захвату. После окончания паузы вывожу результат на ЖК. Виртуальный регистр и прерывание по переполнению Т1 вообще не использую, т.к. максимальный интервал 8000 укладывается в таймер1. Флаги тоже никакие не трогаю. Так вот при таком подходе показания вообще скачат чуть ли не на треть. Что делаю неправильно? Коды уж пока не привожу, они уже перелопачены раз 100. Спасибо.
|
|
|
|
|
May 27 2010, 14:21
|
Частый гость
 
Группа: Участник
Сообщений: 148
Регистрация: 27-04-06
Пользователь №: 16 558

|
Хм, однако не всё так радужно оказалось. Я измеряю частоту 1 кгц за время около 250 мс, у меня получается число 3008756. Оно плавает от 3004... до 3010.... что как то кривовато. Так ведь не должно быть!? Посмотрите плз код, скорее я где то в коде накосячил или с флагами запутался. Прерываний других нет. Кварц на 12 мгц. Мне хотя бы разрешение 1 мкс надо. Все вычисления округления потом, сначала надо стабильного числа добиться. Спасибо. Код void FMeasure (void) { unsigned int Cnt;
ClkCount = 0; // очистить результат измерения периодов ImpulsCount = 0; // очистить счетчик прерываний TCNT1 = 0; // очистить таймер1 Cnt = 0; // очистить счетчик TimerStart; // запустить таймер1 TIMSK |= (1 << ICIE1); // Разрешено прерывание по захвату while(Cnt<300) // цикл 0,25 с кварц 12 мгц { Cnt++; pausa(1000); // 0,25 с } TimerStop; // остановить таймер1 TIMSK &= ~(1 << ICIE1); // запретить прерывание по захвату ................................ LCD_Goto(0x42); // вывод на ЖКИ bin_bcd(ClkCount); ................................ ................................
#pragma vector=TIMER1_CAPT_vect // Прерывание по захвату __interrupt void zachvat (void) { if(!(TIFR && ICF1)) // проверяем флаг захвата { static unsigned int OldClkCount; // unsigned int NewClkCount; // if (++ImpulsCount == 1) // если счетчик прерываний инкриминировался первый раз OldClkCount = ICR1; // сохранение первого захваченного значения else { NewClkCount = ICR1; // новое захваченное значение ClkCount +=(NewClkCount-OldClkCount); // OldClkCount = NewClkCount; // } } TIFR |= (1 << ICF1); // очистить флаг захвата }
Сообщение отредактировал Коляй - May 27 2010, 14:23
|
|
|
|
|
May 28 2010, 04:34
|
Частый гость
 
Группа: Свой
Сообщений: 127
Регистрация: 4-04-07
Из: Ижевск
Пользователь №: 26 773

|
Здравствуйте. Вы, ИМХО, не учитываете предисторию. Ведь входной сигнал во время обработки результата может устанавливать флаг ICF, который при входе в программу измерения не чистится. Сделал бы так -запретил работу таймера, очистил его, все счетчики -разрешил, при остановленном! таймере прерывания по захвату и переполнению -очистка флагов и глобальное разрешение прерываний * ждем -пришел захват, запускается таймер -проверяется 46 переполнений таймера(~250мсек), если период измерения не закончен-на *, иначе чтение содержимого ICR, запрет счета таймера, прерываний и выход
|
|
|
|
|
May 29 2010, 02:21
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(Коляй @ May 29 2010, 04:00)  ... После всех вычислений (измерение и суммирование 255 импульсов с периодом 1мс с последующим делением на 255) получается 4-х значное число с ошибкой единица. Вроде хорошо теперь. Вместо деления на 255 будет быстрее суммировать 256 значений и отбрасывать младший байт результата summa>>8
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|