Технический форум по робототехнике.
doc626ge » 12 дек 2005, 02:55
Доброго времени суток! У меня возникла проблема - требуется измерить длительность импульса и его частоту. Использую Bascom-AVR, т.к. немного его знаю. Помогите уважаемые гуру!!! Заранее благодарю!
North » 12 дек 2005, 12:20
Специально для измерения длительности импульса, частоты, а также для ведения лога временных событий используется Input Capture.
avr123.nm.ru » 12 дек 2005, 13:24
doc626ge писал(а):Доброго времени суток! У меня возникла проблема - требуется измерить длительность импульса и его частоту. Использую Bascom-AVR, т.к. немного его знаю. Помогите уважаемые гуру!!! Заранее благодарю!
ну вы хоть код какой нить приведите. Че менять то ? Где ?
а лучше на Си попробуй, это просто.
doc626ge » 13 дек 2005, 14:16
Спасибо, но на Си пока не могу. А измерение длительности и частоты импульса - это часть программы, которая уже написана.... Пробовал Input Capture - но выдает непонятно что. Также пробовал Pulsein w, pind, 3, 0 - длительность измеряется, а частоту как? Через таймеры и прерывания тоже никак, т.к. по фронту прерывание происходит, частота считается, но как поймать спад импульса для измерения длительности ума не приложу....

Или чего то не понимаю?... Пробовал вот так:
Dim RPM As Word
Enable Timer1
Enable Interrupts
Config Timer1=Counter, edge = Rising 'No Prescale
On timer1 11 ' изм. импульс на вход Т1
Do
' Display your results to LCD or something...
Loop
11:
Incr RPM
?
Return
И так
Dim W As Word
.
.
.
Do
Pulsein W, Pind, 3, 0 ' изм. с 0 -- 1
Loop
end
Т.о. получается измерять либо длительность, либо частоту...

А нужно и длит. и частоту..
Подскажите люди добрые! :oops:
North » 13 дек 2005, 16:49
Если частота высокая то и Си не поможет. Измерение частоты и длительности импульса (что по сути одно и тоже) - очень критичная ко времени процедура. Поэтому этот кусок кода лучше писать на асме. Выглядеть это всё должно примерно так (для меги8):
1. Запускаешь таймер1
2. разрешаешь Input Capture, устанавливаешь положительный фронт срабатывания (регистр TCCR1B бит ICES=1).
3. ждёшь прерывания Input Capture.Когда оно свершится в обработчике как можно раньше обнуляешь таймер 1. С этого момента таймер начинает отсчитывать ширину импульса. Меняешь положительный фронт срабатывания на отрицательный чтобы поймать окончание импульса (бит ICES=0).
4. снова ждёшь прерывания Input Capture (в принципе конечно не ждёшь ничего, проц основную программу крутит, прерывание само придёт). В обработчике прерывания вычитываешь регистры ICR1L и ICR1H (именно в этом порядке, это важно!), что есть младшая и старшая части регистра Input Capture, который содержит значение таймера в момент окончания импульса. Всё, теперь ты знаешь длину импульса. Снова меняешь фронт срабатывания (собсно меняешь его каждый раз независимо не от чего). Можешь обнулить таймер, в этом случае следующее прерывание покажет частоту паузы между импульсами, тогда длина периода будет равна длине импульса + длина паузы, а можешь и не обнулять и следующее прерывание покажет длину всего периода, тогда длина паузы будет равна длине периода минус длина импульса.
5. повторяешь пункты 3 и 4. Вот и всё.
Зная длину импульса и паузы можно определить скважность, время периода и как следствие частоту сигнала.
doc626ge » 14 дек 2005, 11:55
To
North Огромное спасибо! :) Попробую! Использую Atmega8, нужно диапазон изм. частот 10 Гц-4кГц. Кстати, по-моему Bascom-Avr позволяет делать ассемблерные вставки.

North » 14 дек 2005, 13:41
Я говорил как раз про восьмую Мегу, просто вместо восьмёрки с закрывающей скобкой подставился смайлик. Кстати, тут у тебя наметилась ещё одна проблема: при очень низкой частоте входного сигнала (при длинном периоде) таймер будет переполняться. Например при частоте процессора 6 МГц получаем 6000000/65536=91,55 Гц - максимальная длина периода, которую можно измерить. Обходится это следующим образом: Разрешаешь прерывание по переполнению таймера и обнуляешь счётчик переполнений. При возникновении этого прерывания в обработчике увеличиваешь счётчик. Для вышеприведённого примера это будет означать, что длина периода как минимум больше чем 1/91,55=0,011 сек. Когда произойдёт прерывание Input Capture (в случае измерения длительности периода - по положительному фронту, измерения импульса - по отрицательному) нужно взять значене регистра ICR (Input Capture Register) и прибавить к нему 65536 столько раз, сколько насчитал счётчик переполнений. Получится длина периода в тиках процессора, которые можно перевести в секунды или в другие требуемые единицы. Вроде всё.
doc626ge » 14 дек 2005, 14:58
to
North Еще раз огромнейшее спасибо!

Такт. частота меги 8МГц. Уже начал читать книгу по асьме

! Но пока не очень понимаю...

avr123.nm.ru » 14 дек 2005, 16:06
не советую забивать голову асмом, лучше Си - он много платформенный.
doc626ge » 14 дек 2005, 16:36
Мне нужен только кусок кода что бы закончить устройство :oops: . Изучение Си в планах. Спасибо! :D
North » 14 дек 2005, 17:14
Советую забить голову асмом. Лишним не будет. К тому же этот участок кода критичен ко времени. Конечно при верхнем пределе измеряемых частот в 4 кГц можно и на Си попробовать написать, но при более высоких частотах счёт идёт уже на отдельные такты процессора. У меня был случай, когда из-за добавления команды на асме в обработчике прерывания устройство переставало нормально работать. Так что это не шутки. На Си удобно реализовывать высокоуровневые вещи, например логику работы системы, сетап, мигание светодиодом и прочие вещи. Кроме того в этом случае о многоплатформенности говорить не приходится, ибо работа с Input Capture равно как и работа с любым другим периферийным устройством, будь то таймер или АЦП - это работа с регистрами, а они у разных контроллеров разные. Так что хоть Си хоть Бейсик хоть Паскаль одна фигня. Если же контроллеры близкие, то и Асм неплохо переносится.
doc626ge » 14 дек 2005, 18:26
Полностью согласен. Но я не очень понял: можно ли в Bascom-Avr вставить кусок кода на асьме? Нехочется всю программу (проверенную на железе, отлаженную - 6кБ) переделывать...
