Технический форум по робототехнике.
sky-walker » 11 окт 2012, 00:29
Всем привет.
Возникла элементарная задача. На вход идет импульс длиной N микросекунд (800-2200 +-100). Надо как-то считать эту длину. В баскоме и ардуино есть команда PulseIn, нужно что-то подобное. Пробовал инкрементить переменную пока на ноге 1, и потом делить на 8 (частота мк 8МГц), но выводит всякую хрень... Пробовал брать исходные коды на Сях из ардуины, так тут вообще непонятное: при импульсе 500us (генерирую в протеусе другой мегой), возвращает не 500, а 13... (результат узнаю подачей его на PORTB, к ним св.диоды, а там в бинарном виде; в том же протеусе...).
Чувствую, что решение элементарное, а отловить не могу... Как это можно реализовать?
Заранее спасибо.
elmot » 11 окт 2012, 01:18
Вы всерьез думаете, что цикл с проверкой состояния ноги и инкрементом переменной занимает 1 такт???
Я вообще не уверен, что 8 МГц проца хватит чтобы мерять микросекунды программно. Думаю, следует использовать меговский таймер. В моих любимых стмках(в любых) - измерение длины импульса - штатная функция таймера, а вот про меги не знаю.
Angel71 » 11 окт 2012, 01:32
каждая итерация вашего инкремента это несколько тактов, а делите на 8. вообще есть таймеры-счётчики и прерывания. +вы лучше сначала напишите, для чего вообще это нужно. может вам
декодирование ик кодов нужно или ещё чего и можно будет просто скопипастить немного кода.
Dmitry__ » 11 окт 2012, 01:40
Да чо тут гадать? PPM микшер мутит
http://www.google.ru/search?ie=UTF-8&hl ... pm%20mixerДобавлено спустя 4 минуты:elmot
Сообщения: 2000
Могем
![Shocked :shock:](http://roboforum.ru/images/smilies/shok.gif)
dccharacter » 11 окт 2012, 02:02
CCP: _Capture_ Compare PWM
elmot » 11 окт 2012, 10:17
Dmitry__ писал(а):elmot
Сообщения: 2000
Могем
![Shocked :shock:](http://roboforum.ru/images/smilies/shok.gif)
Йохохо. Неплохой гет, учитывая что я тут меньше года
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
Спасибо, будем посмотреть...
Radist » 11 окт 2012, 13:51
Предлагаю решить задачу в лоб: вход вешается на внешнее прерывание.
Прерывание настраивается по фронту. В подпрограмме обработки задаем такой алгоритм:
1. Если прерывание стоит по фронту - обнулить таймер и включить его. Прерывание сделать по спаду
2. Если прерывание сделано по спаду - выключить таймер, скопировать из него инфу в озу, поставить прерывание по фронту.
Все, забирайте длину импульса из озу в любое время, она там будет обновляться. Таймер предварительно нужно настроить, чтоб не было переполнения.
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 украл мою идею
![Smile :)](http://roboforum.ru/images/smilies/smile.gif)
Таки надо читать чыжие сообщения
![Embarassed :oops:](http://roboforum.ru/images/smilies/blush.gif)
Angel71 » 11 окт 2012, 16:10
![Embarassed :oops:](http://roboforum.ru/images/smilies/blush.gif)
эта идея неоднократно обсуждалась здесь еще с 2005го.
![Very Happy :D](http://roboforum.ru/images/smilies/biggrin.gif)
так что это как в
шутке с патентами - есть патент, значит нифигашеньки ты не изобрёл, а скомуниздил. признавайся, у кого идею скомуниздил?
п.с. если о птичках, то тс пару раз уже намекось о пользе поиска.
sky-walker » 11 окт 2012, 16:39
Radist,
Спасибо, не подумал о такой возможности, буду пробовать...
Dmitry__,
Надо будет изучить, спасибо за коммент - полезная информация.
До птичек еще далеко...
legion » 11 окт 2012, 17:00
МК-то какой? Для решения этой задачи существует подсистема таймера - Input Capture Unit.
Если кратко, то по фронту/спаду на ноге Input Capture Pin (ICP) таймер будет записывать значение своего счетчика в Input Capture Register (ICR) и активировать прерывание Timer/Counter Capture Event, в котором можно обнулить таймер, изменить срабатывание на спад/фронт и прочитать длительность из ICR.
Если в МК нет таймера с Input Capture Unit или есть, но занят под более важные дела, тогда по внешнему прерыванию, да.
sky-walker » 11 окт 2012, 18:33
МК самый слабый из avr (почти)- atmega8. Пишу в cvAVR. Такой подсистемы, честно говоря, у него не видел...
legion » 11 окт 2012, 18:42
Ничего себе слабый. Да на нем можно ракеты в космос запускать. Есть там Input Capture Unit. Страницы даташита 81-83.
sky-walker » 11 окт 2012, 18:55
Хм, значит проглядел... Спасибо за страницы, пойду читать. Да, действительно, ножка ICP имеется...
Я имел ввиду про кол-во функций, ШИМ-каналов, ног и встроенного кварца - у многих мег мощнее. Вот заказал 64ю (сороконожка в дипе - это нечто, первый раз такое вижу) и 328ю, на серьезные вещи их поставлю...