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

 
 
> Измерение временных интервалов, с высокой точностью
AVR
сообщение Jun 2 2006, 17:03
Сообщение #1


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Здравствуйте!
Как можно измерить временные интервалы дительностью несколько секунд на AVRах с точностью до микросекунды? При том что кварц стоит на 1 МГц? Емкости таймера-счетчика 16 бит для такой задачи не хватает...


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Oct 9 2006, 13:35
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Забавно. На этой странице всех повело совсем не в ту степь, о которой тема. Это как дайте кому-нить палец, дак он и всю руку оттяпает. Сам AVR пропал куда-то чтобы разъяснить, но в его вопросе нет слов о стабильности кварцев, а значит этот критерий точности не рассматривается. Есть слова о проце AVR и о 16 битном таймере. Если обращать внимание на них, то ответ уже давно дан положительный. Причём в условиях задачи это получается максимально возможная точность устройства, ну как 10-битный АЦП, у которого реальная точность всегда поменьше 10 бит из-за разных причин. То же и здесь. В силу разного времени прихода фронтов на шкале 1 мкс запросто может возникнуть "ошибка" вплоть до 1 мкс, от которой в данной схеме никак не избавиться. А вот всякие разговоры о точности и стабильности кварцев только дискредитируют авторов и вообще на мой взгляд какое-то балоболство.

=GM=
Причём тут кратковременная нестабильность в 1Е-9..1Е-12, если долговременная будет в 10000 раз хуже? Автоподстройки здесь нет и кратковременная нестабильность не спасает. А вообще, точность кварца при изготовлении наверно 1Е-4 и все разговоры о температурной и прочей нестабильности - бред какой-то.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
=GM=
сообщение Oct 9 2006, 13:59
Сообщение #3


Ambidexter
*****

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



Цитата(singlskv @ Oct 7 2006, 09:37) *
Подправил немного код GetSmart и defunct
- добавил сохранение SREG в прерываниях
- добавил сброс флага TOV1 в TIFR если делали коррекцию

Код
.def  AL = R24
.def  Const0 = R8
.def  Const1 = R9
.def  _Sreg  = R10
....
    ldi   AL, 1
    mov   Const1, AL
    clr   Const0
...

; обработчик Input Capture:
TIM1_CAPT:
    in    _Sreg,SREG
    in    R4, ICR1L
    in    R5, ICR1H
    tst   R5
    brne  _do_not_correct_result
    in    AL, TIFR
    andi  AL, (1 << TOV1)
    breq  _do_not_correct_result
    out   TIFR, AL
    add   R2, Const1
    adc   R3, Const0
_do_not_correct_result:
    mov   R6, R2
    mov   R7, R3
    out   SREG,_Sreg
; <-- 32-х битный результат в четверке регистров R7-R6-R5-R4 (MSB R7)
    reti
    

; обработчик Timer Overflow:
TIM1_OVF:
    in    _Sreg,SREG
    add   R2, Const1; Инкрементировать старшие 16 бит 32-х битного счетчика
    adc   R3, Const0; учет переноса.
    out   SREG,_Sreg
    reti


Хочу немного покритиковать программу.

1) От возникновения прерывания захвата до команды "in AL,TIFR" может пройти от 12 до 15 МЦ, т.е. достаточно много времени, чтобы произошел перенос от переполнения, следовательно, возможна ошибка в определении времени.

2) Вполне возможно, что если прерывания TIM1_OVF и TIM1_CAPT возникли в течение указанного периода, то прерывание TIM1_OVF выполнится после TIM1_CAPT и ПОВТОРНО скорректирует результат в r3-r2 (не уверен на все 100, надо проверять).

3) Вход в прерывание TIM1_CAPT означает конец интервала измерения и наличие правильного времени в r5-r4 за исключением возможного последнего переноса. Но поскольку перенос из r5-r4 в r7-r6 возможен в одном единственном случае, когда содержимое r5-r4 переходит из состояния 0xFFFF в 0x0000, содержимое регистров r5-r4 надо проверять на 0.

В соответствии со сказанным ниже приведена исправленная программа обработки.
Код
.def       temp   =r16
.def       savreg  =r10

; обработчик Input Capture:
TIM1_CAPT: in     savreg,SREG
           in     R4,ICR1L    ;точные два младших
           in     R5,ICR1H    ;байта времени
           movw   r6,r2       ;два старших байта времени
           mov    temp,r4     ;с возможным переносом
           or     temp,r5     ;во время захвата
           brne   nocarry     ;не было переноса
           subi   r6,-1       ;учтем
           sbci   r7,-1       ;перенос
nocarry:   out    SREG,Sreg
           reti

; обработчик Timer Overflow:
TIM1_OVF:  in     savreg,SREG
           subi   r2,-1       ;
           sbci   r3,-1       ;
           out    SREG,savreg
           reti


Ну и последнее, в подобных случаях предпочитаю использовать конструкцию
Код
           subi   r2,-1       ;
           sbci   r3,-1       ;

Вместо эквивалентной
Код
           add    R2,сonst1   ;
           adc    R3,сonst0   ;

что очевидно лучше, поскольку освобождаются два регистра сonst0 и сonst1.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
singlskv
сообщение Oct 9 2006, 16:34
Сообщение #4


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(=GM= @ Oct 9 2006, 17:59) *
Хочу немного покритиковать программу.

1) От возникновения прерывания захвата до команды "in AL,TIFR" может пройти от 12 до 15 МЦ, т.е. достаточно много времени, чтобы произошел перенос от переполнения, следовательно, возможна ошибка в определении времени.

Вы не учли вот эту проверку:
Код
    in    R5, ICR1H
    tst   R5
    brne  _do_not_correct_result

которая происходит перед "in AL, TIFR"
Цитата
2) Вполне возможно, что если прерывания TIM1_OVF и TIM1_CAPT возникли в течение указанного периода, то прерывание TIM1_OVF выполнится после TIM1_CAPT и ПОВТОРНО скорректирует результат в r3-r2 (не уверен на все 100, надо проверять).

Вот это помагает избежать данной проблеммы:
Код
    out   TIFR, AL

Цитата
3) Вход в прерывание TIM1_CAPT означает конец интервала измерения ...

или начало ....
Ну например если мы хотим измерять длительность единичного импульса на входе.
Цитата
Ну и последнее, в подобных случаях предпочитаю использовать конструкцию
Код
           subi   r2,-1      ;
           sbci   r3,-1      ;

Вместо эквивалентной
Код
           add    R2,сonst1  ;
           adc    R3,сonst0  ;

что очевидно лучше, поскольку освобождаются два регистра сonst0 и сonst1.

subi на регистрах R0-R15 ?! ню...ню...
Go to the top of the page
 
+Quote Post
Леонид Иванович
сообщение Oct 9 2006, 20:15
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 318
Регистрация: 21-07-06
Из: Минск
Пользователь №: 18 986



Цитата
Ну и последнее, в подобных случаях предпочитаю использовать конструкцию
Код
           subi   r2,-1    ;
           sbci   r3,-1    ;


А не так, случайно:

Код
           subi   r16,low(-1)
           sbci   r17,high(-1)


Просто повезло, что в -1 младший и старший байты равны. но писать так не следует.

Сообщение отредактировал Леонид Иванович - Oct 9 2006, 20:16


--------------------
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- AVR   Измерение временных интервалов   Jun 2 2006, 17:03
- - WHALE   C точностью до микросекунды с кварцем на 1Мгц ника...   Jun 2 2006, 17:07
- - GetSmart   А инкрементировать ещё одни (старшие) 16 бит по пе...   Jun 2 2006, 17:10
|- - rezident   Цитата(GetSmart @ Jun 2 2006, 23:10) А ин...   Jun 2 2006, 17:20
|- - AVR   Цитата(GetSmart @ Jun 2 2006, 21:10) А ин...   Jun 2 2006, 17:24
- - GetSmart   ЦитатаC точностью до микросекунды с кварцем на 1Мг...   Jun 2 2006, 17:23
- - GetSmart   Чё-то я ослеп. Речь как раз об AVR. Берёте Мегу8, ...   Jun 2 2006, 17:43
|- - defunct   Цитата(GetSmart @ Jun 2 2006, 20:43) Чё-т...   Jun 2 2006, 19:26
- - GetSmart   ЦитатаНельзя выйти на точность в 1мкс в случае ког...   Jun 2 2006, 19:51
|- - defunct   Цитата(GetSmart @ Jun 2 2006, 22:51) Немн...   Jun 2 2006, 20:32
- - GetSmart   ЦитатаНу представьте захвачен ICR = 0. Что делать?...   Jun 2 2006, 20:54
|- - defunct   Цитата(GetSmart @ Jun 2 2006, 23:54) Цита...   Jun 2 2006, 20:57
|- - smk   Цитата(GetSmart @ Jun 2 2006, 23:54) Цита...   Oct 5 2006, 16:30
|- - defunct   Цитата(smk @ Oct 5 2006, 19:30) У меня си...   Oct 6 2006, 11:11
- - GetSmart   Надо только в прерывании захвата смотреть, если чи...   Jun 2 2006, 21:18
|- - defunct   Цитата(GetSmart @ Jun 3 2006, 00:18) Надо...   Jun 2 2006, 21:45
- - GetSmart   ЦитатаТам это учтено: Да, я это написал когда ещё ...   Jun 2 2006, 21:53
|- - defunct   Цитата(GetSmart @ Jun 3 2006, 00:53) Кста...   Jun 2 2006, 22:05
- - GetSmart   Вроде нормальный пример. Тока непонятно зачем R0 и...   Jun 2 2006, 23:02
|- - defunct   Цитата(GetSmart @ Jun 3 2006, 02:02) Хотя...   Jun 3 2006, 13:02
- - GetSmart   ???   Jun 3 2006, 05:22
- - Rst7   О чем вы, господа? Забыли, что внутри проца есть е...   Jun 3 2006, 06:28
- - GetSmart   О чём вы, господин? Задержка всегда постоянная. И ...   Jun 3 2006, 06:53
- - Rst7   Э, да, вспылил, был неправ   Jun 3 2006, 07:20
- - Валентиныч   А чем вызвано ограничение по кварцу - 1 МГц? (Или ...   Jun 3 2006, 14:17
- - GetSmart   defunct Ну ёкарный бабай... Ещё нужно заменить ...   Jun 3 2006, 17:16
|- - defunct   Цитата(GetSmart @ Jun 3 2006, 20:16) defu...   Jun 3 2006, 19:05
- - Sergiy   все хорошо ребята - мона конечно извращаться с АВР...   Jun 3 2006, 21:14
|- - smk   Цитата(Sergiy @ Jun 4 2006, 00:14) частот...   Oct 5 2006, 17:02
|- - SasaVitebsk   Цитата(Sergiy @ Jun 4 2006, 00:14) все хо...   Oct 5 2006, 23:37
|- - Stanislav   Цитата(SasaVitebsk @ Oct 6 2006, 03:37) Ц...   Oct 6 2006, 11:58
- - Sergiy   Да кстати в продолжение темы, а знаете зачем у ква...   Jun 3 2006, 21:29
- - king2   И вот все равно не понимаю я... Предположим, в эт...   Oct 5 2006, 01:30
- - CD_Eater   Не пойму, к чему эти обсуждения наилучшего кода, е...   Oct 5 2006, 17:56
- - khach   Как померять? Используя ГЛИН (генератор пилы) и вн...   Oct 5 2006, 19:49
- - =GM=   Ну вот, опоздал к началу обсуждения, как всегда, в...   Oct 6 2006, 16:22
|- - Stanislav   Цитата(=GM= @ Oct 6 2006, 20:22) Задача д...   Oct 9 2006, 10:46
|- - =GM=   Цитата(Stanislav @ Oct 9 2006, 09:46) Цит...   Oct 9 2006, 12:56
|- - Stanislav   Цитата(=GM= @ Oct 9 2006, 16:56) Поясните...   Oct 9 2006, 16:09
- - _artem_   =GM=, использование арифметических операций предпо...   Oct 6 2006, 17:17
|- - =GM=   Цитата(_artem_ @ Oct 6 2006, 16:17) =GM=,...   Oct 6 2006, 22:48
- - _artem_   Правильно говорите - я то невнимательно прочитал п...   Oct 7 2006, 00:10
- - singlskv   Подправил немного код GetSmart и defunct - добавил...   Oct 7 2006, 10:37
|- - =GM=   Цитата(Леонид Иванович @ Oct 9 2006, 19:1...   Oct 10 2006, 11:04
|- - singlskv   Цитата(=GM= @ Oct 10 2006, 15:04) Что оче...   Oct 10 2006, 11:19
|- - SasaVitebsk   Цитата(singlskv @ Oct 10 2006, 14:19) Цит...   Oct 10 2006, 13:25
|- - =GM=   Цитата(SasaVitebsk @ Oct 10 2006, 12:25) ...   Oct 10 2006, 14:36
|- - defunct   Цитата(SasaVitebsk @ Oct 10 2006, 16:25) ...   Oct 10 2006, 22:32
- - GetSmart   Цитата(=GM=)Код mov temp,r4 ;с возможным п...   Oct 9 2006, 15:22
|- - =GM=   Цитата(GetSmart @ Oct 9 2006, 14:22) Цита...   Oct 9 2006, 16:06
- - _artem_   Для микросекундной точности mожно скорректировать...   Oct 9 2006, 16:11
|- - Stanislav   Цитата(_artem_ @ Oct 9 2006, 20:11) Для м...   Oct 9 2006, 16:13
- - GetSmart   Цитата(=GM=)Ничего не понял, поясните. Здесь никак...   Oct 9 2006, 16:24
|- - =GM=   Цитата(GetSmart @ Oct 9 2006, 15:24) Цита...   Oct 10 2006, 10:43
|- - singlskv   Цитата(=GM= @ Oct 10 2006, 14:43) 3) Одна...   Oct 10 2006, 11:49
|- - =GM=   Чудак-человек, я согласен, что практически ваша пр...   Oct 10 2006, 12:51
|- - singlskv   Цитата(=GM= @ Oct 10 2006, 16:51) Пусть о...   Oct 10 2006, 13:23
- - GetSmart   Павезло так павезло   Oct 9 2006, 20:37
- - smk   По моему скромному мнению, мне очень понравилась и...   Oct 10 2006, 14:09
- - GetSmart   Ой-Ой-Ой. Ладно, господа. Я вас примирю. Использ...   Oct 10 2006, 14:14
- - GetSmart   Цитата(=GM=)Просто механически повторил ваш код, р...   Oct 10 2006, 14:33
- - singlskv   Еще подправил код: - заменил на одну константу Con...   Oct 10 2006, 16:20
|- - =GM=   Цитата(singlskv @ Oct 10 2006, 15:20) Еще...   Oct 10 2006, 17:15
|- - singlskv   Цитата(=GM= @ Oct 10 2006, 21:15) Мне каж...   Oct 10 2006, 17:52
||- - =GM=   Цитата(singlskv @ Oct 10 2006, 16:52) Цит...   Oct 11 2006, 11:10
||- - singlskv   Цитата(=GM= @ Oct 11 2006, 15:10) Ну раз ...   Oct 11 2006, 16:06
|- - singlskv   Цитата(=GM= @ Oct 10 2006, 21:15) Цитата(...   Oct 10 2006, 18:06
|- - =GM=   Цитата(singlskv @ Oct 10 2006, 17:06) Цит...   Oct 11 2006, 10:54
- - GetSmart   Цитата(singlskv)Код in R5, ICR1H mov R7, ConstF...   Oct 10 2006, 20:19
|- - singlskv   [quote name='GetSmart' date='Oct 11 20...   Oct 10 2006, 20:58
- - GetSmart   defunct Скучали тут без Вас А почему все думают,...   Oct 10 2006, 23:11
|- - defunct   Цитата(GetSmart @ Oct 11 2006, 02:01) А п...   Oct 10 2006, 23:14
- - GetSmart   Цитатакак "глюкодром" Класс! Не, ну...   Oct 10 2006, 23:34
|- - defunct   Цитата(GetSmart @ Oct 11 2006, 02:34) Не,...   Oct 10 2006, 23:57
- - GetSmart   Цитата(defunct)i - переход на длительный обработчи...   Oct 11 2006, 02:49
- - GetSmart   Цитата(=GM=)Автор топика намеревался измерять длит...   Oct 11 2006, 16:25
|- - AVR   Прошу прощения за оффтоп, но для самого автора тем...   Oct 11 2006, 17:25
||- - singlskv   Цитата(AVR @ Oct 11 2006, 21:25) Прошу пр...   Oct 11 2006, 17:30
||- - GetSmart   Цитата(AVR @ Oct 11 2006, 23:25) Прошу пр...   Oct 11 2006, 17:43
|- - =GM=   Цитата(singlskv @ Oct 11 2006, 15:06) Цит...   Oct 12 2006, 09:31
|- - defunct   Цитата(=GM= @ Oct 12 2006, 12:31) А недав...   Oct 15 2006, 02:25
|- - =GM=   Цитата(defunct @ Oct 15 2006, 01:25) Что ...   Oct 16 2006, 13:06
|- - defunct   Цитата(=GM= @ Oct 16 2006, 16:06) Я и не ...   Oct 18 2006, 11:44
|- - =GM=   Цитата(defunct @ Oct 18 2006, 10:44) Зате...   Oct 18 2006, 14:14
|- - defunct   Цитата(=GM= @ Oct 18 2006, 17:14) хотя ко...   Oct 18 2006, 16:04
|- - singlskv   Цитата(=GM= @ Oct 18 2006, 18:14) Но вот ...   Oct 18 2006, 20:07
|- - =GM=   Цитата(singlskv @ Oct 18 2006, 19:07) Цит...   Oct 19 2006, 15:21
- - CD_Eater   Цитата(defunct @ Oct 11 2006, 03:57) Цита...   Oct 11 2006, 17:59
- - singlskv   Цитата(defunct @ Oct 11 2006, 03:14) Цита...   Oct 11 2006, 20:51
- - GetSmart   Цитата(=GM=)GetSmart, хорош бурчать, это у вас так...   Oct 12 2006, 10:18
- - GetSmart   Цитата(=GM=)Как-то вы несистемно подходите к задач...   Oct 18 2006, 14:43
|- - =GM=   Цитата(GetSmart @ Oct 18 2006, 13:43) Цит...   Oct 19 2006, 14:55
- - GetSmart   defunct Любопытная вещь. Это я где-то уже видел и ...   Oct 18 2006, 17:17
- - singlskv   Цитата(=GM= @ Oct 19 2006, 18:55) Код.......   Oct 19 2006, 17:20
- - GetSmart   Цитата(=GM=)Похоже вам слово системщик, как быку к...   Oct 20 2006, 02:23
- - =GM=   GetSmart У вас же в последней проге слишком много ...   Oct 20 2006, 10:08
2 страниц V   1 2 >


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

 


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


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