Прошу совета

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Прошу совета

Сообщение doc626ge » 12 дек 2005, 02:55

Доброго времени суток! У меня возникла проблема - требуется измерить длительность импульса и его частоту. Использую Bascom-AVR, т.к. немного его знаю. Помогите уважаемые гуру!!! Заранее благодарю!
doc626ge
 
Сообщения: 7
Зарегистрирован: 12 дек 2005, 02:28

Сообщение North » 12 дек 2005, 12:20

Специально для измерения длительности импульса, частоты, а также для ведения лога временных событий используется Input Capture.
Аватара пользователя
North
 
Сообщения: 197
Зарегистрирован: 27 июл 2005, 14:12
Откуда: Дмитров, Москва
прог. языки: С, asm

Re: Прошу совета

Сообщение avr123.nm.ru » 12 дек 2005, 13:24

doc626ge писал(а):Доброго времени суток! У меня возникла проблема - требуется измерить длительность импульса и его частоту. Использую Bascom-AVR, т.к. немного его знаю. Помогите уважаемые гуру!!! Заранее благодарю!


ну вы хоть код какой нить приведите. Че менять то ? Где ?

а лучше на Си попробуй, это просто.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение 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:
doc626ge
 
Сообщения: 7
Зарегистрирован: 12 дек 2005, 02:28

Сообщение 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. Вот и всё.
Зная длину импульса и паузы можно определить скважность, время периода и как следствие частоту сигнала.
Аватара пользователя
North
 
Сообщения: 197
Зарегистрирован: 27 июл 2005, 14:12
Откуда: Дмитров, Москва
прог. языки: С, asm

Сообщение doc626ge » 14 дек 2005, 11:55

To North Огромное спасибо!  :)  Попробую! Использую Atmega8, нужно диапазон изм. частот 10 Гц-4кГц. Кстати, по-моему Bascom-Avr позволяет делать ассемблерные вставки. :)
doc626ge
 
Сообщения: 7
Зарегистрирован: 12 дек 2005, 02:28

Сообщение North » 14 дек 2005, 13:41

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

Сообщение doc626ge » 14 дек 2005, 14:58

to North Еще раз огромнейшее спасибо! :)  Такт. частота меги 8МГц. Уже начал читать книгу по асьме :D ! Но пока не очень понимаю... :oops:
doc626ge
 
Сообщения: 7
Зарегистрирован: 12 дек 2005, 02:28

Сообщение avr123.nm.ru » 14 дек 2005, 16:06

не советую забивать голову асмом, лучше Си - он много платформенный.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Сообщение doc626ge » 14 дек 2005, 16:36

Мне нужен только кусок кода что бы закончить устройство  :oops: . Изучение Си в планах. Спасибо!  :D
doc626ge
 
Сообщения: 7
Зарегистрирован: 12 дек 2005, 02:28

Сообщение North » 14 дек 2005, 17:14

Советую забить голову асмом. Лишним не будет. К тому же этот участок кода критичен ко времени. Конечно при верхнем пределе измеряемых частот в 4 кГц можно и на Си попробовать написать, но при более высоких частотах счёт идёт уже на отдельные такты процессора. У меня был случай, когда из-за добавления команды на асме в обработчике прерывания устройство переставало нормально работать. Так что это не шутки. На Си удобно реализовывать высокоуровневые вещи, например логику работы системы, сетап, мигание светодиодом и прочие вещи. Кроме того в этом случае о многоплатформенности говорить не приходится, ибо работа с Input Capture равно как и работа с любым другим периферийным устройством, будь то таймер или АЦП - это работа с регистрами, а они у разных контроллеров разные. Так что хоть Си хоть Бейсик хоть Паскаль одна фигня. Если же контроллеры близкие, то и Асм неплохо переносится.
Аватара пользователя
North
 
Сообщения: 197
Зарегистрирован: 27 июл 2005, 14:12
Откуда: Дмитров, Москва
прог. языки: С, asm

Сообщение doc626ge » 14 дек 2005, 18:26

Полностью согласен. Но я не очень понял: можно ли в Bascom-Avr вставить кусок кода на асьме? Нехочется всю программу (проверенную на железе, отлаженную - 6кБ) переделывать... :(
doc626ge
 
Сообщения: 7
Зарегистрирован: 12 дек 2005, 02:28


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5