roboforum.ru

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

Помогите с алгоритмом

Помогите с алгоритмом

HarryStar » 06 май 2011, 00:13

мк должен выполнять 3 задачи:
1) Посылать 50 раз в сек управляющие импульсы на сервы
2) Измерять длительность импульса, подключенного к внешнему прерыванию (тоже серво сигнал)
3) см. пункт 2, только другой канал

Т.е. нужно измерять длительности серво импульсов по 2м каналам и при этом управлять еще другими сервами.

Все это по отдельности и даже в любых комбинациях по 2 у меня работает. Т.е. я могу измерять длительности импульсов по обоим каналам или измерять по 1 каналу и еще управлять своими сервами.

А вот все вместе неполучается.
На данный момент алгоритм такой:
Прога ждет внешнего прерывания на одном канале по изменению фронта.
При старте импульса записывает время, при окончании импульса вычисляется его длительность и выдается пачка по 1 ипмпульсу на каждую серву. Т.о. посылка своих импульсов тактируется как бы внешним источником других сервоимпульсов.

А вот как сделать так, чтобы прога сначала вычисляла длительность по 2м каналам, а в промежутке запускала свои импульсы, я пока не придумал :(

PS: Нормальный вариант это развести задачи на 2 МК, но хочется пока попробовать на одном.

Re: Помогите с алгоритмом

avr123.nm.ru » 06 май 2011, 11:15

HarryStar писал(а): как сделать так, чтобы прога сначала вычисляла длительность по 2м каналам, а в промежутке запускала свои импульсы,


Буквально так как написали - на прерываниях замерить 1 затем 2 импульс, а потом на таймере сформировать 2 импульса на сервы.

Re: Помогите с алгоритмом

Radist » 06 май 2011, 11:30

Известен период появления информации - 50 мс
известно максимальное время импульса - 2 мс

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

Положим, что вывод на первую серву будет от 0 до 2 мс, вывод на вторую - от 2 до 4 мс.

Сидим в главном цикле, ждем обнуления таймера. Дождались - выдали единичку и ждем когда ее надо будет убрать. Дождались, убрали. Ждем когда время станет 2 мс. Дождались, выставили единичку второй серве. Ждем когда ее надо убрать. Дождались - убрали. Снова ждем обнуления таймера.

В это время внешние прерывания настроены на фронт. Получив прерывание от сервы - меняем соответствующее прерывание на прерывание по спаду, записываем время. По тому, что это было за прерывание (пор фронту или по спаду) узнаем что время это начало или конец импульса, а значит узнаем длину импульса. Со вторым прерыванием аналогично.

Re: Помогите с алгоритмом

avr123.nm.ru » 06 май 2011, 12:02

наверно 20 мс

Re: Помогите с алгоритмом

Radist » 06 май 2011, 12:22

Ага, перепутал мс и Гц.

Re: Помогите с алгоритмом

HarryStar » 06 май 2011, 13:39

Radist писал(а):Сидим в главном цикле, ждем обнуления таймера. Дождались - выдали единичку и ждем когда ее надо будет убрать. Дождались, убрали. Ждем когда время станет 2 мс. Дождались, выставили единичку второй серве. Ждем когда ее надо убрать. Дождались - убрали. Снова ждем обнуления таймера.

Так нельзя :) При таком алгоритме "в лоб" у проца на 16 Мгц хватит быстродействия на несколько серв, дальше будет низкая точность, причем максимальное число серв по этому алгоритму - 8.
Но эта часть задачи я сделал, тут проблем нет.

А вот с анализом все не так просто :)
Проблема в том, что импульсы от 2х сигналов, которые надо анализировать приходят в разные моменты времени, иногда накладываясь друг на друга, иногда нет. Иногда 1 импульс раньше, иногда другой, они между собой не связаны.
И свои импульсы надо выдавать именно в промежуток времени, когда оба они прошли и до следующих есть хотябы 2500 мкс, иначе либо искажаются входные данные либо выходные становятся не синхронными и происходит дрожание серв.

А проблема в том, что пока проц сидит в обработчике прерываний, другие прерывания не выполняются, и переход по ним происходит только после окончания обработчика, что вызывает искажение данных.
Обработчики внешних прерываний короткие - там только время с таймера записывается, а вот выдача сигналов на сервы занимает около 2500 мкс (сами импульсы + секвенсор).
Т.о. Если решить задачу в лоб получается например: 2 импульса по 1500 на внешних прерываниях
1й канал старт импульса 100 мкс (обработка почти 0 мкс)
2й канал старт импульса 1000 мкс (обработка почти 0 мкс)
1й канал окончание импульса 1600 мкс (обработка почти 0 мкс)
таймер 1/50 Сек для вывода своих импульсов 1700 мкс (обработка длится 2500 мкс)
2й канал окончание импульса 4200 мкс (т.к. пока мы находились в предыдущем обработчике, прерываний небыло)

Т.о. 1й канал у нас посчитался правильно 1600 - 100 = 1500
А вот второй неправильно 4200 - 1000 = 3200, хотя на самом деле он был тоже 1500, но окончание импульса было профукано, пока мы сидели в своем обработчике.

Re: Помогите с алгоритмом

vadinator » 06 май 2011, 13:56

HarryStar писал(а):Проблема в том, что импульсы от 2х сигналов, которые надо анализировать приходят в разные моменты времени, иногда накладываясь друг на друга, иногда нет...

Тогда возможно лучше реализовать опрос входов по таймеру (исключив внешние прерывания), например с частотой 100-200 кГц...так же и ШИМ формировать аппаратно(с помощью программных счётчиков)...

Re: Помогите с алгоритмом

HarryStar » 06 май 2011, 17:05

Шим аппаратно неполучится :( 24 сервы, только программно. Еще и секвенсор на все. Жуть. Буду с осцилографом сидеть думать...

Re: Помогите с алгоритмом

vadinator » 06 май 2011, 18:09

Тьфу ты ;) имел ввиду программный ШИМ...очепятка вышла ;-)

Re: Помогите с алгоритмом

HarryStar » 07 май 2011, 01:09

К сожалению на решение задачи в лоб не хватает быстродействия МК.
С использованием осциллографа задача была решена в частном виде.
Оказывается 8-ми канальный китайский приемник туринги и совместимые с ним выдают импульсы на сервы строго последовательно:
1й канал, 2й канал, и т.д. до 8.
Т.е. спад импульса 1го канала, соотв. началу импульса 2го канала и т.д.
Т.о. в моем конкретном случае 1й импульс со внешнего прерывания шел гарантированно раньше, что позволило упростить алгоритм, запуская свои импульсы четко после окончания импульса со 2го канала. При этом правда время между импульсами, подаваемыми на мои сервы плавает от 18 мс до 22 мс, вместо 20, но сервы это терпят, проблем не возникает.


Rambler\'s Top100 Mail.ru counter