Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Измерение ширины импульса
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
dvs85
Все пытаюсь сделать программу для измерения ширины импульса. Мне посоветовали следующий алгоритм:

1. Настроить таймеры и компаратор

2. Включить прерывание по нарастающему фронту

3. По сработке прерывания запустить таймер

4. Переключить срабатывание прерывания по фронту

5. Сбросить флаг прерывания компаратора

6. Когда сработает прерывание по ниспадающему фронту - остановить таймер

Подскажите, это правильный алгоритм? Не могу понять также, как посчитать сам интервал таймером..
haker_fox
Цитата(dvs85 @ Jul 7 2008, 09:04) *
Все пытаюсь сделать программу для измерения ширины импульса. Мне посоветовали следующий алгоритм:

1. Настроить таймеры и компаратор

2. Включить прерывание по нарастающему фронту

3. По сработке прерывания запустить таймер

4. Переключить срабатывание прерывания по фронту

5. Сбросить флаг прерывания компаратора

6. Когда сработает прерывание по ниспадающему фронту - остановить таймер

Подскажите, это правильный алгоритм? Не могу понять также, как посчитать сам интервал таймером..

А какой формы сигнал: прмоугольник, пила, синус...?
Максимальная частота, амплитуда?
Если речь идет о компараторе, то, полагаю, что сигнал аналоговый. Тогда нужно копать в сторону захвата. Т.е. компаратор можно настроить так, чтобы он запускал/останавливал таймер. Таким образом измерение сведется к чтению регистров.
dvs85
Импульс - прямоугольный. Длительность любая, насколько хватит регистров. Амплитуда - 5 вольт. Частота очень небольшая - это тестовая программа, т.е. пускается одиночный импульс и измеряется его длительность.
dvs85
Можно ли сделать так к примеру: Компаратор включает таймер, тот начинает считать число переполнений, которые происходят примерно допустим в 0,1 секунду, и затем это число переполнений умножается на 0,1 секунды и выводится.. Это будет правильно?
Палыч
Цитата(dvs85 @ Jul 7 2008, 03:04) *
Подскажите, это правильный алгоритм? Не могу понять также, как посчитать сам интервал таймером..
Такой алгоритм имеет право быть. Только необходимо определиться с параметрами импульса и точностью измерений. Например, приведенный Вам алгоритм не сможет замерить длительность "очень коротких" импульсов - если импульс закончится до того, как программа выйдет из прерывания, инициирующего начало измерений.
Как считать интервал? Зависит от длительности и требуемой точности измерения. Например, можно измерять импульс по счетному регистру (зная, что каждая единица = Х мс или = Х мкс), можно считать ещё и переполнения таймера, расширяя программным путём счетный регистр таймера...
P.S. А, можно считать только переполнения таймера, если импульс очень длинный...
dvs85
Цитата
Например, можно измерять импульс по счетному регистру (зная, что каждая единица = Х мс или = Х мкс), можно считать ещё и переполнения таймера, расширяя программным путём счетный регистр таймера...


А можно об этом попобробнее?
Что значит
Цитата
каждая единица = Х мс
?
Палыч
Цитата(dvs85 @ Jul 7 2008, 08:27) *
А можно об этом попобробнее?
Ваш МК тактируется от некоторого источника, например, кварц 10МГц. Таймер Вы запускаете с пределителем равным 1, тогда каждая единица в счетном регистре 0,1 мкс
dvs85
Единица это имеется в виду тик таймера? То есть таймер тикнул, значение регистра изменилось на 1?

Цитата
можно считать ещё и переполнения таймера, расширяя программным путём счетный регистр таймера..

Каким образом происходит расширение счетного регистра?
Палыч
Значение счетного регистра изменяются в зависимости от режима работы таймера, частоты источника тактирования и пределителя.
dvs85
Цитата
Значение счетного регистра изменяются в зависимости от режима работы таймера, частоты источника тактирования и пределителя.


То есть если частота кварца 4000000, предделитель = 1, режим работы по сравнению с регистром сравнения. Что из этого получается?


Мне написали как расчитывать, только я никак понять не могу как это применить

Написано так

(24 бит * К) / 4 МГц

Может кто расшифрует, что это значит?
Палыч
Цитата(dvs85 @ Jul 7 2008, 08:40) *
Единица это имеется в виду тик таймера? То есть таймер тикнул, значение регистра изменилось на 1?
Что Вы понимаете под "тик таймера"? Обычно - это прерывание от таймера...
Цитата(dvs85 @ Jul 7 2008, 08:40) *
Каким образом происходит расширение счетного регистра?
Таймер имеет счетный регистр (8 бит или 16). Пусть, счетный регистр - 8 бит, тогда если подсчитывать число переполнений таймера в восьмибитном регистре (или ячейке памяти), мы расширяем программным путём его значение - оно становится 16-тибитным: старшие 8 бит -в ячейке памяти или регистре (число переполнений), младшие 8 бит - счетный регистр таймера. По-аналогии, подсчет в 16-тибитном слове числа переполнений таймера, имеющего 16-тибитный счетный регистр, расширяем счетный регистр до 32 бит.

Цитата(dvs85 @ Jul 7 2008, 08:50) *
То есть если частота кварца 4000000, предделитель = 1, режим работы по сравнению с регистром сравнения. Что из этого получается?
Это что за режим - не понимаю? Каждые 1/4000000=0.25 мкс к счетному регистру таймера будет прибавляться (вычитаться) единица. Дальнейшее поведение зависит от режима таймера: normal, PWM, fast PWM, CTC - и всё это в разновидностях...
dvs85
В общем, что нужно сделать чтобы посчитать короткие импульсы (я так понимаю, если будет возможность считать короткие импульсы, то будет и возможность считать и импульсы подлинее)?
А то я не совсем понял, что програмно нужно сделать..
Э
Цитата
то что за режим - не понимаю? Каждые 1/4000000=0.25 мкс к счетному регистру таймера будет прибавляться (вычитаться) единица. Дальнейшее поведение зависит от режима таймера: normal, PWM, fast PWM, CTC - и всё это в разновидностях...

Я пытался сделать в режиме сброса при совпадении
Палыч
Цитата(dvs85 @ Jul 7 2008, 09:16) *
В общем, что нужно сделать чтобы посчитать короткие импульсы (я так понимаю, если будет возможность считать короткие импульсы, то будет и возможность считать и импульсы подлинее)?
А то я не совсем понял, что програмно нужно сделать..
Вы, в начале, отпределитесь какие (по длительности) импульсы Вы хотите принимать и с какой точностью - это и будет определять: каким методом (алготитмом) длительность будет определяться...
dvs85
Длительность от мсек до минут.. точность - сотые мсек
Палыч
Цитата(dvs85 @ Jul 7 2008, 09:29) *
Длительность от мсек до минут.. точность - сотые мсек
У Вас - что? Устройство исключительно для определения длительности импульсов? Уж очень требования - широкие...
Тагда, наверное, так:

Таймер1, пределитель 1, normal (от 0 до FFFF). Ловить начало импульса на ICR1. Подсчитывать программно переполнения таймера. Ловить конец импульса на ICR1. По двум значениям регистра захвата и числу переполнений вычислять длительность.

P.S. Пределитель 1 - не догма, можно и 8 или 64 (может быть).
_Ivan_33
скачай книгу Шпак Ю А программирование на языке С микроконтроллеров PIC и AVR - для AVR там есть такой пример...


сам расскажу ... компаратор можно заблокировать ACSR=0x80;
дальше поставить счетчик в захват регист TCCR1B - там битом одним можно поставить по какому фронту будет проводится захват и в обработчике прерывания какой нибудь переменной задать значение регистра ICR и затем включить прерывание по переполнению счетчика там задать переменную которая будет при переполнении счетчика увеличиваться на 1 и затем след прерывание ставить как заблагорасудится (фронт или спад) и тоже другой переменной придать значение ICR и затем вычислить все
Палыч
Цитата(_Ivan_33 @ Jul 7 2008, 11:09) *
... компаратор можно заблокировать
Заблокировать то - можно... Но с компаратором удобно настроиться на амплитуду импульсов...
_Ivan_33
а поподробнее?
Палыч
Цитата(_Ivan_33 @ Jul 8 2008, 11:06) *
а поподробнее?
Это - вопрос ко мне? Если фронт/спад импульсов - сильно затянуты, компаратором удобно подстроиться под амплитуду, при которой считается, что импульс начался/закончился.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.