roboforum.ru

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


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

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

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

Сообщение NorthStar » 28 сен 2010, 22:01

Добрый день!
Прошу подсказать. Мне нужно измерить длительность импульса на микроконтроллере PIC16F877 (подключить к аксселерометру). К сожалению оба порта PWM/компаратор заняты. Порт прерывания - свободен, но он только один, а у аксселерометра 2 выхода на 2 оси.
Подскажите способ измерить длинну импульса, используя обычные порты контроллера? Например прерывание по таймеру.
NorthStar
 
Сообщения: 317
Зарегистрирован: 13 сен 2010, 12:47

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

Сообщение Radist » 28 сен 2010, 22:14

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

Ждем фронта импульса, включаем таймер, ждем спада импульса, выключаем таймер. Нужно быть уверенным, что таймер не переполнится, иначе считать число переполнений таймера. Чем меньше предделитель - тем выше точность счета.
Аватара пользователя
Radist
 
Сообщения: 2254
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

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

Сообщение avr123.nm.ru » 28 сен 2010, 22:27

Возможно входы модуля захвата сравнения свободны? Тогда их надо использовать. Русская документация по микроконтроллерам PIC есть на страничке http://proavr.narod.ru/09.htm в ней есть примеры кода для разных задач.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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

Сообщение NorthStar » 29 сен 2010, 18:33

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

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

Сообщение Radist » 29 сен 2010, 22:13

Если есть вход внешнего прерывания - вешаем это дело на него. Проц может заниматься своими делами. А вообще обычно сперва распределяют ноги и ресурсы проца по задачам, а не наоборот.
Аватара пользователя
Radist
 
Сообщения: 2254
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

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

Сообщение avr123.nm.ru » 29 сен 2010, 23:08

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


У вас схема как на http://RoboPica.Narod.Ru ? Или какие то модификации сделаны ?
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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

Сообщение NorthStar » 04 окт 2010, 18:50

Ну у меня на последовательном порту Bluetooth модуль а на прерывании пульт ДУ.
Пульт можно снять, но мне-то для подключения аксселерометра 2 входа нужно, одним прерыванием много не сделаешь.
NorthStar
 
Сообщения: 317
Зарегистрирован: 13 сен 2010, 12:47

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-го контроллера хотелось бы.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

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

Сообщение Michael_K » 26 ноя 2010, 09:38

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

Добавлено спустя 3 минуты 9 секунд:
Если речь об AVR-ках, и импульсы идут по очереди, то берите проц с прерыванием на pin-change на весь порт и радуйтесь. Точность будет порядка трех-четырех тактов проца.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

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

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

Зависит от того что необходимо делать в прерываниях и в основной программе
Сергей
 
Сообщения: 3744
Зарегистрирован: 29 дек 2004, 23:15
Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей

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

Сообщение Michael_K » 26 ноя 2010, 09:42

Сорри, проглядел - мега16. Нету там такого прерывания, насколько помню.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

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

Сообщение HarryStar » 26 ноя 2010, 12:15

мега32, а не 16, но не суть, они почти одинаковые. Точность в 3-4 такта меня бы устроила, но там действительно нет прерывания по изменению всего порта. Или я не нашел.
Может какой то внешней простенькой микросхемкой можно отслеживать изменение любого из 8-ми битов? а уже с нее завести на внешнее прерывание контроллера. Только вот есть ли такая штука?
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

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

Сообщение boez » 26 ноя 2010, 13:05

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

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

Сообщение vadinator » 26 ноя 2010, 23:14

В вашу задачку ПЛИС просится...
Роботы, уже среди нас...
Прошу прощения за аватар, никак схему динамической индикации не могу настроить :)
Аватара пользователя
vadinator
 
Сообщения: 979
Зарегистрирован: 19 янв 2010, 14:51
Откуда: Петрозаводск
прог. языки: C, FBD, Wiring-Processimg,,,LD, SFC, ST...
ФИО: Вадим

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

Сообщение Michael_K » 26 ноя 2010, 23:22

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

Вы не ответили на вопрос - импульсы идут по очереди или вразнобой?
Микросхемок есть много разных...
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

След.

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

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

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