roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 22:37

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Помогите с алгоритмом
СообщениеДобавлено: 06 май 2011, 00:13 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 995
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
мк должен выполнять 3 задачи:
1) Посылать 50 раз в сек управляющие импульсы на сервы
2) Измерять длительность импульса, подключенного к внешнему прерыванию (тоже серво сигнал)
3) см. пункт 2, только другой канал

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

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с алгоритмом
СообщениеДобавлено: 06 май 2011, 11:15 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
HarryStar писал(а):
как сделать так, чтобы прога сначала вычисляла длительность по 2м каналам, а в промежутке запускала свои импульсы,


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

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с алгоритмом
СообщениеДобавлено: 06 май 2011, 11:30 
Не в сети
Аватара пользователя

Зарегистрирован: 01 июл 2009, 08:59
Сообщения: 2254
Откуда: Екатеринбург
прог. языки: асемблер AVR
Известен период появления информации - 50 мс
известно максимальное время импульса - 2 мс

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с алгоритмом
СообщениеДобавлено: 06 май 2011, 12:02 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
наверно 20 мс

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с алгоритмом
СообщениеДобавлено: 06 май 2011, 12:22 
Не в сети
Аватара пользователя

Зарегистрирован: 01 июл 2009, 08:59
Сообщения: 2254
Откуда: Екатеринбург
прог. языки: асемблер AVR
Ага, перепутал мс и Гц.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с алгоритмом
СообщениеДобавлено: 06 май 2011, 13:39 
Не в сети
Аватара пользователя

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

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

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

_________________
Роботы, уже среди нас...
Прошу прощения за аватар, никак схему динамической индикации не могу настроить :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с алгоритмом
СообщениеДобавлено: 06 май 2011, 17:05 
Не в сети
Аватара пользователя

Зарегистрирован: 15 ноя 2010, 13:56
Сообщения: 995
Откуда: Нижний Новгород
прог. языки: С, С++, РНР
Шим аппаратно неполучится :( 24 сервы, только программно. Еще и секвенсор на все. Жуть. Буду с осцилографом сидеть думать...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с алгоритмом
СообщениеДобавлено: 06 май 2011, 18:09 
Не в сети
Аватара пользователя

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

_________________
Роботы, уже среди нас...
Прошу прощения за аватар, никак схему динамической индикации не могу настроить :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с алгоритмом
СообщениеДобавлено: 07 май 2011, 01:09 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO