roboforum.ru

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

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

avr123.nm.ru » 16 авг 2006, 21:23

Эх.... придется задачу в курс крапать по управлению SERVO !

Lirzman » 16 авг 2006, 21:37

Чему равна длительность '0', если переод равен 20мс, а длительность '1'  равна 1,5 мс?

20-1.5=18.5

aesok » 17 авг 2006, 00:21

Lirzman писал(а):
Чему равна длительность '0', если переод равен 20мс, а длительность '1'  равна 1,5 мс?

20-1.5=18.5


Добавте это пожалуйста в программу.

Анатолий.

Lirzman » 17 авг 2006, 00:23

Я наконец въехал, неполучалось из-за подмены понятий. :D
Через 5 минут выложу псевдокод

Lirzman » 17 авг 2006, 00:39

Вот псевдокод, взята за основу ваша(aesok) картинка(2 стр назад)
Для кратости привожу в примере только 3 сервы
Код: Выделить всёРазвернуть
cur_servo;//серва на которую подаём сигнал в данный момент
if(cur_servo=1)
{clear_bit(3);
set_bit(1);
cur_servo=2;
wait(servo_time_1);
}
else if(cur_servo=2)
{clear_bit(1);
set_bit(2);
cur_servo=3;
wait(servo_time_2);
}
else if(cur_servo=3)

{clear_bit(2);
set_bit(3);
cur_servo=4;
wait(servo_time_3);
}
else if(cur_servo=4)
{clear_bit(3);
cur_servo=1;
wait(period - servo_time_1 - servo_time_2 - servo_time_3);
}


Вот так всё просто, если не сказать элементарно.

!!!НО!!! как мне сделать вычитание(последнюю функцию wait) если period=1 а servo_time_X = 62000..58500?

Может сложением? :shock:  :shock:  :shock:
Последний раз редактировалось Lirzman 17 авг 2006, 01:03, всего редактировалось 1 раз.

Сергей » 17 авг 2006, 01:01

Во-первых можно не писать else, пиши подряд if, так тоже работает.
Во-вторых у тебя есть маленькая опечатка:
else if(cur_servo=2)
{clear_bit(1);
set_bit(2);
cur_servo=3;
wait(servo_time_2);
}
else if(cur_servo=3)

{clear_bit(1); <<<<<<< Здесь должен быть бит 2. Ну сказал на всяк случай чтоб другие не путались.
set_bit(3);
cur_servo=4;
wait(servo_time_3);
}
else if(cur_servo=4)
{clear_bit(3);
cur_servo=1;
wait(period - servo_time_1 - servo_time_2 - servo_time_3);
}

Lirzman » 17 авг 2006, 01:02

Спасибо, исправил :D

Lirzman » 17 авг 2006, 01:05

Так что мне с последней проблемой делать?

Не писать же таблицу соответствий для углов поворота/тиков таймера??? :shock:

Во-первых можно не писать else, пиши подряд if, так тоже работает.

А что в псевдокоде строгие правиля синтаксиса тоже есть? :D  :D  :D
Последний раз редактировалось Lirzman 17 авг 2006, 01:06, всего редактировалось 1 раз.

Lirzman » 17 авг 2006, 01:07

Какая разница?
Главное что-б людям понятнее было.

Lirzman » 17 авг 2006, 01:13

Слушай, а зачем делатьэто все на таймере1, ведь вроде это может и с таймером0 уместиться.

Страницы на 3-4 назад отмотай и все поймешь

Сергей » 17 авг 2006, 01:13

Да, главное чтоб понятней =) ну по-крайней мере псевдо код нужно писать покороче, ну а потом уже расписывать как нужно.., я так считаю.)

Lirzman » 17 авг 2006, 01:16

ну по-крайней мере псевдо код нужно писать покороче

Ладно проехали(уже написал). :D

Сергей » 17 авг 2006, 01:20

Lirzman писал(а):!!!НО!!! как мне сделать вычитание(последнюю функцию wait) если period=1 а servo_time_X = 62000..58500?

Здесь объясни пожалуйста, как период может быть равен 1,  если он должен быть равен 20мс? или я не в том направлении мыслю?

aesok » 17 авг 2006, 01:22

Lirzman писал(а):Вот псевдокод, взята за основу ваша(aesok) картинка(2 стр назад)
Для кратости привожу в примере только 3 сервы
Код: Выделить всёРазвернуть
cur_servo;//серва на которую подаём сигнал в данный момент
if(cur_servo=1)
{clear_bit(3);
set_bit(1);
cur_servo=2;
wait(servo_time_1);
}
else if(cur_servo=2)
{clear_bit(1);
set_bit(2);
cur_servo=3;
wait(servo_time_2);
}
else if(cur_servo=3)

{clear_bit(2);
set_bit(3);
cur_servo=4;
wait(servo_time_3);
}
else if(cur_servo=4)
{clear_bit(3);
cur_servo=1;
wait(period - servo_time_1 - servo_time_2 - servo_time_3);
}


Вот так всё просто, если не сказать элементарно.


Отлично 4 с 2 плюсами!!!!!


!!!НО!!! как мне сделать вычитание(последнюю функцию wait) если period=1 а servo_time_X = 62000..58500?

Может сложением? :shock:  :shock:  :shock:


Еще один плюс!!!! Да сложением. Еще раз проанализируйте как работает таймер, и попытайтесь понять почему именно сложением.

wait(servo_time_X); - это TCNT1=servo_time_X;
И у вас практически готовый код обработчика прерывыний таймера!!!

Анатолий.

Сергей » 17 авг 2006, 01:27

Сергей писал(а):
Lirzman писал(а):!!!НО!!! как мне сделать вычитание(последнюю функцию wait) если period=1 а servo_time_X = 62000..58500?

Здесь объясни пожалуйста, как период может быть равен 1,  если он должен быть равен 20мс? или я не в том направлении мыслю?

Фу, блин, дошло=)


Rambler\'s Top100 Mail.ru counter