roboforum.ru

Технический форум по робототехнике.

Способы измерения длительности импульса.

Способы измерения длительности импульса.

NorthStar » 28 сен 2010, 22:01

Добрый день!
Прошу подсказать. Мне нужно измерить длительность импульса на микроконтроллере PIC16F877 (подключить к аксселерометру). К сожалению оба порта PWM/компаратор заняты. Порт прерывания - свободен, но он только один, а у аксселерометра 2 выхода на 2 оси.
Подскажите способ измерить длинну импульса, используя обычные порты контроллера? Например прерывание по таймеру.

Re: Способы измерения длительности импульса.

Radist » 28 сен 2010, 22:14

Элементарно, Ватсон (с)

Ждем фронта импульса, включаем таймер, ждем спада импульса, выключаем таймер. Нужно быть уверенным, что таймер не переполнится, иначе считать число переполнений таймера. Чем меньше предделитель - тем выше точность счета.

Re: Способы измерения длительности импульса.

avr123.nm.ru » 28 сен 2010, 22:27

Возможно входы модуля захвата сравнения свободны? Тогда их надо использовать. Русская документация по микроконтроллерам PIC есть на страничке http://proavr.narod.ru/09.htm в ней есть примеры кода для разных задач.

Re: Способы измерения длительности импульса.

NorthStar » 29 сен 2010, 18:33

1.Входы модуля захвата у меня заняты. Мне на ROBPICA надо подключить, а там прямо на плате к этим выводам драйвер моторов подключен.
2. Наверное попробую - ждать единицу и по ней таймер запускать. Но получится, что контроллер ничем другим уже не сможет заниматься. Видимо нужен еще один контроллер.

Re: Способы измерения длительности импульса.

Radist » 29 сен 2010, 22:13

Если есть вход внешнего прерывания - вешаем это дело на него. Проц может заниматься своими делами. А вообще обычно сперва распределяют ноги и ресурсы проца по задачам, а не наоборот.

Re: Способы измерения длительности импульса.

avr123.nm.ru » 29 сен 2010, 23:08

NorthStar писал(а):2. Наверное попробую - ждать единицу и по ней таймер запускать. Но получится, что контроллер ничем другим уже не сможет заниматься. Видимо нужен еще один контроллер.


У вас схема как на http://RoboPica.Narod.Ru ? Или какие то модификации сделаны ?

Re: Способы измерения длительности импульса.

NorthStar » 04 окт 2010, 18:50

Ну у меня на последовательном порту Bluetooth модуль а на прерывании пульт ДУ.
Пульт можно снять, но мне-то для подключения аксселерометра 2 входа нужно, одним прерыванием много не сделаешь.

Re: Способы измерения длительности импульса.

HarryStar » 26 ноя 2010, 09:33

Новую тему не стал открывать, т.к. мне нужно то же самое почти.
Нужно измерить длительность импульсов от 900 до 2100 мкс примерно (стандартные сигналы управления сервами и другими подобными устройствами, в т.ч. аклелерометрами).
Внешние прерывания свободны (3 шт), но 3 канала маловато, хотелось бы 8. Обычные порты тоже свободны.
Вопросов собственно 2.
1) Если использовать внешние прерывания (по на 3 канала), то насколько будет нагружен мк? Он из прерываний вылезать не будет почти. Прерывания будут происходить 2(подъем и спад сигнала)*50(период импульсов)*3(канала) = 300 раз в секунду примерно. Это конечно не очень много, но боюсь на основную работу времени останется мало. мк атмега32-16
2) Хотелось бы использовать 1 внешнее прерывание, а 8 каналов подать на какой-то порт. Чтоб прерывание происходило при изменении уровня любого из 8-им каналов. Тогда все бы делалось в 1м обработчике, который бы считывал все 8 каналов с 1 порта. Это бы сильно прооптимизировало вычисления и освободило бы входы внешних прерываний. Такое возможно и как? Без использования 2-го контроллера хотелось бы.

Re: Способы измерения длительности импульса.

Michael_K » 26 ноя 2010, 09:38

проц какой? импульсы идут по очереди или вразнобой?

Добавлено спустя 3 минуты 9 секунд:
Если речь об AVR-ках, и импульсы идут по очереди, то берите проц с прерыванием на pin-change на весь порт и радуйтесь. Точность будет порядка трех-четырех тактов проца.

Re: Способы измерения длительности импульса.

Сергей » 26 ноя 2010, 09:40

Зависит от того что необходимо делать в прерываниях и в основной программе

Re: Способы измерения длительности импульса.

Michael_K » 26 ноя 2010, 09:42

Сорри, проглядел - мега16. Нету там такого прерывания, насколько помню.

Re: Способы измерения длительности импульса.

HarryStar » 26 ноя 2010, 12:15

мега32, а не 16, но не суть, они почти одинаковые. Точность в 3-4 такта меня бы устроила, но там действительно нет прерывания по изменению всего порта. Или я не нашел.
Может какой то внешней простенькой микросхемкой можно отслеживать изменение любого из 8-ми битов? а уже с нее завести на внешнее прерывание контроллера. Только вот есть ли такая штука?

Re: Способы измерения длительности импульса.

boez » 26 ноя 2010, 13:05

А атмега32 это принципиально? Может взять какую-нибудь, у которой есть прерывание по изменению порта?
Ну и с самим прерыванием нужно аккуратнее, там будут проблемы когда фронты на разных линиях подойдут близко друг к другу - такое может происходить, если девайс управляется от цифрового контроллера, который валит или все импульсы разом (общее начало - разный конец). Вообще если возможно наложение фронтов - точность в 2-3 цикла ИМХО нереальна. Потому что если фронты идут с разхождением в несколько тактов - прога первый фронт поймает, начнет выполнение обработчика, и только когда его полностью выполнит - начнет обработку следующего фронта, опоздание будет равно времени выполнения обработчика.
А - еще есть простенькая внешняя микросхемка! Называется atmega48A, около бакса стоит :) Пускай она все ноги обмеряет и по любому удобному цифровому каналу (spi,uart,i2c) шлет готовые цифры. Запускать без кварца, тактировать от генератора основной меги. А можно и атмегу8, обработку вообще без прерываний делать, шустрым главным циклом, средняя погрешность немного возрастет (до пары мкс может), зато максимальная может и уменьшиться. Работу с передатчиком только надо аккуратно из такого цикла делать, максимально короткими действиями.

Re: Способы измерения длительности импульса.

vadinator » 26 ноя 2010, 23:14

В вашу задачку ПЛИС просится...

Re: Способы измерения длительности импульса.

Michael_K » 26 ноя 2010, 23:22

HarryStar писал(а):Может какой то внешней простенькой микросхемкой можно отслеживать изменение любого из 8-ми битов? а уже с нее завести на внешнее прерывание контроллера. Только вот есть ли такая штука?

Вы не ответили на вопрос - импульсы идут по очереди или вразнобой?
Микросхемок есть много разных...


Rambler\'s Top100 Mail.ru counter