roboforum.ru

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

Как померить длину импульса?

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

Как померить длину импульса?

Сообщение sky-walker » 11 окт 2012, 00:29

Всем привет.

Возникла элементарная задача. На вход идет импульс длиной N микросекунд (800-2200 +-100). Надо как-то считать эту длину. В баскоме и ардуино есть команда PulseIn, нужно что-то подобное. Пробовал инкрементить переменную пока на ноге 1, и потом делить на 8 (частота мк 8МГц), но выводит всякую хрень... Пробовал брать исходные коды на Сях из ардуины, так тут вообще непонятное: при импульсе 500us (генерирую в протеусе другой мегой), возвращает не 500, а 13... (результат узнаю подачей его на PORTB, к ним св.диоды, а там в бинарном виде; в том же протеусе...).

Чувствую, что решение элементарное, а отловить не могу... Как это можно реализовать?
Заранее спасибо.
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: Как померить длину импульса?

Сообщение elmot » 11 окт 2012, 01:18

Вы всерьез думаете, что цикл с проверкой состояния ноги и инкрементом переменной занимает 1 такт???
Я вообще не уверен, что 8 МГц проца хватит чтобы мерять микросекунды программно. Думаю, следует использовать меговский таймер. В моих любимых стмках(в любых) - измерение длины импульса - штатная функция таймера, а вот про меги не знаю.
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Как померить длину импульса?

Сообщение Angel71 » 11 окт 2012, 01:32

каждая итерация вашего инкремента это несколько тактов, а делите на 8. вообще есть таймеры-счётчики и прерывания. +вы лучше сначала напишите, для чего вообще это нужно. может вам декодирование ик кодов нужно или ещё чего и можно будет просто скопипастить немного кода.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Как померить длину импульса?

Сообщение Dmitry__ » 11 окт 2012, 01:40

Да чо тут гадать? PPM микшер мутит :D
http://www.google.ru/search?ie=UTF-8&hl ... pm%20mixer

Добавлено спустя 4 минуты:
elmot
Сообщения: 2000

Могем :shock:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Как померить длину импульса?

Сообщение dccharacter » 11 окт 2012, 02:02

CCP: _Capture_ Compare PWM
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Как померить длину импульса?

Сообщение elmot » 11 окт 2012, 10:17

Dmitry__ писал(а):
elmot
Сообщения: 2000

Могем :shock:

Йохохо. Неплохой гет, учитывая что я тут меньше года
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Как померить длину импульса?

Сообщение sky-walker » 11 окт 2012, 13:36

Dmitry__ писал(а):Да чо тут гадать? PPM микшер мутит

Вы очень близки, но не совсем ). PPM (де)мультиплексор я чуть позже буду делать, как знаний поднаберусь.

Для чего - специально не указал пока, так как есть 2 идеи.
Первая: лежит ультразвуковой сонар от ардуины (HC-SR04). Он возвращает дальность как раз через длину импульса (там вроде в мс а не мкс, так что это точно реально).

Вторая: как начинающий, строю машинку - 2 двига 5В + шарик от наст. тенниса в кач-ве поворотного колеса (стойку из ПКЛ сделал). Но едет она криво (спасибо брату-китайцу за тупые колеса + шарик немного не в центре стоит). Хочу поставить гироскоп, чтобы при смещении один из моторов подгазовывал, а другой наоборот + можно было на угол точный повернуть. Но гиры с обвязкой нормальные стоят 15+... А у меня валяется 3 гиры для RC-моделей (спасибо папиному хобби - авиамоделизму). Принцип работы: на входе сигнал с приемника (как раз 800-2200мкс), на выходе - он же, но с прибавленным офсетом поворота. Вот его мне и надо считать.

Мда, с одним тактом это я ступил... Только начинаю, так что сильно не пинайте ). Буду изучать исходники ардуинской pulseIn, там вроде тоже инкремент...

А таймером как? То что они есть я знаю, в будущем ловить начало импульса как раз по внешнему прерыванию хочу сделать. У таймеров же вроде прерывания самые быстрые (на 8МГц) это 1 такт и 8 тактов + в каждом прерывании явно (теперь...) не один такт будет...

dccharacter писал(а):CCP: _Capture_ Compare PWM

Спасибо, будем посмотреть...
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: Как померить длину импульса?

Сообщение Radist » 11 окт 2012, 13:51

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

Re: Как померить длину импульса?

Сообщение Dmitry__ » 11 окт 2012, 15:11

sky-walker писал(а):Вы очень близки, но не совсем ). PPM (де)мультиплексор я чуть позже буду делать, как знаний поднаберусь.

Ну, я ссылку на гугль дал "PPM mixer" для поиска решения той же задачи, можно еще: "ppm decoder source avr"
Такие вещи делаются на аппаратных ресурсах контроллера -tmr, CCP (как тут и советовали)
Или программно, но на асме.
Вот огрызок комментов из одного из способов:
Код: Выделить всёРазвернуть
;декодирование PWC сигнала. Прерывание от INT.
;алгоритм декодирования PWC:
;INT настроен на фронт.
;Во время прерывания по фронту INT, запускается TMR1 с нулевого значения
;и INT настраивается на прерывание по спаду сигнала.
;После прерывания по спаду сигнала, останавливается TMR1 и его значение масштабируется до 8-бит. PWM
;если значение таймера выходит за диапазон PWC (выключен передатчик, помехи, шумы), то значение аннулируется
;INT перенастраивается на прерывание по фронту сигнала и цикл повторяется.

;параметры PWC сигнала (PULSE WIDTH CONTROL 1500usec NEUTRAL):
;среднее положение привода - импульс 1.5 мс.
;крайние положения привода: +0.6 мс. и -0.6 мс. (2.1 мс. и 0.9 мс. соответственно)
;частота повторения 20 мс. (50 гц.)

;максимальное значение PWC   = 2.1 мс. = 2100mks. / 0.25(clk)= 8400 тактов.
;среднее значение PWC      = 1.5 мс. = 1500mks. /0.25 = 6000 тактов.
;минимальное значение PWC   = 0.9 мс. = 900mks. / 0.25 = 3600 тактов.
;алгоритм масштабирования PWC:
;2-й способ (со знаком, 9 бит):
;значение(16 bit) - 6000
;знак = направление, старший байт - значение (выровненное относительно нейтрали)


Всяко разно:
http://homepages.paradise.net.nz/bhabbott/decoder.html
И всякие ресурсы на драйверы двигателей (тam везде декодирование PPM)
http://homepages.paradise.net.nz/bhabbott/bridge.html

Добавлено спустя 2 минуты 27 секунд:
гыг, Radist украл мою идею :)
Таки надо читать чыжие сообщения :oops:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: Как померить длину импульса?

Сообщение Angel71 » 11 окт 2012, 16:10

:oops: эта идея неоднократно обсуждалась здесь еще с 2005го. :D так что это как в шутке с патентами - есть патент, значит нифигашеньки ты не изобрёл, а скомуниздил. признавайся, у кого идею скомуниздил?
п.с. если о птичках, то тс пару раз уже намекось о пользе поиска.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Как померить длину импульса?

Сообщение sky-walker » 11 окт 2012, 16:39

Radist,
Спасибо, не подумал о такой возможности, буду пробовать...

Dmitry__,
Надо будет изучить, спасибо за коммент - полезная информация.

До птичек еще далеко...
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: Как померить длину импульса?

Сообщение legion » 11 окт 2012, 17:00

МК-то какой? Для решения этой задачи существует подсистема таймера - Input Capture Unit.
Если кратко, то по фронту/спаду на ноге Input Capture Pin (ICP) таймер будет записывать значение своего счетчика в Input Capture Register (ICR) и активировать прерывание Timer/Counter Capture Event, в котором можно обнулить таймер, изменить срабатывание на спад/фронт и прочитать длительность из ICR.

Если в МК нет таймера с Input Capture Unit или есть, но занят под более важные дела, тогда по внешнему прерыванию, да.
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: Как померить длину импульса?

Сообщение sky-walker » 11 окт 2012, 18:33

МК самый слабый из avr (почти)- atmega8. Пишу в cvAVR. Такой подсистемы, честно говоря, у него не видел...
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP

Re: Как померить длину импульса?

Сообщение legion » 11 окт 2012, 18:42

Ничего себе слабый. Да на нем можно ракеты в космос запускать. Есть там Input Capture Unit. Страницы даташита 81-83.
legion
 
Сообщения: 736
Зарегистрирован: 24 апр 2010, 14:47
Откуда: Уфа
прог. языки: avr asm

Re: Как померить длину импульса?

Сообщение sky-walker » 11 окт 2012, 18:55

Хм, значит проглядел... Спасибо за страницы, пойду читать. Да, действительно, ножка ICP имеется...

Я имел ввиду про кол-во функций, ШИМ-каналов, ног и встроенного кварца - у многих мег мощнее. Вот заказал 64ю (сороконожка в дипе - это нечто, первый раз такое вижу) и 328ю, на серьезные вещи их поставлю...
Аватара пользователя
sky-walker
 
Сообщения: 40
Зарегистрирован: 29 сен 2012, 14:41
прог. языки: C\C++, AutoIt, PHP


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

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

Сейчас этот форум просматривают: Bing [Bot] и гости: 0

cron