roboforum.ru

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

Управление Сервами в WinAvr

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

Сообщение avr123.nm.ru » 16 авг 2006, 00:49

Лучше делать так - прерываться как в задаче 6  - каждые 20 мс по таймеру 0, запускать таймер 1 и подавать на все сервы "1".

затем выходить из прерывания и начинать ожидание насчета времени сервы (или нескольких) которую выключить 1-й, затем 2-й и так далее.

т.е. можно задавать число при достижении которого таймер 1 будет давать прерывание в котором обнулять импульс на нужных сервах. естественно таймер 1 при этом не останавливается.

чем выше частота кварца тем тоньше регулирование серв.

окончание этого процесса будет максимум 2300 мкС после прервания.

теперь нужно занятся расчетами. опять прочитать заданые длины импульсов для серв и расставить их по ранжиру - к следующему прерыванию.

=======

можно сделать прервание каждые 5 мС и управлять 2 сервами в каждом промежутке. Это проще алгоритмически и снизит ударную нагрузку на питание серв.

=======

Советую не бросатья кодировать, а сформулировать четко алгоритм, написать прогу в псевдокоде и затем закодировать на Си.

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

Сообщение Lirzman » 16 авг 2006, 01:00

avr123.nm.ru писал(а):Советую не бросатья кодировать, а сформулировать четко алгоритм, написать прогу в псевдокоде и затем закодировать на Си.

Полностью с вами согласен.
Завтра попытаюсь это сделать.
Сегодня даже в псевдокоде я уже ничего путного не напишу. :D  :D  :D
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение aesok » 16 авг 2006, 01:14

Lirzman писал(а):
aesok писал(а):char szInput [5]; - Место под 5 символов

А разве счет в массиве не с нуля идет?
Просто я уже проверял, если в массив под 5 запихнуть 4 символа
оно не заработает пока Enter не нажмешь, ну или там символ какой-нибудь не введешь.

В том то идето что нумеруеться а 0, а размер задается с 1.

Масив с размерностью 1 имеет одну запись с индексом 0.


Насчет нескольких серв мне пришла интересная идея:idea: .
А что если поставить все управляющие импульсы в очередь?
Учитывая что МК остаётся свободным(работает таймер) времени и ресурсов это займет немного.
Пример:
(2мс+20мс)*8(кол-во серв)=88мс
Сервы успеют за это время 20 раз туда и обратно повернутся.

Как идейка реализуема?


Напраление мыслей правильное. лучше всего обрабатывать в очередь. Но учти програма будет раза в 3-4 больше. Готов.

Шли код, в нем есть 2 ошибки совершенно неочевидные для начинающих, попробую завтра объяснить в чем дело. Лучше вначале разобраться с простой, а потом усложнять.

Анатолий.
aesok
 
Сообщения: 69
Зарегистрирован: 11 авг 2006, 01:02
Откуда: ----

Сообщение aesok » 16 авг 2006, 01:24

Лучше такой вариант:

Максимальная длина импульса для сервы - 2.1 мс. выделяем для сервы 2,5 мс. для 8 серв надо 2,5 * 8 = 20 мс.  Дунай в этом направлении.

Анатолий.
aesok
 
Сообщения: 69
Зарегистрирован: 11 авг 2006, 01:02
Откуда: ----

Сообщение avr123.nm.ru » 16 авг 2006, 02:07

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

Сообщение avr123.nm.ru » 16 авг 2006, 02:26

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

Поэтому сейчас более важен осцилограф чем модель сервы.


не надо на PROTEUS балоны катить !

он не вводит в заблуждение !

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

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

Сообщение Lirzman » 16 авг 2006, 13:26

avr123.nm.ru писал(а):кстати можно на неостанавливаемом таймере 1 все зделать.

А я и хочу всё на одном таймере сделать. :D
Отводить под сервы 2 таймера, это слишком жирно получается. :D
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение Lirzman » 16 авг 2006, 14:00

aesok писал(а):Максимальная длина импульса для сервы - 2.1 мс. выделяем для сервы 2,5 мс. для 8 серв надо 2,5 * 8 = 20 мс

На бумаге красиво получается, но на практике таким способом удастся управлять каждой 8-й сервой, и то с очень небольшой точностью.

Что будет если всем сервам надо будет повернуться на 0.7мс?
20мс период выродится в 5.6мс :shock:.

Так что сейчас буду думать над реализацией идеи с очередью.
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение aesok » 16 авг 2006, 14:29

Попробуйте запрограмировать вот это.
Вложения
Безымянный.GIF
рис
Безымянный.GIF (5.2 КиБ) Просмотров: 1786
aesok
 
Сообщения: 69
Зарегистрирован: 11 авг 2006, 01:02
Откуда: ----

Сообщение Lirzman » 16 авг 2006, 16:12

aesok писал(а):Попробуйте запрограмировать вот это.

Запрограммировать это несложно, но мы опять упираемся в пресловутую проблему "тиков таймера=тиков процессора".
Это можно обойти если вручную найти задержку 20мс-t1-t2-t3-t4-t5-t6-t7-t8, и жестко закрепить это число в константу.

Добавлено:
Но!!! Тогда мы сможем поворачивать серву только на определенный(закрепленный в константе угол)
Управляющий импульс ведь у каждой сервы СВОЙ!!!
Последний раз редактировалось Lirzman 16 авг 2006, 16:17, всего редактировалось 1 раз.
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение avr123.nm.ru » 16 авг 2006, 16:16

Lirzman писал(а):
aesok писал(а):Что будет если всем сервам надо будет повернуться на 0.7мс?
20мс период выродится в 5.6мс :shock:.

Так что сейчас буду думать над реализацией идеи с очередью.


а какая разница на сколько нужно повернуть сервы ? вы каждой управляете через 2500 мкС (или 2400 или поменьше) не зависимо от длины управляющего импульса.

у вас есть число которые нужно загрузить в таймер 1 после управления каждой сервой - например 2500  5000  7500  и так далее

чтоб во 2-й серве слеоать импульс вам нужно в прервании на 2500 сделать "1"  на серву 2 и вписать в регистр таймер 1 число 4500, когда он опятьпрервется нужно сделать "0" на серве 2 и вписать в таймер 1 число 5000

по прерванию на 5000 на серве 3 сделать "1" и вписать в таймер1 число  (5000 + (длина импульса для серво 3 в мкС))

это пример чисел если таймер1 тикает каждую мкС.

========

Вот такие настройки для таймера_1 похоже нужны:

// Timer/Counter 1 тикает от  System Clock
TCCR1A=0x00;
TCCR1B=0x01;


OCR1AH=0x0F; // это 2 байтное число
OCR1AL=0xFF; // при досчете до которого
// произойдет прерывание - TIM1_COMPA


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

Сообщение Lirzman » 16 авг 2006, 16:57

ИМНО слишко сложно всё.
Зачем огород городить с расчетами, если гораздо проще так:
Подать упр. импульс в (X)мс на серву 1.
Подать задержку в 20мс на серву 1.

Подать упр. импульс в (X)мс на серву 2.
Подать задержку в 20мс на серву 2.

И т.д до 8 сервы.

Я думаю сила(torque) сервы не слишком упадет если сигнал будет раз в 176мс ((2+20)*8=176)?

Или я неправ?
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение aesok » 16 авг 2006, 17:20

Lirzman писал(а):ИМНО слишко сложно всё.
Зачем огород городить с расчетами, если гораздо проще так:
Подать упр. импульс в (X)мс на серву 1.
Подать задержку в 20мс на серву 1.

Подать упр. импульс в (X)мс на серву 2.
Подать задержку в 20мс на серву 2.

И т.д до 8 сервы.

Я думаю сила(torque) сервы не слишком упадет если сигнал будет раз в 176мс ((2+20)*8=176)?

Или я неправ?


Не надо ждать 20 мс чтобы подать ипульс на следующюу серву. 20 мс это пероуд импульсов на одной серве.

Думаю период в  176 мс очень большой. Нужно поискать спецификации серв.

Анатолий.
aesok
 
Сообщения: 69
Зарегистрирован: 11 авг 2006, 01:02
Откуда: ----

Сообщение Lirzman » 16 авг 2006, 17:30

aesok писал(а):Думаю период в  176 мс очень большой.

Почему-же большой каждая серва будет позиционироваться ~5 раз в секунду

[OFFTOP]
ICQ цветок не смотрите,он не горит потому что у меня Miranda,
а так я в сети постоянно(у меня ADSL)  :D
[/OFFTOP]
Аватара пользователя
Lirzman
 
Сообщения: 257
Зарегистрирован: 22 мар 2005, 03:59
Откуда: Питер

Сообщение aesok » 16 авг 2006, 18:46

Lirzman писал(а):
aesok писал(а):Думаю период в  176 мс очень большой.

Почему-же большой каждая серва будет позиционироваться ~5 раз в секунду



Я не спец по сервомашинкам, но вот что я думаю:

Для цифровых сервомошинок не нет большой разници в переоде следования импульсов. Микроконтроллер измеряет длительность импульса, запоминиет это значение в памяти, и изпользует для установки положения сервомашинки. Нет новых импульсов, используеться значение из памяти, есть значение обновляеться.

В аналоговых сервомашинках запоминающим элементом являеться кондесатор. Если не подзаряжать его время от времени до нужного напряжения (по спецификациям сервомашинок через каждые 20 мс) то он будет из за токов утечки разряжаться, и положение сервомашинки будет изменяться. Но нужно проверить на реальной сервомашинке.

Так что если вы предпологаете истользовать аналоговые серво то старайтесь сделать период импульсов как можно ближе к 20 мс.

To 123: Что говорит ваш любимый симулятор по этому поводу.

Анатолий.
aesok
 
Сообщения: 69
Зарегистрирован: 11 авг 2006, 01:02
Откуда: ----

Пред.След.

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

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

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