roboforum.ru

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

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

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

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

Сообщение HarryStar » 06 май 2011, 00:13

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

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

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

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

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

PS: Нормальный вариант это развести задачи на 2 МК, но хочется пока попробовать на одном.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

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

Сообщение avr123.nm.ru » 06 май 2011, 11:15

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


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

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

Сообщение Radist » 06 май 2011, 11:30

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

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

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

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

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

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

Сообщение avr123.nm.ru » 06 май 2011, 12:02

наверно 20 мс
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

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

Сообщение Radist » 06 май 2011, 12:22

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

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

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

Сообщение vadinator » 06 май 2011, 13:56

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

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

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

Сообщение HarryStar » 06 май 2011, 17:05

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

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

Сообщение vadinator » 06 май 2011, 18:09

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

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

Сообщение HarryStar » 07 май 2011, 01:09

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


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

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

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